From 129763d12126517e441e1d57c5349145d9207f6f Mon Sep 17 00:00:00 2001 From: hasanbalci Date: Fri, 18 Aug 2017 17:17:09 +0300 Subject: [PATCH] pushing changes for v4.0.0 release --- package.json | 2 +- sbgnviz.js | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 175f4f9b..83a3918a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sbgnviz", - "version": "3.4.3", + "version": "4.0.0", "description": "SBGNPD visualization library", "main": "src/index.js", "licence": "LGPL-3.0", diff --git a/sbgnviz.js b/sbgnviz.js index 5a7a5607..ca782322 100644 --- a/sbgnviz.js +++ b/sbgnviz.js @@ -46148,7 +46148,7 @@ function extend() { },{}],146:[function(_dereq_,module,exports){ module.exports={ "name": "sbgnviz", - "version": "3.1.0", + "version": "3.4.3", "description": "SBGNPD visualization library", "main": "src/index.js", "licence": "LGPL-3.0", @@ -51095,7 +51095,7 @@ var jsonToSbgnml = { // get all glyphs var glyphList = []; - // be carefule that :visible is also used during recursive search of nodes + // be careful that :visible is also used during recursive search of nodes // in the getGlyphSbgnml function. If not set accordingly, discrepancies will occur. cy.nodes(":visible").each(function(ele, i){ if(typeof ele === "number") { @@ -51282,7 +51282,7 @@ var jsonToSbgnml = { // add string to a new extension for this glyph if(hasNewtExt) { var extension = self.getOrCreateExtension(glyph); - extension.list["newt"] = jQuery.parseXML(""+newtExtString+""); + extension.add(""+newtExtString+""); console.log(extension.toXML()); } @@ -51366,7 +51366,7 @@ var jsonToSbgnml = { // add info for hidden edges if(edge.hidden()) { var extension = self.getOrCreateExtension(arc); - extension.list["newt"] = jQuery.parseXML(""); + extension.add(""); console.log(extension.toXML()); } @@ -51835,16 +51835,23 @@ mainUtilities.showNodesSmart = function(_nodes) { mainUtilities.showEles = function(eles) { // If this function is being called we can assume that view utilities extension is on use var viewUtilities = cy.viewUtilities('get'); + var hiddenEles = eles.filter(':hidden'); + if (hiddenEles.length === 0) { + return; + } if(options.undoable) { var ur = cy.undoRedo(); ur.action("thickenBorder", mainUtilities.thickenBorder, mainUtilities.thinBorder); ur.action("thinBorder", mainUtilities.thinBorder, mainUtilities.thickenBorder); - var nodesToThinBorder = eles.neighborhood(":visible").nodes("[thickBorder]"); - var nodesToThickenBorder = cy.edges(":hidden").difference(eles.edges()).connectedNodes().intersection(eles.nodes()); + // Batching var actions = []; + var nodesToThinBorder = (hiddenEles.neighborhood(":visible").nodes("[thickBorder]")) + .difference(cy.edges(":hidden").difference(hiddenEles.edges().union(hiddenEles.nodes().connectedEdges())).connectedNodes()); actions.push({name: "thinBorder", param: nodesToThinBorder}); - actions.push({name: "show", param: eles}); + actions.push({name: "show", param: hiddenEles}); + var nodesToThickenBorder = hiddenEles.nodes().edgesWith(cy.nodes(":hidden").difference(hiddenEles.nodes())) + .connectedNodes().intersection(hiddenEles.nodes()); actions.push({name: "thickenBorder", param: nodesToThickenBorder}); cy.undoRedo().do("batch", actions); } @@ -52617,7 +52624,12 @@ var sbgnmlToJson = { var glyph = childGlyphs[i]; var glyphClass = glyph.class_; if (glyphClass !== 'state variable' && glyphClass !== 'unit of information') { - self.traverseNodes(glyph, jsonArray, elId, compartments); + if(!glyph.compartmentRef || glyph.compartmentRef == elId) { + self.traverseNodes(glyph, jsonArray, elId, compartments); + } + else if (glyph.compartmentRef != elId) { + self.traverseNodes(glyph, jsonArray, glyph.compartmentRef, compartments); + }; } } } else { @@ -52942,7 +52954,7 @@ var sbgnmlToJson = { compartmentChildrenMap[compartmentRef].push(glyph); } } - + for (i = 0; i < glyphs.length; i++) { var glyph = glyphs[i]; self.traverseNodes(glyph, cytoscapeJsNodes, '', compartments); @@ -53178,4 +53190,4 @@ var undoRedoActionFunctions = { module.exports = undoRedoActionFunctions; },{"./element-utilities":151}]},{},[147])(147) }); -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXN5bmMvbGliL2FzeW5jLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9saWIvYjY0LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2VzNi1wcm9taXNlL2Rpc3QvZXM2LXByb21pc2UuanMiLCJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JlYWNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmRleG9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvaXMtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzb25sZC9icm93c2VyL2lnbm9yZS5qcyIsIm5vZGVfbW9kdWxlcy9qc29ubGQvanMvanNvbmxkLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGlic2Jnbi5qcy9zcmMvYW5ub3RhdGlvbi11dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9saWJzYmduLmpzL3NyYy9saWJzYmduLWFubm90YXRpb25zLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvc3JjL2xpYnNiZ24tcmVuZGVyLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvc3JjL2xpYnNiZ24uanMiLCJub2RlX21vZHVsZXMvbGlic2Jnbi5qcy9zcmMvdXRpbGl0aWVzLmpzIiwibm9kZV9tb2R1bGVzL24zL04zLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM0xleGVyLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM1BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9uMy9saWIvTjNTdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvbjMvbGliL04zU3RyZWFtV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM1V0aWwuanMiLCJub2RlX21vZHVsZXMvbjMvbGliL04zV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3ByZXR0eS1kYXRhL3ByZXR0eS1kYXRhLmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZGVjb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvYmxhbmstbm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2NsYXNzLW9yZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvY29sbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9kYXRhLWZhY3RvcnkuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9kZWZhdWx0LWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvZW1wdHkuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9mZXRjaGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvZm9ybXVsYS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvaW5kZXhlZC1mb3JtdWxhLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvanNvbnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2xpdGVyYWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9sb2cuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9uM3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL25hbWVkLW5vZGUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9uYW1lc3BhY2UuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9ub2RlLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvcGFyc2UuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9wYXRjaC1wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9xdWVyeS10by1zcGFycWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9xdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3JkZmFwYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9yZGZ4bWxwYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9zZXJpYWxpemUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9zZXJpYWxpemVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvc3BhcnFsLXRvLXF1ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvc3RhdGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvdXBkYXRlLW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi91cGRhdGVzLXZpYS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3VyaS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi92YXJpYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3hzZC5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbm9kZV9tb2R1bGVzL24zL2xpYi9OM0xleGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zU3RvcmUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1Xcml0ZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9kdXBsZXgtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NheC9saWIvc2F4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9jYXBhYmlsaXR5LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXNwb25zZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwibm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL2JvbS5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL2J1aWxkZXIuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL3Byb2Nlc3NvcnMuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi94bWwyanMuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvVXRpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxBdHRyaWJ1dGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ0RhdGEuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ29tbWVudC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEVERBdHRMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERUREVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRFRERW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERURE5vdGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERlY2xhcmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERvY1R5cGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRG9jdW1lbnRDQi5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTE5vZGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFJhdy5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxTdHJlYW1Xcml0ZXIuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MU3RyaW5nV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFN0cmluZ2lmaWVyLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFRleHQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MV3JpdGVyQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94bWxkb20vZG9tLXBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy94bWxkb20vZG9tLmpzIiwibm9kZV9tb2R1bGVzL3htbGRvbS9zYXguanMiLCJub2RlX21vZHVsZXMveG1saHR0cHJlcXVlc3QvbGliL1hNTEh0dHBSZXF1ZXN0LmpzIiwibm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsInBhY2thZ2UuanNvbiIsInNyYy9pbmRleC5qcyIsInNyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1pbnN0YW5jZS5qcyIsInNyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1yZW5kZXJlci5qcyIsInNyYy91dGlsaXRpZXMvY2xhc3Nlcy5qcyIsInNyYy91dGlsaXRpZXMvZWxlbWVudC11dGlsaXRpZXMuanMiLCJzcmMvdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9ncmFwaC11dGlsaXRpZXMuanMiLCJzcmMvdXRpbGl0aWVzL2pzb24tdG8tc2Jnbm1sLWNvbnZlcnRlci5qcyIsInNyYy91dGlsaXRpZXMva2V5Ym9hcmQtaW5wdXQtdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9saWItdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9tYWluLXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLWpzb24tY29udmVydGVyLmpzIiwic3JjL3V0aWxpdGllcy90ZXh0LXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvdWktdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy91bmRvLXJlZG8tYWN0aW9uLWZ1bmN0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbm1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1OEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvL1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNobEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4WkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2x4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcmhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaG5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4N0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9iQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDejdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzk3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFVBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOStCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9RQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN0UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbnNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXRDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDem5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1bUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Y0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0dkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyohXG4gKiBhc3luY1xuICogaHR0cHM6Ly9naXRodWIuY29tL2Nhb2xhbi9hc3luY1xuICpcbiAqIENvcHlyaWdodCAyMDEwLTIwMTQgQ2FvbGFuIE1jTWFob25cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG4vKmpzaGludCBvbmV2YXI6IGZhbHNlLCBpbmRlbnQ6NCAqL1xuLypnbG9iYWwgc2V0SW1tZWRpYXRlOiBmYWxzZSwgc2V0VGltZW91dDogZmFsc2UsIGNvbnNvbGU6IGZhbHNlICovXG4oZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIGFzeW5jID0ge307XG5cbiAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyXG4gICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jO1xuXG4gICAgcm9vdCA9IHRoaXM7XG4gICAgaWYgKHJvb3QgIT0gbnVsbCkge1xuICAgICAgcHJldmlvdXNfYXN5bmMgPSByb290LmFzeW5jO1xuICAgIH1cblxuICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYztcbiAgICAgICAgcmV0dXJuIGFzeW5jO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvbmx5X29uY2UoZm4pIHtcbiAgICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsYmFjayB3YXMgYWxyZWFkeSBjYWxsZWQuXCIpO1xuICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8vXG5cbiAgICB2YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuICAgIHZhciBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9O1xuXG4gICAgdmFyIF9lYWNoID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgX21hcCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yKSB7XG4gICAgICAgIGlmIChhcnIubWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyLm1hcChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHgsIGksIGEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICB2YXIgX3JlZHVjZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtZW1vKSB7XG4gICAgICAgIGlmIChhcnIucmVkdWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyLnJlZHVjZShpdGVyYXRvciwgbWVtbyk7XG4gICAgICAgIH1cbiAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkge1xuICAgICAgICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHgsIGksIGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcblxuICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cztcbiAgICB9O1xuXG4gICAgLy8vLyBleHBvcnRlZCBhc3luYyBtb2R1bGUgZnVuY3Rpb25zIC8vLy9cblxuICAgIC8vLy8gbmV4dFRpY2sgaW1wbGVtZW50YXRpb24gd2l0aCBicm93c2VyLWNvbXBhdGlibGUgZmFsbGJhY2sgLy8vL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIShwcm9jZXNzLm5leHRUaWNrKSkge1xuICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3luYy5uZXh0VGljayA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhc3luYy5uZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgIC8vIG5vdCBhIGRpcmVjdCBhbGlhcyBmb3IgSUUxMCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYy5lYWNoID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGlmICghYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7XG4gICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKHgsIG9ubHlfb25jZShkb25lKSApO1xuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDtcblxuICAgIGFzeW5jLmVhY2hTZXJpZXMgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29tcGxldGVkID0gMDtcbiAgICAgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdGVyYXRvcihhcnJbY29tcGxldGVkXSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaXRlcmF0ZSgpO1xuICAgIH07XG4gICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7XG5cbiAgICBhc3luYy5lYWNoTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmbiA9IF9lYWNoTGltaXQobGltaXQpO1xuICAgICAgICBmbi5hcHBseShudWxsLCBbYXJyLCBpdGVyYXRvciwgY2FsbGJhY2tdKTtcbiAgICB9O1xuICAgIGFzeW5jLmZvckVhY2hMaW1pdCA9IGFzeW5jLmVhY2hMaW1pdDtcblxuICAgIHZhciBfZWFjaExpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDtcbiAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDtcbiAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDtcblxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlcGxlbmlzaCAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgc3RhcnRlZCA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltzdGFydGVkIC0gMV0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsZW5pc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuXG4gICAgdmFyIGRvUGFyYWxsZWwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbYXN5bmMuZWFjaF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBkb1BhcmFsbGVsTGltaXQgPSBmdW5jdGlvbihsaW1pdCwgZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbX2VhY2hMaW1pdChsaW1pdCldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgZG9TZXJpZXMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbYXN5bmMuZWFjaFNlcmllc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG5cbiAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7XG4gICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAoZXJyLCB2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbeC5pbmRleF0gPSB2O1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApO1xuICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7XG4gICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgdmFyIF9tYXBMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBkb1BhcmFsbGVsTGltaXQobGltaXQsIF9hc3luY01hcCk7XG4gICAgfTtcblxuICAgIC8vIHJlZHVjZSBvbmx5IGhhcyBhIHNlcmllcyB2ZXJzaW9uLCBhcyBkb2luZyByZWR1Y2UgaW4gcGFyYWxsZWwgd29uJ3RcbiAgICAvLyB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy5cbiAgICBhc3luYy5yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IobWVtbywgeCwgZnVuY3Rpb24gKGVyciwgdikge1xuICAgICAgICAgICAgICAgIG1lbW8gPSB2O1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtZW1vKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBpbmplY3QgYWxpYXNcbiAgICBhc3luYy5pbmplY3QgPSBhc3luYy5yZWR1Y2U7XG4gICAgLy8gZm9sZGwgYWxpYXNcbiAgICBhc3luYy5mb2xkbCA9IGFzeW5jLnJlZHVjZTtcblxuICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0pLnJldmVyc2UoKTtcbiAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgLy8gZm9sZHIgYWxpYXNcbiAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0O1xuXG4gICAgdmFyIF9maWx0ZXIgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhc3luYy5maWx0ZXIgPSBkb1BhcmFsbGVsKF9maWx0ZXIpO1xuICAgIGFzeW5jLmZpbHRlclNlcmllcyA9IGRvU2VyaWVzKF9maWx0ZXIpO1xuICAgIC8vIHNlbGVjdCBhbGlhc1xuICAgIGFzeW5jLnNlbGVjdCA9IGFzeW5jLmZpbHRlcjtcbiAgICBhc3luYy5zZWxlY3RTZXJpZXMgPSBhc3luYy5maWx0ZXJTZXJpZXM7XG5cbiAgICB2YXIgX3JlamVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9O1xuICAgICAgICB9KTtcbiAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhc3luYy5yZWplY3QgPSBkb1BhcmFsbGVsKF9yZWplY3QpO1xuICAgIGFzeW5jLnJlamVjdFNlcmllcyA9IGRvU2VyaWVzKF9yZWplY3QpO1xuXG4gICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7XG4gICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7XG4gICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7XG5cbiAgICBhc3luYy5zb21lID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gYW55IGFsaWFzXG4gICAgYXN5bmMuYW55ID0gYXN5bmMuc29tZTtcblxuICAgIGFzeW5jLmV2ZXJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXYpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIGFsbCBhbGlhc1xuICAgIGFzeW5jLmFsbCA9IGFzeW5jLmV2ZXJ5O1xuXG4gICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXN5bmMuYXV0byA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgdmFyIGtleXMgPSBfa2V5cyh0YXNrcyk7XG4gICAgICAgIHZhciByZW1haW5pbmdUYXNrcyA9IGtleXMubGVuZ3RoXG4gICAgICAgIGlmICghcmVtYWluaW5nVGFza3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTtcblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107XG4gICAgICAgIHZhciBhZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoZm4pO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRhc2tDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlbWFpbmluZ1Rhc2tzLS1cbiAgICAgICAgICAgIF9lYWNoKGxpc3RlbmVycy5zbGljZSgwKSwgZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nVGFza3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGZpbmFsIGNhbGxiYWNrIGZyb20gY2FsbGluZyBpdHNlbGYgaWYgaXQgZXJyb3JzXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICAgICAgICAgIHRoZUNhbGxiYWNrKG51bGwsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSBfaXNBcnJheSh0YXNrc1trXSkgPyB0YXNrc1trXTogW3Rhc2tzW2tdXTtcbiAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJncztcbiAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTtcbiAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVhZHkoKSkge1xuICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnJldHJ5ID0gZnVuY3Rpb24odGltZXMsIHRhc2ssIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBERUZBVUxUX1RJTUVTID0gNTtcbiAgICAgICAgdmFyIGF0dGVtcHRzID0gW107XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0cyBpZiB0aW1lcyBub3QgcGFzc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdGltZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gdGFzaztcbiAgICAgICAgICAgIHRhc2sgPSB0aW1lcztcbiAgICAgICAgICAgIHRpbWVzID0gREVGQVVMVF9USU1FUztcbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgdGltZXMgaXMgYSBudW1iZXJcbiAgICAgICAgdGltZXMgPSBwYXJzZUludCh0aW1lcywgMTApIHx8IERFRkFVTFRfVElNRVM7XG4gICAgICAgIHZhciB3cmFwcGVkVGFzayA9IGZ1bmN0aW9uKHdyYXBwZWRDYWxsYmFjaywgd3JhcHBlZFJlc3VsdHMpIHtcbiAgICAgICAgICAgIHZhciByZXRyeUF0dGVtcHQgPSBmdW5jdGlvbih0YXNrLCBmaW5hbEF0dGVtcHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2VyaWVzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGFzayhmdW5jdGlvbihlcnIsIHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXNDYWxsYmFjayghZXJyIHx8IGZpbmFsQXR0ZW1wdCwge2VycjogZXJyLCByZXN1bHQ6IHJlc3VsdH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCB3cmFwcGVkUmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3aGlsZSAodGltZXMpIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0cy5wdXNoKHJldHJ5QXR0ZW1wdCh0YXNrLCAhKHRpbWVzLT0xKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN5bmMuc2VyaWVzKGF0dGVtcHRzLCBmdW5jdGlvbihkb25lLCBkYXRhKXtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICh3cmFwcGVkQ2FsbGJhY2sgfHwgY2FsbGJhY2spKGRhdGEuZXJyLCBkYXRhLnJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhIGNhbGxiYWNrIGlzIHBhc3NlZCwgcnVuIHRoaXMgYXMgYSBjb250cm9sbCBmbG93XG4gICAgICAgIHJldHVybiBjYWxsYmFjayA/IHdyYXBwZWRUYXNrKCkgOiB3cmFwcGVkVGFza1xuICAgIH07XG5cbiAgICBhc3luYy53YXRlcmZhbGwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGlmICghX2lzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gd2F0ZXJmYWxsIG11c3QgYmUgYW4gYXJyYXkgb2YgZnVuY3Rpb25zJyk7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cmFwSXRlcmF0b3IgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh3cmFwSXRlcmF0b3IobmV4dCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHdyYXBJdGVyYXRvcihhc3luYy5pdGVyYXRvcih0YXNrcykpKCk7XG4gICAgfTtcblxuICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBpZiAoX2lzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307XG4gICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGFzeW5jLnBhcmFsbGVsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IGFzeW5jLm1hcCwgZWFjaDogYXN5bmMuZWFjaCB9LCB0YXNrcywgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBhc3luYy5wYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24odGFza3MsIGxpbWl0LCBjYWxsYmFjaykge1xuICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IF9tYXBMaW1pdChsaW1pdCksIGVhY2g6IF9lYWNoTGltaXQobGltaXQpIH0sIHRhc2tzLCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgaWYgKF9pc0FycmF5KHRhc2tzKSkge1xuICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307XG4gICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJncztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYXN5bmMuaXRlcmF0b3IgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICAgICAgdmFyIG1ha2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza3NbaW5kZXhdLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmbi5uZXh0KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm4ubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4IDwgdGFza3MubGVuZ3RoIC0gMSkgPyBtYWtlQ2FsbGJhY2soaW5kZXggKyAxKTogbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZm47XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIGFzeW5jLmFwcGx5ID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShcbiAgICAgICAgICAgICAgICBudWxsLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgciA9IFtdO1xuICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHtcbiAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHtcbiAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7XG4gICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7XG5cbiAgICBhc3luYy53aGlsc3QgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0ZXN0KCkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3luYy53aGlsc3QodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBhc3luYy5kb1doaWxzdCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHtcbiAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgaWYgKHRlc3QuYXBwbHkobnVsbCwgYXJncykpIHtcbiAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnVudGlsID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRlc3QoKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzeW5jLnVudGlsKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYXN5bmMuZG9VbnRpbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHtcbiAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgaWYgKCF0ZXN0LmFwcGx5KG51bGwsIGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnF1ZXVlID0gZnVuY3Rpb24gKHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgICAgICAgaWYgKGNvbmN1cnJlbmN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBfaW5zZXJ0KHEsIGRhdGEsIHBvcywgY2FsbGJhY2spIHtcbiAgICAgICAgICBpZiAoIXEuc3RhcnRlZCl7XG4gICAgICAgICAgICBxLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAvLyBjYWxsIGRyYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyB0YXNrc1xuICAgICAgICAgICAgIHJldHVybiBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmIChxLmRyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykge1xuICAgICAgICAgICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIHEudGFza3MudW5zaGlmdChpdGVtKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxLnRhc2tzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAocS5zYXR1cmF0ZWQgJiYgcS50YXNrcy5sZW5ndGggPT09IHEuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgIHEuc2F0dXJhdGVkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHEucHJvY2Vzcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd29ya2VycyA9IDA7XG4gICAgICAgIHZhciBxID0ge1xuICAgICAgICAgICAgdGFza3M6IFtdLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLFxuICAgICAgICAgICAgZW1wdHk6IG51bGwsXG4gICAgICAgICAgICBkcmFpbjogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcGF1c2VkOiBmYWxzZSxcbiAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIGZhbHNlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2lsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBxLmRyYWluID0gbnVsbDtcbiAgICAgICAgICAgICAgcS50YXNrcyA9IFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFxLnBhdXNlZCAmJiB3b3JrZXJzIDwgcS5jb25jdXJyZW5jeSAmJiBxLnRhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHEudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHEuZW1wdHkgJiYgcS50YXNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHEuZW1wdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3b3JrZXJzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VycyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmNhbGxiYWNrLmFwcGx5KHRhc2ssIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5kcmFpbiAmJiBxLnRhc2tzLmxlbmd0aCArIHdvcmtlcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBxLnByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gb25seV9vbmNlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIodGFzay5kYXRhLCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBxLnRhc2tzLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBydW5uaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlcnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaWRsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXVzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChxLnBhdXNlZCA9PT0gdHJ1ZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBxLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEucGF1c2VkID09PSBmYWxzZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBxLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FsbCBxLnByb2Nlc3Mgb25jZSBwZXIgY29uY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHdvcmtlciB0byBwcmVzZXJ2ZSBmdWxsIGNvbmN1cnJlbmN5IGFmdGVyIHBhdXNlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDE7IHcgPD0gcS5jb25jdXJyZW5jeTsgdysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShxLnByb2Nlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfTtcblxuICAgIGFzeW5jLnByaW9yaXR5UXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkge1xuXG4gICAgICAgIGZ1bmN0aW9uIF9jb21wYXJlVGFza3MoYSwgYil7XG4gICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIF9iaW5hcnlTZWFyY2goc2VxdWVuY2UsIGl0ZW0sIGNvbXBhcmUpIHtcbiAgICAgICAgICB2YXIgYmVnID0gLTEsXG4gICAgICAgICAgICAgIGVuZCA9IHNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgd2hpbGUgKGJlZyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IGJlZyArICgoZW5kIC0gYmVnICsgMSkgPj4+IDEpO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoaXRlbSwgc2VxdWVuY2VbbWlkXSkgPj0gMCkge1xuICAgICAgICAgICAgICBiZWcgPSBtaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYmVnO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwcmlvcml0eSwgY2FsbGJhY2spIHtcbiAgICAgICAgICBpZiAoIXEuc3RhcnRlZCl7XG4gICAgICAgICAgICBxLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAvLyBjYWxsIGRyYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyB0YXNrc1xuICAgICAgICAgICAgIHJldHVybiBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmIChxLmRyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykge1xuICAgICAgICAgICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssXG4gICAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHksXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgcS50YXNrcy5zcGxpY2UoX2JpbmFyeVNlYXJjaChxLnRhc2tzLCBpdGVtLCBfY29tcGFyZVRhc2tzKSArIDEsIDAsIGl0ZW0pO1xuXG4gICAgICAgICAgICAgIGlmIChxLnNhdHVyYXRlZCAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gcS5jb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgICAgICAgcS5zYXR1cmF0ZWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHdpdGggYSBub3JtYWwgcXVldWVcbiAgICAgICAgdmFyIHEgPSBhc3luYy5xdWV1ZSh3b3JrZXIsIGNvbmN1cnJlbmN5KTtcblxuICAgICAgICAvLyBPdmVycmlkZSBwdXNoIHRvIGFjY2VwdCBzZWNvbmQgcGFyYW1ldGVyIHJlcHJlc2VudGluZyBwcmlvcml0eVxuICAgICAgICBxLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgcHJpb3JpdHksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgX2luc2VydChxLCBkYXRhLCBwcmlvcml0eSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlbW92ZSB1bnNoaWZ0IGZ1bmN0aW9uXG4gICAgICAgIGRlbGV0ZSBxLnVuc2hpZnQ7XG5cbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfTtcblxuICAgIGFzeW5jLmNhcmdvID0gZnVuY3Rpb24gKHdvcmtlciwgcGF5bG9hZCkge1xuICAgICAgICB2YXIgd29ya2luZyAgICAgPSBmYWxzZSxcbiAgICAgICAgICAgIHRhc2tzICAgICAgID0gW107XG5cbiAgICAgICAgdmFyIGNhcmdvID0ge1xuICAgICAgICAgICAgdGFza3M6IHRhc2tzLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCxcbiAgICAgICAgICAgIGVtcHR5OiBudWxsLFxuICAgICAgICAgICAgZHJhaW46IG51bGwsXG4gICAgICAgICAgICBkcmFpbmVkOiB0cnVlLFxuICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmdvLnNhdHVyYXRlZCAmJiB0YXNrcy5sZW5ndGggPT09IHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLnNhdHVyYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGNhcmdvLnByb2Nlc3MpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIHByb2Nlc3MoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGNhcmdvLmRyYWluICYmICFjYXJnby5kcmFpbmVkKSBjYXJnby5kcmFpbigpO1xuICAgICAgICAgICAgICAgICAgICBjYXJnby5kcmFpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0cyA9IHR5cGVvZiBwYXlsb2FkID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YXNrcy5zcGxpY2UoMCwgdGFza3MubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLmRhdGE7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgY2FyZ28uZW1wdHkoKTtcbiAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBfZWFjaCh0cywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jYWxsYmFjay5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY2FyZ287XG4gICAgfTtcblxuICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW25hbWVdKHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XSkpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpO1xuICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTtcbiAgICAvKmFzeW5jLmluZm8gPSBfY29uc29sZV9mbignaW5mbycpO1xuICAgIGFzeW5jLndhcm4gPSBfY29uc29sZV9mbignd2FybicpO1xuICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki9cblxuICAgIGFzeW5jLm1lbW9pemUgPSBmdW5jdGlvbiAoZm4sIGhhc2hlcikge1xuICAgICAgICB2YXIgbWVtbyA9IHt9O1xuICAgICAgICB2YXIgcXVldWVzID0ge307XG4gICAgICAgIGhhc2hlciA9IGhhc2hlciB8fCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB2YXIga2V5ID0gaGFzaGVyLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKGtleSBpbiBtZW1vKSB7XG4gICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykge1xuICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdO1xuICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcVtpXS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbWVtb2l6ZWQubWVtbyA9IG1lbW87XG4gICAgICAgIG1lbW9pemVkLnVubWVtb2l6ZWQgPSBmbjtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH07XG5cbiAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoZm4udW5tZW1vaXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGFzeW5jLnRpbWVzID0gZnVuY3Rpb24gKGNvdW50LCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvdW50ZXIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb3VudGVyLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzeW5jLm1hcChjb3VudGVyLCBpdGVyYXRvciwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb3VudGVyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY291bnRlci5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgYXN5bmMuc2VxID0gZnVuY3Rpb24gKC8qIGZ1bmN0aW9ucy4uLiAqLykge1xuICAgICAgICB2YXIgZm5zID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgICAgIGFzeW5jLnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHtcbiAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBuZXdhcmdzLmNvbmNhdChbZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICBjYihlcnIsIG5leHRhcmdzKTtcbiAgICAgICAgICAgICAgICB9XSkpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNhdChyZXN1bHRzKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHtcbiAgICAgIHJldHVybiBhc3luYy5zZXEuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFjaGZuLCBmbnMgLyphcmdzLi4uKi8pIHtcbiAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlvbiAoZm4sIGNiKSB7XG4gICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncy5jb25jYXQoW2NiXSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICAgICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ287XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jLmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7XG4gICAgYXN5bmMuYXBwbHlFYWNoU2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7XG5cbiAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm4obmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgIH07XG5cbiAgICAvLyBOb2RlLmpzXG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gYXN5bmM7XG4gICAgfVxuICAgIC8vIEFNRCAvIFJlcXVpcmVKU1xuICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnXG4gICAgZWxzZSB7XG4gICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYztcbiAgICB9XG5cbn0oKSk7XG4iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcbiIsbnVsbCwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG52YXIgcm9vdFBhcmVudCA9IHt9XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gU2FmYXJpIDUtNyBsYWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgYE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3JgIHByb3BlcnR5XG4gKiAgICAgb24gb2JqZWN0cy5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIGZ1bmN0aW9uIEJhciAoKSB7fVxuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgYXJyLmNvbnN0cnVjdG9yID0gQmFyXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgYXJyLmNvbnN0cnVjdG9yID09PSBCYXIgJiYgLy8gY29uc3RydWN0b3IgY2FuIGJlIHNldFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG4vKipcbiAqIENsYXNzOiBCdWZmZXJcbiAqID09PT09PT09PT09PT1cbiAqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGFyZSBhdWdtZW50ZWRcbiAqIHdpdGggZnVuY3Rpb24gcHJvcGVydGllcyBmb3IgYWxsIHRoZSBub2RlIGBCdWZmZXJgIEFQSSBmdW5jdGlvbnMuIFdlIHVzZVxuICogYFVpbnQ4QXJyYXlgIHNvIHRoYXQgc3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXQgcmV0dXJuc1xuICogYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogQnkgYXVnbWVudGluZyB0aGUgaW5zdGFuY2VzLCB3ZSBjYW4gYXZvaWQgbW9kaWZ5aW5nIHRoZSBgVWludDhBcnJheWBcbiAqIHByb3RvdHlwZS5cbiAqL1xuZnVuY3Rpb24gQnVmZmVyIChhcmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAvLyBBdm9pZCBnb2luZyB0aHJvdWdoIGFuIEFyZ3VtZW50c0FkYXB0b3JUcmFtcG9saW5lIGluIHRoZSBjb21tb24gY2FzZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHJldHVybiBuZXcgQnVmZmVyKGFyZywgYXJndW1lbnRzWzFdKVxuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZylcbiAgfVxuXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMsIGFyZylcbiAgfVxuXG4gIC8vIFNsaWdodGx5IGxlc3MgY29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoaXMsIGFyZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAndXRmOCcpXG4gIH1cblxuICAvLyBVbnVzdWFsLlxuICByZXR1cm4gZnJvbU9iamVjdCh0aGlzLCBhcmcpXG59XG5cbmZ1bmN0aW9uIGZyb21OdW1iZXIgKHRoYXQsIGxlbmd0aCkge1xuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGxlbmd0aCkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgLy8gQXNzdW1wdGlvbjogYnl0ZUxlbmd0aCgpIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPCBrTWF4TGVuZ3RoLlxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkpIHJldHVybiBmcm9tQnVmZmVyKHRoYXQsIG9iamVjdClcblxuICBpZiAoaXNBcnJheShvYmplY3QpKSByZXR1cm4gZnJvbUFycmF5KHRoYXQsIG9iamVjdClcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZycpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvYmplY3QuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tVHlwZWRBcnJheSh0aGF0LCBvYmplY3QpXG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCBvYmplY3QpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9iamVjdC5sZW5ndGgpIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iamVjdClcblxuICByZXR1cm4gZnJvbUpzb25PYmplY3QodGhhdCwgb2JqZWN0KVxufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyICh0aGF0LCBidWZmZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYnVmZmVyLmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGJ1ZmZlci5jb3B5KHRoYXQsIDAsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRHVwbGljYXRlIG9mIGZyb21BcnJheSgpIHRvIGtlZXAgZnJvbUFycmF5KCkgbW9ub21vcnBoaWMuXG5mdW5jdGlvbiBmcm9tVHlwZWRBcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgLy8gVHJ1bmNhdGluZyB0aGUgZWxlbWVudHMgaXMgcHJvYmFibHkgbm90IHdoYXQgcGVvcGxlIGV4cGVjdCBmcm9tIHR5cGVkXG4gIC8vIGFycmF5cyB3aXRoIEJZVEVTX1BFUl9FTEVNRU5UID4gMSBidXQgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yXG4gIC8vIG9mIHRoZSBvbGQgQnVmZmVyIGNvbnN0cnVjdG9yLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tVHlwZWRBcnJheSh0aGF0LCBuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIERlc2VyaWFsaXplIHsgdHlwZTogJ0J1ZmZlcicsIGRhdGE6IFsxLDIsMywuLi5dIH0gaW50byBhIEJ1ZmZlciBvYmplY3QuXG4vLyBSZXR1cm5zIGEgemVyby1sZW5ndGggYnVmZmVyIGZvciBpbnB1dHMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjLlxuZnVuY3Rpb24gZnJvbUpzb25PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICB2YXIgYXJyYXlcbiAgdmFyIGxlbmd0aCA9IDBcblxuICBpZiAob2JqZWN0LnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqZWN0LmRhdGEpKSB7XG4gICAgYXJyYXkgPSBvYmplY3QuZGF0YVxuICAgIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgfVxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxufSBlbHNlIHtcbiAgLy8gcHJlLXNldCBmb3IgdmFsdWVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBmdXR1cmVcbiAgQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSB1bmRlZmluZWRcbiAgQnVmZmVyLnByb3RvdHlwZS5wYXJlbnQgPSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gYWxsb2NhdGUgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGxlbmd0aCkpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhhdC5faXNCdWZmZXIgPSB0cnVlXG4gIH1cblxuICB2YXIgZnJvbVBvb2wgPSBsZW5ndGggIT09IDAgJiYgbGVuZ3RoIDw9IEJ1ZmZlci5wb29sU2l6ZSA+Pj4gMVxuICBpZiAoZnJvbVBvb2wpIHRoYXQucGFyZW50ID0gcm9vdFBhcmVudFxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAoc3ViamVjdCwgZW5jb2RpbmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNsb3dCdWZmZXIpKSByZXR1cm4gbmV3IFNsb3dCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG4gIGRlbGV0ZSBidWYucGFyZW50XG4gIHJldHVybiBidWZcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIHZhciBpID0gMFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgYnJlYWtcblxuICAgICsraVxuICB9XG5cbiAgaWYgKGkgIT09IGxlbikge1xuICAgIHggPSBhW2ldXG4gICAgeSA9IGJbaV1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMuJylcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldXG4gICAgaXRlbS5jb3B5KGJ1ZiwgcG9zKVxuICAgIHBvcyArPSBpdGVtLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHN0cmluZyA9ICcnICsgc3RyaW5nXG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgY2FzZSAncmF3cyc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgc3RhcnQgPSBzdGFydCB8IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBJbmZpbml0eSA/IHRoaXMubGVuZ3RoIDogZW5kIHwgMFxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG4gIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJ1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gMFxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYilcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0KSB7XG4gIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgYnl0ZU9mZnNldCA+Pj0gMFxuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG4gIGlmIChieXRlT2Zmc2V0ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gLTFcblxuICAvLyBOZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoICsgYnl0ZU9mZnNldCwgMClcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nIGFsd2F5cyBmYWlsc1xuICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIFsgdmFsIF0sIGJ5dGVPZmZzZXQpXG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0KSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltieXRlT2Zmc2V0ICsgaV0gPT09IHZhbFtmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleF0pIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWwubGVuZ3RoKSByZXR1cm4gYnl0ZU9mZnNldCArIGZvdW5kSW5kZXhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbi8vIGBnZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5nZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLnJlYWRVSW50OChvZmZzZXQpXG59XG5cbi8vIGBzZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0ICh2LCBvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5zZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLndyaXRlVUludDgodiwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3dhcCA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSBsZW5ndGggfCAwXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSBCdWZmZXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSlcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdCdWYubGVuZ3RoKSBuZXdCdWYucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpc1xuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYnVmZmVyIG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5fc2V0KHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSwgdGFyZ2V0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlCdWZmZXJgIHdpdGggdGhlICpjb3BpZWQqIG1lbW9yeSBvZiB0aGUgYnVmZmVyIGluc3RhbmNlLlxuICogQWRkZWQgaW4gTm9kZSAwLjEyLiBPbmx5IGF2YWlsYWJsZSBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgQXJyYXlCdWZmZXIuXG4gKi9cbkJ1ZmZlci5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIgKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gKG5ldyBCdWZmZXIodGhpcykpLmJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5sZW5ndGgpXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0J1ZmZlci50b0FycmF5QnVmZmVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJylcbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBCUCA9IEJ1ZmZlci5wcm90b3R5cGVcblxuLyoqXG4gKiBBdWdtZW50IGEgVWludDhBcnJheSAqaW5zdGFuY2UqIChub3QgdGhlIFVpbnQ4QXJyYXkgY2xhc3MhKSB3aXRoIEJ1ZmZlciBtZXRob2RzXG4gKi9cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIF9hdWdtZW50IChhcnIpIHtcbiAgYXJyLmNvbnN0cnVjdG9yID0gQnVmZmVyXG4gIGFyci5faXNCdWZmZXIgPSB0cnVlXG5cbiAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgVWludDhBcnJheSBzZXQgbWV0aG9kIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX3NldCA9IGFyci5zZXRcblxuICAvLyBkZXByZWNhdGVkXG4gIGFyci5nZXQgPSBCUC5nZXRcbiAgYXJyLnNldCA9IEJQLnNldFxuXG4gIGFyci53cml0ZSA9IEJQLndyaXRlXG4gIGFyci50b1N0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0xvY2FsZVN0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0pTT04gPSBCUC50b0pTT05cbiAgYXJyLmVxdWFscyA9IEJQLmVxdWFsc1xuICBhcnIuY29tcGFyZSA9IEJQLmNvbXBhcmVcbiAgYXJyLmluZGV4T2YgPSBCUC5pbmRleE9mXG4gIGFyci5jb3B5ID0gQlAuY29weVxuICBhcnIuc2xpY2UgPSBCUC5zbGljZVxuICBhcnIucmVhZFVJbnRMRSA9IEJQLnJlYWRVSW50TEVcbiAgYXJyLnJlYWRVSW50QkUgPSBCUC5yZWFkVUludEJFXG4gIGFyci5yZWFkVUludDggPSBCUC5yZWFkVUludDhcbiAgYXJyLnJlYWRVSW50MTZMRSA9IEJQLnJlYWRVSW50MTZMRVxuICBhcnIucmVhZFVJbnQxNkJFID0gQlAucmVhZFVJbnQxNkJFXG4gIGFyci5yZWFkVUludDMyTEUgPSBCUC5yZWFkVUludDMyTEVcbiAgYXJyLnJlYWRVSW50MzJCRSA9IEJQLnJlYWRVSW50MzJCRVxuICBhcnIucmVhZEludExFID0gQlAucmVhZEludExFXG4gIGFyci5yZWFkSW50QkUgPSBCUC5yZWFkSW50QkVcbiAgYXJyLnJlYWRJbnQ4ID0gQlAucmVhZEludDhcbiAgYXJyLnJlYWRJbnQxNkxFID0gQlAucmVhZEludDE2TEVcbiAgYXJyLnJlYWRJbnQxNkJFID0gQlAucmVhZEludDE2QkVcbiAgYXJyLnJlYWRJbnQzMkxFID0gQlAucmVhZEludDMyTEVcbiAgYXJyLnJlYWRJbnQzMkJFID0gQlAucmVhZEludDMyQkVcbiAgYXJyLnJlYWRGbG9hdExFID0gQlAucmVhZEZsb2F0TEVcbiAgYXJyLnJlYWRGbG9hdEJFID0gQlAucmVhZEZsb2F0QkVcbiAgYXJyLnJlYWREb3VibGVMRSA9IEJQLnJlYWREb3VibGVMRVxuICBhcnIucmVhZERvdWJsZUJFID0gQlAucmVhZERvdWJsZUJFXG4gIGFyci53cml0ZVVJbnQ4ID0gQlAud3JpdGVVSW50OFxuICBhcnIud3JpdGVVSW50TEUgPSBCUC53cml0ZVVJbnRMRVxuICBhcnIud3JpdGVVSW50QkUgPSBCUC53cml0ZVVJbnRCRVxuICBhcnIud3JpdGVVSW50MTZMRSA9IEJQLndyaXRlVUludDE2TEVcbiAgYXJyLndyaXRlVUludDE2QkUgPSBCUC53cml0ZVVJbnQxNkJFXG4gIGFyci53cml0ZVVJbnQzMkxFID0gQlAud3JpdGVVSW50MzJMRVxuICBhcnIud3JpdGVVSW50MzJCRSA9IEJQLndyaXRlVUludDMyQkVcbiAgYXJyLndyaXRlSW50TEUgPSBCUC53cml0ZUludExFXG4gIGFyci53cml0ZUludEJFID0gQlAud3JpdGVJbnRCRVxuICBhcnIud3JpdGVJbnQ4ID0gQlAud3JpdGVJbnQ4XG4gIGFyci53cml0ZUludDE2TEUgPSBCUC53cml0ZUludDE2TEVcbiAgYXJyLndyaXRlSW50MTZCRSA9IEJQLndyaXRlSW50MTZCRVxuICBhcnIud3JpdGVJbnQzMkxFID0gQlAud3JpdGVJbnQzMkxFXG4gIGFyci53cml0ZUludDMyQkUgPSBCUC53cml0ZUludDMyQkVcbiAgYXJyLndyaXRlRmxvYXRMRSA9IEJQLndyaXRlRmxvYXRMRVxuICBhcnIud3JpdGVGbG9hdEJFID0gQlAud3JpdGVGbG9hdEJFXG4gIGFyci53cml0ZURvdWJsZUxFID0gQlAud3JpdGVEb3VibGVMRVxuICBhcnIud3JpdGVEb3VibGVCRSA9IEJQLndyaXRlRG91YmxlQkVcbiAgYXJyLmZpbGwgPSBCUC5maWxsXG4gIGFyci5pbnNwZWN0ID0gQlAuaW5zcGVjdFxuICBhcnIudG9BcnJheUJ1ZmZlciA9IEJQLnRvQXJyYXlCdWZmZXJcblxuICByZXR1cm4gYXJyXG59XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMzAwXCI6IFwiTXVsdGlwbGUgQ2hvaWNlc1wiLFxuICBcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gIFwiMzAyXCI6IFwiTW92ZWQgVGVtcG9yYXJpbHlcIixcbiAgXCIzMDNcIjogXCJTZWUgT3RoZXJcIixcbiAgXCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcbiAgXCIzMDVcIjogXCJVc2UgUHJveHlcIixcbiAgXCIzMDdcIjogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgXCIzMDhcIjogXCJQZXJtYW5lbnQgUmVkaXJlY3RcIixcbiAgXCI0MDBcIjogXCJCYWQgUmVxdWVzdFwiLFxuICBcIjQwMVwiOiBcIlVuYXV0aG9yaXplZFwiLFxuICBcIjQwMlwiOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgXCI0MDNcIjogXCJGb3JiaWRkZW5cIixcbiAgXCI0MDRcIjogXCJOb3QgRm91bmRcIixcbiAgXCI0MDVcIjogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgXCI0MDZcIjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICBcIjQwN1wiOiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gIFwiNDA4XCI6IFwiUmVxdWVzdCBUaW1lLW91dFwiLFxuICBcIjQwOVwiOiBcIkNvbmZsaWN0XCIsXG4gIFwiNDEwXCI6IFwiR29uZVwiLFxuICBcIjQxMVwiOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICBcIjQxMlwiOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgXCI0MTNcIjogXCJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJSZXF1ZXN0LVVSSSBUb28gTGFyZ2VcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICBcIjQxOFwiOiBcIkknbSBhIHRlYXBvdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI1MDBcIjogXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIixcbiAgXCI1MDFcIjogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLFxuICBcIjUwM1wiOiBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIixcbiAgXCI1MDRcIjogXCJHYXRld2F5IFRpbWUtb3V0XCIsXG4gIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcbiAgXCI1MDZcIjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICBcIjUwN1wiOiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIFwiNTA5XCI6IFwiQmFuZHdpZHRoIExpbWl0IEV4Y2VlZGVkXCIsXG4gIFwiNTEwXCI6IFwiTm90IEV4dGVuZGVkXCIsXG4gIFwiNTExXCI6IFwiTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiXG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvKiFcbiAqIEBvdmVydmlldyBlczYtcHJvbWlzZSAtIGEgdGlueSBpbXBsZW1lbnRhdGlvbiBvZiBQcm9taXNlcy9BKy5cbiAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDE0IFllaHVkYSBLYXR6LCBUb20gRGFsZSwgU3RlZmFuIFBlbm5lciBhbmQgY29udHJpYnV0b3JzIChDb252ZXJzaW9uIHRvIEVTNiBBUEkgYnkgSmFrZSBBcmNoaWJhbGQpXG4gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlXG4gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vamFrZWFyY2hpYmFsZC9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICAyLjMuMFxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJG9iamVjdE9yRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZSh4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkgPSBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGFyZykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW5dID0gY2FsbGJhY2s7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArIDFdID0gYXJnO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArPSAyO1xuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPT09IDIpIHtcbiAgICAgICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgICAgICAvLyBJZiBhZGRpdGlvbmFsIGNhbGxiYWNrcyBhcmUgcXVldWVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCwgdGhleVxuICAgICAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4obGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4gPSBzY2hlZHVsZUZuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwKGFzYXBGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBhc2FwRm47XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyB8fCB7fTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuICAgIC8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuICAgIC8vIG5vZGVcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKSB7XG4gICAgICB2YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xuICAgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5XG4gICAgICAvLyBzZXRJbW1lZGlhdGUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBpbnN0ZWFkXG4gICAgICB2YXIgdmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5tYXRjaCgvXig/OihcXGQrKVxcLik/KD86KFxcZCspXFwuKT8oXFwqfFxcZCspJC8pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmVyc2lvbikgJiYgdmVyc2lvblsxXSA9PT0gJzAnICYmIHZlcnNpb25bMl0gPT09ICcxMCcpIHtcbiAgICAgICAgbmV4dFRpY2sgPSBzZXRJbW1lZGlhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5leHRUaWNrKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHZlcnR4XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5vZGUuZGF0YSA9IChpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHdlYiB3b3JrZXJcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2g7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gsIDEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbjsgaSs9Mikge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV07XG4gICAgICAgIHZhciBhcmcgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXTtcblxuICAgICAgICBjYWxsYmFjayhhcmcpO1xuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydGV4KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHIgPSByZXF1aXJlO1xuICAgICAgICB2YXIgdmVydHggPSByKCd2ZXJ0eCcpO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoO1xuICAgIC8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG4gICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0ZXgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AoKSB7fVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgICA9IHZvaWQgMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEID0gMTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgID0gMjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGdldFRoZW4ocHJvbWlzZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSwgdGhlbikge1xuICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgICAgdmFyIHNlYWxlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3IgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG5cbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTtcblxuICAgICAgICBpZiAoIXNlYWxlZCAmJiBlcnJvcikge1xuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgICAgIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZSh0aGVuYWJsZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKSB7XG4gICAgICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0aGVuID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihtYXliZVRoZW5hYmxlKTtcblxuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSB2YWx1ZS5lcnJvcjtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgICBlbnVtZXJhdG9yLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl92YWxpZGF0ZUlucHV0KGlucHV0KSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9pbnB1dCAgICAgPSBpbnB1dDtcbiAgICAgICAgZW51bWVyYXRvci5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgICAgZW51bWVyYXRvci5faW5pdCgpO1xuXG4gICAgICAgIGlmIChlbnVtZXJhdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IubGVuZ3RoID0gZW51bWVyYXRvci5sZW5ndGggfHwgMDtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9lbnVtZXJhdGUoKTtcbiAgICAgICAgICBpZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3ZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlSW5wdXQgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShpbnB1dCk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcjtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIHZhciBsZW5ndGggID0gZW51bWVyYXRvci5sZW5ndGg7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcbiAgICAgIHZhciBpbnB1dCAgID0gZW51bWVyYXRvci5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW51bWVyYXRvci5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuICAgICAgdmFyIGMgPSBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoZW50cnkpKSB7XG4gICAgICAgIGlmIChlbnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICBlbnRyeS5fb25lcnJvciA9IG51bGw7XG4gICAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRyeSksIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmctLTtcbiAgICAgICAgZW51bWVyYXRvci5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24oc3RhdGUsIGksIHZhbHVlKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3dpbGxTZXR0bGVBdCA9IGZ1bmN0aW9uKHByb21pc2UsIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCwgaSwgdmFsdWUpO1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGwoZW50cmllcykge1xuICAgICAgcmV0dXJuIG5ldyBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCh0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGw7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZShlbnRyaWVzKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuJykpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxtZW50KHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmUob2JqZWN0KSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdChyZWFzb24pIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3Q7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZTtcbiAgICAvKipcbiAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoXG4gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb25cbiAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBUZXJtaW5vbG9neVxuICAgICAgLS0tLS0tLS0tLS1cblxuICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC5cbiAgICAgIC0gYHZhbHVlYCBpcyBhbnkgbGVnYWwgSmF2YVNjcmlwdCB2YWx1ZSAoaW5jbHVkaW5nIHVuZGVmaW5lZCwgYSB0aGVuYWJsZSwgb3IgYSBwcm9taXNlKS5cbiAgICAgIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLlxuICAgICAgLSBgc2V0dGxlZGAgdGhlIGZpbmFsIHJlc3Rpbmcgc3RhdGUgb2YgYSBwcm9taXNlLCBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWRcbiAgICAgIHN0YXRlLiAgUHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFyZSBpbiB0aGVcbiAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gICAgICBQcm9taXNlcyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGFcbiAgICAgIHByb21pc2UsIHRoZW4gdGhlIG9yaWdpbmFsIHByb21pc2UncyBzZXR0bGVkIHN0YXRlIHdpbGwgbWF0Y2ggdGhlIHZhbHVlJ3NcbiAgICAgIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbFxuICAgICAgaXRzZWxmIGZ1bGZpbGwuXG5cblxuICAgICAgQmFzaWMgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgYGBganNcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gb24gZmFpbHVyZVxuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXNcbiAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICAgICAgYGBganNcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpXG4gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7XG4gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTlxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAY2xhc3MgUHJvbWlzZVxuICAgICAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX2lkID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIrKztcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHJlc29sdmVyKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UpKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZSh0aGlzLCByZXNvbHZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuYWxsID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJhY2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlc29sdmUgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlamVjdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcjtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0QXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9hc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXA7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UsXG5cbiAgICAvKipcbiAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgICAgd2hpY2ggcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGVcbiAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGVcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBDaGFpbmluZ1xuICAgICAgLS0tLS0tLS1cblxuICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICAgIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1lbnRcbiAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiB1c2VyLm5hbWU7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7XG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXRcbiAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgICB9KTtcblxuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScuXG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgICAgfSk7XG4gICAgICBgYGBcbiAgICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFzc2ltaWxhdGlvblxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlXG4gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWplY3QuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBTaW1wbGUgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcbiAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciBhdXRob3IsIGJvb2tzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7XG4gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcblxuICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykge1xuXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7XG5cbiAgICAgIH1cblxuICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kQXV0aG9yKCkuXG4gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgICAgICAvLyBmb3VuZCBib29rc1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgdGhlblxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWRcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBwYXJlbnQuX3N0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAmJiAhb25SZWplY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgICB2YXIgcmVzdWx0ID0gcGFyZW50Ll9yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzW3N0YXRlIC0gMV07XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHN0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH0sXG5cbiAgICAvKipcbiAgICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICAgIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBmaW5kQXV0aG9yKCl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgICAgfVxuXG4gICAgICAvLyBzeW5jaHJvbm91c1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmluZEF1dGhvcigpO1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH1cblxuICAgICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgICAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIGNhdGNoXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IGdsb2JhbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgICBpZiAoUCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvY2FsLlByb21pc2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGw7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZSA9IHtcbiAgICAgICdQcm9taXNlJzogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1snRVM2UHJvbWlzZSddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQoKTtcbn0pLmNhbGwodGhpcyk7XG5cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IDA7XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW1pdHRlci5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSAxO1xuICBlbHNlXG4gICAgcmV0ID0gZW1pdHRlci5fZXZlbnRzW3R5cGVdLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIlxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2ggKG9iaiwgZm4sIGN0eCkge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKGZuKSAhPT0gJ1tvYmplY3QgRnVuY3Rpb25dJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIGwgPSBvYmoubGVuZ3RoO1xuICAgIGlmIChsID09PSArbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIG9ialtpXSwgaSwgb2JqKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY3R4LCBvYmpba10sIGssIG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4iLCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxudmFyIGh0dHBzID0gbW9kdWxlLmV4cG9ydHM7XG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gICAgaWYgKGh0dHAuaGFzT3duUHJvcGVydHkoa2V5KSkgaHR0cHNba2V5XSA9IGh0dHBba2V5XTtcbn07XG5cbmh0dHBzLnJlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYikge1xuICAgIGlmICghcGFyYW1zKSBwYXJhbXMgPSB7fTtcbiAgICBwYXJhbXMuc2NoZW1lID0gJ2h0dHBzJztcbiAgICBwYXJhbXMucHJvdG9jb2wgPSAnaHR0cHM6JztcbiAgICByZXR1cm4gaHR0cC5yZXF1ZXN0LmNhbGwodGhpcywgcGFyYW1zLCBjYik7XG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTsiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIi8vIElnbm9yZSBtb2R1bGUgZm9yIGJyb3dzZXJpZnkgKHNlZSBwYWNrYWdlLmpzb24pIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpTT04tTEQgQVBJLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQGxpY2Vuc2UgQlNEIDMtQ2xhdXNlIExpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBEaWdpdGFsIEJhemFhciwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTXG4gKiBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuKGZ1bmN0aW9uKCkge1xuXG4vLyBkZXRlcm1pbmUgaWYgaW4tYnJvd3NlciBvciB1c2luZyBub2RlLmpzXG52YXIgX25vZGVqcyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcbnZhciBfYnJvd3NlciA9ICFfbm9kZWpzICYmXG4gICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpO1xuaWYoX2Jyb3dzZXIpIHtcbiAgaWYodHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZ2xvYmFsID0gd2luZG93O1xuICAgIH0gZWxzZSBpZih0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGdsb2JhbCA9IHNlbGY7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiAkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZ2xvYmFsID0gJDtcbiAgICB9XG4gIH1cbn1cblxuLy8gYXR0YWNoZXMganNvbmxkIEFQSSB0byB0aGUgZ2l2ZW4gb2JqZWN0XG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uKGpzb25sZCkge1xuXG4vKiBDb3JlIEFQSSAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIEpTT04tTEQgY29tcGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQgdG8gY29tcGFjdC5cbiAqIEBwYXJhbSBjdHggdGhlIGNvbnRleHQgdG8gY29tcGFjdCB3aXRoLlxuICogQHBhcmFtIFtvcHRpb25zXSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2NvbXBhY3RBcnJheXNdIHRydWUgdG8gY29tcGFjdCBhcnJheXMgdG8gc2luZ2xlIHZhbHVlcyB3aGVuXG4gKiAgICAgICAgICAgIGFwcHJvcHJpYXRlLCBmYWxzZSBub3QgdG8gKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW2dyYXBoXSB0cnVlIHRvIGFsd2F5cyBvdXRwdXQgYSB0b3AtbGV2ZWwgZ3JhcGggKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbc2tpcEV4cGFuc2lvbl0gdHJ1ZSB0byBhc3N1bWUgdGhlIGlucHV0IGlzIGV4cGFuZGVkIGFuZCBza2lwXG4gKiAgICAgICAgICAgIGV4cGFuc2lvbiwgZmFsc2Ugbm90IHRvLCBkZWZhdWx0cyB0byBmYWxzZS5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBjb21wYWN0ZWQsIGN0eCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5jb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNvbXBhY3QsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmKGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdUaGUgY29tcGFjdGlvbiBjb250ZXh0IG11c3Qgbm90IGJlIG51bGwuJyxcbiAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgbG9jYWwgY29udGV4dCd9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBub3RoaW5nIHRvIGNvbXBhY3RcbiAgaWYoaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmKCEoJ2Jhc2UnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5iYXNlID0gKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpID8gaW5wdXQgOiAnJztcbiAgfVxuICBpZighKCdjb21wYWN0QXJyYXlzJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuY29tcGFjdEFycmF5cyA9IHRydWU7XG4gIH1cbiAgaWYoISgnZ3JhcGgnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5ncmFwaCA9IGZhbHNlO1xuICB9XG4gIGlmKCEoJ3NraXBFeHBhbnNpb24nIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5za2lwRXhwYW5zaW9uID0gZmFsc2U7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cbiAgaWYoISgnbGluaycgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmxpbmsgPSBmYWxzZTtcbiAgfVxuICBpZihvcHRpb25zLmxpbmspIHtcbiAgICAvLyBmb3JjZSBza2lwIGV4cGFuc2lvbiB3aGVuIGxpbmtpbmcsIFwibGlua1wiIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWNcbiAgICAvLyBBUEksIGl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGZyYW1pbmdcbiAgICBvcHRpb25zLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICB9XG5cbiAgdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmKG9wdGlvbnMuc2tpcEV4cGFuc2lvbikge1xuICAgICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgaW5wdXQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGpzb25sZC5leHBhbmQoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfTtcblxuICAvLyBleHBhbmQgaW5wdXQgdGhlbiBkbyBjb21wYWN0aW9uXG4gIGV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBleHBhbmRlZCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIGNvbXBhY3Rpb24uJyxcbiAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzIGNvbnRleHRcbiAgICB2YXIgYWN0aXZlQ3R4ID0gX2dldEluaXRpYWxDb250ZXh0KG9wdGlvbnMpO1xuICAgIGpzb25sZC5wcm9jZXNzQ29udGV4dChhY3RpdmVDdHgsIGN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBhY3RpdmVDdHgpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgcHJvY2VzcyBjb250ZXh0IGJlZm9yZSBjb21wYWN0aW9uLicsXG4gICAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBhY3RlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGRvIGNvbXBhY3Rpb25cbiAgICAgICAgY29tcGFjdGVkID0gbmV3IFByb2Nlc3NvcigpLmNvbXBhY3QoYWN0aXZlQ3R4LCBudWxsLCBleHBhbmRlZCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXAobnVsbCwgY29tcGFjdGVkLCBhY3RpdmVDdHgsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBwZXJmb3JtcyBjbGVhbiB1cCBhZnRlciBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGNsZWFudXAoZXJyLCBjb21wYWN0ZWQsIGFjdGl2ZUN0eCwgb3B0aW9ucykge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgaWYob3B0aW9ucy5jb21wYWN0QXJyYXlzICYmICFvcHRpb25zLmdyYXBoICYmIF9pc0FycmF5KGNvbXBhY3RlZCkpIHtcbiAgICAgIGlmKGNvbXBhY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gc2ltcGxpZnkgdG8gYSBzaW5nbGUgaXRlbVxuICAgICAgICBjb21wYWN0ZWQgPSBjb21wYWN0ZWRbMF07XG4gICAgICB9IGVsc2UgaWYoY29tcGFjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBzaW1wbGlmeSB0byBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgY29tcGFjdGVkID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG9wdGlvbnMuZ3JhcGggJiYgX2lzT2JqZWN0KGNvbXBhY3RlZCkpIHtcbiAgICAgIC8vIGFsd2F5cyB1c2UgYXJyYXkgaWYgZ3JhcGggb3B0aW9uIGlzIG9uXG4gICAgICBjb21wYWN0ZWQgPSBbY29tcGFjdGVkXTtcbiAgICB9XG5cbiAgICAvLyBmb2xsb3cgQGNvbnRleHQga2V5XG4gICAgaWYoX2lzT2JqZWN0KGN0eCkgJiYgJ0Bjb250ZXh0JyBpbiBjdHgpIHtcbiAgICAgIGN0eCA9IGN0eFsnQGNvbnRleHQnXTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCBvdXRwdXQgY29udGV4dFxuICAgIGN0eCA9IF9jbG9uZShjdHgpO1xuICAgIGlmKCFfaXNBcnJheShjdHgpKSB7XG4gICAgICBjdHggPSBbY3R4XTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIGVtcHR5IGNvbnRleHRzXG4gICAgdmFyIHRtcCA9IGN0eDtcbiAgICBjdHggPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZighX2lzT2JqZWN0KHRtcFtpXSkgfHwgT2JqZWN0LmtleXModG1wW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGN0eC5wdXNoKHRtcFtpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGFycmF5IGlmIG9ubHkgb25lIGNvbnRleHRcbiAgICB2YXIgaGFzQ29udGV4dCA9IChjdHgubGVuZ3RoID4gMCk7XG4gICAgaWYoY3R4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY3R4ID0gY3R4WzBdO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb250ZXh0IGFuZC9vciBAZ3JhcGhcbiAgICBpZihfaXNBcnJheShjb21wYWN0ZWQpKSB7XG4gICAgICAvLyB1c2UgJ0BncmFwaCcga2V5d29yZFxuICAgICAgdmFyIGt3Z3JhcGggPSBfY29tcGFjdElyaShhY3RpdmVDdHgsICdAZ3JhcGgnKTtcbiAgICAgIHZhciBncmFwaCA9IGNvbXBhY3RlZDtcbiAgICAgIGNvbXBhY3RlZCA9IHt9O1xuICAgICAgaWYoaGFzQ29udGV4dCkge1xuICAgICAgICBjb21wYWN0ZWRbJ0Bjb250ZXh0J10gPSBjdHg7XG4gICAgICB9XG4gICAgICBjb21wYWN0ZWRba3dncmFwaF0gPSBncmFwaDtcbiAgICB9IGVsc2UgaWYoX2lzT2JqZWN0KGNvbXBhY3RlZCkgJiYgaGFzQ29udGV4dCkge1xuICAgICAgLy8gcmVvcmRlciBrZXlzIHNvIEBjb250ZXh0IGlzIGZpcnN0XG4gICAgICB2YXIgZ3JhcGggPSBjb21wYWN0ZWQ7XG4gICAgICBjb21wYWN0ZWQgPSB7J0Bjb250ZXh0JzogY3R4fTtcbiAgICAgIGZvcih2YXIga2V5IGluIGdyYXBoKSB7XG4gICAgICAgIGNvbXBhY3RlZFtrZXldID0gZ3JhcGhba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQsIGFjdGl2ZUN0eCk7XG4gIH1cbn07XG5cbi8qKlxuICogUGVyZm9ybXMgSlNPTi1MRCBleHBhbnNpb24uXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0IHRvIGV4cGFuZC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2Jhc2VdIHRoZSBiYXNlIElSSSB0byB1c2UuXG4gKiAgICAgICAgICBbZXhwYW5kQ29udGV4dF0gYSBjb250ZXh0IHRvIGV4cGFuZCB3aXRoLlxuICogICAgICAgICAgW2tlZXBGcmVlRmxvYXRpbmdOb2Rlc10gdHJ1ZSB0byBrZWVwIGZyZWUtZmxvYXRpbmcgbm9kZXMsXG4gKiAgICAgICAgICAgIGZhbHNlIG5vdCB0bywgZGVmYXVsdHMgdG8gZmFsc2UuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZXhwYW5kZWQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQuZXhwYW5kID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBleHBhbmQsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cbiAgaWYoISgna2VlcEZyZWVGbG9hdGluZ05vZGVzJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMua2VlcEZyZWVGbG9hdGluZ05vZGVzID0gZmFsc2U7XG4gIH1cblxuICBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgLy8gaWYgaW5wdXQgaXMgYSBzdHJpbmcsIGF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgcmVtb3RlIGRvY3VtZW50XG4gICAgaWYodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRvbmUgPSBmdW5jdGlvbihlcnIsIHJlbW90ZURvYykge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmKCFyZW1vdGVEb2MuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICAgJ05vIHJlbW90ZSBkb2N1bWVudCBmb3VuZCBhdCB0aGUgZ2l2ZW4gVVJMLicsXG4gICAgICAgICAgICAgICdqc29ubGQuTnVsbFJlbW90ZURvY3VtZW50Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHR5cGVvZiByZW1vdGVEb2MuZG9jdW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZW1vdGVEb2MuZG9jdW1lbnQgPSBKU09OLnBhcnNlKHJlbW90ZURvYy5kb2N1bWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdDb3VsZCBub3QgcmV0cmlldmUgYSBKU09OLUxEIGRvY3VtZW50IGZyb20gdGhlIFVSTC4gVVJMICcgK1xuICAgICAgICAgICAgJ2RlcmVmZXJlbmNpbmcgbm90IGltcGxlbWVudGVkLicsICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLCB7XG4gICAgICAgICAgICAgIGNvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsXG4gICAgICAgICAgICAgIGNhdXNlOiBleCxcbiAgICAgICAgICAgICAgcmVtb3RlRG9jOiByZW1vdGVEb2NcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwYW5kKHJlbW90ZURvYyk7XG4gICAgICB9O1xuICAgICAgdmFyIHByb21pc2UgPSBvcHRpb25zLmRvY3VtZW50TG9hZGVyKGlucHV0LCBkb25lKTtcbiAgICAgIGlmKHByb21pc2UgJiYgJ3RoZW4nIGluIHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKGRvbmUuYmluZChudWxsLCBudWxsKSwgZG9uZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIG5vdGhpbmcgdG8gbG9hZFxuICAgIGV4cGFuZCh7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IG51bGwsIGRvY3VtZW50OiBpbnB1dH0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBleHBhbmQocmVtb3RlRG9jKSB7XG4gICAgLy8gc2V0IGRlZmF1bHQgYmFzZVxuICAgIGlmKCEoJ2Jhc2UnIGluIG9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zLmJhc2UgPSByZW1vdGVEb2MuZG9jdW1lbnRVcmwgfHwgJyc7XG4gICAgfVxuICAgIC8vIGJ1aWxkIG1ldGEtb2JqZWN0IGFuZCByZXRyaWV2ZSBhbGwgQGNvbnRleHQgVVJMc1xuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGRvY3VtZW50OiBfY2xvbmUocmVtb3RlRG9jLmRvY3VtZW50KSxcbiAgICAgIHJlbW90ZUNvbnRleHQ6IHsnQGNvbnRleHQnOiByZW1vdGVEb2MuY29udGV4dFVybH1cbiAgICB9O1xuICAgIGlmKCdleHBhbmRDb250ZXh0JyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgZXhwYW5kQ29udGV4dCA9IF9jbG9uZShvcHRpb25zLmV4cGFuZENvbnRleHQpO1xuICAgICAgaWYodHlwZW9mIGV4cGFuZENvbnRleHQgPT09ICdvYmplY3QnICYmICdAY29udGV4dCcgaW4gZXhwYW5kQ29udGV4dCkge1xuICAgICAgICBpbnB1dC5leHBhbmRDb250ZXh0ID0gZXhwYW5kQ29udGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LmV4cGFuZENvbnRleHQgPSB7J0Bjb250ZXh0JzogZXhwYW5kQ29udGV4dH07XG4gICAgICB9XG4gICAgfVxuICAgIF9yZXRyaWV2ZUNvbnRleHRVcmxzKGlucHV0LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGlucHV0KSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHZhciBleHBhbmRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc29yKCk7XG4gICAgICAgIHZhciBhY3RpdmVDdHggPSBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucyk7XG4gICAgICAgIHZhciBkb2N1bWVudCA9IGlucHV0LmRvY3VtZW50O1xuICAgICAgICB2YXIgcmVtb3RlQ29udGV4dCA9IGlucHV0LnJlbW90ZUNvbnRleHRbJ0Bjb250ZXh0J107XG5cbiAgICAgICAgLy8gcHJvY2VzcyBvcHRpb25hbCBleHBhbmRDb250ZXh0XG4gICAgICAgIGlmKGlucHV0LmV4cGFuZENvbnRleHQpIHtcbiAgICAgICAgICBhY3RpdmVDdHggPSBwcm9jZXNzb3IucHJvY2Vzc0NvbnRleHQoXG4gICAgICAgICAgICBhY3RpdmVDdHgsIGlucHV0LmV4cGFuZENvbnRleHRbJ0Bjb250ZXh0J10sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJvY2VzcyByZW1vdGUgY29udGV4dCBmcm9tIEhUVFAgTGluayBIZWFkZXJcbiAgICAgICAgaWYocmVtb3RlQ29udGV4dCkge1xuICAgICAgICAgIGFjdGl2ZUN0eCA9IHByb2Nlc3Nvci5wcm9jZXNzQ29udGV4dChcbiAgICAgICAgICAgIGFjdGl2ZUN0eCwgcmVtb3RlQ29udGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBleHBhbmQgZG9jdW1lbnRcbiAgICAgICAgZXhwYW5kZWQgPSBwcm9jZXNzb3IuZXhwYW5kKFxuICAgICAgICAgIGFjdGl2ZUN0eCwgbnVsbCwgZG9jdW1lbnQsIG9wdGlvbnMsIGZhbHNlKTtcblxuICAgICAgICAvLyBvcHRpbWl6ZSBhd2F5IEBncmFwaCB3aXRoIG5vIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgaWYoX2lzT2JqZWN0KGV4cGFuZGVkKSAmJiAoJ0BncmFwaCcgaW4gZXhwYW5kZWQpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoZXhwYW5kZWQpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWRbJ0BncmFwaCddO1xuICAgICAgICB9IGVsc2UgaWYoZXhwYW5kZWQgPT09IG51bGwpIHtcbiAgICAgICAgICBleHBhbmRlZCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9ybWFsaXplIHRvIGFuIGFycmF5XG4gICAgICAgIGlmKCFfaXNBcnJheShleHBhbmRlZCkpIHtcbiAgICAgICAgICBleHBhbmRlZCA9IFtleHBhbmRlZF07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGV4cGFuZGVkKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBKU09OLUxEIGZsYXR0ZW5pbmcuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY3R4IHRoZSBjb250ZXh0IHRvIHVzZSB0byBjb21wYWN0IHRoZSBmbGF0dGVuZWQgb3V0cHV0LCBvciBudWxsLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbYmFzZV0gdGhlIGJhc2UgSVJJIHRvIHVzZS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZmxhdHRlbmVkKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCwgY3R4LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZmxhdHRlbiwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH0gZWxzZSBpZih0eXBlb2YgY3R4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBjdHg7XG4gICAgY3R4ID0gbnVsbDtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBmbGF0dGVuaW5nLicsXG4gICAgICAgICdqc29ubGQuRmxhdHRlbkVycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgfVxuXG4gICAgdmFyIGZsYXR0ZW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gZG8gZmxhdHRlbmluZ1xuICAgICAgZmxhdHRlbmVkID0gbmV3IFByb2Nlc3NvcigpLmZsYXR0ZW4oX2lucHV0KTtcbiAgICB9IGNhdGNoKGV4KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXgpO1xuICAgIH1cblxuICAgIGlmKGN0eCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGZsYXR0ZW5lZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcGFjdCByZXN1bHQgKGZvcmNlIEBncmFwaCBvcHRpb24gdG8gdHJ1ZSwgc2tpcCBleHBhbnNpb24pXG4gICAgb3B0aW9ucy5ncmFwaCA9IHRydWU7XG4gICAgb3B0aW9ucy5za2lwRXhwYW5zaW9uID0gdHJ1ZTtcbiAgICBqc29ubGQuY29tcGFjdChmbGF0dGVuZWQsIGN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBjb21wYWN0ZWQpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgY29tcGFjdCBmbGF0dGVuZWQgb3V0cHV0LicsXG4gICAgICAgICAgJ2pzb25sZC5GbGF0dGVuRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGNvbXBhY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBKU09OLUxEIGZyYW1pbmcuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0IHRvIGZyYW1lLlxuICogQHBhcmFtIGZyYW1lIHRoZSBKU09OLUxEIGZyYW1lIHRvIHVzZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIGZyYW1pbmcgb3B0aW9ucy5cbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtlbWJlZF0gZGVmYXVsdCBAZW1iZWQgZmxhZzogJ0BsYXN0JywgJ0BhbHdheXMnLCAnQG5ldmVyJywgJ0BsaW5rJ1xuICogICAgICAgICAgICAoZGVmYXVsdDogJ0BsYXN0JykuXG4gKiAgICAgICAgICBbZXhwbGljaXRdIGRlZmF1bHQgQGV4cGxpY2l0IGZsYWcgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtyZXF1aXJlQWxsXSBkZWZhdWx0IEByZXF1aXJlQWxsIGZsYWcgKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW29taXREZWZhdWx0XSBkZWZhdWx0IEBvbWl0RGVmYXVsdCBmbGFnIChkZWZhdWx0OiBmYWxzZSkuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZnJhbWVkKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmZyYW1lID0gZnVuY3Rpb24oaW5wdXQsIGZyYW1lLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZnJhbWUsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnYmFzZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmJhc2UgPSAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgPyBpbnB1dCA6ICcnO1xuICB9XG4gIGlmKCEoJ2RvY3VtZW50TG9hZGVyJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZG9jdW1lbnRMb2FkZXIgPSBqc29ubGQubG9hZERvY3VtZW50O1xuICB9XG4gIGlmKCEoJ2VtYmVkJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZW1iZWQgPSAnQGxhc3QnO1xuICB9XG4gIG9wdGlvbnMuZXhwbGljaXQgPSBvcHRpb25zLmV4cGxpY2l0IHx8IGZhbHNlO1xuICBpZighKCdyZXF1aXJlQWxsJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMucmVxdWlyZUFsbCA9IHRydWU7XG4gIH1cbiAgb3B0aW9ucy5vbWl0RGVmYXVsdCA9IG9wdGlvbnMub21pdERlZmF1bHQgfHwgZmFsc2U7XG5cbiAganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIC8vIGlmIGZyYW1lIGlzIGEgc3RyaW5nLCBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIHJlbW90ZSBkb2N1bWVudFxuICAgIGlmKHR5cGVvZiBmcmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBkb25lID0gZnVuY3Rpb24oZXJyLCByZW1vdGVEb2MpIHtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZighcmVtb3RlRG9jLmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdObyByZW1vdGUgZG9jdW1lbnQgZm91bmQgYXQgdGhlIGdpdmVuIFVSTC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLk51bGxSZW1vdGVEb2N1bWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0eXBlb2YgcmVtb3RlRG9jLmRvY3VtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVtb3RlRG9jLmRvY3VtZW50ID0gSlNPTi5wYXJzZShyZW1vdGVEb2MuZG9jdW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnQ291bGQgbm90IHJldHJpZXZlIGEgSlNPTi1MRCBkb2N1bWVudCBmcm9tIHRoZSBVUkwuIFVSTCAnICtcbiAgICAgICAgICAgICdkZXJlZmVyZW5jaW5nIG5vdCBpbXBsZW1lbnRlZC4nLCAnanNvbmxkLkxvYWREb2N1bWVudEVycm9yJywge1xuICAgICAgICAgICAgICBjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLFxuICAgICAgICAgICAgICBjYXVzZTogZXgsXG4gICAgICAgICAgICAgIHJlbW90ZURvYzogcmVtb3RlRG9jXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGRvRnJhbWUocmVtb3RlRG9jKTtcbiAgICAgIH07XG4gICAgICB2YXIgcHJvbWlzZSA9IG9wdGlvbnMuZG9jdW1lbnRMb2FkZXIoZnJhbWUsIGRvbmUpO1xuICAgICAgaWYocHJvbWlzZSAmJiAndGhlbicgaW4gcHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlLnRoZW4oZG9uZS5iaW5kKG51bGwsIG51bGwpLCBkb25lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gbm90aGluZyB0byBsb2FkXG4gICAgZG9GcmFtZSh7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IG51bGwsIGRvY3VtZW50OiBmcmFtZX0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBkb0ZyYW1lKHJlbW90ZUZyYW1lKSB7XG4gICAgLy8gcHJlc2VydmUgZnJhbWUgY29udGV4dCBhbmQgYWRkIGFueSBMaW5rIGhlYWRlciBjb250ZXh0XG4gICAgdmFyIGZyYW1lID0gcmVtb3RlRnJhbWUuZG9jdW1lbnQ7XG4gICAgdmFyIGN0eDtcbiAgICBpZihmcmFtZSkge1xuICAgICAgY3R4ID0gZnJhbWVbJ0Bjb250ZXh0J107XG4gICAgICBpZihyZW1vdGVGcmFtZS5jb250ZXh0VXJsKSB7XG4gICAgICAgIGlmKCFjdHgpIHtcbiAgICAgICAgICBjdHggPSByZW1vdGVGcmFtZS5jb250ZXh0VXJsO1xuICAgICAgICB9IGVsc2UgaWYoX2lzQXJyYXkoY3R4KSkge1xuICAgICAgICAgIGN0eC5wdXNoKHJlbW90ZUZyYW1lLmNvbnRleHRVcmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eCA9IFtjdHgsIHJlbW90ZUZyYW1lLmNvbnRleHRVcmxdO1xuICAgICAgICB9XG4gICAgICAgIGZyYW1lWydAY29udGV4dCddID0gY3R4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4ID0gY3R4IHx8IHt9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdHggPSB7fTtcbiAgICB9XG5cbiAgICAvLyBleHBhbmQgaW5wdXRcbiAgICBqc29ubGQuZXhwYW5kKGlucHV0LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGV4cGFuZGVkKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGV4cGFuZCBpbnB1dCBiZWZvcmUgZnJhbWluZy4nLFxuICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBleHBhbmQgZnJhbWVcbiAgICAgIHZhciBvcHRzID0gX2Nsb25lKG9wdGlvbnMpO1xuICAgICAgb3B0cy5pc0ZyYW1lID0gdHJ1ZTtcbiAgICAgIG9wdHMua2VlcEZyZWVGbG9hdGluZ05vZGVzID0gdHJ1ZTtcbiAgICAgIGpzb25sZC5leHBhbmQoZnJhbWUsIG9wdHMsIGZ1bmN0aW9uKGVyciwgZXhwYW5kZWRGcmFtZSkge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgZnJhbWUgYmVmb3JlIGZyYW1pbmcuJyxcbiAgICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYW1lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBkbyBmcmFtaW5nXG4gICAgICAgICAgZnJhbWVkID0gbmV3IFByb2Nlc3NvcigpLmZyYW1lKGV4cGFuZGVkLCBleHBhbmRlZEZyYW1lLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb21wYWN0IHJlc3VsdCAoZm9yY2UgQGdyYXBoIG9wdGlvbiB0byB0cnVlLCBza2lwIGV4cGFuc2lvbixcbiAgICAgICAgLy8gY2hlY2sgZm9yIGxpbmtlZCBlbWJlZHMpXG4gICAgICAgIG9wdHMuZ3JhcGggPSB0cnVlO1xuICAgICAgICBvcHRzLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICAgICAgICBvcHRzLmxpbmsgPSB7fTtcbiAgICAgICAganNvbmxkLmNvbXBhY3QoZnJhbWVkLCBjdHgsIG9wdHMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkLCBjdHgpIHtcbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdDb3VsZCBub3QgY29tcGFjdCBmcmFtZWQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBnZXQgZ3JhcGggYWxpYXNcbiAgICAgICAgICB2YXIgZ3JhcGggPSBfY29tcGFjdElyaShjdHgsICdAZ3JhcGgnKTtcbiAgICAgICAgICAvLyByZW1vdmUgQHByZXNlcnZlIGZyb20gcmVzdWx0c1xuICAgICAgICAgIG9wdHMubGluayA9IHt9O1xuICAgICAgICAgIGNvbXBhY3RlZFtncmFwaF0gPSBfcmVtb3ZlUHJlc2VydmUoY3R4LCBjb21wYWN0ZWRbZ3JhcGhdLCBvcHRzKTtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqICoqRXhwZXJpbWVudGFsKipcbiAqXG4gKiBMaW5rcyBhIEpTT04tTEQgZG9jdW1lbnQncyBub2RlcyBpbiBtZW1vcnkuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGRvY3VtZW50IHRvIGxpbmsuXG4gKiBAcGFyYW0gY3R4IHRoZSBKU09OLUxEIGNvbnRleHQgdG8gYXBwbHkuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBsaW5rZWQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQubGluayA9IGZ1bmN0aW9uKGlucHV0LCBjdHgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIC8vIEFQSSBtYXRjaGVzIHJ1bm5pbmcgZnJhbWUgd2l0aCBhIHdpbGRjYXJkIGZyYW1lIGFuZCBlbWJlZDogJ0BsaW5rJ1xuICAvLyBnZXQgYXJndW1lbnRzXG4gIHZhciBmcmFtZSA9IHt9O1xuICBpZihjdHgpIHtcbiAgICBmcmFtZVsnQGNvbnRleHQnXSA9IGN0eDtcbiAgfVxuICBmcmFtZVsnQGVtYmVkJ10gPSAnQGxpbmsnO1xuICBqc29ubGQuZnJhbWUoaW5wdXQsIGZyYW1lLCBvcHRpb25zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqICoqRGVwcmVjYXRlZCoqXG4gKlxuICogUGVyZm9ybXMgSlNPTi1MRCBvYmplY3RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGRvY3VtZW50IHRvIG9iamVjdGlmeS5cbiAqIEBwYXJhbSBjdHggdGhlIEpTT04tTEQgY29udGV4dCB0byBhcHBseS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2Jhc2VdIHRoZSBiYXNlIElSSSB0byB1c2UuXG4gKiAgICAgICAgICBbZXhwYW5kQ29udGV4dF0gYSBjb250ZXh0IHRvIGV4cGFuZCB3aXRoLlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIGxpbmtlZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5vYmplY3RpZnkgPSBmdW5jdGlvbihpbnB1dCwgY3R4LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBsaW5raW5nLicsXG4gICAgICAgICdqc29ubGQuTGlua0Vycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgfVxuXG4gICAgdmFyIGZsYXR0ZW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gZmxhdHRlbiB0aGUgZ3JhcGhcbiAgICAgIGZsYXR0ZW5lZCA9IG5ldyBQcm9jZXNzb3IoKS5mbGF0dGVuKF9pbnB1dCk7XG4gICAgfSBjYXRjaChleCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICB9XG5cbiAgICAvLyBjb21wYWN0IHJlc3VsdCAoZm9yY2UgQGdyYXBoIG9wdGlvbiB0byB0cnVlLCBza2lwIGV4cGFuc2lvbilcbiAgICBvcHRpb25zLmdyYXBoID0gdHJ1ZTtcbiAgICBvcHRpb25zLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICAgIGpzb25sZC5jb21wYWN0KGZsYXR0ZW5lZCwgY3R4LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGNvbXBhY3RlZCwgY3R4KSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGNvbXBhY3QgZmxhdHRlbmVkIG91dHB1dCBiZWZvcmUgbGlua2luZy4nLFxuICAgICAgICAgICdqc29ubGQuTGlua0Vycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZ3JhcGggYWxpYXNcbiAgICAgIHZhciBncmFwaCA9IF9jb21wYWN0SXJpKGN0eCwgJ0BncmFwaCcpO1xuICAgICAgdmFyIHRvcCA9IGNvbXBhY3RlZFtncmFwaF1bMF07XG5cbiAgICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24oc3ViamVjdCkge1xuICAgICAgICAvLyBjYW4ndCByZXBsYWNlIGp1c3QgYSBzdHJpbmdcbiAgICAgICAgaWYoIV9pc09iamVjdChzdWJqZWN0KSAmJiAhX2lzQXJyYXkoc3ViamVjdCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBib3R0b20gb3V0IHJlY3Vyc2lvbiBvbiByZS12aXNpdFxuICAgICAgICBpZihfaXNPYmplY3Qoc3ViamVjdCkpIHtcbiAgICAgICAgICBpZihyZWN1cnNlLnZpc2l0ZWRbc3ViamVjdFsnQGlkJ11dKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2UudmlzaXRlZFtzdWJqZWN0WydAaWQnXV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWFjaCBhcnJheSBlbGVtZW50ICpvciogb2JqZWN0IGtleVxuICAgICAgICBmb3IodmFyIGsgaW4gc3ViamVjdCkge1xuICAgICAgICAgIHZhciBvYmogPSBzdWJqZWN0W2tdO1xuICAgICAgICAgIHZhciBpc2lkID0gKGpzb25sZC5nZXRDb250ZXh0VmFsdWUoY3R4LCBrLCAnQHR5cGUnKSA9PT0gJ0BpZCcpO1xuXG4gICAgICAgICAgLy8gY2FuJ3QgcmVwbGFjZSBhIG5vbi1vYmplY3Qgb3Igbm9uLWFycmF5IHVubGVzcyBpdCdzIGFuIEBpZFxuICAgICAgICAgIGlmKCFfaXNBcnJheShvYmopICYmICFfaXNPYmplY3Qob2JqKSAmJiAhaXNpZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoX2lzU3RyaW5nKG9iaikgJiYgaXNpZCkge1xuICAgICAgICAgICAgc3ViamVjdFtrXSA9IG9iaiA9IHRvcFtvYmpdO1xuICAgICAgICAgICAgcmVjdXJzZShvYmopO1xuICAgICAgICAgIH0gZWxzZSBpZihfaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGlmKF9pc1N0cmluZyhvYmpbaV0pICYmIGlzaWQpIHtcbiAgICAgICAgICAgICAgICBvYmpbaV0gPSB0b3Bbb2JqW2ldXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmKF9pc09iamVjdChvYmpbaV0pICYmICdAaWQnIGluIG9ialtpXSkge1xuICAgICAgICAgICAgICAgIG9ialtpXSA9IHRvcFtvYmpbaV1bJ0BpZCddXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWN1cnNlKG9ialtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKF9pc09iamVjdChvYmopKSB7XG4gICAgICAgICAgICB2YXIgc2lkID0gb2JqWydAaWQnXTtcbiAgICAgICAgICAgIHN1YmplY3Rba10gPSBvYmogPSB0b3Bbc2lkXTtcbiAgICAgICAgICAgIHJlY3Vyc2Uob2JqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWN1cnNlLnZpc2l0ZWQgPSB7fTtcbiAgICAgIHJlY3Vyc2UodG9wKTtcblxuICAgICAgY29tcGFjdGVkLm9mX3R5cGUgPSB7fTtcbiAgICAgIGZvcih2YXIgcyBpbiB0b3ApIHtcbiAgICAgICAgaWYoISgnQHR5cGUnIGluIHRvcFtzXSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZXMgPSB0b3Bbc11bJ0B0eXBlJ107XG4gICAgICAgIGlmKCFfaXNBcnJheSh0eXBlcykpIHtcbiAgICAgICAgICB0eXBlcyA9IFt0eXBlc107XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciB0ID0gMDsgdCA8IHR5cGVzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgaWYoISh0eXBlc1t0XSBpbiBjb21wYWN0ZWQub2ZfdHlwZSkpIHtcbiAgICAgICAgICAgIGNvbXBhY3RlZC5vZl90eXBlW3R5cGVzW3RdXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wYWN0ZWQub2ZfdHlwZVt0eXBlc1t0XV0ucHVzaCh0b3Bbc10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgUkRGIGRhdGFzZXQgbm9ybWFsaXphdGlvbiBvbiB0aGUgZ2l2ZW4gaW5wdXQuIFRoZSBpbnB1dCBpcyBKU09OLUxEXG4gKiB1bmxlc3MgdGhlICdpbnB1dEZvcm1hdCcgb3B0aW9uIGlzIHVzZWQuIFRoZSBvdXRwdXQgaXMgYW4gUkRGIGRhdGFzZXRcbiAqIHVubGVzcyB0aGUgJ2Zvcm1hdCcgb3B0aW9uIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCB0byBub3JtYWxpemUgYXMgSlNPTi1MRCBvciBhcyBhIGZvcm1hdCBzcGVjaWZpZWQgYnlcbiAqICAgICAgICAgIHRoZSAnaW5wdXRGb3JtYXQnIG9wdGlvbi5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2FsZ29yaXRobV0gdGhlIG5vcm1hbGl6YXRpb24gYWxnb3JpdGhtIHRvIHVzZSwgYFVSRE5BMjAxNWAgb3JcbiAqICAgICAgICAgICAgYFVSR05BMjAxMmAgKGRlZmF1bHQ6IGBVUkdOQTIwMTJgKS5cbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtpbnB1dEZvcm1hdF0gdGhlIGZvcm1hdCBpZiBpbnB1dCBpcyBub3QgSlNPTi1MRDpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbZm9ybWF0XSB0aGUgZm9ybWF0IGlmIG91dHB1dCBpcyBhIHN0cmluZzpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgbm9ybWFsaXplZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5ub3JtYWxpemUgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IG5vcm1hbGl6ZSwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdhbGdvcml0aG0nIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5hbGdvcml0aG0gPSAnVVJHTkEyMDEyJztcbiAgfVxuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICBpZignaW5wdXRGb3JtYXQnIGluIG9wdGlvbnMpIHtcbiAgICBpZihvcHRpb25zLmlucHV0Rm9ybWF0ICE9PSAnYXBwbGljYXRpb24vbnF1YWRzJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ1Vua25vd24gbm9ybWFsaXphdGlvbiBpbnB1dCBmb3JtYXQuJyxcbiAgICAgICAgJ2pzb25sZC5Ob3JtYWxpemVFcnJvcicpKTtcbiAgICB9XG4gICAgdmFyIHBhcnNlZElucHV0ID0gX3BhcnNlTlF1YWRzKGlucHV0KTtcbiAgICAvLyBkbyBub3JtYWxpemF0aW9uXG4gICAgbmV3IFByb2Nlc3NvcigpLm5vcm1hbGl6ZShwYXJzZWRJbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnZlcnQgdG8gUkRGIGRhdGFzZXQgdGhlbiBkbyBub3JtYWxpemF0aW9uXG4gICAgdmFyIG9wdHMgPSBfY2xvbmUob3B0aW9ucyk7XG4gICAgZGVsZXRlIG9wdHMuZm9ybWF0O1xuICAgIG9wdHMucHJvZHVjZUdlbmVyYWxpemVkUmRmID0gZmFsc2U7XG4gICAganNvbmxkLnRvUkRGKGlucHV0LCBvcHRzLCBmdW5jdGlvbihlcnIsIGRhdGFzZXQpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgY29udmVydCBpbnB1dCB0byBSREYgZGF0YXNldCBiZWZvcmUgbm9ybWFsaXphdGlvbi4nLFxuICAgICAgICAgICdqc29ubGQuTm9ybWFsaXplRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cbiAgICAgIC8vIGRvIG5vcm1hbGl6YXRpb25cbiAgICAgIG5ldyBQcm9jZXNzb3IoKS5ub3JtYWxpemUoZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIFJERiBkYXRhc2V0IHRvIEpTT04tTEQuXG4gKlxuICogQHBhcmFtIGRhdGFzZXQgYSBzZXJpYWxpemVkIHN0cmluZyBvZiBSREYgaW4gYSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZVxuICogICAgICAgICAgZm9ybWF0IG9wdGlvbiBvciBhbiBSREYgZGF0YXNldCB0byBjb252ZXJ0LlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbZm9ybWF0XSB0aGUgZm9ybWF0IGlmIGRhdGFzZXQgcGFyYW0gbXVzdCBmaXJzdCBiZSBwYXJzZWQ6XG4gKiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9ucXVhZHMnIGZvciBOLVF1YWRzIChkZWZhdWx0KS5cbiAqICAgICAgICAgIFtyZGZQYXJzZXJdIGEgY3VzdG9tIFJERi1wYXJzZXIgdG8gdXNlIHRvIHBhcnNlIHRoZSBkYXRhc2V0LlxuICogICAgICAgICAgW3VzZVJkZlR5cGVdIHRydWUgdG8gdXNlIHJkZjp0eXBlLCBmYWxzZSB0byB1c2UgQHR5cGVcbiAqICAgICAgICAgICAgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFt1c2VOYXRpdmVUeXBlc10gdHJ1ZSB0byBjb252ZXJ0IFhTRCB0eXBlcyBpbnRvIG5hdGl2ZSB0eXBlc1xuICogICAgICAgICAgICAoYm9vbGVhbiwgaW50ZWdlciwgZG91YmxlKSwgZmFsc2Ugbm90IHRvIChkZWZhdWx0OiBmYWxzZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBvdXRwdXQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQuZnJvbVJERiA9IGZ1bmN0aW9uKGRhdGFzZXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGZyb20gUkRGLCB0b28gZmV3IGFyZ3VtZW50cy4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBnZXQgYXJndW1lbnRzXG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmKCEoJ3VzZVJkZlR5cGUnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy51c2VSZGZUeXBlID0gZmFsc2U7XG4gIH1cbiAgaWYoISgndXNlTmF0aXZlVHlwZXMnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy51c2VOYXRpdmVUeXBlcyA9IGZhbHNlO1xuICB9XG5cbiAgaWYoISgnZm9ybWF0JyBpbiBvcHRpb25zKSAmJiBfaXNTdHJpbmcoZGF0YXNldCkpIHtcbiAgICAvLyBzZXQgZGVmYXVsdCBmb3JtYXQgdG8gbnF1YWRzXG4gICAgaWYoISgnZm9ybWF0JyBpbiBvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5mb3JtYXQgPSAnYXBwbGljYXRpb24vbnF1YWRzJztcbiAgICB9XG4gIH1cblxuICBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgLy8gaGFuZGxlIHNwZWNpYWwgZm9ybWF0XG4gICAgdmFyIHJkZlBhcnNlcjtcbiAgICBpZihvcHRpb25zLmZvcm1hdCkge1xuICAgICAgLy8gY2hlY2sgc3VwcG9ydGVkIGZvcm1hdHNcbiAgICAgIHJkZlBhcnNlciA9IG9wdGlvbnMucmRmUGFyc2VyIHx8IF9yZGZQYXJzZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICAgIGlmKCFyZGZQYXJzZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnVW5rbm93biBpbnB1dCBmb3JtYXQuJyxcbiAgICAgICAgICAnanNvbmxkLlVua25vd25Gb3JtYXQnLCB7Zm9ybWF0OiBvcHRpb25zLmZvcm1hdH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm8tb3AgcGFyc2VyLCBhc3N1bWUgZGF0YXNldCBhbHJlYWR5IHBhcnNlZFxuICAgICAgcmRmUGFyc2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2tDYWxsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLy8gcmRmIHBhcnNlciBtYXkgYmUgYXN5bmMgb3Igc3luYywgYWx3YXlzIHBhc3MgY2FsbGJhY2tcbiAgICAgIGRhdGFzZXQgPSByZGZQYXJzZXIoZGF0YXNldCwgZnVuY3Rpb24oZXJyLCBkYXRhc2V0KSB7XG4gICAgICAgIGNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGlmKCFjYWxsYmFja0NhbGxlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgc3luY2hyb25vdXMgb3IgcHJvbWlzZS1iYXNlZCBwYXJzZXJcbiAgICBpZihkYXRhc2V0KSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGFjdHVhbGx5IGEgcHJvbWlzZVxuICAgICAgaWYoJ3RoZW4nIGluIGRhdGFzZXQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFzZXQudGhlbihmdW5jdGlvbihkYXRhc2V0KSB7XG4gICAgICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIHBhcnNlciBpcyBzeW5jaHJvbm91c1xuICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgLy8gY29udmVydCBmcm9tIFJERlxuICAgICAgbmV3IFByb2Nlc3NvcigpLmZyb21SREYoZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIE91dHB1dHMgdGhlIFJERiBkYXRhc2V0IGZvdW5kIGluIHRoZSBnaXZlbiBKU09OLUxEIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtmb3JtYXRdIHRoZSBmb3JtYXQgdG8gdXNlIHRvIG91dHB1dCBhIHN0cmluZzpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbcHJvZHVjZUdlbmVyYWxpemVkUmRmXSB0cnVlIHRvIG91dHB1dCBnZW5lcmFsaXplZCBSREYsIGZhbHNlXG4gKiAgICAgICAgICAgIHRvIHByb2R1Y2Ugb25seSBzdGFuZGFyZCBSREYgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBkYXRhc2V0KSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLnRvUkRGID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHRvIFJERiwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBleHBhbmRlZCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIHNlcmlhbGl6YXRpb24gdG8gUkRGLicsXG4gICAgICAgICdqc29ubGQuUmRmRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YXNldDtcbiAgICB0cnkge1xuICAgICAgLy8gb3V0cHV0IFJERiBkYXRhc2V0XG4gICAgICBkYXRhc2V0ID0gUHJvY2Vzc29yLnByb3RvdHlwZS50b1JERihleHBhbmRlZCwgb3B0aW9ucyk7XG4gICAgICBpZihvcHRpb25zLmZvcm1hdCkge1xuICAgICAgICBpZihvcHRpb25zLmZvcm1hdCA9PT0gJ2FwcGxpY2F0aW9uL25xdWFkcycpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgX3RvTlF1YWRzKGRhdGFzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ1Vua25vd24gb3V0cHV0IGZvcm1hdC4nLFxuICAgICAgICAgICdqc29ubGQuVW5rbm93bkZvcm1hdCcsIHtmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0fSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChleCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YXNldCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiAqKkV4cGVyaW1lbnRhbCoqXG4gKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlIG5vZGVzIGluIHRoZSBnaXZlbiBKU09OLUxEIGlucHV0IGludG8gYSBtYXAgb2ZcbiAqIG5vZGUgSUQgPT4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtpc3N1ZXJdIGEganNvbmxkLklkZW50aWZpZXJJc3N1ZXIgdG8gdXNlIHRvIGxhYmVsIGJsYW5rIG5vZGVzLlxuICogICAgICAgICAgW25hbWVyXSAoZGVwcmVjYXRlZClcbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBub2RlTWFwKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmNyZWF0ZU5vZGVNYXAgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNyZWF0ZSBub2RlIG1hcCwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBjcmVhdGluZyBub2RlIG1hcC4nLFxuICAgICAgICAnanNvbmxkLkNyZWF0ZU5vZGVNYXBFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgIH1cblxuICAgIHZhciBub2RlTWFwO1xuICAgIHRyeSB7XG4gICAgICBub2RlTWFwID0gbmV3IFByb2Nlc3NvcigpLmNyZWF0ZU5vZGVNYXAoX2lucHV0LCBvcHRpb25zKTtcbiAgICB9IGNhdGNoKGV4KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIG5vZGVNYXApO1xuICB9KTtcbn07XG5cbi8qKlxuICogKipFeHBlcmltZW50YWwqKlxuICpcbiAqIE1lcmdlcyB0d28gb3IgbW9yZSBKU09OLUxEIGRvY3VtZW50cyBpbnRvIGEgc2luZ2xlIGZsYXR0ZW5lZCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0gZG9jcyB0aGUgSlNPTi1MRCBkb2N1bWVudHMgdG8gbWVyZ2UgdG9nZXRoZXIuXG4gKiBAcGFyYW0gY3R4IHRoZSBjb250ZXh0IHRvIHVzZSB0byBjb21wYWN0IHRoZSBtZXJnZWQgcmVzdWx0LCBvciBudWxsLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbYmFzZV0gdGhlIGJhc2UgSVJJIHRvIHVzZS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbaXNzdWVyXSBhIGpzb25sZC5JZGVudGlmaWVySXNzdWVyIHRvIHVzZSB0byBsYWJlbCBibGFuayBub2Rlcy5cbiAqICAgICAgICAgIFtuYW1lcl0gKGRlcHJlY2F0ZWQpLlxuICogICAgICAgICAgW21lcmdlTm9kZXNdIHRydWUgdG8gbWVyZ2UgcHJvcGVydGllcyBmb3Igbm9kZXMgd2l0aCB0aGUgc2FtZSBJRCxcbiAqICAgICAgICAgICAgZmFsc2UgdG8gaWdub3JlIG5ldyBwcm9wZXJ0aWVzIGZvciBub2RlcyB3aXRoIHRoZSBzYW1lIElEIG9uY2VcbiAqICAgICAgICAgICAgdGhlIElEIGhhcyBiZWVuIGRlZmluZWQ7IG5vdGUgdGhhdCB0aGlzIG1heSBub3QgcHJldmVudCBtZXJnaW5nXG4gKiAgICAgICAgICAgIG5ldyBwcm9wZXJ0aWVzIHdoZXJlIGEgbm9kZSBpcyBpbiB0aGUgYG9iamVjdGAgcG9zaXRpb25cbiAqICAgICAgICAgICAgKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIG1lcmdlZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5tZXJnZSA9IGZ1bmN0aW9uKGRvY3MsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IG1lcmdlLCB0b28gZmV3IGFyZ3VtZW50cy4nKSk7XG4gICAgfSk7XG4gIH1cbiAgaWYoIV9pc0FycmF5KGRvY3MpKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBtZXJnZSwgXCJkb2NzXCIgbXVzdCBiZSBhbiBhcnJheS4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBnZXQgYXJndW1lbnRzXG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIGlmKHR5cGVvZiBjdHggPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGN0eDtcbiAgICBjdHggPSBudWxsO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBleHBhbmQgYWxsIGRvY3VtZW50c1xuICB2YXIgZXhwYW5kZWQgPSBbXTtcbiAgdmFyIGVycm9yID0gbnVsbDtcbiAgdmFyIGNvdW50ID0gZG9jcy5sZW5ndGg7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG9wdHMgPSB7fTtcbiAgICBmb3IodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBvcHRzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICAgIGpzb25sZC5leHBhbmQoZG9jc1tpXSwgb3B0cywgZXhwYW5kQ29tcGxldGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kQ29tcGxldGUoZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZihlcnIpIHtcbiAgICAgIGVycm9yID0gZXJyO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIGZsYXR0ZW5pbmcuJyxcbiAgICAgICAgJ2pzb25sZC5GbGF0dGVuRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG4gICAgZXhwYW5kZWQucHVzaChfaW5wdXQpO1xuICAgIGlmKC0tY291bnQgPT09IDApIHtcbiAgICAgIG1lcmdlKGV4cGFuZGVkKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZShleHBhbmRlZCkge1xuICAgIHZhciBtZXJnZU5vZGVzID0gdHJ1ZTtcbiAgICBpZignbWVyZ2VOb2RlcycgaW4gb3B0aW9ucykge1xuICAgICAgbWVyZ2VOb2RlcyA9IG9wdGlvbnMubWVyZ2VOb2RlcztcbiAgICB9XG5cbiAgICB2YXIgaXNzdWVyID0gb3B0aW9ucy5uYW1lciB8fCBvcHRpb25zLmlzc3VlciB8fCBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gICAgdmFyIGdyYXBocyA9IHsnQGRlZmF1bHQnOiB7fX07XG5cbiAgICB2YXIgZGVmYXVsdEdyYXBoO1xuICAgIHRyeSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZXhwYW5kZWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gdW5pcXVlbHkgcmVsYWJlbCBibGFuayBub2Rlc1xuICAgICAgICB2YXIgZG9jID0gZXhwYW5kZWRbaV07XG4gICAgICAgIGRvYyA9IGpzb25sZC5yZWxhYmVsQmxhbmtOb2Rlcyhkb2MsIHtcbiAgICAgICAgICBpc3N1ZXI6IG5ldyBJZGVudGlmaWVySXNzdWVyKCdfOmInICsgaSArICctJylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gYWRkIG5vZGVzIHRvIHRoZSBzaGFyZWQgbm9kZSBtYXAgZ3JhcGhzIGlmIG1lcmdpbmcgbm9kZXMsIHRvIGFcbiAgICAgICAgLy8gc2VwYXJhdGUgZ3JhcGggc2V0IGlmIG5vdFxuICAgICAgICB2YXIgX2dyYXBocyA9IChtZXJnZU5vZGVzIHx8IGkgPT09IDApID8gZ3JhcGhzIDogeydAZGVmYXVsdCc6IHt9fTtcbiAgICAgICAgX2NyZWF0ZU5vZGVNYXAoZG9jLCBfZ3JhcGhzLCAnQGRlZmF1bHQnLCBpc3N1ZXIpO1xuXG4gICAgICAgIGlmKF9ncmFwaHMgIT09IGdyYXBocykge1xuICAgICAgICAgIC8vIG1lcmdlIGRvY3VtZW50IGdyYXBocyBidXQgZG9uJ3QgbWVyZ2UgZXhpc3Rpbmcgbm9kZXNcbiAgICAgICAgICBmb3IodmFyIGdyYXBoTmFtZSBpbiBfZ3JhcGhzKSB7XG4gICAgICAgICAgICB2YXIgX25vZGVNYXAgPSBfZ3JhcGhzW2dyYXBoTmFtZV07XG4gICAgICAgICAgICBpZighKGdyYXBoTmFtZSBpbiBncmFwaHMpKSB7XG4gICAgICAgICAgICAgIGdyYXBoc1tncmFwaE5hbWVdID0gX25vZGVNYXA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5vZGVNYXAgPSBncmFwaHNbZ3JhcGhOYW1lXTtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIF9ub2RlTWFwKSB7XG4gICAgICAgICAgICAgIGlmKCEoa2V5IGluIG5vZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgbm9kZU1hcFtrZXldID0gX25vZGVNYXBba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYWxsIG5vbi1kZWZhdWx0IGdyYXBocyB0byBkZWZhdWx0IGdyYXBoXG4gICAgICBkZWZhdWx0R3JhcGggPSBfbWVyZ2VOb2RlTWFwcyhncmFwaHMpO1xuICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgfVxuXG4gICAgLy8gcHJvZHVjZSBmbGF0dGVuZWQgb3V0cHV0XG4gICAgdmFyIGZsYXR0ZW5lZCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdEdyYXBoKS5zb3J0KCk7XG4gICAgZm9yKHZhciBraSA9IDA7IGtpIDwga2V5cy5sZW5ndGg7ICsra2kpIHtcbiAgICAgIHZhciBub2RlID0gZGVmYXVsdEdyYXBoW2tleXNba2ldXTtcbiAgICAgIC8vIG9ubHkgYWRkIGZ1bGwgc3ViamVjdHMgdG8gdG9wLWxldmVsXG4gICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlKSkge1xuICAgICAgICBmbGF0dGVuZWQucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjdHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBmbGF0dGVuZWQpO1xuICAgIH1cblxuICAgIC8vIGNvbXBhY3QgcmVzdWx0IChmb3JjZSBAZ3JhcGggb3B0aW9uIHRvIHRydWUsIHNraXAgZXhwYW5zaW9uKVxuICAgIG9wdGlvbnMuZ3JhcGggPSB0cnVlO1xuICAgIG9wdGlvbnMuc2tpcEV4cGFuc2lvbiA9IHRydWU7XG4gICAganNvbmxkLmNvbXBhY3QoZmxhdHRlbmVkLCBjdHgsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGNvbXBhY3QgbWVyZ2VkIG91dHB1dC4nLFxuICAgICAgICAgICdqc29ubGQuTWVyZ2VFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgY29tcGFjdGVkKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZWxhYmVscyBhbGwgYmxhbmsgbm9kZXMgaW4gdGhlIGdpdmVuIEpTT04tTEQgaW5wdXQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0LlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbaXNzdWVyXSBhIGpzb25sZC5JZGVudGlmaWVySXNzdWVyIHRvIHVzZSB0byBsYWJlbCBibGFuayBub2Rlcy5cbiAqICAgICAgICAgIFtuYW1lcl0gKGRlcHJlY2F0ZWQpLlxuICovXG5qc29ubGQucmVsYWJlbEJsYW5rTm9kZXMgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGlzc3VlciA9IG9wdGlvbnMubmFtZXIgfHwgb3B0aW9ucy5pc3N1ZXIgfHwgbmV3IElkZW50aWZpZXJJc3N1ZXIoJ186YicpO1xuICByZXR1cm4gX2xhYmVsQmxhbmtOb2Rlcyhpc3N1ZXIsIGlucHV0KTtcbn07XG5cbi8qKlxuICogUHJlcGVuZHMgYSBiYXNlIElSSSB0byB0aGUgZ2l2ZW4gcmVsYXRpdmUgSVJJLlxuICpcbiAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIElSSS5cbiAqIEBwYXJhbSBpcmkgdGhlIHJlbGF0aXZlIElSSS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBJUkkuXG4gKi9cbmpzb25sZC5wcmVwZW5kQmFzZSA9IGZ1bmN0aW9uKGJhc2UsIGlyaSkge1xuICByZXR1cm4gX3ByZXBlbmRCYXNlKGJhc2UsIGlyaSk7XG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGRvY3VtZW50IGxvYWRlciBmb3IgZXh0ZXJuYWwgZG9jdW1lbnRzLiBJZiB0aGUgZW52aXJvbm1lbnRcbiAqIGlzIG5vZGUuanMsIGEgY2FsbGJhY2stY29udGludWF0aW9uLXN0eWxlIGRvY3VtZW50IGxvYWRlciBpcyB1c2VkOyBvdGhlcndpc2UsXG4gKiBhIHByb21pc2VzLXN0eWxlIGRvY3VtZW50IGxvYWRlciBpcyB1c2VkLlxuICpcbiAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byBsb2FkLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyxcbiAqICAgICAgICAgIGlmIHVzaW5nIGEgbm9uLXByb21pc2VzIEFQSS5cbiAqXG4gKiBAcmV0dXJuIGEgcHJvbWlzZSwgaWYgdXNpbmcgYSBwcm9taXNlcyBBUEkuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlciA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgdmFyIGVyciA9IG5ldyBKc29uTGRFcnJvcihcbiAgICAnQ291bGQgbm90IHJldHJpZXZlIGEgSlNPTi1MRCBkb2N1bWVudCBmcm9tIHRoZSBVUkwuIFVSTCAnICtcbiAgICAnZGVyZWZlcmVuY2luZyBub3QgaW1wbGVtZW50ZWQuJywgJ2pzb25sZC5Mb2FkRG9jdW1lbnRFcnJvcicsXG4gICAge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCd9KTtcbiAgaWYoX25vZGVqcykge1xuICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICB9XG4gIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQgZGVmYXVsdCBkb2N1bWVudCBsb2FkZXIuIFVzZSBvciBvdmVycmlkZSBqc29ubGQuZG9jdW1lbnRMb2FkZXJcbiAqIGluc3RlYWQuXG4gKi9cbmpzb25sZC5sb2FkRG9jdW1lbnQgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gIHZhciBwcm9taXNlID0ganNvbmxkLmRvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2spO1xuICBpZihwcm9taXNlICYmICd0aGVuJyBpbiBwcm9taXNlKSB7XG4gICAgcHJvbWlzZS50aGVuKGNhbGxiYWNrLmJpbmQobnVsbCwgbnVsbCksIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLyogUHJvbWlzZXMgQVBJICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlcyBBUEkgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2FwaV0gYW4gb2JqZWN0IHRvIGF0dGFjaCB0aGUgQVBJIHRvLlxuICogICAgICAgICAgW3ZlcnNpb25dICdqc29uLWxkLTEuMCcgdG8gb3V0cHV0IGEgc3RhbmRhcmQgSlNPTi1MRCAxLjAgcHJvbWlzZXNcbiAqICAgICAgICAgICAgQVBJLCAnanNvbmxkLmpzJyB0byBvdXRwdXQgdGhlIHNhbWUgd2l0aCBhdWdtZW50ZWQgcHJvcHJpZXRhcnlcbiAqICAgICAgICAgICAgbWV0aG9kcyAoZGVmYXVsdDogJ2pzb25sZC5qcycpXG4gKlxuICogQHJldHVybiB0aGUgcHJvbWlzZXMgQVBJIG9iamVjdC5cbiAqL1xuanNvbmxkLnByb21pc2VzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuICB2YXIgcHJvbWlzaWZ5ID0ganNvbmxkLnByb21pc2lmeTtcblxuICAvLyBoYW5kbGUgJ2FwaScgb3B0aW9uIGFzIHZlcnNpb24sIHNldCBkZWZhdWx0c1xuICB2YXIgYXBpID0gb3B0aW9ucy5hcGkgfHwge307XG4gIHZhciB2ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8ICdqc29ubGQuanMnO1xuICBpZih0eXBlb2Ygb3B0aW9ucy5hcGkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYoIW9wdGlvbnMudmVyc2lvbikge1xuICAgICAgdmVyc2lvbiA9IG9wdGlvbnMuYXBpO1xuICAgIH1cbiAgICBhcGkgPSB7fTtcbiAgfVxuXG4gIC8vIFRoZSBXZWIgSURMIHRlc3QgaGFybmVzcyB3aWxsIGNoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkZWZpbmVkIGluXG4gIC8vIHRoZSBmdW5jdGlvbnMgYmVsb3cuIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlXG4gIC8vIHJlcXVpcmVkIChub24tb3B0aW9uYWwpIHBhcmFtZXRlcnMgb2YgdGhlIEpzb25MZFByb2Nlc3NvciBpbnRlcmZhY2UgYXNcbiAgLy8gZGVmaW5lZCBoZXJlOlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvanNvbi1sZC1hcGkvI3RoZS1qc29ubGRwcm9jZXNzb3ItaW50ZXJmYWNlXG5cbiAgYXBpLmV4cGFuZCA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBleHBhbmQsIHRvbyBmZXcgYXJndW1lbnRzLicpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzaWZ5LmFwcGx5KG51bGwsIFtqc29ubGQuZXhwYW5kXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5jb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29tcGFjdCwgdG9vIGZldyBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIHZhciBjb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAvLyBlbnN1cmUgb25seSBvbmUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2tcbiAgICAgIGpzb25sZC5jb21wYWN0KGlucHV0LCBjdHgsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgY29tcGFjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbY29tcGFjdF0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICB9O1xuICBhcGkuZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBmbGF0dGVuLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgIG51bGwsIFtqc29ubGQuZmxhdHRlbl0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICB9O1xuICBhcGkuZnJhbWUgPSBmdW5jdGlvbihpbnB1dCwgZnJhbWUpIHtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ291bGQgbm90IGZyYW1lLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbanNvbmxkLmZyYW1lXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5mcm9tUkRGID0gZnVuY3Rpb24oZGF0YXNldCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBmcm9tIFJERiwgdG9vIGZldyBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNpZnkuYXBwbHkoXG4gICAgICBudWxsLCBbanNvbmxkLmZyb21SREZdLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfTtcbiAgYXBpLnRvUkRGID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdG8gUkRGLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbanNvbmxkLnRvUkRGXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5ub3JtYWxpemUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3Qgbm9ybWFsaXplLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgIG51bGwsIFtqc29ubGQubm9ybWFsaXplXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG5cbiAgaWYodmVyc2lvbiA9PT0gJ2pzb25sZC5qcycpIHtcbiAgICBhcGkubGluayA9IGZ1bmN0aW9uKGlucHV0LCBjdHgpIHtcbiAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBsaW5rLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNpZnkuYXBwbHkoXG4gICAgICAgIG51bGwsIFtqc29ubGQubGlua10uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gICAgYXBpLm9iamVjdGlmeSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICByZXR1cm4gcHJvbWlzaWZ5LmFwcGx5KFxuICAgICAgICBudWxsLCBbanNvbmxkLm9iamVjdGlmeV0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gICAgYXBpLmNyZWF0ZU5vZGVNYXAgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgICAgbnVsbCwgW2pzb25sZC5jcmVhdGVOb2RlTWFwXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbiAgICBhcGkubWVyZ2UgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgICAgbnVsbCwgW2pzb25sZC5tZXJnZV0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGpzb25sZC5Qcm9taXNlID0gZ2xvYmFsLlByb21pc2UgfHwgcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xuICB9IGNhdGNoKGUpIHtcbiAgICB2YXIgZiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBhIFByb21pc2UgaW1wbGVtZW50YXRpb24uJyk7XG4gICAgfTtcbiAgICBmb3IodmFyIG1ldGhvZCBpbiBhcGkpIHtcbiAgICAgIGFwaVttZXRob2RdID0gZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXBpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5vZGUuanMgYXN5bmMgb3AgaW50byBhIHByb21pc2Ugdy9ib3hlZCByZXNvbHZlZCB2YWx1ZShzKS5cbiAqXG4gKiBAcGFyYW0gb3AgdGhlIG9wZXJhdGlvbiB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIHByb21pc2UuXG4gKi9cbmpzb25sZC5wcm9taXNpZnkgPSBmdW5jdGlvbihvcCkge1xuICBpZighanNvbmxkLlByb21pc2UpIHtcbiAgICB0cnkge1xuICAgICAganNvbmxkLlByb21pc2UgPSBnbG9iYWwuUHJvbWlzZSB8fCByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGEgUHJvbWlzZSBpbXBsZW1lbnRhdGlvbi4nKTtcbiAgICB9XG4gIH1cbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gbmV3IGpzb25sZC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIG9wLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KGZ1bmN0aW9uKGVyciwgdmFsdWUpIHtcbiAgICAgIGlmKCFlcnIpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufTtcblxuLy8gZXh0ZW5kIGpzb25sZC5wcm9taXNlcyB3L2pzb25sZC5qcyBtZXRob2RzXG5qc29ubGQucHJvbWlzZXMoe2FwaToganNvbmxkLnByb21pc2VzfSk7XG5cbi8qIFdlYklETCBBUEkgKi9cblxuZnVuY3Rpb24gSnNvbkxkUHJvY2Vzc29yKCkge31cbkpzb25MZFByb2Nlc3Nvci5wcm90b3R5cGUgPSBqc29ubGQucHJvbWlzZXMoe3ZlcnNpb246ICdqc29uLWxkLTEuMCd9KTtcbkpzb25MZFByb2Nlc3Nvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcyBpbnN0YW5jZW9mIEpzb25MZFByb2Nlc3Nvcikge1xuICAgIHJldHVybiAnW29iamVjdCBKc29uTGRQcm9jZXNzb3JdJztcbiAgfVxuICByZXR1cm4gJ1tvYmplY3QgSnNvbkxkUHJvY2Vzc29yUHJvdG90eXBlXSc7XG59O1xuanNvbmxkLkpzb25MZFByb2Nlc3NvciA9IEpzb25MZFByb2Nlc3NvcjtcblxuLy8gSUU4IGhhcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgYnV0IGl0IG9ubHlcbi8vIHdvcmtzIG9uIERPTSBub2RlcyAtLSBzbyBmZWF0dXJlIGRldGVjdGlvblxuLy8gcmVxdWlyZXMgdHJ5L2NhdGNoIDotKFxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gISFPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5pZihjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7fSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gZmFsc2U7XG4gIH1cbn1cblxuaWYoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpzb25MZFByb2Nlc3NvciwgJ3Byb3RvdHlwZScsIHtcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2VcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKc29uTGRQcm9jZXNzb3IucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCB7XG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBKc29uTGRQcm9jZXNzb3JcbiAgfSk7XG59XG5cbi8vIHNldHVwIGJyb3dzZXIgZ2xvYmFsIEpzb25MZFByb2Nlc3NvclxuaWYoX2Jyb3dzZXIgJiYgdHlwZW9mIGdsb2JhbC5Kc29uTGRQcm9jZXNzb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gIGlmKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ0pzb25MZFByb2Nlc3NvcicsIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogSnNvbkxkUHJvY2Vzc29yXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZ2xvYmFsLkpzb25MZFByb2Nlc3NvciA9IEpzb25MZFByb2Nlc3NvcjtcbiAgfVxufVxuXG4vKiBVdGlsaXR5IEFQSSAqL1xuXG4vLyBkZWZpbmUgc2V0SW1tZWRpYXRlIGFuZCBuZXh0VGlja1xuLy8vLyBuZXh0VGljayBpbXBsZW1lbnRhdGlvbiB3aXRoIGJyb3dzZXItY29tcGF0aWJsZSBmYWxsYmFjayAvLy8vXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMvYmxvYi9tYXN0ZXIvbGliL2FzeW5jLmpzXG5cbi8vIGNhcHR1cmUgdGhlIGdsb2JhbCByZWZlcmVuY2UgdG8gZ3VhcmQgYWdhaW5zdCBmYWtlVGltZXIgbW9ja3NcbnZhciBfc2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBzZXRJbW1lZGlhdGU7XG5cbnZhciBfZGVsYXkgPSBfc2V0SW1tZWRpYXRlID8gZnVuY3Rpb24oZm4pIHtcbiAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIChmb3IgSUUxMCBjb21wYXRpYmlsaXR5KVxuICBfc2V0SW1tZWRpYXRlKGZuKTtcbn0gOiBmdW5jdGlvbihmbikge1xuICBzZXRUaW1lb3V0KGZuLCAwKTtcbn07XG5cbmlmKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICBqc29ubGQubmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xufSBlbHNlIHtcbiAganNvbmxkLm5leHRUaWNrID0gX2RlbGF5O1xufVxuanNvbmxkLnNldEltbWVkaWF0ZSA9IF9zZXRJbW1lZGlhdGUgPyBfZGVsYXkgOiBqc29ubGQubmV4dFRpY2s7XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBoZWFkZXIuIFRoZSByZXN1bHRzIHdpbGwgYmUga2V5J2QgYnkgdGhlIHZhbHVlIG9mIFwicmVsXCIuXG4gKlxuICogTGluazogPGh0dHA6Ly9qc29uLWxkLm9yZy9jb250ZXh0cy9wZXJzb24uanNvbmxkPjsgcmVsPVwiaHR0cDovL3d3dy53My5vcmcvbnMvanNvbi1sZCNjb250ZXh0XCI7IHR5cGU9XCJhcHBsaWNhdGlvbi9sZCtqc29uXCJcbiAqXG4gKiBQYXJzZXMgYXM6IHtcbiAqICAgJ2h0dHA6Ly93d3cudzMub3JnL25zL2pzb24tbGQjY29udGV4dCc6IHtcbiAqICAgICB0YXJnZXQ6IGh0dHA6Ly9qc29uLWxkLm9yZy9jb250ZXh0cy9wZXJzb24uanNvbmxkLFxuICogICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9sZCtqc29uJ1xuICogICB9XG4gKiB9XG4gKlxuICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBcInJlbFwiIHdpdGggdGhlIHNhbWUgSVJJLCB0aGVuIGVudHJpZXMgaW4gdGhlXG4gKiByZXN1bHRpbmcgbWFwIGZvciB0aGF0IFwicmVsXCIgd2lsbCBiZSBhcnJheXMuXG4gKlxuICogQHBhcmFtIGhlYWRlciB0aGUgbGluayBoZWFkZXIgdG8gcGFyc2UuXG4gKi9cbmpzb25sZC5wYXJzZUxpbmtIZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIpIHtcbiAgdmFyIHJ2YWwgPSB7fTtcbiAgLy8gc3BsaXQgb24gdW5icmFja2V0ZWQvdW5xdW90ZWQgY29tbWFzXG4gIHZhciBlbnRyaWVzID0gaGVhZGVyLm1hdGNoKC8oPzo8W14+XSo/PnxcIlteXCJdKj9cInxbXixdKSsvZyk7XG4gIHZhciByTGlua0hlYWRlciA9IC9cXHMqPChbXj5dKj8pPlxccyooPzo7XFxzKiguKikpPy87XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG1hdGNoID0gZW50cmllc1tpXS5tYXRjaChyTGlua0hlYWRlcik7XG4gICAgaWYoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHt0YXJnZXQ6IG1hdGNoWzFdfTtcbiAgICB2YXIgcGFyYW1zID0gbWF0Y2hbMl07XG4gICAgdmFyIHJQYXJhbXMgPSAvKC4qPyk9KD86KD86XCIoW15cIl0qPylcIil8KFteXCJdKj8pKVxccyooPzooPzo7XFxzKil8JCkvZztcbiAgICB3aGlsZShtYXRjaCA9IHJQYXJhbXMuZXhlYyhwYXJhbXMpKSB7XG4gICAgICByZXN1bHRbbWF0Y2hbMV1dID0gKG1hdGNoWzJdID09PSB1bmRlZmluZWQpID8gbWF0Y2hbM10gOiBtYXRjaFsyXTtcbiAgICB9XG4gICAgdmFyIHJlbCA9IHJlc3VsdFsncmVsJ10gfHwgJyc7XG4gICAgaWYoX2lzQXJyYXkocnZhbFtyZWxdKSkge1xuICAgICAgcnZhbFtyZWxdLnB1c2gocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYocmVsIGluIHJ2YWwpIHtcbiAgICAgIHJ2YWxbcmVsXSA9IFtydmFsW3JlbF0sIHJlc3VsdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ2YWxbcmVsXSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW1wbGUgcXVldWUgZm9yIHJlcXVlc3RpbmcgZG9jdW1lbnRzLlxuICovXG5qc29ubGQuUmVxdWVzdFF1ZXVlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3JlcXVlc3RzID0ge307XG59O1xuanNvbmxkLlJlcXVlc3RRdWV1ZS5wcm90b3R5cGUud3JhcExvYWRlciA9IGZ1bmN0aW9uKGxvYWRlcikge1xuICB0aGlzLl9sb2FkZXIgPSBsb2FkZXI7XG4gIHRoaXMuX3VzZVByb21pc2UgPSAobG9hZGVyLmxlbmd0aCA9PT0gMSk7XG4gIHJldHVybiB0aGlzLmFkZC5iaW5kKHRoaXMpO1xufTtcbmpzb25sZC5SZXF1ZXN0UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGNhbGxiYWNrIG11c3QgYmUgZ2l2ZW4gaWYgbm90IHVzaW5nIHByb21pc2VzXG4gIGlmKCFjYWxsYmFjayAmJiAhc2VsZi5fdXNlUHJvbWlzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XG4gIH1cblxuICAvLyBQcm9taXNlLWJhc2VkIEFQSVxuICBpZihzZWxmLl91c2VQcm9taXNlKSB7XG4gICAgcmV0dXJuIG5ldyBqc29ubGQuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsb2FkID0gc2VsZi5fcmVxdWVzdHNbdXJsXTtcbiAgICAgIGlmKCFsb2FkKSB7XG4gICAgICAgIC8vIGxvYWQgVVJMIHRoZW4gcmVtb3ZlIGZyb20gcXVldWVcbiAgICAgICAgbG9hZCA9IHNlbGYuX3JlcXVlc3RzW3VybF0gPSBzZWxmLl9sb2FkZXIodXJsKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlbW90ZURvYykge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3JlcXVlc3RzW3VybF07XG4gICAgICAgICAgICByZXR1cm4gcmVtb3RlRG9jO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3JlcXVlc3RzW3VybF07XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyByZXNvbHZlL3JlamVjdCBwcm9taXNlIG9uY2UgVVJMIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgbG9hZC50aGVuKGZ1bmN0aW9uKHJlbW90ZURvYykge1xuICAgICAgICByZXNvbHZlKHJlbW90ZURvYyk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNhbGxiYWNrLWJhc2VkIEFQSVxuICBpZih1cmwgaW4gc2VsZi5fcmVxdWVzdHMpIHtcbiAgICBzZWxmLl9yZXF1ZXN0c1t1cmxdLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuX3JlcXVlc3RzW3VybF0gPSBbY2FsbGJhY2tdO1xuICAgIHNlbGYuX2xvYWRlcih1cmwsIGZ1bmN0aW9uKGVyciwgcmVtb3RlRG9jKSB7XG4gICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5fcmVxdWVzdHNbdXJsXTtcbiAgICAgIGRlbGV0ZSBzZWxmLl9yZXF1ZXN0c1t1cmxdO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYWxsYmFja3NbaV0oZXJyLCByZW1vdGVEb2MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW1wbGUgZG9jdW1lbnQgY2FjaGUgdGhhdCByZXRhaW5zIGRvY3VtZW50cyBmb3IgYSBzaG9ydFxuICogcGVyaW9kIG9mIHRpbWUuXG4gKlxuICogRklYTUU6IEltcGxlbWVudCBzaW1wbGUgSFRUUCBjYWNoaW5nIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuXG4gKi9cbmpzb25sZC5Eb2N1bWVudENhY2hlID0gZnVuY3Rpb24oc2l6ZSkge1xuICB0aGlzLm9yZGVyID0gW107XG4gIHRoaXMuY2FjaGUgPSB7fTtcbiAgdGhpcy5zaXplID0gc2l6ZSB8fCA1MDtcbiAgdGhpcy5leHBpcmVzID0gMzAgKiAxMDAwO1xufTtcbmpzb25sZC5Eb2N1bWVudENhY2hlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih1cmwpIHtcbiAgaWYodXJsIGluIHRoaXMuY2FjaGUpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmNhY2hlW3VybF07XG4gICAgaWYoZW50cnkuZXhwaXJlcyA+PSArbmV3IERhdGUoKSkge1xuICAgICAgcmV0dXJuIGVudHJ5LmN0eDtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbdXJsXTtcbiAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YodXJsKSwgMSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuanNvbmxkLkRvY3VtZW50Q2FjaGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHVybCwgY3R4KSB7XG4gIGlmKHRoaXMub3JkZXIubGVuZ3RoID09PSB0aGlzLnNpemUpIHtcbiAgICBkZWxldGUgdGhpcy5jYWNoZVt0aGlzLm9yZGVyLnNoaWZ0KCldO1xuICB9XG4gIHRoaXMub3JkZXIucHVzaCh1cmwpO1xuICB0aGlzLmNhY2hlW3VybF0gPSB7Y3R4OiBjdHgsIGV4cGlyZXM6ICgrbmV3IERhdGUoKSArIHRoaXMuZXhwaXJlcyl9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBjb250ZXh0IGNhY2hlLlxuICpcbiAqIEBwYXJhbSBzaXplIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLlxuICovXG5qc29ubGQuQWN0aXZlQ29udGV4dENhY2hlID0gZnVuY3Rpb24oc2l6ZSkge1xuICB0aGlzLm9yZGVyID0gW107XG4gIHRoaXMuY2FjaGUgPSB7fTtcbiAgdGhpcy5zaXplID0gc2l6ZSB8fCAxMDA7XG59O1xuanNvbmxkLkFjdGl2ZUNvbnRleHRDYWNoZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oYWN0aXZlQ3R4LCBsb2NhbEN0eCkge1xuICB2YXIga2V5MSA9IEpTT04uc3RyaW5naWZ5KGFjdGl2ZUN0eCk7XG4gIHZhciBrZXkyID0gSlNPTi5zdHJpbmdpZnkobG9jYWxDdHgpO1xuICB2YXIgbGV2ZWwxID0gdGhpcy5jYWNoZVtrZXkxXTtcbiAgaWYobGV2ZWwxICYmIGtleTIgaW4gbGV2ZWwxKSB7XG4gICAgcmV0dXJuIGxldmVsMVtrZXkyXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5qc29ubGQuQWN0aXZlQ29udGV4dENhY2hlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBsb2NhbEN0eCwgcmVzdWx0KSB7XG4gIGlmKHRoaXMub3JkZXIubGVuZ3RoID09PSB0aGlzLnNpemUpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLm9yZGVyLnNoaWZ0KCk7XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbZW50cnkuYWN0aXZlQ3R4XVtlbnRyeS5sb2NhbEN0eF07XG4gIH1cbiAgdmFyIGtleTEgPSBKU09OLnN0cmluZ2lmeShhY3RpdmVDdHgpO1xuICB2YXIga2V5MiA9IEpTT04uc3RyaW5naWZ5KGxvY2FsQ3R4KTtcbiAgdGhpcy5vcmRlci5wdXNoKHthY3RpdmVDdHg6IGtleTEsIGxvY2FsQ3R4OiBrZXkyfSk7XG4gIGlmKCEoa2V5MSBpbiB0aGlzLmNhY2hlKSkge1xuICAgIHRoaXMuY2FjaGVba2V5MV0gPSB7fTtcbiAgfVxuICB0aGlzLmNhY2hlW2tleTFdW2tleTJdID0gX2Nsb25lKHJlc3VsdCk7XG59O1xuXG4vKipcbiAqIERlZmF1bHQgSlNPTi1MRCBjYWNoZS5cbiAqL1xuanNvbmxkLmNhY2hlID0ge1xuICBhY3RpdmVDdHg6IG5ldyBqc29ubGQuQWN0aXZlQ29udGV4dENhY2hlKClcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgbG9hZGVycy5cbiAqL1xuanNvbmxkLmRvY3VtZW50TG9hZGVycyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBidWlsdC1pbiBqcXVlcnkgZG9jdW1lbnQgbG9hZGVyLlxuICpcbiAqIEBwYXJhbSAkIHRoZSBqcXVlcnkgaW5zdGFuY2UgdG8gdXNlLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHVzZVByb21pc2U6IHRydWUgdG8gdXNlIGEgcHJvbWlzZXMgQVBJLCBmYWxzZSBmb3IgYVxuICogICAgICAgICAgICBjYWxsYmFjay1jb250aW51YXRpb24tc3R5bGUgQVBJOyBkZWZhdWx0cyB0byB0cnVlIGlmIFByb21pc2VcbiAqICAgICAgICAgICAgaXMgZ2xvYmFsbHkgZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICpcbiAqIEByZXR1cm4gdGhlIGpxdWVyeSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlcnMuanF1ZXJ5ID0gZnVuY3Rpb24oJCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHF1ZXVlID0gbmV3IGpzb25sZC5SZXF1ZXN0UXVldWUoKTtcblxuICAvLyB1c2Ugb3B0aW9uIG9yLCBieSBkZWZhdWx0LCB1c2UgUHJvbWlzZSB3aGVuIGl0cyBkZWZpbmVkXG4gIHZhciB1c2VQcm9taXNlID0gKCd1c2VQcm9taXNlJyBpbiBvcHRpb25zID9cbiAgICBvcHRpb25zLnVzZVByb21pc2UgOiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSk7XG4gIGlmKHVzZVByb21pc2UpIHtcbiAgICByZXR1cm4gcXVldWUud3JhcExvYWRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGxvYWRlciwgdXJsKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVldWUud3JhcExvYWRlcihsb2FkZXIpO1xuXG4gIGZ1bmN0aW9uIGxvYWRlcih1cmwsIGNhbGxiYWNrKSB7XG4gICAgaWYodXJsLmluZGV4T2YoJ2h0dHA6JykgIT09IDAgJiYgdXJsLmluZGV4T2YoJ2h0dHBzOicpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IG9ubHkgXCJodHRwXCIgYW5kIFwiaHR0cHNcIiBVUkxzIGFyZSAnICtcbiAgICAgICAgJ3N1cHBvcnRlZC4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuc2VjdXJlICYmIHVybC5pbmRleE9mKCdodHRwcycpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IHNlY3VyZSBtb2RlIGlzIGVuYWJsZWQgYW5kICcgK1xuICAgICAgICAndGhlIFVSTFxcJ3Mgc2NoZW1lIGlzIG5vdCBcImh0dHBzXCIuJyxcbiAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsfSksXG4gICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICAgIH1cbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBhY2NlcHRzOiB7XG4gICAgICAgIGpzb246ICdhcHBsaWNhdGlvbi9sZCtqc29uLCBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfSxcbiAgICAgIC8vIGVuc3VyZSBBY2NlcHQgaGVhZGVyIGlzIHZlcnkgc3BlY2lmaWMgZm9yIEpTT04tTEQvSlNPTlxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2xkK2pzb24sIGFwcGxpY2F0aW9uL2pzb24nXG4gICAgICB9LFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgIGNyb3NzRG9tYWluOiB0cnVlLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgdmFyIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogZGF0YX07XG5cbiAgICAgICAgLy8gaGFuZGxlIExpbmsgSGVhZGVyXG4gICAgICAgIHZhciBjb250ZW50VHlwZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgdmFyIGxpbmtIZWFkZXIgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcignTGluaycpO1xuICAgICAgICBpZihsaW5rSGVhZGVyICYmIGNvbnRlbnRUeXBlICE9PSAnYXBwbGljYXRpb24vbGQranNvbicpIHtcbiAgICAgICAgICAvLyBvbmx5IDEgcmVsYXRlZCBsaW5rIGhlYWRlciBwZXJtaXR0ZWRcbiAgICAgICAgICBsaW5rSGVhZGVyID0ganNvbmxkLnBhcnNlTGlua0hlYWRlcihsaW5rSGVhZGVyKVtMSU5LX0hFQURFUl9SRUxdO1xuICAgICAgICAgIGlmKF9pc0FycmF5KGxpbmtIZWFkZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGl0IGhhcyBtb3JlIHRoYW4gb25lICcgK1xuICAgICAgICAgICAgICAnYXNzb2NpYXRlZCBIVFRQIExpbmsgSGVhZGVyLicsXG4gICAgICAgICAgICAgICdqc29ubGQuSW52YWxpZFVybCcsXG4gICAgICAgICAgICAgIHtjb2RlOiAnbXVsdGlwbGUgY29udGV4dCBsaW5rIGhlYWRlcnMnLCB1cmw6IHVybH0pLCBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihsaW5rSGVhZGVyKSB7XG4gICAgICAgICAgICBkb2MuY29udGV4dFVybCA9IGxpbmtIZWFkZXIudGFyZ2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnIpIHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCwgYW4gZXJyb3Igb2NjdXJyZWQuJyxcbiAgICAgICAgICAnanNvbmxkLkxvYWREb2N1bWVudEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmwsIGNhdXNlOiBlcnJ9KSxcbiAgICAgICAgICB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnVpbHQtaW4gbm9kZSBkb2N1bWVudCBsb2FkZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHN0cmljdFNTTDogdHJ1ZSB0byByZXF1aXJlIFNTTCBjZXJ0aWZpY2F0ZXMgdG8gYmUgdmFsaWQsXG4gKiAgICAgICAgICAgIGZhbHNlIG5vdCB0byAoZGVmYXVsdDogdHJ1ZSkuXG4gKiAgICAgICAgICBtYXhSZWRpcmVjdHM6IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHMgdG8gcGVybWl0LCBub25lIGJ5XG4gKiAgICAgICAgICAgIGRlZmF1bHQuXG4gKiAgICAgICAgICByZXF1ZXN0OiB0aGUgb2JqZWN0IHdoaWNoIHdpbGwgbWFrZSB0aGUgcmVxdWVzdCwgZGVmYXVsdCBpc1xuICogICAgICAgICAgICBwcm92aWRlZCBieSBgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcmVxdWVzdGAuXG4gKiAgICAgICAgICBoZWFkZXJzOiBhbiBhcnJheSBvZiBoZWFkZXJzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFzIHJlcXVlc3RcbiAqICAgICAgICAgICAgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3RlZCBkb2N1bWVudC4gQWNjZXB0IGlzIG5vdCBhbGxvd2VkLlxuICogICAgICAgICAgdXNlUHJvbWlzZTogdHJ1ZSB0byB1c2UgYSBwcm9taXNlcyBBUEksIGZhbHNlIGZvciBhXG4gKiAgICAgICAgICAgIGNhbGxiYWNrLWNvbnRpbnVhdGlvbi1zdHlsZSBBUEk7IGZhbHNlIGJ5IGRlZmF1bHQuXG4gKlxuICogQHJldHVybiB0aGUgbm9kZSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlcnMubm9kZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBzdHJpY3RTU0wgPSAoJ3N0cmljdFNTTCcgaW4gb3B0aW9ucykgPyBvcHRpb25zLnN0cmljdFNTTCA6IHRydWU7XG4gIHZhciBtYXhSZWRpcmVjdHMgPSAoJ21heFJlZGlyZWN0cycgaW4gb3B0aW9ucykgPyBvcHRpb25zLm1heFJlZGlyZWN0cyA6IC0xO1xuICB2YXIgcmVxdWVzdCA9ICgncmVxdWVzdCcgaW4gb3B0aW9ucykgPyBvcHRpb25zLnJlcXVlc3QgOiByZXF1aXJlKCdyZXF1ZXN0Jyk7XG4gIHZhciBhY2NlcHRIZWFkZXIgPSAnYXBwbGljYXRpb24vbGQranNvbiwgYXBwbGljYXRpb24vanNvbic7XG4gIHZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuICAvLyBUT0RPOiBkaXNhYmxlIGNhY2hlIHVudGlsIEhUVFAgY2FjaGluZyBpbXBsZW1lbnRlZFxuICAvL3ZhciBjYWNoZSA9IG5ldyBqc29ubGQuRG9jdW1lbnRDYWNoZSgpO1xuXG4gIHZhciBxdWV1ZSA9IG5ldyBqc29ubGQuUmVxdWVzdFF1ZXVlKCk7XG4gIGlmKG9wdGlvbnMudXNlUHJvbWlzZSkge1xuICAgIHJldHVybiBxdWV1ZS53cmFwTG9hZGVyKGZ1bmN0aW9uKHVybCkge1xuICAgICAgcmV0dXJuIGpzb25sZC5wcm9taXNpZnkobG9hZERvY3VtZW50LCB1cmwsIFtdKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgaWYoJ0FjY2VwdCcgaW4gaGVhZGVycyB8fCAnYWNjZXB0JyBpbiBoZWFkZXJzKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAnQWNjZXB0IGhlYWRlciBtYXkgbm90IGJlIHNwZWNpZmllZCBhcyBhbiBvcHRpb247IG9ubHkgXCInICtcbiAgICAgIGFjY2VwdEhlYWRlciArICdcIiBpcyBzdXBwb3J0ZWQuJyk7XG4gIH1cbiAgcmV0dXJuIHF1ZXVlLndyYXBMb2FkZXIoZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIGxvYWREb2N1bWVudCh1cmwsIFtdLCBjYWxsYmFjayk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGxvYWREb2N1bWVudCh1cmwsIHJlZGlyZWN0cywgY2FsbGJhY2spIHtcbiAgICBpZih1cmwuaW5kZXhPZignaHR0cDonKSAhPT0gMCAmJiB1cmwuaW5kZXhPZignaHR0cHM6JykgIT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgb25seSBcImh0dHBcIiBhbmQgXCJodHRwc1wiIFVSTHMgYXJlICcgK1xuICAgICAgICAnc3VwcG9ydGVkLicsXG4gICAgICAgICdqc29ubGQuSW52YWxpZFVybCcsIHtjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLCB1cmw6IHVybH0pLFxuICAgICAgICB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICB9XG4gICAgaWYob3B0aW9ucy5zZWN1cmUgJiYgdXJsLmluZGV4T2YoJ2h0dHBzJykgIT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgc2VjdXJlIG1vZGUgaXMgZW5hYmxlZCBhbmQgJyArXG4gICAgICAgICd0aGUgVVJMXFwncyBzY2hlbWUgaXMgbm90IFwiaHR0cHNcIi4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IGRpc2FibGUgY2FjaGUgdW50aWwgSFRUUCBjYWNoaW5nIGltcGxlbWVudGVkXG4gICAgdmFyIGRvYyA9IG51bGw7Ly9jYWNoZS5nZXQodXJsKTtcbiAgICBpZihkb2MgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBkb2MpO1xuICAgIH1cbiAgICB2YXIgaGVhZGVycyA9IHsnQWNjZXB0JzogYWNjZXB0SGVhZGVyfTtcbiAgICBmb3IodmFyIGsgaW4gb3B0aW9ucy5oZWFkZXJzKSB7IGhlYWRlcnNba10gPSBvcHRpb25zLmhlYWRlcnNba107IH1cbiAgICByZXF1ZXN0KHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIHN0cmljdFNTTDogc3RyaWN0U1NMLFxuICAgICAgZm9sbG93UmVkaXJlY3Q6IGZhbHNlXG4gICAgfSwgaGFuZGxlUmVzcG9uc2UpO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UoZXJyLCByZXMsIGJvZHkpIHtcbiAgICAgIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogYm9keSB8fCBudWxsfTtcblxuICAgICAgLy8gaGFuZGxlIGVycm9yXG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGFuIGVycm9yIG9jY3VycmVkLicsXG4gICAgICAgICAgJ2pzb25sZC5Mb2FkRG9jdW1lbnRFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsLCBjYXVzZTogZXJyfSksIGRvYyk7XG4gICAgICB9XG4gICAgICB2YXIgc3RhdHVzVGV4dCA9IGh0dHAuU1RBVFVTX0NPREVTW3Jlcy5zdGF0dXNDb2RlXTtcbiAgICAgIGlmKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDogJyArIHN0YXR1c1RleHQsXG4gICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge1xuICAgICAgICAgICAgY29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgaHR0cFN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlXG4gICAgICAgICAgfSksIGRvYyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBMaW5rIEhlYWRlclxuICAgICAgaWYocmVzLmhlYWRlcnMubGluayAmJlxuICAgICAgICByZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10gIT09ICdhcHBsaWNhdGlvbi9sZCtqc29uJykge1xuICAgICAgICAvLyBvbmx5IDEgcmVsYXRlZCBsaW5rIGhlYWRlciBwZXJtaXR0ZWRcbiAgICAgICAgdmFyIGxpbmtIZWFkZXIgPSBqc29ubGQucGFyc2VMaW5rSGVhZGVyKFxuICAgICAgICAgIHJlcy5oZWFkZXJzLmxpbmspW0xJTktfSEVBREVSX1JFTF07XG4gICAgICAgIGlmKF9pc0FycmF5KGxpbmtIZWFkZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCwgaXQgaGFzIG1vcmUgdGhhbiBvbmUgYXNzb2NpYXRlZCAnICtcbiAgICAgICAgICAgICdIVFRQIExpbmsgSGVhZGVyLicsXG4gICAgICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLFxuICAgICAgICAgICAge2NvZGU6ICdtdWx0aXBsZSBjb250ZXh0IGxpbmsgaGVhZGVycycsIHVybDogdXJsfSksIGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYobGlua0hlYWRlcikge1xuICAgICAgICAgIGRvYy5jb250ZXh0VXJsID0gbGlua0hlYWRlci50YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIHJlZGlyZWN0XG4gICAgICBpZihyZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCA0MDAgJiZcbiAgICAgICAgcmVzLmhlYWRlcnMubG9jYXRpb24pIHtcbiAgICAgICAgaWYocmVkaXJlY3RzLmxlbmd0aCA9PT0gbWF4UmVkaXJlY3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgdGhlcmUgd2VyZSB0b28gbWFueSByZWRpcmVjdHMuJyxcbiAgICAgICAgICAgICdqc29ubGQuVG9vTWFueVJlZGlyZWN0cycsIHtcbiAgICAgICAgICAgICAgY29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJyxcbiAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgIGh0dHBTdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgcmVkaXJlY3RzOiByZWRpcmVjdHNcbiAgICAgICAgICAgIH0pLCBkb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHJlZGlyZWN0cy5pbmRleE9mKHVybCkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgaW5maW5pdGUgcmVkaXJlY3Rpb24gd2FzIGRldGVjdGVkLicsXG4gICAgICAgICAgICAnanNvbmxkLkluZmluaXRlUmVkaXJlY3REZXRlY3RlZCcsIHtcbiAgICAgICAgICAgICAgY29kZTogJ3JlY3Vyc2l2ZSBjb250ZXh0IGluY2x1c2lvbicsXG4gICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICBodHRwU3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgIHJlZGlyZWN0czogcmVkaXJlY3RzXG4gICAgICAgICAgICB9KSwgZG9jKTtcbiAgICAgICAgfVxuICAgICAgICByZWRpcmVjdHMucHVzaCh1cmwpO1xuICAgICAgICByZXR1cm4gbG9hZERvY3VtZW50KHJlcy5oZWFkZXJzLmxvY2F0aW9uLCByZWRpcmVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIGNhY2hlIGZvciBlYWNoIHJlZGlyZWN0ZWQgVVJMXG4gICAgICByZWRpcmVjdHMucHVzaCh1cmwpO1xuICAgICAgLy8gVE9ETzogZGlzYWJsZSBjYWNoZSB1bnRpbCBIVFRQIGNhY2hpbmcgaW1wbGVtZW50ZWRcbiAgICAgIC8qZm9yKHZhciBpID0gMDsgaSA8IHJlZGlyZWN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYWNoZS5zZXQoXG4gICAgICAgICAgcmVkaXJlY3RzW2ldLFxuICAgICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogcmVkaXJlY3RzW2ldLCBkb2N1bWVudDogYm9keX0pO1xuICAgICAgfSovXG4gICAgICBjYWxsYmFjayhlcnIsIGRvYyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBidWlsdC1pbiBYTUxIdHRwUmVxdWVzdCBkb2N1bWVudCBsb2FkZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHVzZVByb21pc2U6IHRydWUgdG8gdXNlIGEgcHJvbWlzZXMgQVBJLCBmYWxzZSBmb3IgYVxuICogICAgICAgICAgICBjYWxsYmFjay1jb250aW51YXRpb24tc3R5bGUgQVBJOyBkZWZhdWx0cyB0byB0cnVlIGlmIFByb21pc2VcbiAqICAgICAgICAgICAgaXMgZ2xvYmFsbHkgZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICogICAgICAgICAgW3hocl06IHRoZSBYTUxIdHRwUmVxdWVzdCBBUEkgdG8gdXNlLlxuICpcbiAqIEByZXR1cm4gdGhlIFhNTEh0dHBSZXF1ZXN0IGRvY3VtZW50IGxvYWRlci5cbiAqL1xuanNvbmxkLmRvY3VtZW50TG9hZGVycy54aHIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcmxpbmsgPSAvKF58KFxcclxcbikpbGluazovaTtcbiAgdmFyIHF1ZXVlID0gbmV3IGpzb25sZC5SZXF1ZXN0UXVldWUoKTtcblxuICAvLyB1c2Ugb3B0aW9uIG9yLCBieSBkZWZhdWx0LCB1c2UgUHJvbWlzZSB3aGVuIGl0cyBkZWZpbmVkXG4gIHZhciB1c2VQcm9taXNlID0gKCd1c2VQcm9taXNlJyBpbiBvcHRpb25zID9cbiAgICBvcHRpb25zLnVzZVByb21pc2UgOiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSk7XG4gIGlmKHVzZVByb21pc2UpIHtcbiAgICByZXR1cm4gcXVldWUud3JhcExvYWRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGxvYWRlciwgdXJsKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVldWUud3JhcExvYWRlcihsb2FkZXIpO1xuXG4gIGZ1bmN0aW9uIGxvYWRlcih1cmwsIGNhbGxiYWNrKSB7XG4gICAgaWYodXJsLmluZGV4T2YoJ2h0dHA6JykgIT09IDAgJiYgdXJsLmluZGV4T2YoJ2h0dHBzOicpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IG9ubHkgXCJodHRwXCIgYW5kIFwiaHR0cHNcIiBVUkxzIGFyZSAnICtcbiAgICAgICAgJ3N1cHBvcnRlZC4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuc2VjdXJlICYmIHVybC5pbmRleE9mKCdodHRwcycpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IHNlY3VyZSBtb2RlIGlzIGVuYWJsZWQgYW5kICcgK1xuICAgICAgICAndGhlIFVSTFxcJ3Mgc2NoZW1lIGlzIG5vdCBcImh0dHBzXCIuJyxcbiAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsfSksXG4gICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICAgIH1cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgWE1MSHR0cFJlcXVlc3Q7XG4gICAgdmFyIHJlcSA9IG5ldyB4aHIoKTtcbiAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZihyZXEuc3RhdHVzID49IDQwMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDogJyArIHJlcS5zdGF0dXNUZXh0LFxuICAgICAgICAgICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLCB7XG4gICAgICAgICAgICBjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBodHRwU3RhdHVzQ29kZTogcmVxLnN0YXR1c1xuICAgICAgICAgIH0pLCB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogcmVxLnJlc3BvbnNlfTtcblxuICAgICAgLy8gaGFuZGxlIExpbmsgSGVhZGVyIChhdm9pZCB1bnNhZmUgaGVhZGVyIHdhcm5pbmcgYnkgZXhpc3RlbmNlIHRlc3RpbmcpXG4gICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgdmFyIGxpbmtIZWFkZXI7XG4gICAgICBpZihybGluay50ZXN0KHJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICAgICAgbGlua0hlYWRlciA9IHJlcS5nZXRSZXNwb25zZUhlYWRlcignTGluaycpO1xuICAgICAgfVxuICAgICAgaWYobGlua0hlYWRlciAmJiBjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nKSB7XG4gICAgICAgIC8vIG9ubHkgMSByZWxhdGVkIGxpbmsgaGVhZGVyIHBlcm1pdHRlZFxuICAgICAgICBsaW5rSGVhZGVyID0ganNvbmxkLnBhcnNlTGlua0hlYWRlcihsaW5rSGVhZGVyKVtMSU5LX0hFQURFUl9SRUxdO1xuICAgICAgICBpZihfaXNBcnJheShsaW5rSGVhZGVyKSkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGl0IGhhcyBtb3JlIHRoYW4gb25lICcgK1xuICAgICAgICAgICAgJ2Fzc29jaWF0ZWQgSFRUUCBMaW5rIEhlYWRlci4nLFxuICAgICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJyxcbiAgICAgICAgICAgIHtjb2RlOiAnbXVsdGlwbGUgY29udGV4dCBsaW5rIGhlYWRlcnMnLCB1cmw6IHVybH0pLCBkb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGxpbmtIZWFkZXIpIHtcbiAgICAgICAgICBkb2MuY29udGV4dFVybCA9IGxpbmtIZWFkZXIudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgfTtcbiAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGFuIGVycm9yIG9jY3VycmVkLicsXG4gICAgICAgICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfTtcbiAgICByZXEub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2xkK2pzb24sIGFwcGxpY2F0aW9uL2pzb24nKTtcbiAgICByZXEuc2VuZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEFzc2lnbnMgdGhlIGRlZmF1bHQgZG9jdW1lbnQgbG9hZGVyIGZvciBleHRlcm5hbCBkb2N1bWVudCBVUkxzIHRvIGEgYnVpbHQtaW5cbiAqIGRlZmF1bHQuIFN1cHBvcnRlZCB0eXBlcyBjdXJyZW50bHkgaW5jbHVkZTogJ2pxdWVyeScgYW5kICdub2RlJy5cbiAqXG4gKiBUbyB1c2UgdGhlIGpxdWVyeSBkb2N1bWVudCBsb2FkZXIsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHJlZmVyZW5jZVxuICogdG8gdGhlIG1haW4ganF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSB0byBzZXQuXG4gKiBAcGFyYW0gW3BhcmFtc10gdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8gdXNlIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC51c2VEb2N1bWVudExvYWRlciA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYoISh0eXBlIGluIGpzb25sZC5kb2N1bWVudExvYWRlcnMpKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ1Vua25vd24gZG9jdW1lbnQgbG9hZGVyIHR5cGU6IFwiJyArIHR5cGUgKyAnXCInLFxuICAgICAgJ2pzb25sZC5Vbmtub3duRG9jdW1lbnRMb2FkZXInLFxuICAgICAge3R5cGU6IHR5cGV9KTtcbiAgfVxuXG4gIC8vIHNldCBkb2N1bWVudCBsb2FkZXJcbiAganNvbmxkLmRvY3VtZW50TG9hZGVyID0ganNvbmxkLmRvY3VtZW50TG9hZGVyc1t0eXBlXS5hcHBseShcbiAgICBqc29ubGQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBsb2NhbCBjb250ZXh0LCByZXNvbHZpbmcgYW55IFVSTHMgYXMgbmVjZXNzYXJ5LCBhbmQgcmV0dXJucyBhXG4gKiBuZXcgYWN0aXZlIGNvbnRleHQgaW4gaXRzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBhY3RpdmVDdHggdGhlIGN1cnJlbnQgYWN0aXZlIGNvbnRleHQuXG4gKiBAcGFyYW0gbG9jYWxDdHggdGhlIGxvY2FsIGNvbnRleHQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIGN0eCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5wcm9jZXNzQ29udGV4dCA9IGZ1bmN0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgpIHtcbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIgY2FsbGJhY2tBcmcgPSAyO1xuICBpZihhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMl0gfHwge307XG4gICAgY2FsbGJhY2tBcmcgKz0gMTtcbiAgfVxuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbY2FsbGJhY2tBcmddO1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnYmFzZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmJhc2UgPSAnJztcbiAgfVxuICBpZighKCdkb2N1bWVudExvYWRlcicgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmRvY3VtZW50TG9hZGVyID0ganNvbmxkLmxvYWREb2N1bWVudDtcbiAgfVxuXG4gIC8vIHJldHVybiBpbml0aWFsIGNvbnRleHQgZWFybHkgZm9yIG51bGwgY29udGV4dFxuICBpZihsb2NhbEN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucykpO1xuICB9XG5cbiAgLy8gcmV0cmlldmUgVVJMcyBpbiBsb2NhbEN0eFxuICBsb2NhbEN0eCA9IF9jbG9uZShsb2NhbEN0eCk7XG4gIGlmKCEoX2lzT2JqZWN0KGxvY2FsQ3R4KSAmJiAnQGNvbnRleHQnIGluIGxvY2FsQ3R4KSkge1xuICAgIGxvY2FsQ3R4ID0geydAY29udGV4dCc6IGxvY2FsQ3R4fTtcbiAgfVxuICBfcmV0cmlldmVDb250ZXh0VXJscyhsb2NhbEN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBjdHgpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gcHJvY2VzcyBjb250ZXh0XG4gICAgICBjdHggPSBuZXcgUHJvY2Vzc29yKCkucHJvY2Vzc0NvbnRleHQoYWN0aXZlQ3R4LCBjdHgsIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIGN0eCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN1YmplY3QgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gbG9vayBmb3IuXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSBzdWJqZWN0IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHksIGZhbHNlIGlmIG5vdC5cbiAqL1xuanNvbmxkLmhhc1Byb3BlcnR5ID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgdmFyIHJ2YWwgPSBmYWxzZTtcbiAgaWYocHJvcGVydHkgaW4gc3ViamVjdCkge1xuICAgIHZhciB2YWx1ZSA9IHN1YmplY3RbcHJvcGVydHldO1xuICAgIHJ2YWwgPSAoIV9pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPiAwKTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gc3ViamVjdC5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2suXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgZXhpc3RzLCBmYWxzZSBpZiBub3QuXG4gKi9cbmpzb25sZC5oYXNWYWx1ZSA9IGZ1bmN0aW9uKHN1YmplY3QsIHByb3BlcnR5LCB2YWx1ZSkge1xuICB2YXIgcnZhbCA9IGZhbHNlO1xuICBpZihqc29ubGQuaGFzUHJvcGVydHkoc3ViamVjdCwgcHJvcGVydHkpKSB7XG4gICAgdmFyIHZhbCA9IHN1YmplY3RbcHJvcGVydHldO1xuICAgIHZhciBpc0xpc3QgPSBfaXNMaXN0KHZhbCk7XG4gICAgaWYoX2lzQXJyYXkodmFsKSB8fCBpc0xpc3QpIHtcbiAgICAgIGlmKGlzTGlzdCkge1xuICAgICAgICB2YWwgPSB2YWxbJ0BsaXN0J107XG4gICAgICB9XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmKGpzb25sZC5jb21wYXJlVmFsdWVzKHZhbHVlLCB2YWxbaV0pKSB7XG4gICAgICAgICAgcnZhbCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoIV9pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gYXZvaWQgbWF0Y2hpbmcgdGhlIHNldCBvZiB2YWx1ZXMgd2l0aCBhbiBhcnJheSB2YWx1ZSBwYXJhbWV0ZXJcbiAgICAgIHJ2YWwgPSBqc29ubGQuY29tcGFyZVZhbHVlcyh2YWx1ZSwgdmFsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEFkZHMgYSB2YWx1ZSB0byBhIHN1YmplY3QuIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSwgYWxsIHZhbHVlcyBpbiB0aGVcbiAqIGFycmF5IHdpbGwgYmUgYWRkZWQuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QgdG8gYWRkIHRoZSB2YWx1ZSB0by5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdGhhdCByZWxhdGVzIHRoZSB2YWx1ZSB0byB0aGUgc3ViamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYWRkLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgW3Byb3BlcnR5SXNBcnJheV0gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYWx3YXlzIGFuIGFycmF5LCBmYWxzZVxuICogICAgICAgICAgaWYgbm90IChkZWZhdWx0OiBmYWxzZSkuXG4gKiAgICAgICAgW2FsbG93RHVwbGljYXRlXSB0cnVlIHRvIGFsbG93IGR1cGxpY2F0ZXMsIGZhbHNlIG5vdCB0byAodXNlcyBhXG4gKiAgICAgICAgICBzaW1wbGUgc2hhbGxvdyBjb21wYXJpc29uIG9mIHN1YmplY3QgSUQgb3IgdmFsdWUpIChkZWZhdWx0OiB0cnVlKS5cbiAqL1xuanNvbmxkLmFkZFZhbHVlID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHksIHZhbHVlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZighKCdwcm9wZXJ0eUlzQXJyYXknIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuICBpZighKCdhbGxvd0R1cGxpY2F0ZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmFsbG93RHVwbGljYXRlID0gdHJ1ZTtcbiAgfVxuXG4gIGlmKF9pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmKHZhbHVlLmxlbmd0aCA9PT0gMCAmJiBvcHRpb25zLnByb3BlcnR5SXNBcnJheSAmJlxuICAgICAgIShwcm9wZXJ0eSBpbiBzdWJqZWN0KSkge1xuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0gPSBbXTtcbiAgICB9XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICBqc29ubGQuYWRkVmFsdWUoc3ViamVjdCwgcHJvcGVydHksIHZhbHVlW2ldLCBvcHRpb25zKTtcbiAgICB9XG4gIH0gZWxzZSBpZihwcm9wZXJ0eSBpbiBzdWJqZWN0KSB7XG4gICAgLy8gY2hlY2sgaWYgc3ViamVjdCBhbHJlYWR5IGhhcyB2YWx1ZSBpZiBkdXBsaWNhdGVzIG5vdCBhbGxvd2VkXG4gICAgdmFyIGhhc1ZhbHVlID0gKCFvcHRpb25zLmFsbG93RHVwbGljYXRlICYmXG4gICAgICBqc29ubGQuaGFzVmFsdWUoc3ViamVjdCwgcHJvcGVydHksIHZhbHVlKSk7XG5cbiAgICAvLyBtYWtlIHByb3BlcnR5IGFuIGFycmF5IGlmIHZhbHVlIG5vdCBwcmVzZW50IG9yIGFsd2F5cyBhbiBhcnJheVxuICAgIGlmKCFfaXNBcnJheShzdWJqZWN0W3Byb3BlcnR5XSkgJiZcbiAgICAgICghaGFzVmFsdWUgfHwgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkpKSB7XG4gICAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IFtzdWJqZWN0W3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gYWRkIG5ldyB2YWx1ZVxuICAgIGlmKCFoYXNWYWx1ZSkge1xuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0ucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGFkZCBuZXcgdmFsdWUgYXMgc2V0IG9yIHNpbmdsZSB2YWx1ZVxuICAgIHN1YmplY3RbcHJvcGVydHldID0gb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPyBbdmFsdWVdIDogdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhbGwgb2YgdGhlIHZhbHVlcyBmb3IgYSBzdWJqZWN0J3MgcHJvcGVydHkgYXMgYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5LlxuICpcbiAqIEByZXR1cm4gYWxsIG9mIHRoZSB2YWx1ZXMgZm9yIGEgc3ViamVjdCdzIHByb3BlcnR5IGFzIGFuIGFycmF5LlxuICovXG5qc29ubGQuZ2V0VmFsdWVzID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgdmFyIHJ2YWwgPSBzdWJqZWN0W3Byb3BlcnR5XSB8fCBbXTtcbiAgaWYoIV9pc0FycmF5KHJ2YWwpKSB7XG4gICAgcnZhbCA9IFtydmFsXTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhIHByb3BlcnR5IGZyb20gYSBzdWJqZWN0LlxuICpcbiAqIEBwYXJhbSBzdWJqZWN0IHRoZSBzdWJqZWN0LlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eS5cbiAqL1xuanNvbmxkLnJlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgZGVsZXRlIHN1YmplY3RbcHJvcGVydHldO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSBhIHN1YmplY3QuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRoYXQgcmVsYXRlcyB0aGUgdmFsdWUgdG8gdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW3Byb3BlcnR5SXNBcnJheV0gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYWx3YXlzIGFuIGFycmF5LCBmYWxzZVxuICogICAgICAgICAgICBpZiBub3QgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqL1xuanNvbmxkLnJlbW92ZVZhbHVlID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHksIHZhbHVlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZighKCdwcm9wZXJ0eUlzQXJyYXknIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGZpbHRlciBvdXQgdmFsdWVcbiAgdmFyIHZhbHVlcyA9IGpzb25sZC5nZXRWYWx1ZXMoc3ViamVjdCwgcHJvcGVydHkpLmZpbHRlcihmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuICFqc29ubGQuY29tcGFyZVZhbHVlcyhlLCB2YWx1ZSk7XG4gIH0pO1xuXG4gIGlmKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICBqc29ubGQucmVtb3ZlUHJvcGVydHkoc3ViamVjdCwgcHJvcGVydHkpO1xuICB9IGVsc2UgaWYodmFsdWVzLmxlbmd0aCA9PT0gMSAmJiAhb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkpIHtcbiAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IHZhbHVlc1swXTtcbiAgfSBlbHNlIHtcbiAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IHZhbHVlcztcbiAgfVxufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gSlNPTi1MRCB2YWx1ZXMgZm9yIGVxdWFsaXR5LiBUd28gSlNPTi1MRCB2YWx1ZXMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBlcXVhbCBpZjpcbiAqXG4gKiAxLiBUaGV5IGFyZSBib3RoIHByaW1pdGl2ZXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUuXG4gKiAyLiBUaGV5IGFyZSBib3RoIEB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBAdmFsdWUsIEB0eXBlLCBAbGFuZ3VhZ2UsXG4gKiAgIGFuZCBAaW5kZXgsIE9SXG4gKiAzLiBUaGV5IGJvdGggaGF2ZSBAaWRzIHRoZXkgYXJlIHRoZSBzYW1lLlxuICpcbiAqIEBwYXJhbSB2MSB0aGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdjIgdGhlIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdjEgYW5kIHYyIGFyZSBjb25zaWRlcmVkIGVxdWFsLCBmYWxzZSBpZiBub3QuXG4gKi9cbmpzb25sZC5jb21wYXJlVmFsdWVzID0gZnVuY3Rpb24odjEsIHYyKSB7XG4gIC8vIDEuIGVxdWFsIHByaW1pdGl2ZXNcbiAgaWYodjEgPT09IHYyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAyLiBlcXVhbCBAdmFsdWVzXG4gIGlmKF9pc1ZhbHVlKHYxKSAmJiBfaXNWYWx1ZSh2MikgJiZcbiAgICB2MVsnQHZhbHVlJ10gPT09IHYyWydAdmFsdWUnXSAmJlxuICAgIHYxWydAdHlwZSddID09PSB2MlsnQHR5cGUnXSAmJlxuICAgIHYxWydAbGFuZ3VhZ2UnXSA9PT0gdjJbJ0BsYW5ndWFnZSddICYmXG4gICAgdjFbJ0BpbmRleCddID09PSB2MlsnQGluZGV4J10pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIDMuIGVxdWFsIEBpZHNcbiAgaWYoX2lzT2JqZWN0KHYxKSAmJiAoJ0BpZCcgaW4gdjEpICYmIF9pc09iamVjdCh2MikgJiYgKCdAaWQnIGluIHYyKSkge1xuICAgIHJldHVybiB2MVsnQGlkJ10gPT09IHYyWydAaWQnXTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dCBrZXkgYW5kIHR5cGUsIG51bGwgaWYgbm9uZSBpc1xuICogc2V0LlxuICpcbiAqIEBwYXJhbSBjdHggdGhlIGFjdGl2ZSBjb250ZXh0LlxuICogQHBhcmFtIGtleSB0aGUgY29udGV4dCBrZXkuXG4gKiBAcGFyYW0gW3R5cGVdIHRoZSB0eXBlIG9mIHZhbHVlIHRvIGdldCAoZWc6ICdAaWQnLCAnQHR5cGUnKSwgaWYgbm90XG4gKiAgICAgICAgICBzcGVjaWZpZWQgZ2V0cyB0aGUgZW50aXJlIGVudHJ5IGZvciBhIGtleSwgbnVsbCBpZiBub3QgZm91bmQuXG4gKlxuICogQHJldHVybiB0aGUgdmFsdWUuXG4gKi9cbmpzb25sZC5nZXRDb250ZXh0VmFsdWUgPSBmdW5jdGlvbihjdHgsIGtleSwgdHlwZSkge1xuICB2YXIgcnZhbCA9IG51bGw7XG5cbiAgLy8gcmV0dXJuIG51bGwgZm9yIGludmFsaWQga2V5XG4gIGlmKGtleSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gZ2V0IGRlZmF1bHQgbGFuZ3VhZ2VcbiAgaWYodHlwZSA9PT0gJ0BsYW5ndWFnZScgJiYgKHR5cGUgaW4gY3R4KSkge1xuICAgIHJ2YWwgPSBjdHhbdHlwZV07XG4gIH1cblxuICAvLyBnZXQgc3BlY2lmaWMgZW50cnkgaW5mb3JtYXRpb25cbiAgaWYoY3R4Lm1hcHBpbmdzW2tleV0pIHtcbiAgICB2YXIgZW50cnkgPSBjdHgubWFwcGluZ3Nba2V5XTtcblxuICAgIGlmKF9pc1VuZGVmaW5lZCh0eXBlKSkge1xuICAgICAgLy8gcmV0dXJuIHdob2xlIGVudHJ5XG4gICAgICBydmFsID0gZW50cnk7XG4gICAgfSBlbHNlIGlmKHR5cGUgaW4gZW50cnkpIHtcbiAgICAgIC8vIHJldHVybiBlbnRyeSB2YWx1ZSBmb3IgdHlwZVxuICAgICAgcnZhbCA9IGVudHJ5W3R5cGVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqIFJlZ2lzdGVyZWQgUkRGIGRhdGFzZXQgcGFyc2VycyBoYXNoZWQgYnkgY29udGVudC10eXBlLiAqL1xudmFyIF9yZGZQYXJzZXJzID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIFJERiBkYXRhc2V0IHBhcnNlciBieSBjb250ZW50LXR5cGUsIGZvciB1c2Ugd2l0aFxuICoganNvbmxkLmZyb21SREYuIEFuIFJERiBkYXRhc2V0IHBhcnNlciB3aWxsIGFsd2F5cyBiZSBnaXZlbiB0d28gcGFyYW1ldGVycyxcbiAqIGEgc3RyaW5nIG9mIGlucHV0IGFuZCBhIGNhbGxiYWNrLiBBbiBSREYgZGF0YXNldCBwYXJzZXIgY2FuIGJlIHN5bmNocm9ub3VzXG4gKiBvciBhc3luY2hyb25vdXMuXG4gKlxuICogSWYgdGhlIHBhcnNlciBmdW5jdGlvbiByZXR1cm5zIHVuZGVmaW5lZCBvciBudWxsIHRoZW4gaXQgd2lsbCBiZSBhc3N1bWVkIHRvXG4gKiBiZSBhc3luY2hyb25vdXMgdy9hIGNvbnRpbnVhdGlvbi1wYXNzaW5nIHN0eWxlIGFuZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyXG4gKiBnaXZlbiB0byB0aGUgcGFyc2VyIE1VU1QgYmUgaW52b2tlZC5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGEgUHJvbWlzZSwgdGhlbiBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgYXN5bmNocm9ub3VzLCBidXQgdGhlXG4gKiBjYWxsYmFjayBwYXJhbWV0ZXIgTVVTVCBOT1QgYmUgaW52b2tlZC4gSXQgc2hvdWxkIGluc3RlYWQgYmUgaWdub3JlZC5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGFuIFJERiBkYXRhc2V0LCBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgc3luY2hyb25vdXMgYW5kIHRoZVxuICogY2FsbGJhY2sgcGFyYW1ldGVyIE1VU1QgTk9UIGJlIGludm9rZWQuIEl0IHNob3VsZCBpbnN0ZWFkIGJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50LXR5cGUgZm9yIHRoZSBwYXJzZXIuXG4gKiBAcGFyYW0gcGFyc2VyKGlucHV0LCBjYWxsYmFjayhlcnIsIGRhdGFzZXQpKSB0aGUgcGFyc2VyIGZ1bmN0aW9uICh0YWtlcyBhXG4gKiAgICAgICAgICBzdHJpbmcgYXMgYSBwYXJhbWV0ZXIgYW5kIGVpdGhlciByZXR1cm5zIG51bGwvdW5kZWZpbmVkIGFuZCB1c2VzXG4gKiAgICAgICAgICB0aGUgZ2l2ZW4gY2FsbGJhY2ssIHJldHVybnMgYSBQcm9taXNlLCBvciByZXR1cm5zIGFuIFJERiBkYXRhc2V0KS5cbiAqL1xuanNvbmxkLnJlZ2lzdGVyUkRGUGFyc2VyID0gZnVuY3Rpb24oY29udGVudFR5cGUsIHBhcnNlcikge1xuICBfcmRmUGFyc2Vyc1tjb250ZW50VHlwZV0gPSBwYXJzZXI7XG59O1xuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGFuIFJERiBkYXRhc2V0IHBhcnNlciBieSBjb250ZW50LXR5cGUuXG4gKlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50LXR5cGUgZm9yIHRoZSBwYXJzZXIuXG4gKi9cbmpzb25sZC51bnJlZ2lzdGVyUkRGUGFyc2VyID0gZnVuY3Rpb24oY29udGVudFR5cGUpIHtcbiAgZGVsZXRlIF9yZGZQYXJzZXJzW2NvbnRlbnRUeXBlXTtcbn07XG5cbmlmKF9ub2RlanMpIHtcbiAgLy8gbmVlZGVkIGZvciBzZXJpYWxpemF0aW9uIG9mIFhNTCBsaXRlcmFsc1xuICBpZih0eXBlb2YgWE1MU2VyaWFsaXplciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgWE1MU2VyaWFsaXplciA9IG51bGw7XG4gIH1cbiAgaWYodHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIE5vZGUgPSB7XG4gICAgICBFTEVNRU5UX05PREU6IDEsXG4gICAgICBBVFRSSUJVVEVfTk9ERTogMixcbiAgICAgIFRFWFRfTk9ERTogMyxcbiAgICAgIENEQVRBX1NFQ1RJT05fTk9ERTogNCxcbiAgICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSxcbiAgICAgIEVOVElUWV9OT0RFOiA2LFxuICAgICAgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiA3LFxuICAgICAgQ09NTUVOVF9OT0RFOiA4LFxuICAgICAgRE9DVU1FTlRfTk9ERTogOSxcbiAgICAgIERPQ1VNRU5UX1RZUEVfTk9ERTogMTAsXG4gICAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSxcbiAgICAgIE5PVEFUSU9OX05PREU6MTJcbiAgICB9O1xuICB9XG59XG5cbi8vIGNvbnN0YW50c1xudmFyIFhTRF9CT09MRUFOID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW4nO1xudmFyIFhTRF9ET1VCTEUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZG91YmxlJztcbnZhciBYU0RfSU5URUdFUiA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRlZ2VyJztcbnZhciBYU0RfU1RSSU5HID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZyc7XG5cbnZhciBSREYgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc7XG52YXIgUkRGX0xJU1QgPSBSREYgKyAnTGlzdCc7XG52YXIgUkRGX0ZJUlNUID0gUkRGICsgJ2ZpcnN0JztcbnZhciBSREZfUkVTVCA9IFJERiArICdyZXN0JztcbnZhciBSREZfTklMID0gUkRGICsgJ25pbCc7XG52YXIgUkRGX1RZUEUgPSBSREYgKyAndHlwZSc7XG52YXIgUkRGX1BMQUlOX0xJVEVSQUwgPSBSREYgKyAnUGxhaW5MaXRlcmFsJztcbnZhciBSREZfWE1MX0xJVEVSQUwgPSBSREYgKyAnWE1MTGl0ZXJhbCc7XG52YXIgUkRGX09CSkVDVCA9IFJERiArICdvYmplY3QnO1xudmFyIFJERl9MQU5HU1RSSU5HID0gUkRGICsgJ2xhbmdTdHJpbmcnO1xuXG52YXIgTElOS19IRUFERVJfUkVMID0gJ2h0dHA6Ly93d3cudzMub3JnL25zL2pzb24tbGQjY29udGV4dCc7XG52YXIgTUFYX0NPTlRFWFRfVVJMUyA9IDEwO1xuXG4vKipcbiAqIEEgSlNPTi1MRCBFcnJvci5cbiAqXG4gKiBAcGFyYW0gbXNnIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHR5cGUgdGhlIGVycm9yIHR5cGUuXG4gKiBAcGFyYW0gZGV0YWlscyB0aGUgZXJyb3IgZGV0YWlscy5cbiAqL1xudmFyIEpzb25MZEVycm9yID0gZnVuY3Rpb24obXNnLCB0eXBlLCBkZXRhaWxzKSB7XG4gIGlmKF9ub2RlanMpIHtcbiAgICBFcnJvci5jYWxsKHRoaXMpO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2UgaWYodHlwZW9mIEVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG4gIHRoaXMubmFtZSA9IHR5cGUgfHwgJ2pzb25sZC5FcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1zZyB8fCAnQW4gdW5zcGVjaWZpZWQgSlNPTi1MRCBlcnJvciBvY2N1cnJlZC4nO1xuICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzIHx8IHt9O1xufTtcbmlmKF9ub2RlanMpIHtcbiAgcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzKEpzb25MZEVycm9yLCBFcnJvcik7XG59IGVsc2UgaWYodHlwZW9mIEVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICBKc29uTGRFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IEpTT04tTEQgUHJvY2Vzc29yLlxuICovXG52YXIgUHJvY2Vzc29yID0gZnVuY3Rpb24oKSB7fTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb21wYWN0cyBhbiBlbGVtZW50IHVzaW5nIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dC4gQWxsIHZhbHVlc1xuICogbXVzdCBiZSBpbiBleHBhbmRlZCBmb3JtIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGFjdGl2ZVByb3BlcnR5IHRoZSBjb21wYWN0ZWQgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiAgICAgICAgICB0byBjb21wYWN0LCBudWxsIGZvciBub25lLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY29tcGFjdC5cbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBjb21wYWN0aW9uIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB0aGUgY29tcGFjdGVkIHZhbHVlLlxuICovXG5Qcm9jZXNzb3IucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCwgb3B0aW9ucykge1xuICAvLyByZWN1cnNpdmVseSBjb21wYWN0IGFycmF5XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7ICsraSkge1xuICAgICAgLy8gY29tcGFjdCwgZHJvcHBpbmcgYW55IG51bGwgdmFsdWVzXG4gICAgICB2YXIgY29tcGFjdGVkID0gdGhpcy5jb21wYWN0KFxuICAgICAgICBhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCBlbGVtZW50W2ldLCBvcHRpb25zKTtcbiAgICAgIGlmKGNvbXBhY3RlZCAhPT0gbnVsbCkge1xuICAgICAgICBydmFsLnB1c2goY29tcGFjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob3B0aW9ucy5jb21wYWN0QXJyYXlzICYmIHJ2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyB1c2Ugc2luZ2xlIGVsZW1lbnQgaWYgbm8gY29udGFpbmVyIGlzIHNwZWNpZmllZFxuICAgICAgdmFyIGNvbnRhaW5lciA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoXG4gICAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG4gICAgICBpZihjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgICAgcnZhbCA9IHJ2YWxbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlbHkgY29tcGFjdCBvYmplY3RcbiAgaWYoX2lzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgaWYob3B0aW9ucy5saW5rICYmICdAaWQnIGluIGVsZW1lbnQgJiYgZWxlbWVudFsnQGlkJ10gaW4gb3B0aW9ucy5saW5rKSB7XG4gICAgICAvLyBjaGVjayBmb3IgYSBsaW5rZWQgZWxlbWVudCB0byByZXVzZVxuICAgICAgdmFyIGxpbmtlZCA9IG9wdGlvbnMubGlua1tlbGVtZW50WydAaWQnXV07XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlua2VkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmKGxpbmtlZFtpXS5leHBhbmRlZCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBsaW5rZWRbaV0uY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZG8gdmFsdWUgY29tcGFjdGlvbiBvbiBAdmFsdWVzIGFuZCBzdWJqZWN0IHJlZmVyZW5jZXNcbiAgICBpZihfaXNWYWx1ZShlbGVtZW50KSB8fCBfaXNTdWJqZWN0UmVmZXJlbmNlKGVsZW1lbnQpKSB7XG4gICAgICB2YXIgcnZhbCA9IF9jb21wYWN0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCk7XG4gICAgICBpZihvcHRpb25zLmxpbmsgJiYgX2lzU3ViamVjdFJlZmVyZW5jZShlbGVtZW50KSkge1xuICAgICAgICAvLyBzdG9yZSBsaW5rZWQgZWxlbWVudFxuICAgICAgICBpZighKGVsZW1lbnRbJ0BpZCddIGluIG9wdGlvbnMubGluaykpIHtcbiAgICAgICAgICBvcHRpb25zLmxpbmtbZWxlbWVudFsnQGlkJ11dID0gW107XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXS5wdXNoKHtleHBhbmRlZDogZWxlbWVudCwgY29tcGFjdGVkOiBydmFsfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnZhbDtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogYXZvaWQgbWlzdXNlIG9mIGFjdGl2ZSBwcm9wZXJ0eSBhcyBhbiBleHBhbmRlZCBwcm9wZXJ0eT9cbiAgICB2YXIgaW5zaWRlUmV2ZXJzZSA9IChhY3RpdmVQcm9wZXJ0eSA9PT0gJ0ByZXZlcnNlJyk7XG5cbiAgICB2YXIgcnZhbCA9IHt9O1xuXG4gICAgaWYob3B0aW9ucy5saW5rICYmICdAaWQnIGluIGVsZW1lbnQpIHtcbiAgICAgIC8vIHN0b3JlIGxpbmtlZCBlbGVtZW50XG4gICAgICBpZighKGVsZW1lbnRbJ0BpZCddIGluIG9wdGlvbnMubGluaykpIHtcbiAgICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXSA9IFtdO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXS5wdXNoKHtleHBhbmRlZDogZWxlbWVudCwgY29tcGFjdGVkOiBydmFsfSk7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBlbGVtZW50IGtleXMgaW4gb3JkZXJcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQpLnNvcnQoKTtcbiAgICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgICAgdmFyIGV4cGFuZGVkUHJvcGVydHkgPSBrZXlzW2tpXTtcbiAgICAgIHZhciBleHBhbmRlZFZhbHVlID0gZWxlbWVudFtleHBhbmRlZFByb3BlcnR5XTtcblxuICAgICAgLy8gY29tcGFjdCBAaWQgYW5kIEB0eXBlKHMpXG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQGlkJyB8fCBleHBhbmRlZFByb3BlcnR5ID09PSAnQHR5cGUnKSB7XG4gICAgICAgIHZhciBjb21wYWN0ZWRWYWx1ZTtcblxuICAgICAgICAvLyBjb21wYWN0IHNpbmdsZSBAaWRcbiAgICAgICAgaWYoX2lzU3RyaW5nKGV4cGFuZGVkVmFsdWUpKSB7XG4gICAgICAgICAgY29tcGFjdGVkVmFsdWUgPSBfY29tcGFjdElyaShcbiAgICAgICAgICAgIGFjdGl2ZUN0eCwgZXhwYW5kZWRWYWx1ZSwgbnVsbCxcbiAgICAgICAgICAgIHt2b2NhYjogKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdHlwZScpfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXhwYW5kZWQgdmFsdWUgbXVzdCBiZSBhIEB0eXBlIGFycmF5XG4gICAgICAgICAgY29tcGFjdGVkVmFsdWUgPSBbXTtcbiAgICAgICAgICBmb3IodmFyIHZpID0gMDsgdmkgPCBleHBhbmRlZFZhbHVlLmxlbmd0aDsgKyt2aSkge1xuICAgICAgICAgICAgY29tcGFjdGVkVmFsdWUucHVzaChfY29tcGFjdElyaShcbiAgICAgICAgICAgICAgYWN0aXZlQ3R4LCBleHBhbmRlZFZhbHVlW3ZpXSwgbnVsbCwge3ZvY2FiOiB0cnVlfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBrZXl3b3JkIGFsaWFzIGFuZCBhZGQgdmFsdWVcbiAgICAgICAgdmFyIGFsaWFzID0gX2NvbXBhY3RJcmkoYWN0aXZlQ3R4LCBleHBhbmRlZFByb3BlcnR5KTtcbiAgICAgICAgdmFyIGlzQXJyYXkgPSAoX2lzQXJyYXkoY29tcGFjdGVkVmFsdWUpICYmIGV4cGFuZGVkVmFsdWUubGVuZ3RoID09PSAwKTtcbiAgICAgICAganNvbmxkLmFkZFZhbHVlKFxuICAgICAgICAgIHJ2YWwsIGFsaWFzLCBjb21wYWN0ZWRWYWx1ZSwge3Byb3BlcnR5SXNBcnJheTogaXNBcnJheX0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIEByZXZlcnNlXG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQHJldmVyc2UnKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGNvbXBhY3QgZXhwYW5kZWQgdmFsdWVcbiAgICAgICAgdmFyIGNvbXBhY3RlZFZhbHVlID0gdGhpcy5jb21wYWN0KFxuICAgICAgICAgIGFjdGl2ZUN0eCwgJ0ByZXZlcnNlJywgZXhwYW5kZWRWYWx1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGRvdWJsZS1yZXZlcnNlZCBwcm9wZXJ0aWVzXG4gICAgICAgIGZvcih2YXIgY29tcGFjdGVkUHJvcGVydHkgaW4gY29tcGFjdGVkVmFsdWUpIHtcbiAgICAgICAgICBpZihhY3RpdmVDdHgubWFwcGluZ3NbY29tcGFjdGVkUHJvcGVydHldICYmXG4gICAgICAgICAgICBhY3RpdmVDdHgubWFwcGluZ3NbY29tcGFjdGVkUHJvcGVydHldLnJldmVyc2UpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbXBhY3RlZFZhbHVlW2NvbXBhY3RlZFByb3BlcnR5XTtcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKFxuICAgICAgICAgICAgICBhY3RpdmVDdHgsIGNvbXBhY3RlZFByb3BlcnR5LCAnQGNvbnRhaW5lcicpO1xuICAgICAgICAgICAgdmFyIHVzZUFycmF5ID0gKGNvbnRhaW5lciA9PT0gJ0BzZXQnIHx8ICFvcHRpb25zLmNvbXBhY3RBcnJheXMpO1xuICAgICAgICAgICAganNvbmxkLmFkZFZhbHVlKFxuICAgICAgICAgICAgICBydmFsLCBjb21wYWN0ZWRQcm9wZXJ0eSwgdmFsdWUsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gICAgICAgICAgICBkZWxldGUgY29tcGFjdGVkVmFsdWVbY29tcGFjdGVkUHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGNvbXBhY3RlZFZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gdXNlIGtleXdvcmQgYWxpYXMgYW5kIGFkZCB2YWx1ZVxuICAgICAgICAgIHZhciBhbGlhcyA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgZXhwYW5kZWRQcm9wZXJ0eSk7XG4gICAgICAgICAganNvbmxkLmFkZFZhbHVlKHJ2YWwsIGFsaWFzLCBjb21wYWN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIEBpbmRleCBwcm9wZXJ0eVxuICAgICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpbmRleCcpIHtcbiAgICAgICAgLy8gZHJvcCBAaW5kZXggaWYgaW5zaWRlIGFuIEBpbmRleCBjb250YWluZXJcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0Bjb250YWluZXInKTtcbiAgICAgICAgaWYoY29udGFpbmVyID09PSAnQGluZGV4Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlIGtleXdvcmQgYWxpYXMgYW5kIGFkZCB2YWx1ZVxuICAgICAgICB2YXIgYWxpYXMgPSBfY29tcGFjdElyaShhY3RpdmVDdHgsIGV4cGFuZGVkUHJvcGVydHkpO1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUocnZhbCwgYWxpYXMsIGV4cGFuZGVkVmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2tpcCBhcnJheSBwcm9jZXNzaW5nIGZvciBrZXl3b3JkcyB0aGF0IGFyZW4ndCBAZ3JhcGggb3IgQGxpc3RcbiAgICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgIT09ICdAZ3JhcGgnICYmIGV4cGFuZGVkUHJvcGVydHkgIT09ICdAbGlzdCcgJiZcbiAgICAgICAgX2lzS2V5d29yZChleHBhbmRlZFByb3BlcnR5KSkge1xuICAgICAgICAvLyB1c2Uga2V5d29yZCBhbGlhcyBhbmQgYWRkIHZhbHVlIGFzIGlzXG4gICAgICAgIHZhciBhbGlhcyA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgZXhwYW5kZWRQcm9wZXJ0eSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShydmFsLCBhbGlhcywgZXhwYW5kZWRWYWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3RlOiBleHBhbmRlZCB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5IGR1ZSB0byBleHBhbnNpb24gYWxnb3JpdGhtLlxuXG4gICAgICAvLyBwcmVzZXJ2ZSBlbXB0eSBhcnJheXNcbiAgICAgIGlmKGV4cGFuZGVkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBpdGVtQWN0aXZlUHJvcGVydHkgPSBfY29tcGFjdElyaShcbiAgICAgICAgICBhY3RpdmVDdHgsIGV4cGFuZGVkUHJvcGVydHksIGV4cGFuZGVkVmFsdWUsIHt2b2NhYjogdHJ1ZX0sXG4gICAgICAgICAgaW5zaWRlUmV2ZXJzZSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICBydmFsLCBpdGVtQWN0aXZlUHJvcGVydHksIGV4cGFuZGVkVmFsdWUsIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWV9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVjdXNpdmVseSBwcm9jZXNzIGFycmF5IHZhbHVlc1xuICAgICAgZm9yKHZhciB2aSA9IDA7IHZpIDwgZXhwYW5kZWRWYWx1ZS5sZW5ndGg7ICsrdmkpIHtcbiAgICAgICAgdmFyIGV4cGFuZGVkSXRlbSA9IGV4cGFuZGVkVmFsdWVbdmldO1xuXG4gICAgICAgIC8vIGNvbXBhY3QgcHJvcGVydHkgYW5kIGdldCBjb250YWluZXIgdHlwZVxuICAgICAgICB2YXIgaXRlbUFjdGl2ZVByb3BlcnR5ID0gX2NvbXBhY3RJcmkoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBleHBhbmRlZFByb3BlcnR5LCBleHBhbmRlZEl0ZW0sIHt2b2NhYjogdHJ1ZX0sXG4gICAgICAgICAgaW5zaWRlUmV2ZXJzZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKFxuICAgICAgICAgIGFjdGl2ZUN0eCwgaXRlbUFjdGl2ZVByb3BlcnR5LCAnQGNvbnRhaW5lcicpO1xuXG4gICAgICAgIC8vIGdldCBAbGlzdCB2YWx1ZSBpZiBhcHByb3ByaWF0ZVxuICAgICAgICB2YXIgaXNMaXN0ID0gX2lzTGlzdChleHBhbmRlZEl0ZW0pO1xuICAgICAgICB2YXIgbGlzdCA9IG51bGw7XG4gICAgICAgIGlmKGlzTGlzdCkge1xuICAgICAgICAgIGxpc3QgPSBleHBhbmRlZEl0ZW1bJ0BsaXN0J107XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWN1cnNpdmVseSBjb21wYWN0IGV4cGFuZGVkIGl0ZW1cbiAgICAgICAgdmFyIGNvbXBhY3RlZEl0ZW0gPSB0aGlzLmNvbXBhY3QoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBpdGVtQWN0aXZlUHJvcGVydHksIGlzTGlzdCA/IGxpc3QgOiBleHBhbmRlZEl0ZW0sIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBAbGlzdFxuICAgICAgICBpZihpc0xpc3QpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgQGxpc3QgdmFsdWUgaXMgYW4gYXJyYXlcbiAgICAgICAgICBpZighX2lzQXJyYXkoY29tcGFjdGVkSXRlbSkpIHtcbiAgICAgICAgICAgIGNvbXBhY3RlZEl0ZW0gPSBbY29tcGFjdGVkSXRlbV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoY29udGFpbmVyICE9PSAnQGxpc3QnKSB7XG4gICAgICAgICAgICAvLyB3cmFwIHVzaW5nIEBsaXN0IGFsaWFzXG4gICAgICAgICAgICB2YXIgd3JhcHBlciA9IHt9O1xuICAgICAgICAgICAgd3JhcHBlcltfY29tcGFjdElyaShhY3RpdmVDdHgsICdAbGlzdCcpXSA9IGNvbXBhY3RlZEl0ZW07XG4gICAgICAgICAgICBjb21wYWN0ZWRJdGVtID0gd3JhcHBlcjtcblxuICAgICAgICAgICAgLy8gaW5jbHVkZSBAaW5kZXggZnJvbSBleHBhbmRlZCBAbGlzdCwgaWYgYW55XG4gICAgICAgICAgICBpZignQGluZGV4JyBpbiBleHBhbmRlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgY29tcGFjdGVkSXRlbVtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAaW5kZXgnKV0gPVxuICAgICAgICAgICAgICAgIGV4cGFuZGVkSXRlbVsnQGluZGV4J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKGl0ZW1BY3RpdmVQcm9wZXJ0eSBpbiBydmFsKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCB1c2UgQGxpc3QgY29udGFpbmVyIGZvciBtb3JlIHRoYW4gMSBsaXN0XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdKU09OLUxEIGNvbXBhY3QgZXJyb3I7IHByb3BlcnR5IGhhcyBhIFwiQGxpc3RcIiBAY29udGFpbmVyICcgK1xuICAgICAgICAgICAgICAncnVsZSBidXQgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIEBsaXN0IHRoYXQgbWF0Y2hlcyAnICtcbiAgICAgICAgICAgICAgJ3RoZSBjb21wYWN0ZWQgdGVybSBpbiB0aGUgZG9jdW1lbnQuIENvbXBhY3Rpb24gbWlnaHQgbWl4ICcgK1xuICAgICAgICAgICAgICAndW53YW50ZWQgaXRlbXMgaW50byB0aGUgbGlzdC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdjb21wYWN0aW9uIHRvIGxpc3Qgb2YgbGlzdHMnfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGxhbmd1YWdlIGFuZCBpbmRleCBtYXBzXG4gICAgICAgIGlmKGNvbnRhaW5lciA9PT0gJ0BsYW5ndWFnZScgfHwgY29udGFpbmVyID09PSAnQGluZGV4Jykge1xuICAgICAgICAgIC8vIGdldCBvciBjcmVhdGUgdGhlIG1hcCBvYmplY3RcbiAgICAgICAgICB2YXIgbWFwT2JqZWN0O1xuICAgICAgICAgIGlmKGl0ZW1BY3RpdmVQcm9wZXJ0eSBpbiBydmFsKSB7XG4gICAgICAgICAgICBtYXBPYmplY3QgPSBydmFsW2l0ZW1BY3RpdmVQcm9wZXJ0eV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ2YWxbaXRlbUFjdGl2ZVByb3BlcnR5XSA9IG1hcE9iamVjdCA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIGNvbnRhaW5lciBpcyBhIGxhbmd1YWdlIG1hcCwgc2ltcGxpZnkgY29tcGFjdGVkIHZhbHVlIHRvXG4gICAgICAgICAgLy8gYSBzaW1wbGUgc3RyaW5nXG4gICAgICAgICAgaWYoY29udGFpbmVyID09PSAnQGxhbmd1YWdlJyAmJiBfaXNWYWx1ZShjb21wYWN0ZWRJdGVtKSkge1xuICAgICAgICAgICAgY29tcGFjdGVkSXRlbSA9IGNvbXBhY3RlZEl0ZW1bJ0B2YWx1ZSddO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGFkZCBjb21wYWN0IHZhbHVlIHRvIG1hcCBvYmplY3QgdXNpbmcga2V5IGZyb20gZXhwYW5kZWQgdmFsdWVcbiAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgY29udGFpbmVyIHR5cGVcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUobWFwT2JqZWN0LCBleHBhbmRlZEl0ZW1bY29udGFpbmVyXSwgY29tcGFjdGVkSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIGFuIGFycmF5IGlmOiBjb21wYWN0QXJyYXlzIGZsYWcgaXMgZmFsc2UsXG4gICAgICAgICAgLy8gQGNvbnRhaW5lciBpcyBAc2V0IG9yIEBsaXN0ICwgdmFsdWUgaXMgYW4gZW1wdHlcbiAgICAgICAgICAvLyBhcnJheSwgb3Iga2V5IGlzIEBncmFwaFxuICAgICAgICAgIHZhciBpc0FycmF5ID0gKCFvcHRpb25zLmNvbXBhY3RBcnJheXMgfHwgY29udGFpbmVyID09PSAnQHNldCcgfHxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9PT0gJ0BsaXN0JyB8fFxuICAgICAgICAgICAgKF9pc0FycmF5KGNvbXBhY3RlZEl0ZW0pICYmIGNvbXBhY3RlZEl0ZW0ubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BsaXN0JyB8fCBleHBhbmRlZFByb3BlcnR5ID09PSAnQGdyYXBoJyk7XG5cbiAgICAgICAgICAvLyBhZGQgY29tcGFjdCB2YWx1ZVxuICAgICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICAgIHJ2YWwsIGl0ZW1BY3RpdmVQcm9wZXJ0eSwgY29tcGFjdGVkSXRlbSxcbiAgICAgICAgICAgIHtwcm9wZXJ0eUlzQXJyYXk6IGlzQXJyYXl9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gb25seSBwcmltaXRpdmVzIHJlbWFpbiB3aGljaCBhcmUgYWxyZWFkeSBjb21wYWN0XG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBleHBhbmRzIGFuIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGNvbnRleHQuIEFueSBjb250ZXh0IGluXG4gKiB0aGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQuIEFsbCBjb250ZXh0IFVSTHMgbXVzdCBoYXZlIGJlZW4gcmV0cmlldmVkXG4gKiBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlQ3R4IHRoZSBjb250ZXh0IHRvIHVzZS5cbiAqIEBwYXJhbSBhY3RpdmVQcm9wZXJ0eSB0aGUgcHJvcGVydHkgZm9yIHRoZSBlbGVtZW50LCBudWxsIGZvciBub25lLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZXhwYW5kLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGV4cGFuc2lvbiBvcHRpb25zLlxuICogQHBhcmFtIGluc2lkZUxpc3QgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhIGxpc3QsIGZhbHNlIGlmIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBleHBhbmRlZCB2YWx1ZS5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCwgb3B0aW9ucywgaW5zaWRlTGlzdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gbm90aGluZyB0byBleHBhbmRcbiAgaWYoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKCFfaXNBcnJheShlbGVtZW50KSAmJiAhX2lzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgLy8gZHJvcCBmcmVlLWZsb2F0aW5nIHNjYWxhcnMgdGhhdCBhcmUgbm90IGluIGxpc3RzXG4gICAgaWYoIWluc2lkZUxpc3QgJiYgKGFjdGl2ZVByb3BlcnR5ID09PSBudWxsIHx8XG4gICAgICBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHt2b2NhYjogdHJ1ZX0pID09PSAnQGdyYXBoJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBlbGVtZW50IGFjY29yZGluZyB0byB2YWx1ZSBleHBhbnNpb24gcnVsZXNcbiAgICByZXR1cm4gX2V4cGFuZFZhbHVlKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIGVsZW1lbnQpO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIGFycmF5XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICB2YXIgY29udGFpbmVyID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG4gICAgaW5zaWRlTGlzdCA9IGluc2lkZUxpc3QgfHwgY29udGFpbmVyID09PSAnQGxpc3QnO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBleHBhbmQgZWxlbWVudFxuICAgICAgdmFyIGUgPSBzZWxmLmV4cGFuZChhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCBlbGVtZW50W2ldLCBvcHRpb25zKTtcbiAgICAgIGlmKGluc2lkZUxpc3QgJiYgKF9pc0FycmF5KGUpIHx8IF9pc0xpc3QoZSkpKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIGxpc3RzIGFyZSBpbGxlZ2FsXG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgbGlzdHMgb2YgbGlzdHMgYXJlIG5vdCBwZXJtaXR0ZWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdsaXN0IG9mIGxpc3RzJ30pO1xuICAgICAgfVxuICAgICAgLy8gZHJvcCBudWxsIHZhbHVlc1xuICAgICAgaWYoZSAhPT0gbnVsbCkge1xuICAgICAgICBpZihfaXNBcnJheShlKSkge1xuICAgICAgICAgIHJ2YWwgPSBydmFsLmNvbmNhdChlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBydmFsLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH1cblxuICAvLyByZWN1cnNpdmVseSBleHBhbmQgb2JqZWN0OlxuXG4gIC8vIGlmIGVsZW1lbnQgaGFzIGEgY29udGV4dCwgcHJvY2VzcyBpdFxuICBpZignQGNvbnRleHQnIGluIGVsZW1lbnQpIHtcbiAgICBhY3RpdmVDdHggPSBzZWxmLnByb2Nlc3NDb250ZXh0KGFjdGl2ZUN0eCwgZWxlbWVudFsnQGNvbnRleHQnXSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBleHBhbmQgdGhlIGFjdGl2ZSBwcm9wZXJ0eVxuICB2YXIgZXhwYW5kZWRBY3RpdmVQcm9wZXJ0eSA9IF9leHBhbmRJcmkoXG4gICAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwge3ZvY2FiOiB0cnVlfSk7XG5cbiAgdmFyIHJ2YWwgPSB7fTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KS5zb3J0KCk7XG4gIGZvcih2YXIga2kgPSAwOyBraSA8IGtleXMubGVuZ3RoOyArK2tpKSB7XG4gICAgdmFyIGtleSA9IGtleXNba2ldO1xuICAgIHZhciB2YWx1ZSA9IGVsZW1lbnRba2V5XTtcbiAgICB2YXIgZXhwYW5kZWRWYWx1ZTtcblxuICAgIC8vIHNraXAgQGNvbnRleHRcbiAgICBpZihrZXkgPT09ICdAY29udGV4dCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBwcm9wZXJ0eVxuICAgIHZhciBleHBhbmRlZFByb3BlcnR5ID0gX2V4cGFuZElyaShhY3RpdmVDdHgsIGtleSwge3ZvY2FiOiB0cnVlfSk7XG5cbiAgICAvLyBkcm9wIG5vbi1hYnNvbHV0ZSBJUkkga2V5cyB0aGF0IGFyZW4ndCBrZXl3b3Jkc1xuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09IG51bGwgfHxcbiAgICAgICEoX2lzQWJzb2x1dGVJcmkoZXhwYW5kZWRQcm9wZXJ0eSkgfHwgX2lzS2V5d29yZChleHBhbmRlZFByb3BlcnR5KSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmKF9pc0tleXdvcmQoZXhwYW5kZWRQcm9wZXJ0eSkpIHtcbiAgICAgIGlmKGV4cGFuZGVkQWN0aXZlUHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIGtleXdvcmQgY2Fubm90IGJlIHVzZWQgYXMgYSBAcmV2ZXJzZSAnICtcbiAgICAgICAgICAncHJvcGVydHkuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgbWFwJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICB9XG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5IGluIHJ2YWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBjb2xsaWRpbmcga2V5d29yZHMgZGV0ZWN0ZWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2NvbGxpZGluZyBrZXl3b3JkcycsIGtleXdvcmQ6IGV4cGFuZGVkUHJvcGVydHl9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzeW50YXggZXJyb3IgaWYgQGlkIGlzIG5vdCBhIHN0cmluZ1xuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAaWQnICYmICFfaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICBpZighb3B0aW9ucy5pc0ZyYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaWRcIiB2YWx1ZSBtdXN0IGEgc3RyaW5nLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnaW52YWxpZCBAaWQgdmFsdWUnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgIH1cbiAgICAgIGlmKCFfaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaWRcIiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuICcgK1xuICAgICAgICAgICdvYmplY3QuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIEBpZCB2YWx1ZScsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdHlwZScpIHtcbiAgICAgIF92YWxpZGF0ZVR5cGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQGdyYXBoIG11c3QgYmUgYW4gYXJyYXkgb3IgYW4gb2JqZWN0XG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BncmFwaCcgJiZcbiAgICAgICEoX2lzT2JqZWN0KHZhbHVlKSB8fCBfaXNBcnJheSh2YWx1ZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkBncmFwaFwiIHZhbHVlIG11c3Qgbm90IGJlIGFuICcgK1xuICAgICAgICAnb2JqZWN0IG9yIGFuIGFycmF5LicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgQGdyYXBoIHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgLy8gQHZhbHVlIG11c3Qgbm90IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheVxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdmFsdWUnICYmXG4gICAgICAoX2lzT2JqZWN0KHZhbHVlKSB8fCBfaXNBcnJheSh2YWx1ZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkB2YWx1ZVwiIHZhbHVlIG11c3Qgbm90IGJlIGFuICcgK1xuICAgICAgICAnb2JqZWN0IG9yIGFuIGFycmF5LicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgdmFsdWUgb2JqZWN0IHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgLy8gQGxhbmd1YWdlIG11c3QgYmUgYSBzdHJpbmdcbiAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQGxhbmd1YWdlJykge1xuICAgICAgaWYodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZHJvcCBudWxsIEBsYW5ndWFnZSB2YWx1ZXMsIHRoZXkgZXhwYW5kIGFzIGlmIHRoZXkgZGlkbid0IGV4aXN0XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYoIV9pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkBsYW5ndWFnZVwiIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgbGFuZ3VhZ2UtdGFnZ2VkIHN0cmluZycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgICAgLy8gZW5zdXJlIGxhbmd1YWdlIHZhbHVlIGlzIGxvd2VyY2FzZVxuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIEBpbmRleCBtdXN0IGJlIGEgc3RyaW5nXG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpbmRleCcpIHtcbiAgICAgIGlmKCFfaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaW5kZXhcIiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIEBpbmRleCB2YWx1ZScsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEByZXZlcnNlIG11c3QgYmUgYW4gb2JqZWN0XG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0ByZXZlcnNlJykge1xuICAgICAgaWYoIV9pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkByZXZlcnNlXCIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3QuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIEByZXZlcnNlIHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICB9XG5cbiAgICAgIGV4cGFuZGVkVmFsdWUgPSBzZWxmLmV4cGFuZChhY3RpdmVDdHgsICdAcmV2ZXJzZScsIHZhbHVlLCBvcHRpb25zKTtcblxuICAgICAgLy8gcHJvcGVydGllcyBkb3VibGUtcmV2ZXJzZWRcbiAgICAgIGlmKCdAcmV2ZXJzZScgaW4gZXhwYW5kZWRWYWx1ZSkge1xuICAgICAgICBmb3IodmFyIHByb3BlcnR5IGluIGV4cGFuZGVkVmFsdWVbJ0ByZXZlcnNlJ10pIHtcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICBydmFsLCBwcm9wZXJ0eSwgZXhwYW5kZWRWYWx1ZVsnQHJldmVyc2UnXVtwcm9wZXJ0eV0sXG4gICAgICAgICAgICB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYTUU6IGNhbiB0aGlzIGJlIG1lcmdlZCB3aXRoIGNvZGUgYmVsb3cgdG8gc2ltcGxpZnk/XG4gICAgICAvLyBtZXJnZSBpbiBhbGwgcmV2ZXJzZWQgcHJvcGVydGllc1xuICAgICAgdmFyIHJldmVyc2VNYXAgPSBydmFsWydAcmV2ZXJzZSddIHx8IG51bGw7XG4gICAgICBmb3IodmFyIHByb3BlcnR5IGluIGV4cGFuZGVkVmFsdWUpIHtcbiAgICAgICAgaWYocHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZihyZXZlcnNlTWFwID09PSBudWxsKSB7XG4gICAgICAgICAgcmV2ZXJzZU1hcCA9IHJ2YWxbJ0ByZXZlcnNlJ10gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBqc29ubGQuYWRkVmFsdWUocmV2ZXJzZU1hcCwgcHJvcGVydHksIFtdLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICAgIHZhciBpdGVtcyA9IGV4cGFuZGVkVmFsdWVbcHJvcGVydHldO1xuICAgICAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpdGVtcy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2lpXTtcbiAgICAgICAgICBpZihfaXNWYWx1ZShpdGVtKSB8fCBfaXNMaXN0KGl0ZW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkByZXZlcnNlXCIgdmFsdWUgbXVzdCBub3QgYmUgYSAnICtcbiAgICAgICAgICAgICAgJ0B2YWx1ZSBvciBhbiBAbGlzdC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgdmFsdWUnLCB2YWx1ZTogZXhwYW5kZWRWYWx1ZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICByZXZlcnNlTWFwLCBwcm9wZXJ0eSwgaXRlbSwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGFjdGl2ZUN0eCwga2V5LCAnQGNvbnRhaW5lcicpO1xuXG4gICAgaWYoY29udGFpbmVyID09PSAnQGxhbmd1YWdlJyAmJiBfaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAvLyBoYW5kbGUgbGFuZ3VhZ2UgbWFwIGNvbnRhaW5lciAoc2tpcCBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0KVxuICAgICAgZXhwYW5kZWRWYWx1ZSA9IF9leHBhbmRMYW5ndWFnZU1hcCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmKGNvbnRhaW5lciA9PT0gJ0BpbmRleCcgJiYgX2lzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgLy8gaGFuZGxlIGluZGV4IGNvbnRhaW5lciAoc2tpcCBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0KVxuICAgICAgZXhwYW5kZWRWYWx1ZSA9IChmdW5jdGlvbiBfZXhwYW5kSW5kZXhNYXAoYWN0aXZlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHJ2YWwgPSBbXTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpO1xuICAgICAgICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2tpXTtcbiAgICAgICAgICB2YXIgdmFsID0gdmFsdWVba2V5XTtcbiAgICAgICAgICBpZighX2lzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgdmFsID0gW3ZhbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbCA9IHNlbGYuZXhwYW5kKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHZhbCwgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICAgIGZvcih2YXIgdmkgPSAwOyB2aSA8IHZhbC5sZW5ndGg7ICsrdmkpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gdmFsW3ZpXTtcbiAgICAgICAgICAgIGlmKCEoJ0BpbmRleCcgaW4gaXRlbSkpIHtcbiAgICAgICAgICAgICAgaXRlbVsnQGluZGV4J10gPSBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydmFsLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydmFsO1xuICAgICAgfSkoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVjdXJzZSBpbnRvIEBsaXN0IG9yIEBzZXRcbiAgICAgIHZhciBpc0xpc3QgPSAoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BsaXN0Jyk7XG4gICAgICBpZihpc0xpc3QgfHwgZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BzZXQnKSB7XG4gICAgICAgIHZhciBuZXh0QWN0aXZlUHJvcGVydHkgPSBhY3RpdmVQcm9wZXJ0eTtcbiAgICAgICAgaWYoaXNMaXN0ICYmIGV4cGFuZGVkQWN0aXZlUHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgICAgICAgbmV4dEFjdGl2ZVByb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBleHBhbmRlZFZhbHVlID0gc2VsZi5leHBhbmQoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBuZXh0QWN0aXZlUHJvcGVydHksIHZhbHVlLCBvcHRpb25zLCBpc0xpc3QpO1xuICAgICAgICBpZihpc0xpc3QgJiYgX2lzTGlzdChleHBhbmRlZFZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBsaXN0cyBvZiBsaXN0cyBhcmUgbm90IHBlcm1pdHRlZC4nLFxuICAgICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnbGlzdCBvZiBsaXN0cyd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIHZhbHVlIHdpdGgga2V5IGFzIG5ldyBhY3RpdmUgcHJvcGVydHlcbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA9IHNlbGYuZXhwYW5kKGFjdGl2ZUN0eCwga2V5LCB2YWx1ZSwgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRyb3AgbnVsbCB2YWx1ZXMgaWYgcHJvcGVydHkgaXMgbm90IEB2YWx1ZVxuICAgIGlmKGV4cGFuZGVkVmFsdWUgPT09IG51bGwgJiYgZXhwYW5kZWRQcm9wZXJ0eSAhPT0gJ0B2YWx1ZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgZXhwYW5kZWQgdmFsdWUgdG8gQGxpc3QgaWYgY29udGFpbmVyIHNwZWNpZmllcyBpdFxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgIT09ICdAbGlzdCcgJiYgIV9pc0xpc3QoZXhwYW5kZWRWYWx1ZSkgJiZcbiAgICAgIGNvbnRhaW5lciA9PT0gJ0BsaXN0Jykge1xuICAgICAgLy8gZW5zdXJlIGV4cGFuZGVkIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBleHBhbmRlZFZhbHVlID0gKF9pc0FycmF5KGV4cGFuZGVkVmFsdWUpID9cbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA6IFtleHBhbmRlZFZhbHVlXSk7XG4gICAgICBleHBhbmRlZFZhbHVlID0geydAbGlzdCc6IGV4cGFuZGVkVmFsdWV9O1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBjYW4gdGhpcyBiZSBtZXJnZWQgd2l0aCBjb2RlIGFib3ZlIHRvIHNpbXBsaWZ5P1xuICAgIC8vIG1lcmdlIGluIHJldmVyc2UgcHJvcGVydGllc1xuICAgIGlmKGFjdGl2ZUN0eC5tYXBwaW5nc1trZXldICYmIGFjdGl2ZUN0eC5tYXBwaW5nc1trZXldLnJldmVyc2UpIHtcbiAgICAgIHZhciByZXZlcnNlTWFwID0gcnZhbFsnQHJldmVyc2UnXSA9IHJ2YWxbJ0ByZXZlcnNlJ10gfHwge307XG4gICAgICBpZighX2lzQXJyYXkoZXhwYW5kZWRWYWx1ZSkpIHtcbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA9IFtleHBhbmRlZFZhbHVlXTtcbiAgICAgIH1cbiAgICAgIGZvcih2YXIgaWkgPSAwOyBpaSA8IGV4cGFuZGVkVmFsdWUubGVuZ3RoOyArK2lpKSB7XG4gICAgICAgIHZhciBpdGVtID0gZXhwYW5kZWRWYWx1ZVtpaV07XG4gICAgICAgIGlmKF9pc1ZhbHVlKGl0ZW0pIHx8IF9pc0xpc3QoaXRlbSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAcmV2ZXJzZVwiIHZhbHVlIG11c3Qgbm90IGJlIGEgJyArXG4gICAgICAgICAgICAnQHZhbHVlIG9yIGFuIEBsaXN0LicsICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgdmFsdWUnLCB2YWx1ZTogZXhwYW5kZWRWYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICByZXZlcnNlTWFwLCBleHBhbmRlZFByb3BlcnR5LCBpdGVtLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdmFsdWUgZm9yIHByb3BlcnR5XG4gICAgLy8gdXNlIGFuIGFycmF5IGV4Y2VwdCBmb3IgY2VydGFpbiBrZXl3b3Jkc1xuICAgIHZhciB1c2VBcnJheSA9XG4gICAgICBbJ0BpbmRleCcsICdAaWQnLCAnQHR5cGUnLCAnQHZhbHVlJywgJ0BsYW5ndWFnZSddLmluZGV4T2YoXG4gICAgICAgIGV4cGFuZGVkUHJvcGVydHkpID09PSAtMTtcbiAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICBydmFsLCBleHBhbmRlZFByb3BlcnR5LCBleHBhbmRlZFZhbHVlLCB7cHJvcGVydHlJc0FycmF5OiB1c2VBcnJheX0pO1xuICB9XG5cbiAgLy8gZ2V0IHByb3BlcnR5IGNvdW50IG9uIGV4cGFuZGVkIG91dHB1dFxuICBrZXlzID0gT2JqZWN0LmtleXMocnZhbCk7XG4gIHZhciBjb3VudCA9IGtleXMubGVuZ3RoO1xuXG4gIGlmKCdAdmFsdWUnIGluIHJ2YWwpIHtcbiAgICAvLyBAdmFsdWUgbXVzdCBvbmx5IGhhdmUgQGxhbmd1YWdlIG9yIEB0eXBlXG4gICAgaWYoJ0B0eXBlJyBpbiBydmFsICYmICdAbGFuZ3VhZ2UnIGluIHJ2YWwpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIGVsZW1lbnQgY29udGFpbmluZyBcIkB2YWx1ZVwiIG1heSBub3QgJyArXG4gICAgICAgICdjb250YWluIGJvdGggXCJAdHlwZVwiIGFuZCBcIkBsYW5ndWFnZVwiLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgdmFsdWUgb2JqZWN0JywgZWxlbWVudDogcnZhbH0pO1xuICAgIH1cbiAgICB2YXIgdmFsaWRDb3VudCA9IGNvdW50IC0gMTtcbiAgICBpZignQHR5cGUnIGluIHJ2YWwpIHtcbiAgICAgIHZhbGlkQ291bnQgLT0gMTtcbiAgICB9XG4gICAgaWYoJ0BpbmRleCcgaW4gcnZhbCkge1xuICAgICAgdmFsaWRDb3VudCAtPSAxO1xuICAgIH1cbiAgICBpZignQGxhbmd1YWdlJyBpbiBydmFsKSB7XG4gICAgICB2YWxpZENvdW50IC09IDE7XG4gICAgfVxuICAgIGlmKHZhbGlkQ291bnQgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIGVsZW1lbnQgY29udGFpbmluZyBcIkB2YWx1ZVwiIG1heSBvbmx5ICcgK1xuICAgICAgICAnaGF2ZSBhbiBcIkBpbmRleFwiIHByb3BlcnR5IGFuZCBhdCBtb3N0IG9uZSBvdGhlciBwcm9wZXJ0eSAnICtcbiAgICAgICAgJ3doaWNoIGNhbiBiZSBcIkB0eXBlXCIgb3IgXCJAbGFuZ3VhZ2VcIi4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZhbHVlIG9iamVjdCcsIGVsZW1lbnQ6IHJ2YWx9KTtcbiAgICB9XG4gICAgLy8gZHJvcCBudWxsIEB2YWx1ZXNcbiAgICBpZihydmFsWydAdmFsdWUnXSA9PT0gbnVsbCkge1xuICAgICAgcnZhbCA9IG51bGw7XG4gICAgfSBlbHNlIGlmKCdAbGFuZ3VhZ2UnIGluIHJ2YWwgJiYgIV9pc1N0cmluZyhydmFsWydAdmFsdWUnXSkpIHtcbiAgICAgIC8vIGlmIEBsYW5ndWFnZSBpcyBwcmVzZW50LCBAdmFsdWUgbXVzdCBiZSBhIHN0cmluZ1xuICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgb25seSBzdHJpbmdzIG1heSBiZSBsYW5ndWFnZS10YWdnZWQuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZS10YWdnZWQgdmFsdWUnLCBlbGVtZW50OiBydmFsfSk7XG4gICAgfSBlbHNlIGlmKCdAdHlwZScgaW4gcnZhbCAmJiAoIV9pc0Fic29sdXRlSXJpKHJ2YWxbJ0B0eXBlJ10pIHx8XG4gICAgICBydmFsWydAdHlwZSddLmluZGV4T2YoJ186JykgPT09IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhbiBlbGVtZW50IGNvbnRhaW5pbmcgXCJAdmFsdWVcIiBhbmQgXCJAdHlwZVwiICcgK1xuICAgICAgICAnbXVzdCBoYXZlIGFuIGFic29sdXRlIElSSSBmb3IgdGhlIHZhbHVlIG9mIFwiQHR5cGVcIi4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHR5cGVkIHZhbHVlJywgZWxlbWVudDogcnZhbH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmKCdAdHlwZScgaW4gcnZhbCAmJiAhX2lzQXJyYXkocnZhbFsnQHR5cGUnXSkpIHtcbiAgICAvLyBjb252ZXJ0IEB0eXBlIHRvIGFuIGFycmF5XG4gICAgcnZhbFsnQHR5cGUnXSA9IFtydmFsWydAdHlwZSddXTtcbiAgfSBlbHNlIGlmKCdAc2V0JyBpbiBydmFsIHx8ICdAbGlzdCcgaW4gcnZhbCkge1xuICAgIC8vIGhhbmRsZSBAc2V0IGFuZCBAbGlzdFxuICAgIGlmKGNvdW50ID4gMSAmJiAhKGNvdW50ID09PSAyICYmICdAaW5kZXgnIGluIHJ2YWwpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBpZiBhbiBlbGVtZW50IGhhcyB0aGUgcHJvcGVydHkgXCJAc2V0XCIgJyArXG4gICAgICAgICdvciBcIkBsaXN0XCIsIHRoZW4gaXQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgb3RoZXIgcHJvcGVydHkgdGhhdCBpcyAnICtcbiAgICAgICAgJ1wiQGluZGV4XCIuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBzZXQgb3IgbGlzdCBvYmplY3QnLCBlbGVtZW50OiBydmFsfSk7XG4gICAgfVxuICAgIC8vIG9wdGltaXplIGF3YXkgQHNldFxuICAgIGlmKCdAc2V0JyBpbiBydmFsKSB7XG4gICAgICBydmFsID0gcnZhbFsnQHNldCddO1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHJ2YWwpO1xuICAgICAgY291bnQgPSBrZXlzLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZihjb3VudCA9PT0gMSAmJiAnQGxhbmd1YWdlJyBpbiBydmFsKSB7XG4gICAgLy8gZHJvcCBvYmplY3RzIHdpdGggb25seSBAbGFuZ3VhZ2VcbiAgICBydmFsID0gbnVsbDtcbiAgfVxuXG4gIC8vIGRyb3AgY2VydGFpbiB0b3AtbGV2ZWwgb2JqZWN0cyB0aGF0IGRvIG5vdCBvY2N1ciBpbiBsaXN0c1xuICBpZihfaXNPYmplY3QocnZhbCkgJiZcbiAgICAhb3B0aW9ucy5rZWVwRnJlZUZsb2F0aW5nTm9kZXMgJiYgIWluc2lkZUxpc3QgJiZcbiAgICAoYWN0aXZlUHJvcGVydHkgPT09IG51bGwgfHwgZXhwYW5kZWRBY3RpdmVQcm9wZXJ0eSA9PT0gJ0BncmFwaCcpKSB7XG4gICAgLy8gZHJvcCBlbXB0eSBvYmplY3QsIHRvcC1sZXZlbCBAdmFsdWUvQGxpc3QsIG9yIG9iamVjdCB3aXRoIG9ubHkgQGlkXG4gICAgaWYoY291bnQgPT09IDAgfHwgJ0B2YWx1ZScgaW4gcnZhbCB8fCAnQGxpc3QnIGluIHJ2YWwgfHxcbiAgICAgIChjb3VudCA9PT0gMSAmJiAnQGlkJyBpbiBydmFsKSkge1xuICAgICAgcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBKU09OLUxEIG5vZGUgbWFwIChub2RlIElEID0+IG5vZGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgZXhwYW5kZWQgSlNPTi1MRCB0byBjcmVhdGUgYSBub2RlIG1hcCBvZi5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2lzc3Vlcl0gYSBqc29ubGQuSWRlbnRpZmllcklzc3VlciB0byB1c2UgdG8gbGFiZWwgYmxhbmsgbm9kZXMuXG4gKiAgICAgICAgICBbbmFtZXJdIChkZXByZWNhdGVkKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBub2RlIG1hcC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5jcmVhdGVOb2RlTWFwID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gcHJvZHVjZSBhIG1hcCBvZiBhbGwgc3ViamVjdHMgYW5kIG5hbWUgZWFjaCBibm9kZVxuICB2YXIgaXNzdWVyID0gb3B0aW9ucy5uYW1lciB8fCBvcHRpb25zLmlzc3VlciB8fCBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gIHZhciBncmFwaHMgPSB7J0BkZWZhdWx0Jzoge319O1xuICBfY3JlYXRlTm9kZU1hcChpbnB1dCwgZ3JhcGhzLCAnQGRlZmF1bHQnLCBpc3N1ZXIpO1xuXG4gIC8vIGFkZCBhbGwgbm9uLWRlZmF1bHQgZ3JhcGhzIHRvIGRlZmF1bHQgZ3JhcGhcbiAgcmV0dXJuIF9tZXJnZU5vZGVNYXBzKGdyYXBocyk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIEpTT04tTEQgZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGV4cGFuZGVkIEpTT04tTEQgdG8gZmxhdHRlbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBmbGF0dGVuZWQgb3V0cHV0LlxuICovXG5Qcm9jZXNzb3IucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCkge1xuICB2YXIgZGVmYXVsdEdyYXBoID0gdGhpcy5jcmVhdGVOb2RlTWFwKGlucHV0KTtcblxuICAvLyBwcm9kdWNlIGZsYXR0ZW5lZCBvdXRwdXRcbiAgdmFyIGZsYXR0ZW5lZCA9IFtdO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRHcmFwaCkuc29ydCgpO1xuICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgIHZhciBub2RlID0gZGVmYXVsdEdyYXBoW2tleXNba2ldXTtcbiAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgIGlmKCFfaXNTdWJqZWN0UmVmZXJlbmNlKG5vZGUpKSB7XG4gICAgICBmbGF0dGVuZWQucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgSlNPTi1MRCBmcmFtaW5nLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgZXhwYW5kZWQgSlNPTi1MRCB0byBmcmFtZS5cbiAqIEBwYXJhbSBmcmFtZSB0aGUgZXhwYW5kZWQgSlNPTi1MRCBmcmFtZSB0byB1c2UuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgZnJhbWluZyBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gdGhlIGZyYW1lZCBvdXRwdXQuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUuZnJhbWUgPSBmdW5jdGlvbihpbnB1dCwgZnJhbWUsIG9wdGlvbnMpIHtcbiAgLy8gY3JlYXRlIGZyYW1pbmcgc3RhdGVcbiAgdmFyIHN0YXRlID0ge1xuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgZ3JhcGhzOiB7J0BkZWZhdWx0Jzoge30sICdAbWVyZ2VkJzoge319LFxuICAgIHN1YmplY3RTdGFjazogW10sXG4gICAgbGluazoge31cbiAgfTtcblxuICAvLyBwcm9kdWNlIGEgbWFwIG9mIGFsbCBncmFwaHMgYW5kIG5hbWUgZWFjaCBibm9kZVxuICAvLyBGSVhNRTogY3VycmVudGx5IHVzZXMgc3ViamVjdHMgZnJvbSBAbWVyZ2VkIGdyYXBoIG9ubHlcbiAgdmFyIGlzc3VlciA9IG5ldyBJZGVudGlmaWVySXNzdWVyKCdfOmInKTtcbiAgX2NyZWF0ZU5vZGVNYXAoaW5wdXQsIHN0YXRlLmdyYXBocywgJ0BtZXJnZWQnLCBpc3N1ZXIpO1xuICBzdGF0ZS5zdWJqZWN0cyA9IHN0YXRlLmdyYXBoc1snQG1lcmdlZCddO1xuXG4gIC8vIGZyYW1lIHRoZSBzdWJqZWN0c1xuICB2YXIgZnJhbWVkID0gW107XG4gIF9mcmFtZShzdGF0ZSwgT2JqZWN0LmtleXMoc3RhdGUuc3ViamVjdHMpLnNvcnQoKSwgZnJhbWUsIGZyYW1lZCwgbnVsbCk7XG4gIHJldHVybiBmcmFtZWQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIG5vcm1hbGl6YXRpb24gb24gdGhlIGdpdmVuIFJERiBkYXRhc2V0LlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0IHRoZSBSREYgZGF0YXNldCB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgbm9ybWFsaXphdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgbm9ybWFsaXplZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24oZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYob3B0aW9ucy5hbGdvcml0aG0gPT09ICdVUkROQTIwMTUnKSB7XG4gICAgcmV0dXJuIG5ldyBVUkROQTIwMTUob3B0aW9ucykubWFpbihkYXRhc2V0LCBjYWxsYmFjayk7XG4gIH1cbiAgaWYob3B0aW9ucy5hbGdvcml0aG0gPT09ICdVUkdOQTIwMTInKSB7XG4gICAgcmV0dXJuIG5ldyBVUkdOQTIwMTIob3B0aW9ucykubWFpbihkYXRhc2V0LCBjYWxsYmFjayk7XG4gIH1cbiAgY2FsbGJhY2sobmV3IEVycm9yKFxuICAgICdJbnZhbGlkIFJERiBEYXRhc2V0IE5vcm1hbGl6YXRpb24gYWxnb3JpdGhtOiAnICsgb3B0aW9ucy5hbGdvcml0aG0pKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gUkRGIGRhdGFzZXQgdG8gSlNPTi1MRC5cbiAqXG4gKiBAcGFyYW0gZGF0YXNldCB0aGUgUkRGIGRhdGFzZXQuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIG91dHB1dCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUuZnJvbVJERiA9IGZ1bmN0aW9uKGRhdGFzZXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBkZWZhdWx0R3JhcGggPSB7fTtcbiAgdmFyIGdyYXBoTWFwID0geydAZGVmYXVsdCc6IGRlZmF1bHRHcmFwaH07XG4gIHZhciByZWZlcmVuY2VkT25jZSA9IHt9O1xuXG4gIGZvcih2YXIgbmFtZSBpbiBkYXRhc2V0KSB7XG4gICAgdmFyIGdyYXBoID0gZGF0YXNldFtuYW1lXTtcbiAgICBpZighKG5hbWUgaW4gZ3JhcGhNYXApKSB7XG4gICAgICBncmFwaE1hcFtuYW1lXSA9IHt9O1xuICAgIH1cbiAgICBpZihuYW1lICE9PSAnQGRlZmF1bHQnICYmICEobmFtZSBpbiBkZWZhdWx0R3JhcGgpKSB7XG4gICAgICBkZWZhdWx0R3JhcGhbbmFtZV0gPSB7J0BpZCc6IG5hbWV9O1xuICAgIH1cbiAgICB2YXIgbm9kZU1hcCA9IGdyYXBoTWFwW25hbWVdO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IGdyYXBoLmxlbmd0aDsgKyt0aSkge1xuICAgICAgdmFyIHRyaXBsZSA9IGdyYXBoW3RpXTtcblxuICAgICAgLy8gZ2V0IHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0XG4gICAgICB2YXIgcyA9IHRyaXBsZS5zdWJqZWN0LnZhbHVlO1xuICAgICAgdmFyIHAgPSB0cmlwbGUucHJlZGljYXRlLnZhbHVlO1xuICAgICAgdmFyIG8gPSB0cmlwbGUub2JqZWN0O1xuXG4gICAgICBpZighKHMgaW4gbm9kZU1hcCkpIHtcbiAgICAgICAgbm9kZU1hcFtzXSA9IHsnQGlkJzogc307XG4gICAgICB9XG4gICAgICB2YXIgbm9kZSA9IG5vZGVNYXBbc107XG5cbiAgICAgIHZhciBvYmplY3RJc0lkID0gKG8udHlwZSA9PT0gJ0lSSScgfHwgby50eXBlID09PSAnYmxhbmsgbm9kZScpO1xuICAgICAgaWYob2JqZWN0SXNJZCAmJiAhKG8udmFsdWUgaW4gbm9kZU1hcCkpIHtcbiAgICAgICAgbm9kZU1hcFtvLnZhbHVlXSA9IHsnQGlkJzogby52YWx1ZX07XG4gICAgICB9XG5cbiAgICAgIGlmKHAgPT09IFJERl9UWVBFICYmICFvcHRpb25zLnVzZVJkZlR5cGUgJiYgb2JqZWN0SXNJZCkge1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUobm9kZSwgJ0B0eXBlJywgby52YWx1ZSwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gX1JERlRvT2JqZWN0KG8sIG9wdGlvbnMudXNlTmF0aXZlVHlwZXMpO1xuICAgICAganNvbmxkLmFkZFZhbHVlKG5vZGUsIHAsIHZhbHVlLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG5cbiAgICAgIC8vIG9iamVjdCBtYXkgYmUgYW4gUkRGIGxpc3QvcGFydGlhbCBsaXN0IG5vZGUgYnV0IHdlIGNhbid0IGtub3cgZWFzaWx5XG4gICAgICAvLyB1bnRpbCBhbGwgdHJpcGxlcyBhcmUgcmVhZFxuICAgICAgaWYob2JqZWN0SXNJZCkge1xuICAgICAgICBpZihvLnZhbHVlID09PSBSREZfTklMKSB7XG4gICAgICAgICAgLy8gdHJhY2sgcmRmOm5pbCB1bmlxdWVseSBwZXIgZ3JhcGhcbiAgICAgICAgICB2YXIgb2JqZWN0ID0gbm9kZU1hcFtvLnZhbHVlXTtcbiAgICAgICAgICBpZighKCd1c2FnZXMnIGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIG9iamVjdC51c2FnZXMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0LnVzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBwcm9wZXJ0eTogcCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYoby52YWx1ZSBpbiByZWZlcmVuY2VkT25jZSkge1xuICAgICAgICAgIC8vIG9iamVjdCByZWZlcmVuY2VkIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgcmVmZXJlbmNlZE9uY2Vbby52YWx1ZV0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHNpbmdsZSByZWZlcmVuY2VcbiAgICAgICAgICByZWZlcmVuY2VkT25jZVtvLnZhbHVlXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBwcm9wZXJ0eTogcCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBjb252ZXJ0IGxpbmtlZCBsaXN0cyB0byBAbGlzdCBhcnJheXNcbiAgZm9yKHZhciBuYW1lIGluIGdyYXBoTWFwKSB7XG4gICAgdmFyIGdyYXBoT2JqZWN0ID0gZ3JhcGhNYXBbbmFtZV07XG5cbiAgICAvLyBubyBAbGlzdHMgdG8gYmUgY29udmVydGVkLCBjb250aW51ZVxuICAgIGlmKCEoUkRGX05JTCBpbiBncmFwaE9iamVjdCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2ggZWFjaCBSREYgbGlzdFxuICAgIHZhciBuaWwgPSBncmFwaE9iamVjdFtSREZfTklMXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbmlsLnVzYWdlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHVzYWdlID0gbmlsLnVzYWdlc1tpXTtcbiAgICAgIHZhciBub2RlID0gdXNhZ2Uubm9kZTtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHVzYWdlLnByb3BlcnR5O1xuICAgICAgdmFyIGhlYWQgPSB1c2FnZS52YWx1ZTtcbiAgICAgIHZhciBsaXN0ID0gW107XG4gICAgICB2YXIgbGlzdE5vZGVzID0gW107XG5cbiAgICAgIC8vIGVuc3VyZSBub2RlIGlzIGEgd2VsbC1mb3JtZWQgbGlzdCBub2RlOyBpdCBtdXN0OlxuICAgICAgLy8gMS4gQmUgcmVmZXJlbmNlZCBvbmx5IG9uY2UuXG4gICAgICAvLyAyLiBIYXZlIGFuIGFycmF5IGZvciByZGY6Zmlyc3QgdGhhdCBoYXMgMSBpdGVtLlxuICAgICAgLy8gMy4gSGF2ZSBhbiBhcnJheSBmb3IgcmRmOnJlc3QgdGhhdCBoYXMgMSBpdGVtLlxuICAgICAgLy8gNC4gSGF2ZSBubyBrZXlzIG90aGVyIHRoYW46IEBpZCwgcmRmOmZpcnN0LCByZGY6cmVzdCwgYW5kLFxuICAgICAgLy8gICBvcHRpb25hbGx5LCBAdHlwZSB3aGVyZSB0aGUgdmFsdWUgaXMgcmRmOkxpc3QuXG4gICAgICB2YXIgbm9kZUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoO1xuICAgICAgd2hpbGUocHJvcGVydHkgPT09IFJERl9SRVNUICYmXG4gICAgICAgIF9pc09iamVjdChyZWZlcmVuY2VkT25jZVtub2RlWydAaWQnXV0pICYmXG4gICAgICAgIF9pc0FycmF5KG5vZGVbUkRGX0ZJUlNUXSkgJiYgbm9kZVtSREZfRklSU1RdLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBfaXNBcnJheShub2RlW1JERl9SRVNUXSkgJiYgbm9kZVtSREZfUkVTVF0ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIChub2RlS2V5Q291bnQgPT09IDMgfHwgKG5vZGVLZXlDb3VudCA9PT0gNCAmJiBfaXNBcnJheShub2RlWydAdHlwZSddKSAmJlxuICAgICAgICAgIG5vZGVbJ0B0eXBlJ10ubGVuZ3RoID09PSAxICYmIG5vZGVbJ0B0eXBlJ11bMF0gPT09IFJERl9MSVNUKSkpIHtcbiAgICAgICAgbGlzdC5wdXNoKG5vZGVbUkRGX0ZJUlNUXVswXSk7XG4gICAgICAgIGxpc3ROb2Rlcy5wdXNoKG5vZGVbJ0BpZCddKTtcblxuICAgICAgICAvLyBnZXQgbmV4dCBub2RlLCBtb3ZpbmcgYmFja3dhcmRzIHRocm91Z2ggbGlzdFxuICAgICAgICB1c2FnZSA9IHJlZmVyZW5jZWRPbmNlW25vZGVbJ0BpZCddXTtcbiAgICAgICAgbm9kZSA9IHVzYWdlLm5vZGU7XG4gICAgICAgIHByb3BlcnR5ID0gdXNhZ2UucHJvcGVydHk7XG4gICAgICAgIGhlYWQgPSB1c2FnZS52YWx1ZTtcbiAgICAgICAgbm9kZUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoO1xuXG4gICAgICAgIC8vIGlmIG5vZGUgaXMgbm90IGEgYmxhbmsgbm9kZSwgdGhlbiBsaXN0IGhlYWQgZm91bmRcbiAgICAgICAgaWYobm9kZVsnQGlkJ10uaW5kZXhPZignXzonKSAhPT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBsaXN0IGlzIG5lc3RlZCBpbiBhbm90aGVyIGxpc3RcbiAgICAgIGlmKHByb3BlcnR5ID09PSBSREZfRklSU1QpIHtcbiAgICAgICAgLy8gZW1wdHkgbGlzdFxuICAgICAgICBpZihub2RlWydAaWQnXSA9PT0gUkRGX05JTCkge1xuICAgICAgICAgIC8vIGNhbid0IGNvbnZlcnQgcmRmOm5pbCB0byBhIEBsaXN0IG9iamVjdCBiZWNhdXNlIGl0IHdvdWxkXG4gICAgICAgICAgLy8gcmVzdWx0IGluIGEgbGlzdCBvZiBsaXN0cyB3aGljaCBpc24ndCBzdXBwb3J0ZWRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXNlcnZlIGxpc3QgaGVhZFxuICAgICAgICBoZWFkID0gZ3JhcGhPYmplY3RbaGVhZFsnQGlkJ11dW1JERl9SRVNUXVswXTtcbiAgICAgICAgbGlzdC5wb3AoKTtcbiAgICAgICAgbGlzdE5vZGVzLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLyB0cmFuc2Zvcm0gbGlzdCBpbnRvIEBsaXN0IG9iamVjdFxuICAgICAgZGVsZXRlIGhlYWRbJ0BpZCddO1xuICAgICAgaGVhZFsnQGxpc3QnXSA9IGxpc3QucmV2ZXJzZSgpO1xuICAgICAgZm9yKHZhciBqID0gMDsgaiA8IGxpc3ROb2Rlcy5sZW5ndGg7ICsraikge1xuICAgICAgICBkZWxldGUgZ3JhcGhPYmplY3RbbGlzdE5vZGVzW2pdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGUgbmlsLnVzYWdlcztcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1YmplY3RzID0gT2JqZWN0LmtleXMoZGVmYXVsdEdyYXBoKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzdWJqZWN0cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBzdWJqZWN0ID0gc3ViamVjdHNbaV07XG4gICAgdmFyIG5vZGUgPSBkZWZhdWx0R3JhcGhbc3ViamVjdF07XG4gICAgaWYoc3ViamVjdCBpbiBncmFwaE1hcCkge1xuICAgICAgdmFyIGdyYXBoID0gbm9kZVsnQGdyYXBoJ10gPSBbXTtcbiAgICAgIHZhciBncmFwaE9iamVjdCA9IGdyYXBoTWFwW3N1YmplY3RdO1xuICAgICAgdmFyIHN1YmplY3RzXyA9IE9iamVjdC5rZXlzKGdyYXBoT2JqZWN0KS5zb3J0KCk7XG4gICAgICBmb3IodmFyIHNpID0gMDsgc2kgPCBzdWJqZWN0c18ubGVuZ3RoOyArK3NpKSB7XG4gICAgICAgIHZhciBub2RlXyA9IGdyYXBoT2JqZWN0W3N1YmplY3RzX1tzaV1dO1xuICAgICAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlXykpIHtcbiAgICAgICAgICBncmFwaC5wdXNoKG5vZGVfKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgIGlmKCFfaXNTdWJqZWN0UmVmZXJlbmNlKG5vZGUpKSB7XG4gICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufTtcblxuLyoqXG4gKiBPdXRwdXRzIGFuIFJERiBkYXRhc2V0IGZvciB0aGUgZXhwYW5kZWQgSlNPTi1MRCBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGV4cGFuZGVkIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBSREYgZGF0YXNldC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS50b1JERiA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7XG4gIC8vIGNyZWF0ZSBub2RlIG1hcCBmb3IgZGVmYXVsdCBncmFwaCAoYW5kIGFueSBuYW1lZCBncmFwaHMpXG4gIHZhciBpc3N1ZXIgPSBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gIHZhciBub2RlTWFwID0geydAZGVmYXVsdCc6IHt9fTtcbiAgX2NyZWF0ZU5vZGVNYXAoaW5wdXQsIG5vZGVNYXAsICdAZGVmYXVsdCcsIGlzc3Vlcik7XG5cbiAgdmFyIGRhdGFzZXQgPSB7fTtcbiAgdmFyIGdyYXBoTmFtZXMgPSBPYmplY3Qua2V5cyhub2RlTWFwKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBncmFwaE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGdyYXBoTmFtZSA9IGdyYXBoTmFtZXNbaV07XG4gICAgLy8gc2tpcCByZWxhdGl2ZSBJUklzXG4gICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnIHx8IF9pc0Fic29sdXRlSXJpKGdyYXBoTmFtZSkpIHtcbiAgICAgIGRhdGFzZXRbZ3JhcGhOYW1lXSA9IF9ncmFwaFRvUkRGKG5vZGVNYXBbZ3JhcGhOYW1lXSwgaXNzdWVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFzZXQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGxvY2FsIGNvbnRleHQgYW5kIHJldHVybnMgYSBuZXcgYWN0aXZlIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBsb2NhbEN0eCB0aGUgbG9jYWwgY29udGV4dCB0byBwcm9jZXNzLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGNvbnRleHQgcHJvY2Vzc2luZyBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gdGhlIG5ldyBhY3RpdmUgY29udGV4dC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzQ29udGV4dCA9IGZ1bmN0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIG9wdGlvbnMpIHtcbiAgLy8gbm9ybWFsaXplIGxvY2FsIGNvbnRleHQgdG8gYW4gYXJyYXkgb2YgQGNvbnRleHQgb2JqZWN0c1xuICBpZihfaXNPYmplY3QobG9jYWxDdHgpICYmICdAY29udGV4dCcgaW4gbG9jYWxDdHggJiZcbiAgICBfaXNBcnJheShsb2NhbEN0eFsnQGNvbnRleHQnXSkpIHtcbiAgICBsb2NhbEN0eCA9IGxvY2FsQ3R4WydAY29udGV4dCddO1xuICB9XG4gIHZhciBjdHhzID0gX2lzQXJyYXkobG9jYWxDdHgpID8gbG9jYWxDdHggOiBbbG9jYWxDdHhdO1xuXG4gIC8vIG5vIGNvbnRleHRzIGluIGFycmF5LCBjbG9uZSBleGlzdGluZyBjb250ZXh0XG4gIGlmKGN0eHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUN0eC5jbG9uZSgpO1xuICB9XG5cbiAgLy8gcHJvY2VzcyBlYWNoIGNvbnRleHQgaW4gb3JkZXIsIHVwZGF0ZSBhY3RpdmUgY29udGV4dFxuICAvLyBvbiBlYWNoIGl0ZXJhdGlvbiB0byBlbnN1cmUgcHJvcGVyIGNhY2hpbmdcbiAgdmFyIHJ2YWwgPSBhY3RpdmVDdHg7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBjdHhzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGN0eCA9IGN0eHNbaV07XG5cbiAgICAvLyByZXNldCB0byBpbml0aWFsIGNvbnRleHRcbiAgICBpZihjdHggPT09IG51bGwpIHtcbiAgICAgIHJ2YWwgPSBhY3RpdmVDdHggPSBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBkZXJlZmVyZW5jZSBAY29udGV4dCBrZXkgaWYgcHJlc2VudFxuICAgIGlmKF9pc09iamVjdChjdHgpICYmICdAY29udGV4dCcgaW4gY3R4KSB7XG4gICAgICBjdHggPSBjdHhbJ0Bjb250ZXh0J107XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBtdXN0IGJlIGFuIG9iamVjdCBieSBub3csIGFsbCBVUkxzIHJldHJpZXZlZCBiZWZvcmUgdGhpcyBjYWxsXG4gICAgaWYoIV9pc09iamVjdChjdHgpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIGxvY2FsIGNvbnRleHQnLCBjb250ZXh0OiBjdHh9KTtcbiAgICB9XG5cbiAgICAvLyBnZXQgY29udGV4dCBmcm9tIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgIGlmKGpzb25sZC5jYWNoZS5hY3RpdmVDdHgpIHtcbiAgICAgIHZhciBjYWNoZWQgPSBqc29ubGQuY2FjaGUuYWN0aXZlQ3R4LmdldChhY3RpdmVDdHgsIGN0eCk7XG4gICAgICBpZihjYWNoZWQpIHtcbiAgICAgICAgcnZhbCA9IGFjdGl2ZUN0eCA9IGNhY2hlZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGFjdGl2ZSBjb250ZXh0IGFuZCBjbG9uZSBuZXcgb25lIGJlZm9yZSB1cGRhdGluZ1xuICAgIGFjdGl2ZUN0eCA9IHJ2YWw7XG4gICAgcnZhbCA9IHJ2YWwuY2xvbmUoKTtcblxuICAgIC8vIGRlZmluZSBjb250ZXh0IG1hcHBpbmdzIGZvciBrZXlzIGluIGxvY2FsIGNvbnRleHRcbiAgICB2YXIgZGVmaW5lZCA9IHt9O1xuXG4gICAgLy8gaGFuZGxlIEBiYXNlXG4gICAgaWYoJ0BiYXNlJyBpbiBjdHgpIHtcbiAgICAgIHZhciBiYXNlID0gY3R4WydAYmFzZSddO1xuXG4gICAgICAvLyBjbGVhciBiYXNlXG4gICAgICBpZihiYXNlID09PSBudWxsKSB7XG4gICAgICAgIGJhc2UgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmKCFfaXNTdHJpbmcoYmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAYmFzZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgYmFzZSBJUkknLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSBpZihiYXNlICE9PSAnJyAmJiAhX2lzQWJzb2x1dGVJcmkoYmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAYmFzZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYW4gYWJzb2x1dGUgSVJJIG9yIHRoZSBlbXB0eSBzdHJpbmcuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIGJhc2UgSVJJJywgY29udGV4dDogY3R4fSk7XG4gICAgICB9XG5cbiAgICAgIGlmKGJhc2UgIT09IG51bGwpIHtcbiAgICAgICAgYmFzZSA9IGpzb25sZC51cmwucGFyc2UoYmFzZSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBydmFsWydAYmFzZSddID0gYmFzZTtcbiAgICAgIGRlZmluZWRbJ0BiYXNlJ10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBAdm9jYWJcbiAgICBpZignQHZvY2FiJyBpbiBjdHgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGN0eFsnQHZvY2FiJ107XG4gICAgICBpZih2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgcnZhbFsnQHZvY2FiJ107XG4gICAgICB9IGVsc2UgaWYoIV9pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAdm9jYWJcIiBpbiBhICcgK1xuICAgICAgICAgICdAY29udGV4dCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZvY2FiIG1hcHBpbmcnLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSBpZighX2lzQWJzb2x1dGVJcmkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgdGhlIHZhbHVlIG9mIFwiQHZvY2FiXCIgaW4gYSAnICtcbiAgICAgICAgICAnQGNvbnRleHQgbXVzdCBiZSBhbiBhYnNvbHV0ZSBJUkkuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZvY2FiIG1hcHBpbmcnLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ2YWxbJ0B2b2NhYiddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBkZWZpbmVkWydAdm9jYWInXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIEBsYW5ndWFnZVxuICAgIGlmKCdAbGFuZ3VhZ2UnIGluIGN0eCkge1xuICAgICAgdmFyIHZhbHVlID0gY3R4WydAbGFuZ3VhZ2UnXTtcbiAgICAgIGlmKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBydmFsWydAbGFuZ3VhZ2UnXTtcbiAgICAgIH0gZWxzZSBpZighX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IHRoZSB2YWx1ZSBvZiBcIkBsYW5ndWFnZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBkZWZhdWx0IGxhbmd1YWdlJywgY29udGV4dDogY3R4fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydmFsWydAbGFuZ3VhZ2UnXSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBkZWZpbmVkWydAbGFuZ3VhZ2UnXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBhbGwgb3RoZXIga2V5c1xuICAgIGZvcih2YXIga2V5IGluIGN0eCkge1xuICAgICAgX2NyZWF0ZVRlcm1EZWZpbml0aW9uKHJ2YWwsIGN0eCwga2V5LCBkZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBjYWNoZSByZXN1bHRcbiAgICBpZihqc29ubGQuY2FjaGUuYWN0aXZlQ3R4KSB7XG4gICAgICBqc29ubGQuY2FjaGUuYWN0aXZlQ3R4LnNldChhY3RpdmVDdHgsIGN0eCwgcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBsYW5ndWFnZSBtYXAuXG4gKlxuICogQHBhcmFtIGxhbmd1YWdlTWFwIHRoZSBsYW5ndWFnZSBtYXAgdG8gZXhwYW5kLlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIGxhbmd1YWdlIG1hcC5cbiAqL1xuZnVuY3Rpb24gX2V4cGFuZExhbmd1YWdlTWFwKGxhbmd1YWdlTWFwKSB7XG4gIHZhciBydmFsID0gW107XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMobGFuZ3VhZ2VNYXApLnNvcnQoKTtcbiAgZm9yKHZhciBraSA9IDA7IGtpIDwga2V5cy5sZW5ndGg7ICsra2kpIHtcbiAgICB2YXIga2V5ID0ga2V5c1traV07XG4gICAgdmFyIHZhbCA9IGxhbmd1YWdlTWFwW2tleV07XG4gICAgaWYoIV9pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhbCA9IFt2YWxdO1xuICAgIH1cbiAgICBmb3IodmFyIHZpID0gMDsgdmkgPCB2YWwubGVuZ3RoOyArK3ZpKSB7XG4gICAgICB2YXIgaXRlbSA9IHZhbFt2aV07XG4gICAgICBpZihpdGVtID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gbnVsbCB2YWx1ZXMgYXJlIGFsbG93ZWQgKDguNSkgYnV0IGlnbm9yZWQgKDMuMSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmKCFfaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBsYW5ndWFnZSBtYXAgdmFsdWVzIG11c3QgYmUgc3RyaW5ncy4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZSBtYXAgdmFsdWUnLCBsYW5ndWFnZU1hcDogbGFuZ3VhZ2VNYXB9KTtcbiAgICAgIH1cbiAgICAgIHJ2YWwucHVzaCh7XG4gICAgICAgICdAdmFsdWUnOiBpdGVtLFxuICAgICAgICAnQGxhbmd1YWdlJzoga2V5LnRvTG93ZXJDYXNlKClcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBMYWJlbHMgdGhlIGJsYW5rIG5vZGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgZ2l2ZW4gSWRlbnRpZmllcklzc3Vlci5cbiAqXG4gKiBAcGFyYW0gaXNzdWVyIHRoZSBJZGVudGlmaWVySXNzdWVyIHRvIHVzZS5cbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHdpdGggYmxhbmsgbm9kZXMgdG8gcmVuYW1lLlxuICpcbiAqIEByZXR1cm4gdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIF9sYWJlbEJsYW5rTm9kZXMoaXNzdWVyLCBlbGVtZW50KSB7XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGVsZW1lbnQubGVuZ3RoOyArK2kpIHtcbiAgICAgIGVsZW1lbnRbaV0gPSBfbGFiZWxCbGFua05vZGVzKGlzc3VlciwgZWxlbWVudFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYoX2lzTGlzdChlbGVtZW50KSkge1xuICAgIGVsZW1lbnRbJ0BsaXN0J10gPSBfbGFiZWxCbGFua05vZGVzKGlzc3VlciwgZWxlbWVudFsnQGxpc3QnXSk7XG4gIH0gZWxzZSBpZihfaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAvLyByZWxhYmVsIGJsYW5rIG5vZGVcbiAgICBpZihfaXNCbGFua05vZGUoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRbJ0BpZCddID0gaXNzdWVyLmdldElkKGVsZW1lbnRbJ0BpZCddKTtcbiAgICB9XG5cbiAgICAvLyByZWN1cnNpdmVseSBhcHBseSB0byBhbGwga2V5c1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudCkuc29ydCgpO1xuICAgIGZvcih2YXIga2kgPSAwOyBraSA8IGtleXMubGVuZ3RoOyArK2tpKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1traV07XG4gICAgICBpZihrZXkgIT09ICdAaWQnKSB7XG4gICAgICAgIGVsZW1lbnRba2V5XSA9IF9sYWJlbEJsYW5rTm9kZXMoaXNzdWVyLCBlbGVtZW50W2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEV4cGFuZHMgdGhlIGdpdmVuIHZhbHVlIGJ5IHVzaW5nIHRoZSBjb2VyY2lvbiBhbmQga2V5d29yZCBydWxlcyBpbiB0aGVcbiAqIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGFjdGl2ZVByb3BlcnR5IHRoZSBhY3RpdmUgcHJvcGVydHkgdGhlIHZhbHVlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZXhwYW5kLlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBfZXhwYW5kVmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgdmFsdWUpIHtcbiAgLy8gbm90aGluZyB0byBleHBhbmRcbiAgaWYodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gc3BlY2lhbC1jYXNlIGV4cGFuZCBAaWQgYW5kIEB0eXBlIChza2lwcyAnQGlkJyBleHBhbnNpb24pXG4gIHZhciBleHBhbmRlZFByb3BlcnR5ID0gX2V4cGFuZElyaShhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCB7dm9jYWI6IHRydWV9KTtcbiAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpZCcpIHtcbiAgICByZXR1cm4gX2V4cGFuZElyaShhY3RpdmVDdHgsIHZhbHVlLCB7YmFzZTogdHJ1ZX0pO1xuICB9IGVsc2UgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0B0eXBlJykge1xuICAgIHJldHVybiBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgdmFsdWUsIHt2b2NhYjogdHJ1ZSwgYmFzZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gZ2V0IHR5cGUgZGVmaW5pdGlvbiBmcm9tIGNvbnRleHRcbiAgdmFyIHR5cGUgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAdHlwZScpO1xuXG4gIC8vIGRvIEBpZCBleHBhbnNpb24gKGF1dG9tYXRpYyBmb3IgQGdyYXBoKVxuICBpZih0eXBlID09PSAnQGlkJyB8fCAoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BncmFwaCcgJiYgX2lzU3RyaW5nKHZhbHVlKSkpIHtcbiAgICByZXR1cm4geydAaWQnOiBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgdmFsdWUsIHtiYXNlOiB0cnVlfSl9O1xuICB9XG4gIC8vIGRvIEBpZCBleHBhbnNpb24gdy92b2NhYlxuICBpZih0eXBlID09PSAnQHZvY2FiJykge1xuICAgIHJldHVybiB7J0BpZCc6IF9leHBhbmRJcmkoYWN0aXZlQ3R4LCB2YWx1ZSwge3ZvY2FiOiB0cnVlLCBiYXNlOiB0cnVlfSl9O1xuICB9XG5cbiAgLy8gZG8gbm90IGV4cGFuZCBrZXl3b3JkIHZhbHVlc1xuICBpZihfaXNLZXl3b3JkKGV4cGFuZGVkUHJvcGVydHkpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdmFyIHJ2YWwgPSB7fTtcblxuICBpZih0eXBlICE9PSBudWxsKSB7XG4gICAgLy8gb3RoZXIgdHlwZVxuICAgIHJ2YWxbJ0B0eXBlJ10gPSB0eXBlO1xuICB9IGVsc2UgaWYoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIC8vIGNoZWNrIGZvciBsYW5ndWFnZSB0YWdnaW5nIGZvciBzdHJpbmdzXG4gICAgdmFyIGxhbmd1YWdlID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAbGFuZ3VhZ2UnKTtcbiAgICBpZihsYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgcnZhbFsnQGxhbmd1YWdlJ10gPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cbiAgLy8gZG8gY29udmVyc2lvbiBvZiB2YWx1ZXMgdGhhdCBhcmVuJ3QgYmFzaWMgSlNPTiB0eXBlcyB0byBzdHJpbmdzXG4gIGlmKFsnYm9vbGVhbicsICdudW1iZXInLCAnc3RyaW5nJ10uaW5kZXhPZih0eXBlb2YgdmFsdWUpID09PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICBydmFsWydAdmFsdWUnXSA9IHZhbHVlO1xuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgUkRGIHRyaXBsZXMgZm9yIHRoZSBnaXZlbiBncmFwaC5cbiAqXG4gKiBAcGFyYW0gZ3JhcGggdGhlIGdyYXBoIHRvIGNyZWF0ZSBSREYgdHJpcGxlcyBmb3IuXG4gKiBAcGFyYW0gaXNzdWVyIGEgSWRlbnRpZmllcklzc3VlciBmb3IgYXNzaWduaW5nIGJsYW5rIG5vZGUgbmFtZXMuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBSREYgdHJpcGxlcyBmb3IgdGhlIGdpdmVuIGdyYXBoLlxuICovXG5mdW5jdGlvbiBfZ3JhcGhUb1JERihncmFwaCwgaXNzdWVyLCBvcHRpb25zKSB7XG4gIHZhciBydmFsID0gW107XG5cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKGdyYXBoKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgdmFyIG5vZGUgPSBncmFwaFtpZF07XG4gICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhub2RlKS5zb3J0KCk7XG4gICAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsrcGkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbcGldO1xuICAgICAgdmFyIGl0ZW1zID0gbm9kZVtwcm9wZXJ0eV07XG4gICAgICBpZihwcm9wZXJ0eSA9PT0gJ0B0eXBlJykge1xuICAgICAgICBwcm9wZXJ0eSA9IFJERl9UWVBFO1xuICAgICAgfSBlbHNlIGlmKF9pc0tleXdvcmQocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpdGVtcy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpaV07XG5cbiAgICAgICAgLy8gUkRGIHN1YmplY3RcbiAgICAgICAgdmFyIHN1YmplY3QgPSB7fTtcbiAgICAgICAgc3ViamVjdC50eXBlID0gKGlkLmluZGV4T2YoJ186JykgPT09IDApID8gJ2JsYW5rIG5vZGUnIDogJ0lSSSc7XG4gICAgICAgIHN1YmplY3QudmFsdWUgPSBpZDtcblxuICAgICAgICAvLyBza2lwIHJlbGF0aXZlIElSSSBzdWJqZWN0c1xuICAgICAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSREYgcHJlZGljYXRlXG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB7fTtcbiAgICAgICAgcHJlZGljYXRlLnR5cGUgPSAocHJvcGVydHkuaW5kZXhPZignXzonKSA9PT0gMCkgPyAnYmxhbmsgbm9kZScgOiAnSVJJJztcbiAgICAgICAgcHJlZGljYXRlLnZhbHVlID0gcHJvcGVydHk7XG5cbiAgICAgICAgLy8gc2tpcCByZWxhdGl2ZSBJUkkgcHJlZGljYXRlc1xuICAgICAgICBpZighX2lzQWJzb2x1dGVJcmkocHJvcGVydHkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBza2lwIGJsYW5rIG5vZGUgcHJlZGljYXRlcyB1bmxlc3MgcHJvZHVjaW5nIGdlbmVyYWxpemVkIFJERlxuICAgICAgICBpZihwcmVkaWNhdGUudHlwZSA9PT0gJ2JsYW5rIG5vZGUnICYmICFvcHRpb25zLnByb2R1Y2VHZW5lcmFsaXplZFJkZikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCBAbGlzdCB0byB0cmlwbGVzXG4gICAgICAgIGlmKF9pc0xpc3QoaXRlbSkpIHtcbiAgICAgICAgICBfbGlzdFRvUkRGKGl0ZW1bJ0BsaXN0J10sIGlzc3Vlciwgc3ViamVjdCwgcHJlZGljYXRlLCBydmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb252ZXJ0IHZhbHVlIG9yIG5vZGUgb2JqZWN0IHRvIHRyaXBsZVxuICAgICAgICAgIHZhciBvYmplY3QgPSBfb2JqZWN0VG9SREYoaXRlbSk7XG4gICAgICAgICAgLy8gc2tpcCBudWxsIG9iamVjdHMgKHRoZXkgYXJlIHJlbGF0aXZlIElSSXMpXG4gICAgICAgICAgaWYob2JqZWN0KSB7XG4gICAgICAgICAgICBydmFsLnB1c2goe3N1YmplY3Q6IHN1YmplY3QsIHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgQGxpc3QgdmFsdWUgaW50byBsaW5rZWQgbGlzdCBvZiBibGFuayBub2RlIFJERiB0cmlwbGVzXG4gKiAoYW4gUkRGIGNvbGxlY3Rpb24pLlxuICpcbiAqIEBwYXJhbSBsaXN0IHRoZSBAbGlzdCB2YWx1ZS5cbiAqIEBwYXJhbSBpc3N1ZXIgYSBJZGVudGlmaWVySXNzdWVyIGZvciBhc3NpZ25pbmcgYmxhbmsgbm9kZSBuYW1lcy5cbiAqIEBwYXJhbSBzdWJqZWN0IHRoZSBzdWJqZWN0IGZvciB0aGUgaGVhZCBvZiB0aGUgbGlzdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHByZWRpY2F0ZSBmb3IgdGhlIGhlYWQgb2YgdGhlIGxpc3QuXG4gKiBAcGFyYW0gdHJpcGxlcyB0aGUgYXJyYXkgb2YgdHJpcGxlcyB0byBhcHBlbmQgdG8uXG4gKi9cbmZ1bmN0aW9uIF9saXN0VG9SREYobGlzdCwgaXNzdWVyLCBzdWJqZWN0LCBwcmVkaWNhdGUsIHRyaXBsZXMpIHtcbiAgdmFyIGZpcnN0ID0ge3R5cGU6ICdJUkknLCB2YWx1ZTogUkRGX0ZJUlNUfTtcbiAgdmFyIHJlc3QgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBSREZfUkVTVH07XG4gIHZhciBuaWwgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBSREZfTklMfTtcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcblxuICAgIHZhciBibGFua05vZGUgPSB7dHlwZTogJ2JsYW5rIG5vZGUnLCB2YWx1ZTogaXNzdWVyLmdldElkKCl9O1xuICAgIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogYmxhbmtOb2RlfSk7XG5cbiAgICBzdWJqZWN0ID0gYmxhbmtOb2RlO1xuICAgIHByZWRpY2F0ZSA9IGZpcnN0O1xuICAgIHZhciBvYmplY3QgPSBfb2JqZWN0VG9SREYoaXRlbSk7XG5cbiAgICAvLyBza2lwIG51bGwgb2JqZWN0cyAodGhleSBhcmUgcmVsYXRpdmUgSVJJcylcbiAgICBpZihvYmplY3QpIHtcbiAgICAgIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogb2JqZWN0fSk7XG4gICAgfVxuXG4gICAgcHJlZGljYXRlID0gcmVzdDtcbiAgfVxuXG4gIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogbmlsfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OLUxEIHZhbHVlIG9iamVjdCB0byBhbiBSREYgbGl0ZXJhbCBvciBhIEpTT04tTEQgc3RyaW5nIG9yXG4gKiBub2RlIG9iamVjdCB0byBhbiBSREYgcmVzb3VyY2UuXG4gKlxuICogQHBhcmFtIGl0ZW0gdGhlIEpTT04tTEQgdmFsdWUgb3Igbm9kZSBvYmplY3QuXG4gKlxuICogQHJldHVybiB0aGUgUkRGIGxpdGVyYWwgb3IgUkRGIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBfb2JqZWN0VG9SREYoaXRlbSkge1xuICB2YXIgb2JqZWN0ID0ge307XG5cbiAgLy8gY29udmVydCB2YWx1ZSBvYmplY3QgdG8gUkRGXG4gIGlmKF9pc1ZhbHVlKGl0ZW0pKSB7XG4gICAgb2JqZWN0LnR5cGUgPSAnbGl0ZXJhbCc7XG4gICAgdmFyIHZhbHVlID0gaXRlbVsnQHZhbHVlJ107XG4gICAgdmFyIGRhdGF0eXBlID0gaXRlbVsnQHR5cGUnXSB8fCBudWxsO1xuXG4gICAgLy8gY29udmVydCB0byBYU0QgZGF0YXR5cGVzIGFzIGFwcHJvcHJpYXRlXG4gICAgaWYoX2lzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBYU0RfQk9PTEVBTjtcbiAgICB9IGVsc2UgaWYoX2lzRG91YmxlKHZhbHVlKSB8fCBkYXRhdHlwZSA9PT0gWFNEX0RPVUJMRSkge1xuICAgICAgaWYoIV9pc0RvdWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIGNhbm9uaWNhbCBkb3VibGUgcmVwcmVzZW50YXRpb25cbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvRXhwb25lbnRpYWwoMTUpLnJlcGxhY2UoLyhcXGQpMCplXFwrPy8sICckMUUnKTtcbiAgICAgIG9iamVjdC5kYXRhdHlwZSA9IGRhdGF0eXBlIHx8IFhTRF9ET1VCTEU7XG4gICAgfSBlbHNlIGlmKF9pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvRml4ZWQoMCk7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBYU0RfSU5URUdFUjtcbiAgICB9IGVsc2UgaWYoJ0BsYW5ndWFnZScgaW4gaXRlbSkge1xuICAgICAgb2JqZWN0LnZhbHVlID0gdmFsdWU7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBSREZfTEFOR1NUUklORztcbiAgICAgIG9iamVjdC5sYW5ndWFnZSA9IGl0ZW1bJ0BsYW5ndWFnZSddO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG9iamVjdC5kYXRhdHlwZSA9IGRhdGF0eXBlIHx8IFhTRF9TVFJJTkc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGNvbnZlcnQgc3RyaW5nL25vZGUgb2JqZWN0IHRvIFJERlxuICAgIHZhciBpZCA9IF9pc09iamVjdChpdGVtKSA/IGl0ZW1bJ0BpZCddIDogaXRlbTtcbiAgICBvYmplY3QudHlwZSA9IChpZC5pbmRleE9mKCdfOicpID09PSAwKSA/ICdibGFuayBub2RlJyA6ICdJUkknO1xuICAgIG9iamVjdC52YWx1ZSA9IGlkO1xuICB9XG5cbiAgLy8gc2tpcCByZWxhdGl2ZSBJUklzXG4gIGlmKG9iamVjdC50eXBlID09PSAnSVJJJyAmJiAhX2lzQWJzb2x1dGVJcmkob2JqZWN0LnZhbHVlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgdHJpcGxlIG9iamVjdCB0byBhIEpTT04tTEQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBvIHRoZSBSREYgdHJpcGxlIG9iamVjdCB0byBjb252ZXJ0LlxuICogQHBhcmFtIHVzZU5hdGl2ZVR5cGVzIHRydWUgdG8gb3V0cHV0IG5hdGl2ZSB0eXBlcywgZmFsc2Ugbm90IHRvLlxuICpcbiAqIEByZXR1cm4gdGhlIEpTT04tTEQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBfUkRGVG9PYmplY3QobywgdXNlTmF0aXZlVHlwZXMpIHtcbiAgLy8gY29udmVydCBJUkkvYmxhbmsgbm9kZSBvYmplY3QgdG8gSlNPTi1MRFxuICBpZihvLnR5cGUgPT09ICdJUkknIHx8IG8udHlwZSA9PT0gJ2JsYW5rIG5vZGUnKSB7XG4gICAgcmV0dXJuIHsnQGlkJzogby52YWx1ZX07XG4gIH1cblxuICAvLyBjb252ZXJ0IGxpdGVyYWwgdG8gSlNPTi1MRFxuICB2YXIgcnZhbCA9IHsnQHZhbHVlJzogby52YWx1ZX07XG5cbiAgLy8gYWRkIGxhbmd1YWdlXG4gIGlmKG8ubGFuZ3VhZ2UpIHtcbiAgICBydmFsWydAbGFuZ3VhZ2UnXSA9IG8ubGFuZ3VhZ2U7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHR5cGUgPSBvLmRhdGF0eXBlO1xuICAgIGlmKCF0eXBlKSB7XG4gICAgICB0eXBlID0gWFNEX1NUUklORztcbiAgICB9XG4gICAgLy8gdXNlIG5hdGl2ZSB0eXBlcyBmb3IgY2VydGFpbiB4c2QgdHlwZXNcbiAgICBpZih1c2VOYXRpdmVUeXBlcykge1xuICAgICAgaWYodHlwZSA9PT0gWFNEX0JPT0xFQU4pIHtcbiAgICAgICAgaWYocnZhbFsnQHZhbHVlJ10gPT09ICd0cnVlJykge1xuICAgICAgICAgIHJ2YWxbJ0B2YWx1ZSddID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmKHJ2YWxbJ0B2YWx1ZSddID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgcnZhbFsnQHZhbHVlJ10gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKF9pc051bWVyaWMocnZhbFsnQHZhbHVlJ10pKSB7XG4gICAgICAgIGlmKHR5cGUgPT09IFhTRF9JTlRFR0VSKSB7XG4gICAgICAgICAgdmFyIGkgPSBwYXJzZUludChydmFsWydAdmFsdWUnXSwgMTApO1xuICAgICAgICAgIGlmKGkudG9GaXhlZCgwKSA9PT0gcnZhbFsnQHZhbHVlJ10pIHtcbiAgICAgICAgICAgIHJ2YWxbJ0B2YWx1ZSddID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZih0eXBlID09PSBYU0RfRE9VQkxFKSB7XG4gICAgICAgICAgcnZhbFsnQHZhbHVlJ10gPSBwYXJzZUZsb2F0KHJ2YWxbJ0B2YWx1ZSddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZG8gbm90IGFkZCBuYXRpdmUgdHlwZVxuICAgICAgaWYoW1hTRF9CT09MRUFOLCBYU0RfSU5URUdFUiwgWFNEX0RPVUJMRSwgWFNEX1NUUklOR11cbiAgICAgICAgLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgIHJ2YWxbJ0B0eXBlJ10gPSB0eXBlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlICE9PSBYU0RfU1RSSU5HKSB7XG4gICAgICBydmFsWydAdHlwZSddID0gdHlwZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gUkRGIHRyaXBsZXMgZm9yIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSB0MSB0aGUgZmlyc3QgdHJpcGxlLlxuICogQHBhcmFtIHQyIHRoZSBzZWNvbmQgdHJpcGxlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJpcGxlcyBhcmUgdGhlIHNhbWUsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2NvbXBhcmVSREZUcmlwbGVzKHQxLCB0Mikge1xuICB2YXIgYXR0cnMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCddO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldO1xuICAgIGlmKHQxW2F0dHJdLnR5cGUgIT09IHQyW2F0dHJdLnR5cGUgfHwgdDFbYXR0cl0udmFsdWUgIT09IHQyW2F0dHJdLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmKHQxLm9iamVjdC5sYW5ndWFnZSAhPT0gdDIub2JqZWN0Lmxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmKHQxLm9iamVjdC5kYXRhdHlwZSAhPT0gdDIub2JqZWN0LmRhdGF0eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBVUkROQTIwMTUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBVUkROQTIwMTUgPSAoZnVuY3Rpb24oKSB7XG5cbnZhciBQT1NJVElPTlMgPSB7J3N1YmplY3QnOiAncycsICdvYmplY3QnOiAnbycsICduYW1lJzogJ2cnfTtcblxudmFyIE5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMubmFtZSA9ICdVUkROQTIwMTUnO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLmJsYW5rTm9kZUluZm8gPSB7fTtcbiAgdGhpcy5oYXNoVG9CbGFua05vZGVzID0ge307XG4gIHRoaXMuY2Fub25pY2FsSXNzdWVyID0gbmV3IElkZW50aWZpZXJJc3N1ZXIoJ186YzE0bicpO1xuICB0aGlzLnF1YWRzID0gW107XG4gIHRoaXMuc2NoZWR1bGUgPSB7fTtcbiAgaWYoJ21heENhbGxTdGFja0RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy5zY2hlZHVsZS5NQVhfREVQVEggPSBvcHRpb25zLm1heENhbGxTdGFja0RlcHRoO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2NoZWR1bGUuTUFYX0RFUFRIID0gNTAwO1xuICB9XG4gIGlmKCdtYXhUb3RhbENhbGxTdGFja0RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy5zY2hlZHVsZS5NQVhfVE9UQUxfREVQVEggPSBvcHRpb25zLm1heENhbGxTdGFja0RlcHRoO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2NoZWR1bGUuTUFYX1RPVEFMX0RFUFRIID0gMHhGRkZGRkZGRjtcbiAgfVxuICB0aGlzLnNjaGVkdWxlLmRlcHRoID0gMDtcbiAgdGhpcy5zY2hlZHVsZS50b3RhbERlcHRoID0gMDtcbiAgaWYoJ3RpbWVTbGljZScgaW4gb3B0aW9ucykge1xuICAgIHRoaXMuc2NoZWR1bGUudGltZVNsaWNlID0gb3B0aW9ucy50aW1lU2xpY2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWlsbGlzZWNvbmRzXG4gICAgdGhpcy5zY2hlZHVsZS50aW1lU2xpY2UgPSAxMDtcbiAgfVxufTtcblxuLy8gZG8gc29tZSB3b3JrIGluIGEgdGltZSBzbGljZSwgYnV0IGluIHNlcmlhbFxuTm9ybWFsaXplLnByb3RvdHlwZS5kb1dvcmsgPSBmdW5jdGlvbihmbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNjaGVkdWxlID0gdGhpcy5zY2hlZHVsZTtcblxuICBpZihzY2hlZHVsZS50b3RhbERlcHRoID49IHNjaGVkdWxlLk1BWF9UT1RBTF9ERVBUSCkge1xuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXG4gICAgICAnTWF4aW11bSB0b3RhbCBjYWxsIHN0YWNrIGRlcHRoIGV4Y2VlZGVkOyBub3JtYWxpemF0aW9uIGFib3J0aW5nLicpKTtcbiAgfVxuXG4gIChmdW5jdGlvbiB3b3JrKCkge1xuICAgIGlmKHNjaGVkdWxlLmRlcHRoID09PSBzY2hlZHVsZS5NQVhfREVQVEgpIHtcbiAgICAgIC8vIHN0YWNrIHRvbyBkZWVwLCBydW4gb24gbmV4dCB0aWNrXG4gICAgICBzY2hlZHVsZS5kZXB0aCA9IDA7XG4gICAgICBzY2hlZHVsZS5ydW5uaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKHdvcmspO1xuICAgIH1cblxuICAgIC8vIGlmIG5vdCB5ZXQgcnVubmluZywgZm9yY2UgcnVuXG4gICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGlmKCFzY2hlZHVsZS5ydW5uaW5nKSB7XG4gICAgICBzY2hlZHVsZS5zdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgc2NoZWR1bGUuZGVhZGxpbmUgPSBzY2hlZHVsZS5zdGFydCArIHNjaGVkdWxlLnRpbWVTbGljZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBzaG91bGQgYWxzbyBpbmNsdWRlIGFuIGVzdGltYXRlIG9mIGV4cGVjdGVkV29ya1RpbWVcbiAgICBpZihub3cgPCBzY2hlZHVsZS5kZWFkbGluZSkge1xuICAgICAgc2NoZWR1bGUucnVubmluZyA9IHRydWU7XG4gICAgICBzY2hlZHVsZS5kZXB0aCsrO1xuICAgICAgc2NoZWR1bGUudG90YWxEZXB0aCsrO1xuICAgICAgcmV0dXJuIGZuKGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHNjaGVkdWxlLmRlcHRoLS07XG4gICAgICAgIHNjaGVkdWxlLnRvdGFsRGVwdGgtLTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gbm90IGVub3VnaCB0aW1lIGxlZnQgaW4gdGhpcyBzbGljZSwgcnVuIGFmdGVyIGxldHRpbmcgYnJvd3NlclxuICAgIC8vIGRvIHNvbWUgb3RoZXIgdGhpbmdzXG4gICAgc2NoZWR1bGUuZGVwdGggPSAwO1xuICAgIHNjaGVkdWxlLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICBqc29ubGQuc2V0SW1tZWRpYXRlKHdvcmspO1xuICB9KSgpO1xufTtcblxuLy8gYXN5bmNocm9ub3VzbHkgbG9vcFxuTm9ybWFsaXplLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oaXRlcmFibGUsIGZuLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpdGVyYXRvcjtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW5ndGg7XG4gIGlmKF9pc0FycmF5KGl0ZXJhYmxlKSkge1xuICAgIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICBpdGVyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYoaWR4ID09PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3IudmFsdWUgPSBpdGVyYWJsZVtpZHgrK107XG4gICAgICBpdGVyYXRvci5rZXkgPSBpZHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaXRlcmFibGUpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGl0ZXJhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZihpZHggPT09IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpdGVyYXRvci5rZXkgPSBrZXlzW2lkeCsrXTtcbiAgICAgIGl0ZXJhdG9yLnZhbHVlID0gaXRlcmFibGVbaXRlcmF0b3Iua2V5XTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICAoZnVuY3Rpb24gaXRlcmF0ZShlcnIsIHJlc3VsdCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmKGl0ZXJhdG9yKCkpIHtcbiAgICAgIHJldHVybiBzZWxmLmRvV29yayhmdW5jdGlvbigpIHtcbiAgICAgICAgZm4oaXRlcmF0b3IudmFsdWUsIGl0ZXJhdG9yLmtleSwgaXRlcmF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FsbGJhY2soKTtcbiAgfSkoKTtcbn07XG5cbi8vIGFzeW5jaHJvbm91cyB3YXRlcmZhbGxcbk5vcm1hbGl6ZS5wcm90b3R5cGUud2F0ZXJmYWxsID0gZnVuY3Rpb24oZm5zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZm9yRWFjaChmbnMsIGZ1bmN0aW9uKGZuLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgc2VsZi5kb1dvcmsoZm4sIGNhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2spO1xufTtcblxuLy8gYXN5bmNocm9ub3VzIHdoaWxlXG5Ob3JtYWxpemUucHJvdG90eXBlLndoaWxzdCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm4sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgKGZ1bmN0aW9uIGxvb3AoZXJyKSB7XG4gICAgaWYoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYoIWNvbmRpdGlvbigpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgc2VsZi5kb1dvcmsoZm4sIGxvb3ApO1xuICB9KSgpO1xufTtcblxuLy8gNC40KSBOb3JtYWxpemF0aW9uIEFsZ29yaXRobVxuTm9ybWFsaXplLnByb3RvdHlwZS5tYWluID0gZnVuY3Rpb24oZGF0YXNldCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnNjaGVkdWxlLnN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHZhciByZXN1bHQ7XG5cbiAgLy8gaGFuZGxlIGludmFsaWQgb3V0cHV0IGZvcm1hdFxuICBpZihzZWxmLm9wdGlvbnMuZm9ybWF0KSB7XG4gICAgaWYoc2VsZi5vcHRpb25zLmZvcm1hdCAhPT0gJ2FwcGxpY2F0aW9uL25xdWFkcycpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVbmtub3duIG91dHB1dCBmb3JtYXQuJyxcbiAgICAgICAgJ2pzb25sZC5Vbmtub3duRm9ybWF0Jywge2Zvcm1hdDogc2VsZi5vcHRpb25zLmZvcm1hdH0pKTtcbiAgICB9XG4gIH1cblxuICAvLyAxKSBDcmVhdGUgdGhlIG5vcm1hbGl6YXRpb24gc3RhdGUuXG5cbiAgLy8gTm90ZTogT3B0aW1pemUgYnkgZ2VuZXJhdGluZyBub24tbm9ybWFsaXplZCBibGFuayBub2RlIG1hcCBjb25jdXJyZW50bHkuXG4gIHZhciBub25Ob3JtYWxpemVkID0ge307XG5cbiAgc2VsZi53YXRlcmZhbGwoW1xuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvLyAyKSBGb3IgZXZlcnkgcXVhZCBpbiBpbnB1dCBkYXRhc2V0OlxuICAgICAgc2VsZi5mb3JFYWNoKGRhdGFzZXQsIGZ1bmN0aW9uKHRyaXBsZXMsIGdyYXBoTmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnKSB7XG4gICAgICAgICAgZ3JhcGhOYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmZvckVhY2godHJpcGxlcywgZnVuY3Rpb24ocXVhZCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAgIGlmKGdyYXBoTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYoZ3JhcGhOYW1lLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgICAgICAgcXVhZC5uYW1lID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IGdyYXBoTmFtZX07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWFkLm5hbWUgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBncmFwaE5hbWV9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLnF1YWRzLnB1c2gocXVhZCk7XG5cbiAgICAgICAgICAvLyAyLjEpIEZvciBlYWNoIGJsYW5rIG5vZGUgdGhhdCBvY2N1cnMgaW4gdGhlIHF1YWQsIGFkZCBhIHJlZmVyZW5jZVxuICAgICAgICAgIC8vIHRvIHRoZSBxdWFkIHVzaW5nIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgaW4gdGhlIGJsYW5rIG5vZGUgdG9cbiAgICAgICAgICAvLyBxdWFkcyBtYXAsIGNyZWF0aW5nIGEgbmV3IGVudHJ5IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICBzZWxmLmZvckVhY2hDb21wb25lbnQocXVhZCwgZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgICAgICBpZihjb21wb25lbnQudHlwZSAhPT0gJ2JsYW5rIG5vZGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9IGNvbXBvbmVudC52YWx1ZTtcbiAgICAgICAgICAgIGlmKGlkIGluIHNlbGYuYmxhbmtOb2RlSW5mbykge1xuICAgICAgICAgICAgICBzZWxmLmJsYW5rTm9kZUluZm9baWRdLnF1YWRzLnB1c2gocXVhZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub25Ob3JtYWxpemVkW2lkXSA9IHRydWU7XG4gICAgICAgICAgICAgIHNlbGYuYmxhbmtOb2RlSW5mb1tpZF0gPSB7cXVhZHM6IFtxdWFkXX07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIC8vIDMpIENyZWF0ZSBhIGxpc3Qgb2Ygbm9uLW5vcm1hbGl6ZWQgYmxhbmsgbm9kZSBpZGVudGlmaWVyc1xuICAgICAgLy8gbm9uLW5vcm1hbGl6ZWQgaWRlbnRpZmllcnMgYW5kIHBvcHVsYXRlIGl0IHVzaW5nIHRoZSBrZXlzIGZyb20gdGhlXG4gICAgICAvLyBibGFuayBub2RlIHRvIHF1YWRzIG1hcC5cbiAgICAgIC8vIE5vdGU6IFdlIHVzZSBhIG1hcCBoZXJlIGFuZCBpdCB3YXMgZ2VuZXJhdGVkIGR1cmluZyBzdGVwIDIuXG5cbiAgICAgIC8vIDQpIEluaXRpYWxpemUgc2ltcGxlLCBhIGJvb2xlYW4gZmxhZywgdG8gdHJ1ZS5cbiAgICAgIHZhciBzaW1wbGUgPSB0cnVlO1xuXG4gICAgICAvLyA1KSBXaGlsZSBzaW1wbGUgaXMgdHJ1ZSwgaXNzdWUgY2Fub25pY2FsIGlkZW50aWZpZXJzIGZvciBibGFuayBub2RlczpcbiAgICAgIHNlbGYud2hpbHN0KGZ1bmN0aW9uKCkgeyByZXR1cm4gc2ltcGxlOyB9LCBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAvLyA1LjEpIFNldCBzaW1wbGUgdG8gZmFsc2UuXG4gICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIDUuMikgQ2xlYXIgaGFzaCB0byBibGFuayBub2RlcyBtYXAuXG4gICAgICAgIHNlbGYuaGFzaFRvQmxhbmtOb2RlcyA9IHt9O1xuXG4gICAgICAgIHNlbGYud2F0ZXJmYWxsKFtcbiAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gNS4zKSBGb3IgZWFjaCBibGFuayBub2RlIGlkZW50aWZpZXIgaWRlbnRpZmllciBpbiBub24tbm9ybWFsaXplZFxuICAgICAgICAgICAgLy8gaWRlbnRpZmllcnM6XG4gICAgICAgICAgICBzZWxmLmZvckVhY2gobm9uTm9ybWFsaXplZCwgZnVuY3Rpb24odmFsdWUsIGlkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjMuMSkgQ3JlYXRlIGEgaGFzaCwgaGFzaCwgYWNjb3JkaW5nIHRvIHRoZSBIYXNoIEZpcnN0IERlZ3JlZVxuICAgICAgICAgICAgICAvLyBRdWFkcyBhbGdvcml0aG0uXG4gICAgICAgICAgICAgIHNlbGYuaGFzaEZpcnN0RGVncmVlUXVhZHMoaWQsIGZ1bmN0aW9uKGVyciwgaGFzaCkge1xuICAgICAgICAgICAgICAgIGlmKGVycikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDUuMy4yKSBBZGQgaGFzaCBhbmQgaWRlbnRpZmllciB0byBoYXNoIHRvIGJsYW5rIG5vZGVzIG1hcCxcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhIG5ldyBlbnRyeSBpZiBuZWNlc3NhcnkuXG4gICAgICAgICAgICAgICAgaWYoaGFzaCBpbiBzZWxmLmhhc2hUb0JsYW5rTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXS5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2VsZi5oYXNoVG9CbGFua05vZGVzW2hhc2hdID0gW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gNS40KSBGb3IgZWFjaCBoYXNoIHRvIGlkZW50aWZpZXIgbGlzdCBtYXBwaW5nIGluIGhhc2ggdG8gYmxhbmtcbiAgICAgICAgICAgIC8vIG5vZGVzIG1hcCwgbGV4aWNvZ3JhcGhpY2FsbHktc29ydGVkIGJ5IGhhc2g6XG4gICAgICAgICAgICB2YXIgaGFzaGVzID0gT2JqZWN0LmtleXMoc2VsZi5oYXNoVG9CbGFua05vZGVzKS5zb3J0KCk7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaGFzaGVzLCBmdW5jdGlvbihoYXNoLCBpLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuMSkgSWYgdGhlIGxlbmd0aCBvZiBpZGVudGlmaWVyIGxpc3QgaXMgZ3JlYXRlciB0aGFuIDEsXG4gICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG1hcHBpbmcuXG4gICAgICAgICAgICAgIHZhciBpZExpc3QgPSBzZWxmLmhhc2hUb0JsYW5rTm9kZXNbaGFzaF07XG4gICAgICAgICAgICAgIGlmKGlkTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyA1LjQuMikgVXNlIHRoZSBJc3N1ZSBJZGVudGlmaWVyIGFsZ29yaXRobSwgcGFzc2luZyBjYW5vbmljYWxcbiAgICAgICAgICAgICAgLy8gaXNzdWVyIGFuZCB0aGUgc2luZ2xlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpbiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIC8vIGxpc3QsIGlkZW50aWZpZXIsIHRvIGlzc3VlIGEgY2Fub25pY2FsIHJlcGxhY2VtZW50IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgLy8gZm9yIGlkZW50aWZpZXIuXG4gICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoYW5naW5nIGBnZXRJZGAgdG8gYGlzc3VlYFxuICAgICAgICAgICAgICB2YXIgaWQgPSBpZExpc3RbMF07XG4gICAgICAgICAgICAgIHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKGlkKTtcblxuICAgICAgICAgICAgICAvLyA1LjQuMykgUmVtb3ZlIGlkZW50aWZpZXIgZnJvbSBub24tbm9ybWFsaXplZCBpZGVudGlmaWVycy5cbiAgICAgICAgICAgICAgZGVsZXRlIG5vbk5vcm1hbGl6ZWRbaWRdO1xuXG4gICAgICAgICAgICAgIC8vIDUuNC40KSBSZW1vdmUgaGFzaCBmcm9tIHRoZSBoYXNoIHRvIGJsYW5rIG5vZGVzIG1hcC5cbiAgICAgICAgICAgICAgZGVsZXRlIHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXTtcblxuICAgICAgICAgICAgICAvLyA1LjQuNSkgU2V0IHNpbXBsZSB0byB0cnVlLlxuICAgICAgICAgICAgICBzaW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgXSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIC8vIDYpIEZvciBlYWNoIGhhc2ggdG8gaWRlbnRpZmllciBsaXN0IG1hcHBpbmcgaW4gaGFzaCB0byBibGFuayBub2RlcyBtYXAsXG4gICAgICAvLyBsZXhpY29ncmFwaGljYWxseS1zb3J0ZWQgYnkgaGFzaDpcbiAgICAgIHZhciBoYXNoZXMgPSBPYmplY3Qua2V5cyhzZWxmLmhhc2hUb0JsYW5rTm9kZXMpLnNvcnQoKTtcbiAgICAgIHNlbGYuZm9yRWFjaChoYXNoZXMsIGZ1bmN0aW9uKGhhc2gsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gNi4xKSBDcmVhdGUgaGFzaCBwYXRoIGxpc3Qgd2hlcmUgZWFjaCBpdGVtIHdpbGwgYmUgYSByZXN1bHQgb2ZcbiAgICAgICAgLy8gcnVubmluZyB0aGUgSGFzaCBOLURlZ3JlZSBRdWFkcyBhbGdvcml0aG0uXG4gICAgICAgIHZhciBoYXNoUGF0aExpc3QgPSBbXTtcblxuICAgICAgICAvLyA2LjIpIEZvciBlYWNoIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpZGVudGlmaWVyIGluIGlkZW50aWZpZXIgbGlzdDpcbiAgICAgICAgdmFyIGlkTGlzdCA9IHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXTtcbiAgICAgICAgc2VsZi53YXRlcmZhbGwoW1xuICAgICAgICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaWRMaXN0LCBmdW5jdGlvbihpZCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA2LjIuMSkgSWYgYSBjYW5vbmljYWwgaWRlbnRpZmllciBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZCBmb3JcbiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciwgY29udGludWUgdG8gdGhlIG5leHQgaWRlbnRpZmllci5cbiAgICAgICAgICAgICAgaWYoc2VsZi5jYW5vbmljYWxJc3N1ZXIuaGFzSWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyA2LjIuMikgQ3JlYXRlIHRlbXBvcmFyeSBpc3N1ZXIsIGFuIGlkZW50aWZpZXIgaXNzdWVyXG4gICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIHdpdGggdGhlIHByZWZpeCBfOmIuXG4gICAgICAgICAgICAgIHZhciBpc3N1ZXIgPSBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG5cbiAgICAgICAgICAgICAgLy8gNi4yLjMpIFVzZSB0aGUgSXNzdWUgSWRlbnRpZmllciBhbGdvcml0aG0sIHBhc3NpbmcgdGVtcG9yYXJ5XG4gICAgICAgICAgICAgIC8vIGlzc3VlciBhbmQgaWRlbnRpZmllciwgdG8gaXNzdWUgYSBuZXcgdGVtcG9yYXJ5IGJsYW5rIG5vZGVcbiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciBmb3IgaWRlbnRpZmllci5cbiAgICAgICAgICAgICAgaXNzdWVyLmdldElkKGlkKTtcblxuICAgICAgICAgICAgICAvLyA2LjIuNCkgUnVuIHRoZSBIYXNoIE4tRGVncmVlIFF1YWRzIGFsZ29yaXRobSwgcGFzc2luZ1xuICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgaXNzdWVyLCBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGhhc2ggcGF0aCBsaXN0LlxuICAgICAgICAgICAgICBzZWxmLmhhc2hORGVncmVlUXVhZHMoaWQsIGlzc3VlciwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNoUGF0aExpc3QucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIDYuMykgRm9yIGVhY2ggcmVzdWx0IGluIHRoZSBoYXNoIHBhdGggbGlzdCxcbiAgICAgICAgICAgIC8vIGxleGljb2dyYXBoaWNhbGx5LXNvcnRlZCBieSB0aGUgaGFzaCBpbiByZXN1bHQ6XG4gICAgICAgICAgICBoYXNoUGF0aExpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoYS5oYXNoIDwgYi5oYXNoKSA/IC0xIDogKChhLmhhc2ggPiBiLmhhc2gpID8gMSA6IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaGFzaFBhdGhMaXN0LCBmdW5jdGlvbihyZXN1bHQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgLy8gNi4zLjEpIEZvciBlYWNoIGJsYW5rIG5vZGUgaWRlbnRpZmllciwgZXhpc3RpbmcgaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgLy8gdGhhdCB3YXMgaXNzdWVkIGEgdGVtcG9yYXJ5IGlkZW50aWZpZXIgYnkgaWRlbnRpZmllciBpc3N1ZXJcbiAgICAgICAgICAgICAgLy8gaW4gcmVzdWx0LCBpc3N1ZSBhIGNhbm9uaWNhbCBpZGVudGlmaWVyLCBpbiB0aGUgc2FtZSBvcmRlcixcbiAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIElzc3VlIElkZW50aWZpZXIgYWxnb3JpdGhtLCBwYXNzaW5nIGNhbm9uaWNhbFxuICAgICAgICAgICAgICAvLyBpc3N1ZXIgYW5kIGV4aXN0aW5nIGlkZW50aWZpZXIuXG4gICAgICAgICAgICAgIGZvcih2YXIgZXhpc3RpbmcgaW4gcmVzdWx0Lmlzc3Vlci5leGlzdGluZykge1xuICAgICAgICAgICAgICAgIHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKGV4aXN0aW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgXSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvKiBOb3RlOiBBdCB0aGlzIHBvaW50IGFsbCBibGFuayBub2RlcyBpbiB0aGUgc2V0IG9mIFJERiBxdWFkcyBoYXZlIGJlZW5cbiAgICAgIGFzc2lnbmVkIGNhbm9uaWNhbCBpZGVudGlmaWVycywgd2hpY2ggaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgY2Fub25pY2FsXG4gICAgICBpc3N1ZXIuIEhlcmUgZWFjaCBxdWFkIGlzIHVwZGF0ZWQgYnkgYXNzaWduaW5nIGVhY2ggb2YgaXRzIGJsYW5rIG5vZGVzXG4gICAgICBpdHMgbmV3IGlkZW50aWZpZXIuICovXG5cbiAgICAgIC8vIDcpIEZvciBlYWNoIHF1YWQsIHF1YWQsIGluIGlucHV0IGRhdGFzZXQ6XG4gICAgICB2YXIgbm9ybWFsaXplZCA9IFtdO1xuICAgICAgc2VsZi53YXRlcmZhbGwoW1xuICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIHNlbGYuZm9yRWFjaChzZWxmLnF1YWRzLCBmdW5jdGlvbihxdWFkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyA3LjEpIENyZWF0ZSBhIGNvcHksIHF1YWQgY29weSwgb2YgcXVhZCBhbmQgcmVwbGFjZSBhbnkgZXhpc3RpbmdcbiAgICAgICAgICAgIC8vIGJsYW5rIG5vZGUgaWRlbnRpZmllcnMgdXNpbmcgdGhlIGNhbm9uaWNhbCBpZGVudGlmaWVyc1xuICAgICAgICAgICAgLy8gcHJldmlvdXNseSBpc3N1ZWQgYnkgY2Fub25pY2FsIGlzc3Vlci5cbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9wdGltaXplIGF3YXkgdGhlIGNvcHkgaGVyZS5cbiAgICAgICAgICAgIHNlbGYuZm9yRWFjaENvbXBvbmVudChxdWFkLCBmdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgaWYoY29tcG9uZW50LnR5cGUgPT09ICdibGFuayBub2RlJyAmJlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC52YWx1ZS5pbmRleE9mKHNlbGYuY2Fub25pY2FsSXNzdWVyLnByZWZpeCkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSBzZWxmLmNhbm9uaWNhbElzc3Vlci5nZXRJZChjb21wb25lbnQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIDcuMikgQWRkIHF1YWQgY29weSB0byB0aGUgbm9ybWFsaXplZCBkYXRhc2V0LlxuICAgICAgICAgICAgbm9ybWFsaXplZC5wdXNoKF90b05RdWFkKHF1YWQpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIC8vIHNvcnQgbm9ybWFsaXplZCBvdXRwdXRcbiAgICAgICAgICBub3JtYWxpemVkLnNvcnQoKTtcblxuICAgICAgICAgIC8vIDgpIFJldHVybiB0aGUgbm9ybWFsaXplZCBkYXRhc2V0LlxuICAgICAgICAgIGlmKHNlbGYub3B0aW9ucy5mb3JtYXQgPT09ICdhcHBsaWNhdGlvbi9ucXVhZHMnKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBub3JtYWxpemVkLmpvaW4oJycpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0ID0gX3BhcnNlTlF1YWRzKG5vcm1hbGl6ZWQuam9pbignJykpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIF0sIGNhbGxiYWNrKTtcbiAgICB9XG4gIF0sIGZ1bmN0aW9uKGVycikge1xuICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgfSk7XG59O1xuXG4vLyA0LjYpIEhhc2ggRmlyc3QgRGVncmVlIFF1YWRzXG5Ob3JtYWxpemUucHJvdG90eXBlLmhhc2hGaXJzdERlZ3JlZVF1YWRzID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyByZXR1cm4gY2FjaGVkIGhhc2hcbiAgdmFyIGluZm8gPSBzZWxmLmJsYW5rTm9kZUluZm9baWRdO1xuICBpZignaGFzaCcgaW4gaW5mbykge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBpbmZvLmhhc2gpO1xuICB9XG5cbiAgLy8gMSkgSW5pdGlhbGl6ZSBucXVhZHMgdG8gYW4gZW1wdHkgbGlzdC4gSXQgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHF1YWRzIGluXG4gIC8vIE4tUXVhZHMgZm9ybWF0LlxuICB2YXIgbnF1YWRzID0gW107XG5cbiAgLy8gMikgR2V0IHRoZSBsaXN0IG9mIHF1YWRzIHF1YWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGJsYW5rIG5vZGVcbiAgLy8gaWRlbnRpZmllciBpbiB0aGUgYmxhbmsgbm9kZSB0byBxdWFkcyBtYXAuXG4gIHZhciBxdWFkcyA9IGluZm8ucXVhZHM7XG5cbiAgLy8gMykgRm9yIGVhY2ggcXVhZCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIFNlcmlhbGl6ZSB0aGUgcXVhZCBpbiBOLVF1YWRzIGZvcm1hdCB3aXRoIHRoZSBmb2xsb3dpbmcgc3BlY2lhbFxuICAgIC8vIHJ1bGU6XG5cbiAgICAvLyAzLjEuMSkgSWYgYW55IGNvbXBvbmVudCBpbiBxdWFkIGlzIGFuIGJsYW5rIG5vZGUsIHRoZW4gc2VyaWFsaXplIGl0XG4gICAgLy8gdXNpbmcgYSBzcGVjaWFsIGlkZW50aWZpZXIgYXMgZm9sbG93czpcbiAgICB2YXIgY29weSA9IHtwcmVkaWNhdGU6IHF1YWQucHJlZGljYXRlfTtcbiAgICBzZWxmLmZvckVhY2hDb21wb25lbnQocXVhZCwgZnVuY3Rpb24oY29tcG9uZW50LCBrZXkpIHtcbiAgICAgIC8vIDMuMS4yKSBJZiB0aGUgYmxhbmsgbm9kZSdzIGV4aXN0aW5nIGJsYW5rIG5vZGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZVxuICAgICAgLy8gcmVmZXJlbmNlIGJsYW5rIG5vZGUgaWRlbnRpZmllciB0aGVuIHVzZSB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIF86YSxcbiAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgXzp6LlxuICAgICAgY29weVtrZXldID0gc2VsZi5tb2RpZnlGaXJzdERlZ3JlZUNvbXBvbmVudChpZCwgY29tcG9uZW50LCBrZXkpO1xuICAgIH0pO1xuICAgIG5xdWFkcy5wdXNoKF90b05RdWFkKGNvcHkpKTtcbiAgICBjYWxsYmFjaygpO1xuICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyA0KSBTb3J0IG5xdWFkcyBpbiBsZXhpY29ncmFwaGljYWwgb3JkZXIuXG4gICAgbnF1YWRzLnNvcnQoKTtcblxuICAgIC8vIDUpIFJldHVybiB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIHRoZSBzb3J0ZWQsIGpvaW5lZCBucXVhZHNcbiAgICAvLyB0aHJvdWdoIHRoZSBoYXNoIGFsZ29yaXRobS5cbiAgICBpbmZvLmhhc2ggPSBOb3JtYWxpemVIYXNoLmhhc2hOUXVhZHMoc2VsZi5uYW1lLCBucXVhZHMpO1xuICAgIGNhbGxiYWNrKG51bGwsIGluZm8uaGFzaCk7XG4gIH0pO1xufTtcblxuLy8gaGVscGVyIGZvciBtb2RpZnlpbmcgY29tcG9uZW50IGR1cmluZyBIYXNoIEZpcnN0IERlZ3JlZSBRdWFkc1xuTm9ybWFsaXplLnByb3RvdHlwZS5tb2RpZnlGaXJzdERlZ3JlZUNvbXBvbmVudCA9IGZ1bmN0aW9uKGlkLCBjb21wb25lbnQpIHtcbiAgaWYoY29tcG9uZW50LnR5cGUgIT09ICdibGFuayBub2RlJykge1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbiAgY29tcG9uZW50ID0gX2Nsb25lKGNvbXBvbmVudCk7XG4gIGNvbXBvbmVudC52YWx1ZSA9IChjb21wb25lbnQudmFsdWUgPT09IGlkID8gJ186YScgOiAnXzp6Jyk7XG4gIHJldHVybiBjb21wb25lbnQ7XG59O1xuXG4vLyA0LjcpIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG5Ob3JtYWxpemUucHJvdG90eXBlLmhhc2hSZWxhdGVkQmxhbmtOb2RlID0gZnVuY3Rpb24oXG4gIHJlbGF0ZWQsIHF1YWQsIGlzc3VlciwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyAxKSBTZXQgdGhlIGlkZW50aWZpZXIgdG8gdXNlIGZvciByZWxhdGVkLCBwcmVmZXJyaW5nIGZpcnN0IHRoZSBjYW5vbmljYWxcbiAgLy8gaWRlbnRpZmllciBmb3IgcmVsYXRlZCBpZiBpc3N1ZWQsIHNlY29uZCB0aGUgaWRlbnRpZmllciBpc3N1ZWQgYnkgaXNzdWVyXG4gIC8vIGlmIGlzc3VlZCwgYW5kIGxhc3QsIGlmIG5lY2Vzc2FyeSwgdGhlIHJlc3VsdCBvZiB0aGUgSGFzaCBGaXJzdCBEZWdyZWVcbiAgLy8gUXVhZHMgYWxnb3JpdGhtLCBwYXNzaW5nIHJlbGF0ZWQuXG4gIHZhciBpZDtcbiAgc2VsZi53YXRlcmZhbGwoW1xuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBpZihzZWxmLmNhbm9uaWNhbElzc3Vlci5oYXNJZChyZWxhdGVkKSkge1xuICAgICAgICBpZCA9IHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKHJlbGF0ZWQpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICAgIGlmKGlzc3Vlci5oYXNJZChyZWxhdGVkKSkge1xuICAgICAgICBpZCA9IGlzc3Vlci5nZXRJZChyZWxhdGVkKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgICBzZWxmLmhhc2hGaXJzdERlZ3JlZVF1YWRzKHJlbGF0ZWQsIGZ1bmN0aW9uKGVyciwgaGFzaCkge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBpZCA9IGhhc2g7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIF0sIGZ1bmN0aW9uKGVycikge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgLy8gMikgSW5pdGlhbGl6ZSBhIHN0cmluZyBpbnB1dCB0byB0aGUgdmFsdWUgb2YgcG9zaXRpb24uXG4gICAgLy8gTm90ZTogV2UgdXNlIGEgaGFzaCBvYmplY3QgaW5zdGVhZC5cbiAgICB2YXIgbWQgPSBuZXcgTm9ybWFsaXplSGFzaChzZWxmLm5hbWUpO1xuICAgIG1kLnVwZGF0ZShwb3NpdGlvbik7XG5cbiAgICAvLyAzKSBJZiBwb3NpdGlvbiBpcyBub3QgZywgYXBwZW5kIDwsIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlIGluIHF1YWQsXG4gICAgLy8gYW5kID4gdG8gaW5wdXQuXG4gICAgaWYocG9zaXRpb24gIT09ICdnJykge1xuICAgICAgbWQudXBkYXRlKHNlbGYuZ2V0UmVsYXRlZFByZWRpY2F0ZShxdWFkKSk7XG4gICAgfVxuXG4gICAgLy8gNCkgQXBwZW5kIGlkZW50aWZpZXIgdG8gaW5wdXQuXG4gICAgbWQudXBkYXRlKGlkKTtcblxuICAgIC8vIDUpIFJldHVybiB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIGlucHV0IHRocm91Z2ggdGhlIGhhc2hcbiAgICAvLyBhbGdvcml0aG0uXG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG1kLmRpZ2VzdCgpKTtcbiAgfSk7XG59O1xuXG4vLyBoZWxwZXIgZm9yIGdldHRpbmcgYSByZWxhdGVkIHByZWRpY2F0ZVxuTm9ybWFsaXplLnByb3RvdHlwZS5nZXRSZWxhdGVkUHJlZGljYXRlID0gZnVuY3Rpb24ocXVhZCkge1xuICByZXR1cm4gJzwnICsgcXVhZC5wcmVkaWNhdGUudmFsdWUgKyAnPic7XG59O1xuXG4vLyA0LjgpIEhhc2ggTi1EZWdyZWUgUXVhZHNcbk5vcm1hbGl6ZS5wcm90b3R5cGUuaGFzaE5EZWdyZWVRdWFkcyA9IGZ1bmN0aW9uKGlkLCBpc3N1ZXIsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyAxKSBDcmVhdGUgYSBoYXNoIHRvIHJlbGF0ZWQgYmxhbmsgbm9kZXMgbWFwIGZvciBzdG9yaW5nIGhhc2hlcyB0aGF0XG4gIC8vIGlkZW50aWZ5IHJlbGF0ZWQgYmxhbmsgbm9kZXMuXG4gIC8vIE5vdGU6IDIpIGFuZCAzKSBoYW5kbGVkIHdpdGhpbiBgY3JlYXRlSGFzaFRvUmVsYXRlZGBcbiAgdmFyIGhhc2hUb1JlbGF0ZWQ7XG4gIHZhciBtZCA9IG5ldyBOb3JtYWxpemVIYXNoKHNlbGYubmFtZSk7XG4gIHNlbGYud2F0ZXJmYWxsKFtcbiAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgc2VsZi5jcmVhdGVIYXNoVG9SZWxhdGVkKGlkLCBpc3N1ZXIsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmKGVycikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGhhc2hUb1JlbGF0ZWQgPSByZXN1bHQ7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvLyA0KSBDcmVhdGUgYW4gZW1wdHkgc3RyaW5nLCBkYXRhIHRvIGhhc2guXG4gICAgICAvLyBOb3RlOiBXZSBjcmVhdGVkIGEgaGFzaCBvYmplY3QgYG1kYCBhYm92ZSBpbnN0ZWFkLlxuXG4gICAgICAvLyA1KSBGb3IgZWFjaCByZWxhdGVkIGhhc2ggdG8gYmxhbmsgbm9kZSBsaXN0IG1hcHBpbmcgaW4gaGFzaCB0byByZWxhdGVkXG4gICAgICAvLyBibGFuayBub2RlcyBtYXAsIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseSBieSByZWxhdGVkIGhhc2g6XG4gICAgICB2YXIgaGFzaGVzID0gT2JqZWN0LmtleXMoaGFzaFRvUmVsYXRlZCkuc29ydCgpO1xuICAgICAgc2VsZi5mb3JFYWNoKGhhc2hlcywgZnVuY3Rpb24oaGFzaCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAvLyA1LjEpIEFwcGVuZCB0aGUgcmVsYXRlZCBoYXNoIHRvIHRoZSBkYXRhIHRvIGhhc2guXG4gICAgICAgIG1kLnVwZGF0ZShoYXNoKTtcblxuICAgICAgICAvLyA1LjIpIENyZWF0ZSBhIHN0cmluZyBjaG9zZW4gcGF0aC5cbiAgICAgICAgdmFyIGNob3NlblBhdGggPSAnJztcblxuICAgICAgICAvLyA1LjMpIENyZWF0ZSBhbiB1bnNldCBjaG9zZW4gaXNzdWVyIHZhcmlhYmxlLlxuICAgICAgICB2YXIgY2hvc2VuSXNzdWVyO1xuXG4gICAgICAgIC8vIDUuNCkgRm9yIGVhY2ggcGVybXV0YXRpb24gb2YgYmxhbmsgbm9kZSBsaXN0OlxuICAgICAgICB2YXIgcGVybXV0YXRvciA9IG5ldyBQZXJtdXRhdG9yKGhhc2hUb1JlbGF0ZWRbaGFzaF0pO1xuICAgICAgICBzZWxmLndoaWxzdChcbiAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHBlcm11dGF0b3IuaGFzTmV4dCgpOyB9LFxuICAgICAgICAgIGZ1bmN0aW9uKG5leHRQZXJtdXRhdGlvbikge1xuICAgICAgICAgIHZhciBwZXJtdXRhdGlvbiA9IHBlcm11dGF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgLy8gNS40LjEpIENyZWF0ZSBhIGNvcHkgb2YgaXNzdWVyLCBpc3N1ZXIgY29weS5cbiAgICAgICAgICB2YXIgaXNzdWVyQ29weSA9IGlzc3Vlci5jbG9uZSgpO1xuXG4gICAgICAgICAgLy8gNS40LjIpIENyZWF0ZSBhIHN0cmluZyBwYXRoLlxuICAgICAgICAgIHZhciBwYXRoID0gJyc7XG5cbiAgICAgICAgICAvLyA1LjQuMykgQ3JlYXRlIGEgcmVjdXJzaW9uIGxpc3QsIHRvIHN0b3JlIGJsYW5rIG5vZGUgaWRlbnRpZmllcnNcbiAgICAgICAgICAvLyB0aGF0IG11c3QgYmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkIGJ5IHRoaXMgYWxnb3JpdGhtLlxuICAgICAgICAgIHZhciByZWN1cnNpb25MaXN0ID0gW107XG5cbiAgICAgICAgICBzZWxmLndhdGVyZmFsbChbXG4gICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuNCkgRm9yIGVhY2ggcmVsYXRlZCBpbiBwZXJtdXRhdGlvbjpcbiAgICAgICAgICAgICAgc2VsZi5mb3JFYWNoKHBlcm11dGF0aW9uLCBmdW5jdGlvbihyZWxhdGVkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gNS40LjQuMSkgSWYgYSBjYW5vbmljYWwgaWRlbnRpZmllciBoYXMgYmVlbiBpc3N1ZWQgZm9yXG4gICAgICAgICAgICAgICAgLy8gcmVsYXRlZCwgYXBwZW5kIGl0IHRvIHBhdGguXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5jYW5vbmljYWxJc3N1ZXIuaGFzSWQocmVsYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgIHBhdGggKz0gc2VsZi5jYW5vbmljYWxJc3N1ZXIuZ2V0SWQocmVsYXRlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIDUuNC40LjIpIE90aGVyd2lzZTpcbiAgICAgICAgICAgICAgICAgIC8vIDUuNC40LjIuMSkgSWYgaXNzdWVyIGNvcHkgaGFzIG5vdCBpc3N1ZWQgYW4gaWRlbnRpZmllciBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGF0ZWQsIGFwcGVuZCByZWxhdGVkIHRvIHJlY3Vyc2lvbiBsaXN0LlxuICAgICAgICAgICAgICAgICAgaWYoIWlzc3VlckNvcHkuaGFzSWQocmVsYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGlzdC5wdXNoKHJlbGF0ZWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gNS40LjQuMi4yKSBVc2UgdGhlIElzc3VlIElkZW50aWZpZXIgYWxnb3JpdGhtLCBwYXNzaW5nXG4gICAgICAgICAgICAgICAgICAvLyBpc3N1ZXIgY29weSBhbmQgcmVsYXRlZCBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gcGF0aC5cbiAgICAgICAgICAgICAgICAgIHBhdGggKz0gaXNzdWVyQ29weS5nZXRJZChyZWxhdGVkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyA1LjQuNC4zKSBJZiBjaG9zZW4gcGF0aCBpcyBub3QgZW1wdHkgYW5kIHRoZSBsZW5ndGggb2YgcGF0aFxuICAgICAgICAgICAgICAgIC8vIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIGNob3NlbiBwYXRoIGFuZFxuICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIGNob3NlbiBwYXRoLCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gc2tpcCB0byB0aGUgbmV4dCBwZXJtdXRhdGlvbi5cbiAgICAgICAgICAgICAgICBpZihjaG9zZW5QYXRoLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgcGF0aC5sZW5ndGggPj0gY2hvc2VuUGF0aC5sZW5ndGggJiYgcGF0aCA+IGNob3NlblBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBtYXkgY2F1c2UgaW5hY2N1cmF0ZSB0b3RhbCBkZXB0aCBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRQZXJtdXRhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgLy8gNS40LjUpIEZvciBlYWNoIHJlbGF0ZWQgaW4gcmVjdXJzaW9uIGxpc3Q6XG4gICAgICAgICAgICAgIHNlbGYuZm9yRWFjaChyZWN1cnNpb25MaXN0LCBmdW5jdGlvbihyZWxhdGVkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gNS40LjUuMSkgU2V0IHJlc3VsdCB0byB0aGUgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBIYXNoIE4tRGVncmVlIFF1YWRzIGFsZ29yaXRobSwgcGFzc2luZyByZWxhdGVkIGZvclxuICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgYW5kIGlzc3VlciBjb3B5IGZvciBwYXRoIGlkZW50aWZpZXIgaXNzdWVyLlxuICAgICAgICAgICAgICAgIHNlbGYuaGFzaE5EZWdyZWVRdWFkcyhcbiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQsIGlzc3VlckNvcHksIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIDUuNC41LjIpIFVzZSB0aGUgSXNzdWUgSWRlbnRpZmllciBhbGdvcml0aG0sIHBhc3NpbmcgaXNzdWVyXG4gICAgICAgICAgICAgICAgICAvLyBjb3B5IGFuZCByZWxhdGVkIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byBwYXRoLlxuICAgICAgICAgICAgICAgICAgcGF0aCArPSBpc3N1ZXJDb3B5LmdldElkKHJlbGF0ZWQpO1xuXG4gICAgICAgICAgICAgICAgICAvLyA1LjQuNS4zKSBBcHBlbmQgPCwgdGhlIGhhc2ggaW4gcmVzdWx0LCBhbmQgPiB0byBwYXRoLlxuICAgICAgICAgICAgICAgICAgcGF0aCArPSAnPCcgKyByZXN1bHQuaGFzaCArICc+JztcblxuICAgICAgICAgICAgICAgICAgLy8gNS40LjUuNCkgU2V0IGlzc3VlciBjb3B5IHRvIHRoZSBpZGVudGlmaWVyIGlzc3VlciBpblxuICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0LlxuICAgICAgICAgICAgICAgICAgaXNzdWVyQ29weSA9IHJlc3VsdC5pc3N1ZXI7XG5cbiAgICAgICAgICAgICAgICAgIC8vIDUuNC41LjUpIElmIGNob3NlbiBwYXRoIGlzIG5vdCBlbXB0eSBhbmQgdGhlIGxlbmd0aCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBjaG9zZW4gcGF0aCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIGNob3NlbiBwYXRoLCB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyBza2lwIHRvIHRoZSBuZXh0IHBlcm11dGF0aW9uLlxuICAgICAgICAgICAgICAgICAgaWYoY2hvc2VuUGF0aC5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5sZW5ndGggPj0gY2hvc2VuUGF0aC5sZW5ndGggJiYgcGF0aCA+IGNob3NlblBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1heSBjYXVzZSBpbmFjY3VyYXRlIHRvdGFsIGRlcHRoIGNhbGN1bGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0UGVybXV0YXRpb24oKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuNikgSWYgY2hvc2VuIHBhdGggaXMgZW1wdHkgb3IgcGF0aCBpcyBsZXhpY29ncmFwaGljYWxseVxuICAgICAgICAgICAgICAvLyBsZXNzIHRoYW4gY2hvc2VuIHBhdGgsIHNldCBjaG9zZW4gcGF0aCB0byBwYXRoIGFuZCBjaG9zZW5cbiAgICAgICAgICAgICAgLy8gaXNzdWVyIHRvIGlzc3VlciBjb3B5LlxuICAgICAgICAgICAgICBpZihjaG9zZW5QYXRoLmxlbmd0aCA9PT0gMCB8fCBwYXRoIDwgY2hvc2VuUGF0aCkge1xuICAgICAgICAgICAgICAgIGNob3NlblBhdGggPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNob3Nlbklzc3VlciA9IGlzc3VlckNvcHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLCBuZXh0UGVybXV0YXRpb24pO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDUuNSkgQXBwZW5kIGNob3NlbiBwYXRoIHRvIGRhdGEgdG8gaGFzaC5cbiAgICAgICAgICBtZC51cGRhdGUoY2hvc2VuUGF0aCk7XG5cbiAgICAgICAgICAvLyA1LjYpIFJlcGxhY2UgaXNzdWVyLCBieSByZWZlcmVuY2UsIHdpdGggY2hvc2VuIGlzc3Vlci5cbiAgICAgICAgICBpc3N1ZXIgPSBjaG9zZW5Jc3N1ZXI7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuICBdLCBmdW5jdGlvbihlcnIpIHtcbiAgICAvLyA2KSBSZXR1cm4gaXNzdWVyIGFuZCB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIGRhdGEgdG8gaGFzaFxuICAgIC8vIHRocm91Z2ggdGhlIGhhc2ggYWxnb3JpdGhtLlxuICAgIGNhbGxiYWNrKGVyciwge2hhc2g6IG1kLmRpZ2VzdCgpLCBpc3N1ZXI6IGlzc3Vlcn0pO1xuICB9KTtcbn07XG5cbi8vIGhlbHBlciBmb3IgY3JlYXRpbmcgaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcFxuTm9ybWFsaXplLnByb3RvdHlwZS5jcmVhdGVIYXNoVG9SZWxhdGVkID0gZnVuY3Rpb24oaWQsIGlzc3VlciwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIDEpIENyZWF0ZSBhIGhhc2ggdG8gcmVsYXRlZCBibGFuayBub2RlcyBtYXAgZm9yIHN0b3JpbmcgaGFzaGVzIHRoYXRcbiAgLy8gaWRlbnRpZnkgcmVsYXRlZCBibGFuayBub2Rlcy5cbiAgdmFyIGhhc2hUb1JlbGF0ZWQgPSB7fTtcblxuICAvLyAyKSBHZXQgYSByZWZlcmVuY2UsIHF1YWRzLCB0byB0aGUgbGlzdCBvZiBxdWFkcyBpbiB0aGUgYmxhbmsgbm9kZSB0b1xuICAvLyBxdWFkcyBtYXAgZm9yIHRoZSBrZXkgaWRlbnRpZmllci5cbiAgdmFyIHF1YWRzID0gc2VsZi5ibGFua05vZGVJbmZvW2lkXS5xdWFkcztcblxuICAvLyAzKSBGb3IgZWFjaCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIEZvciBlYWNoIGNvbXBvbmVudCBpbiBxdWFkLCBpZiBjb21wb25lbnQgaXMgdGhlIHN1YmplY3QsIG9iamVjdCxcbiAgICAvLyBhbmQgZ3JhcGggbmFtZSBhbmQgaXQgaXMgYSBibGFuayBub2RlIHRoYXQgaXMgbm90IGlkZW50aWZpZWQgYnlcbiAgICAvLyBpZGVudGlmaWVyOlxuICAgIHNlbGYuZm9yRWFjaChxdWFkLCBmdW5jdGlvbihjb21wb25lbnQsIGtleSwgY2FsbGJhY2spIHtcbiAgICAgIGlmKGtleSA9PT0gJ3ByZWRpY2F0ZScgfHxcbiAgICAgICAgIShjb21wb25lbnQudHlwZSA9PT0gJ2JsYW5rIG5vZGUnICYmIGNvbXBvbmVudC52YWx1ZSAhPT0gaWQpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgICAgLy8gMy4xLjEpIFNldCBoYXNoIHRvIHRoZSByZXN1bHQgb2YgdGhlIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG4gICAgICAvLyBhbGdvcml0aG0sIHBhc3NpbmcgdGhlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBmb3IgY29tcG9uZW50IGFzXG4gICAgICAvLyByZWxhdGVkLCBxdWFkLCBwYXRoIGlkZW50aWZpZXIgaXNzdWVyIGFzIGlzc3VlciwgYW5kIHBvc2l0aW9uIGFzXG4gICAgICAvLyBlaXRoZXIgcywgbywgb3IgZyBiYXNlZCBvbiB3aGV0aGVyIGNvbXBvbmVudCBpcyBhIHN1YmplY3QsIG9iamVjdCxcbiAgICAgIC8vIGdyYXBoIG5hbWUsIHJlc3BlY3RpdmVseS5cbiAgICAgIHZhciByZWxhdGVkID0gY29tcG9uZW50LnZhbHVlO1xuICAgICAgdmFyIHBvc2l0aW9uID0gUE9TSVRJT05TW2tleV07XG4gICAgICBzZWxmLmhhc2hSZWxhdGVkQmxhbmtOb2RlKFxuICAgICAgICByZWxhdGVkLCBxdWFkLCBpc3N1ZXIsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGhhc2gpIHtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIpIEFkZCBhIG1hcHBpbmcgb2YgaGFzaCB0byB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvclxuICAgICAgICAvLyBjb21wb25lbnQgdG8gaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcCwgYWRkaW5nIGFuIGVudHJ5IGFzXG4gICAgICAgIC8vIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYoaGFzaCBpbiBoYXNoVG9SZWxhdGVkKSB7XG4gICAgICAgICAgaGFzaFRvUmVsYXRlZFtoYXNoXS5wdXNoKHJlbGF0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc2hUb1JlbGF0ZWRbaGFzaF0gPSBbcmVsYXRlZF07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0sIGNhbGxiYWNrKTtcbiAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgY2FsbGJhY2soZXJyLCBoYXNoVG9SZWxhdGVkKTtcbiAgfSk7XG59O1xuXG4vLyBoZWxwZXIgdGhhdCBpdGVyYXRlcyBvdmVyIHF1YWQgY29tcG9uZW50cyAoc2tpcHMgcHJlZGljYXRlKVxuTm9ybWFsaXplLnByb3RvdHlwZS5mb3JFYWNoQ29tcG9uZW50ID0gZnVuY3Rpb24ocXVhZCwgb3ApIHtcbiAgZm9yKHZhciBrZXkgaW4gcXVhZCkge1xuICAgIC8vIHNraXAgYHByZWRpY2F0ZWBcbiAgICBpZihrZXkgPT09ICdwcmVkaWNhdGUnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb3AocXVhZFtrZXldLCBrZXksIHF1YWQpO1xuICB9XG59O1xuXG5yZXR1cm4gTm9ybWFsaXplO1xuXG59KSgpOyAvLyBlbmQgb2YgZGVmaW5lIFVSRE5BMjAxNVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBVUkdOQTIwMTIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBVUkdOQTIwMTIgPSAoZnVuY3Rpb24oKSB7XG5cbnZhciBOb3JtYWxpemUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIFVSRE5BMjAxNS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLm5hbWUgPSAnVVJHTkEyMDEyJztcbn07XG5Ob3JtYWxpemUucHJvdG90eXBlID0gbmV3IFVSRE5BMjAxNSgpO1xuXG4vLyBoZWxwZXIgZm9yIG1vZGlmeWluZyBjb21wb25lbnQgZHVyaW5nIEhhc2ggRmlyc3QgRGVncmVlIFF1YWRzXG5Ob3JtYWxpemUucHJvdG90eXBlLm1vZGlmeUZpcnN0RGVncmVlQ29tcG9uZW50ID0gZnVuY3Rpb24oaWQsIGNvbXBvbmVudCwga2V5KSB7XG4gIGlmKGNvbXBvbmVudC50eXBlICE9PSAnYmxhbmsgbm9kZScpIHtcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG4gIGNvbXBvbmVudCA9IF9jbG9uZShjb21wb25lbnQpO1xuICBpZihrZXkgPT09ICduYW1lJykge1xuICAgIGNvbXBvbmVudC52YWx1ZSA9ICdfOmcnO1xuICB9IGVsc2Uge1xuICAgIGNvbXBvbmVudC52YWx1ZSA9IChjb21wb25lbnQudmFsdWUgPT09IGlkID8gJ186YScgOiAnXzp6Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn07XG5cbi8vIGhlbHBlciBmb3IgZ2V0dGluZyBhIHJlbGF0ZWQgcHJlZGljYXRlXG5Ob3JtYWxpemUucHJvdG90eXBlLmdldFJlbGF0ZWRQcmVkaWNhdGUgPSBmdW5jdGlvbihxdWFkKSB7XG4gIHJldHVybiBxdWFkLnByZWRpY2F0ZS52YWx1ZTtcbn07XG5cbi8vIGhlbHBlciBmb3IgY3JlYXRpbmcgaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcFxuTm9ybWFsaXplLnByb3RvdHlwZS5jcmVhdGVIYXNoVG9SZWxhdGVkID0gZnVuY3Rpb24oaWQsIGlzc3VlciwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIDEpIENyZWF0ZSBhIGhhc2ggdG8gcmVsYXRlZCBibGFuayBub2RlcyBtYXAgZm9yIHN0b3JpbmcgaGFzaGVzIHRoYXRcbiAgLy8gaWRlbnRpZnkgcmVsYXRlZCBibGFuayBub2Rlcy5cbiAgdmFyIGhhc2hUb1JlbGF0ZWQgPSB7fTtcblxuICAvLyAyKSBHZXQgYSByZWZlcmVuY2UsIHF1YWRzLCB0byB0aGUgbGlzdCBvZiBxdWFkcyBpbiB0aGUgYmxhbmsgbm9kZSB0b1xuICAvLyBxdWFkcyBtYXAgZm9yIHRoZSBrZXkgaWRlbnRpZmllci5cbiAgdmFyIHF1YWRzID0gc2VsZi5ibGFua05vZGVJbmZvW2lkXS5xdWFkcztcblxuICAvLyAzKSBGb3IgZWFjaCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIElmIHRoZSBxdWFkJ3Mgc3ViamVjdCBpcyBhIGJsYW5rIG5vZGUgdGhhdCBkb2VzIG5vdCBtYXRjaFxuICAgIC8vIGlkZW50aWZpZXIsIHNldCBoYXNoIHRvIHRoZSByZXN1bHQgb2YgdGhlIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG4gICAgLy8gYWxnb3JpdGhtLCBwYXNzaW5nIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgZm9yIHN1YmplY3QgYXMgcmVsYXRlZCxcbiAgICAvLyBxdWFkLCBwYXRoIGlkZW50aWZpZXIgaXNzdWVyIGFzIGlzc3VlciwgYW5kIHAgYXMgcG9zaXRpb24uXG4gICAgdmFyIHBvc2l0aW9uO1xuICAgIHZhciByZWxhdGVkO1xuICAgIGlmKHF1YWQuc3ViamVjdC50eXBlID09PSAnYmxhbmsgbm9kZScgJiYgcXVhZC5zdWJqZWN0LnZhbHVlICE9PSBpZCkge1xuICAgICAgcmVsYXRlZCA9IHF1YWQuc3ViamVjdC52YWx1ZTtcbiAgICAgIHBvc2l0aW9uID0gJ3AnO1xuICAgIH0gZWxzZSBpZihxdWFkLm9iamVjdC50eXBlID09PSAnYmxhbmsgbm9kZScgJiYgcXVhZC5vYmplY3QudmFsdWUgIT09IGlkKSB7XG4gICAgICAvLyAzLjIpIE90aGVyd2lzZSwgaWYgcXVhZCdzIG9iamVjdCBpcyBhIGJsYW5rIG5vZGUgdGhhdCBkb2VzIG5vdCBtYXRjaFxuICAgICAgLy8gaWRlbnRpZmllciwgdG8gdGhlIHJlc3VsdCBvZiB0aGUgSGFzaCBSZWxhdGVkIEJsYW5rIE5vZGUgYWxnb3JpdGhtLFxuICAgICAgLy8gcGFzc2luZyB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvciBvYmplY3QgYXMgcmVsYXRlZCwgcXVhZCwgcGF0aFxuICAgICAgLy8gaWRlbnRpZmllciBpc3N1ZXIgYXMgaXNzdWVyLCBhbmQgciBhcyBwb3NpdGlvbi5cbiAgICAgIHJlbGF0ZWQgPSBxdWFkLm9iamVjdC52YWx1ZTtcbiAgICAgIHBvc2l0aW9uID0gJ3InO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAzLjMpIE90aGVyd2lzZSwgY29udGludWUgdG8gdGhlIG5leHQgcXVhZC5cbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICAvLyAzLjQpIEFkZCBhIG1hcHBpbmcgb2YgaGFzaCB0byB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvciB0aGVcbiAgICAvLyBjb21wb25lbnQgdGhhdCBtYXRjaGVkIChzdWJqZWN0IG9yIG9iamVjdCkgdG8gaGFzaCB0byByZWxhdGVkIGJsYW5rXG4gICAgLy8gbm9kZXMgbWFwLCBhZGRpbmcgYW4gZW50cnkgYXMgbmVjZXNzYXJ5LlxuICAgIHNlbGYuaGFzaFJlbGF0ZWRCbGFua05vZGUoXG4gICAgICByZWxhdGVkLCBxdWFkLCBpc3N1ZXIsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGhhc2gpIHtcbiAgICAgIGlmKGhhc2ggaW4gaGFzaFRvUmVsYXRlZCkge1xuICAgICAgICBoYXNoVG9SZWxhdGVkW2hhc2hdLnB1c2gocmVsYXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNoVG9SZWxhdGVkW2hhc2hdID0gW3JlbGF0ZWRdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgY2FsbGJhY2soZXJyLCBoYXNoVG9SZWxhdGVkKTtcbiAgfSk7XG59O1xuXG5yZXR1cm4gTm9ybWFsaXplO1xuXG59KSgpOyAvLyBlbmQgb2YgZGVmaW5lIFVSR05BMjAxMlxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZSBzdWJqZWN0cyBpbiB0aGUgZ2l2ZW4gSlNPTi1MRCBleHBhbmRlZCBpbnB1dFxuICogaW50byBhIG5vZGUgbWFwLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgSlNPTi1MRCBleHBhbmRlZCBpbnB1dC5cbiAqIEBwYXJhbSBncmFwaHMgYSBtYXAgb2YgZ3JhcGggbmFtZSB0byBzdWJqZWN0IG1hcC5cbiAqIEBwYXJhbSBncmFwaCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBncmFwaC5cbiAqIEBwYXJhbSBpc3N1ZXIgdGhlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpc3N1ZXIuXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBpbnB1dCBpZiBpdCBpcyBhIGJub2RlLlxuICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gYXBwZW5kIHRvLCBudWxsIGZvciBub25lLlxuICovXG5mdW5jdGlvbiBfY3JlYXRlTm9kZU1hcChpbnB1dCwgZ3JhcGhzLCBncmFwaCwgaXNzdWVyLCBuYW1lLCBsaXN0KSB7XG4gIC8vIHJlY3Vyc2UgdGhyb3VnaCBhcnJheVxuICBpZihfaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9jcmVhdGVOb2RlTWFwKGlucHV0W2ldLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIHVuZGVmaW5lZCwgbGlzdCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGFkZCBub24tb2JqZWN0IHRvIGxpc3RcbiAgaWYoIV9pc09iamVjdChpbnB1dCkpIHtcbiAgICBpZihsaXN0KSB7XG4gICAgICBsaXN0LnB1c2goaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhZGQgdmFsdWVzIHRvIGxpc3RcbiAgaWYoX2lzVmFsdWUoaW5wdXQpKSB7XG4gICAgaWYoJ0B0eXBlJyBpbiBpbnB1dCkge1xuICAgICAgdmFyIHR5cGUgPSBpbnB1dFsnQHR5cGUnXTtcbiAgICAgIC8vIHJlbmFtZSBAdHlwZSBibGFuayBub2RlXG4gICAgICBpZih0eXBlLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgaW5wdXRbJ0B0eXBlJ10gPSB0eXBlID0gaXNzdWVyLmdldElkKHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZihsaXN0KSB7XG4gICAgICBsaXN0LnB1c2goaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCBpbnB1dCBtdXN0IGJlIGEgc3ViamVjdC5cblxuICAvLyBzcGVjIHJlcXVpcmVzIEB0eXBlIHRvIGJlIG5hbWVkIGZpcnN0LCBzbyBhc3NpZ24gbmFtZXMgZWFybHlcbiAgaWYoJ0B0eXBlJyBpbiBpbnB1dCkge1xuICAgIHZhciB0eXBlcyA9IGlucHV0WydAdHlwZSddO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgIGlmKHR5cGUuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgICBpc3N1ZXIuZ2V0SWQodHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IG5hbWUgZm9yIHN1YmplY3RcbiAgaWYoX2lzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IF9pc0JsYW5rTm9kZShpbnB1dCkgPyBpc3N1ZXIuZ2V0SWQoaW5wdXRbJ0BpZCddKSA6IGlucHV0WydAaWQnXTtcbiAgfVxuXG4gIC8vIGFkZCBzdWJqZWN0IHJlZmVyZW5jZSB0byBsaXN0XG4gIGlmKGxpc3QpIHtcbiAgICBsaXN0LnB1c2goeydAaWQnOiBuYW1lfSk7XG4gIH1cblxuICAvLyBjcmVhdGUgbmV3IHN1YmplY3Qgb3IgbWVyZ2UgaW50byBleGlzdGluZyBvbmVcbiAgdmFyIHN1YmplY3RzID0gZ3JhcGhzW2dyYXBoXTtcbiAgdmFyIHN1YmplY3QgPSBzdWJqZWN0c1tuYW1lXSA9IHN1YmplY3RzW25hbWVdIHx8IHt9O1xuICBzdWJqZWN0WydAaWQnXSA9IG5hbWU7XG4gIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoaW5wdXQpLnNvcnQoKTtcbiAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsrcGkpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW3BpXTtcblxuICAgIC8vIHNraXAgQGlkXG4gICAgaWYocHJvcGVydHkgPT09ICdAaWQnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgcmV2ZXJzZSBwcm9wZXJ0aWVzXG4gICAgaWYocHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgIHZhciByZWZlcmVuY2VkTm9kZSA9IHsnQGlkJzogbmFtZX07XG4gICAgICB2YXIgcmV2ZXJzZU1hcCA9IGlucHV0WydAcmV2ZXJzZSddO1xuICAgICAgZm9yKHZhciByZXZlcnNlUHJvcGVydHkgaW4gcmV2ZXJzZU1hcCkge1xuICAgICAgICB2YXIgaXRlbXMgPSByZXZlcnNlTWFwW3JldmVyc2VQcm9wZXJ0eV07XG4gICAgICAgIGZvcih2YXIgaWkgPSAwOyBpaSA8IGl0ZW1zLmxlbmd0aDsgKytpaSkge1xuICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNbaWldO1xuICAgICAgICAgIHZhciBpdGVtTmFtZSA9IGl0ZW1bJ0BpZCddO1xuICAgICAgICAgIGlmKF9pc0JsYW5rTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaXRlbU5hbWUgPSBpc3N1ZXIuZ2V0SWQoaXRlbU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY3JlYXRlTm9kZU1hcChpdGVtLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIGl0ZW1OYW1lKTtcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICBzdWJqZWN0c1tpdGVtTmFtZV0sIHJldmVyc2VQcm9wZXJ0eSwgcmVmZXJlbmNlZE5vZGUsXG4gICAgICAgICAgICB7cHJvcGVydHlJc0FycmF5OiB0cnVlLCBhbGxvd0R1cGxpY2F0ZTogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzZSBpbnRvIGdyYXBoXG4gICAgaWYocHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgICAvLyBhZGQgZ3JhcGggc3ViamVjdHMgbWFwIGVudHJ5XG4gICAgICBpZighKG5hbWUgaW4gZ3JhcGhzKSkge1xuICAgICAgICBncmFwaHNbbmFtZV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBnID0gKGdyYXBoID09PSAnQG1lcmdlZCcpID8gZ3JhcGggOiBuYW1lO1xuICAgICAgX2NyZWF0ZU5vZGVNYXAoaW5wdXRbcHJvcGVydHldLCBncmFwaHMsIGcsIGlzc3Vlcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBjb3B5IG5vbi1AdHlwZSBrZXl3b3Jkc1xuICAgIGlmKHByb3BlcnR5ICE9PSAnQHR5cGUnICYmIF9pc0tleXdvcmQocHJvcGVydHkpKSB7XG4gICAgICBpZihwcm9wZXJ0eSA9PT0gJ0BpbmRleCcgJiYgcHJvcGVydHkgaW4gc3ViamVjdCAmJlxuICAgICAgICAoaW5wdXRbcHJvcGVydHldICE9PSBzdWJqZWN0W3Byb3BlcnR5XSB8fFxuICAgICAgICBpbnB1dFtwcm9wZXJ0eV1bJ0BpZCddICE9PSBzdWJqZWN0W3Byb3BlcnR5XVsnQGlkJ10pKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgY29uZmxpY3RpbmcgQGluZGV4IHByb3BlcnR5IGRldGVjdGVkLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdjb25mbGljdGluZyBpbmRleGVzJywgc3ViamVjdDogc3ViamVjdH0pO1xuICAgICAgfVxuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0gPSBpbnB1dFtwcm9wZXJ0eV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIG92ZXIgb2JqZWN0c1xuICAgIHZhciBvYmplY3RzID0gaW5wdXRbcHJvcGVydHldO1xuXG4gICAgLy8gaWYgcHJvcGVydHkgaXMgYSBibm9kZSwgYXNzaWduIGl0IGEgbmV3IGlkXG4gICAgaWYocHJvcGVydHkuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgcHJvcGVydHkgPSBpc3N1ZXIuZ2V0SWQocHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8vIGVuc3VyZSBwcm9wZXJ0eSBpcyBhZGRlZCBmb3IgZW1wdHkgYXJyYXlzXG4gICAgaWYob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGpzb25sZC5hZGRWYWx1ZShzdWJqZWN0LCBwcm9wZXJ0eSwgW10sIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWV9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IodmFyIG9pID0gMDsgb2kgPCBvYmplY3RzLmxlbmd0aDsgKytvaSkge1xuICAgICAgdmFyIG8gPSBvYmplY3RzW29pXTtcblxuICAgICAgaWYocHJvcGVydHkgPT09ICdAdHlwZScpIHtcbiAgICAgICAgLy8gcmVuYW1lIEB0eXBlIGJsYW5rIG5vZGVzXG4gICAgICAgIG8gPSAoby5pbmRleE9mKCdfOicpID09PSAwKSA/IGlzc3Vlci5nZXRJZChvKSA6IG87XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBlbWJlZGRlZCBzdWJqZWN0IG9yIHN1YmplY3QgcmVmZXJlbmNlXG4gICAgICBpZihfaXNTdWJqZWN0KG8pIHx8IF9pc1N1YmplY3RSZWZlcmVuY2UobykpIHtcbiAgICAgICAgLy8gcmVsYWJlbCBibGFuayBub2RlIEBpZFxuICAgICAgICB2YXIgaWQgPSBfaXNCbGFua05vZGUobykgPyBpc3N1ZXIuZ2V0SWQob1snQGlkJ10pIDogb1snQGlkJ107XG5cbiAgICAgICAgLy8gYWRkIHJlZmVyZW5jZSBhbmQgcmVjdXJzZVxuICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgc3ViamVjdCwgcHJvcGVydHksIHsnQGlkJzogaWR9LFxuICAgICAgICAgIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWUsIGFsbG93RHVwbGljYXRlOiBmYWxzZX0pO1xuICAgICAgICBfY3JlYXRlTm9kZU1hcChvLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIGlkKTtcbiAgICAgIH0gZWxzZSBpZihfaXNMaXN0KG8pKSB7XG4gICAgICAgIC8vIGhhbmRsZSBAbGlzdFxuICAgICAgICB2YXIgX2xpc3QgPSBbXTtcbiAgICAgICAgX2NyZWF0ZU5vZGVNYXAob1snQGxpc3QnXSwgZ3JhcGhzLCBncmFwaCwgaXNzdWVyLCBuYW1lLCBfbGlzdCk7XG4gICAgICAgIG8gPSB7J0BsaXN0JzogX2xpc3R9O1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgc3ViamVjdCwgcHJvcGVydHksIG8sXG4gICAgICAgICAge3Byb3BlcnR5SXNBcnJheTogdHJ1ZSwgYWxsb3dEdXBsaWNhdGU6IGZhbHNlfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoYW5kbGUgQHZhbHVlXG4gICAgICAgIF9jcmVhdGVOb2RlTWFwKG8sIGdyYXBocywgZ3JhcGgsIGlzc3VlciwgbmFtZSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICBzdWJqZWN0LCBwcm9wZXJ0eSwgbywge3Byb3BlcnR5SXNBcnJheTogdHJ1ZSwgYWxsb3dEdXBsaWNhdGU6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZXJnZU5vZGVNYXBzKGdyYXBocykge1xuICAvLyBhZGQgYWxsIG5vbi1kZWZhdWx0IGdyYXBocyB0byBkZWZhdWx0IGdyYXBoXG4gIHZhciBkZWZhdWx0R3JhcGggPSBncmFwaHNbJ0BkZWZhdWx0J107XG4gIHZhciBncmFwaE5hbWVzID0gT2JqZWN0LmtleXMoZ3JhcGhzKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBncmFwaE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGdyYXBoTmFtZSA9IGdyYXBoTmFtZXNbaV07XG4gICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5vZGVNYXAgPSBncmFwaHNbZ3JhcGhOYW1lXTtcbiAgICB2YXIgc3ViamVjdCA9IGRlZmF1bHRHcmFwaFtncmFwaE5hbWVdO1xuICAgIGlmKCFzdWJqZWN0KSB7XG4gICAgICBkZWZhdWx0R3JhcGhbZ3JhcGhOYW1lXSA9IHN1YmplY3QgPSB7XG4gICAgICAgICdAaWQnOiBncmFwaE5hbWUsXG4gICAgICAgICdAZ3JhcGgnOiBbXVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoISgnQGdyYXBoJyBpbiBzdWJqZWN0KSkge1xuICAgICAgc3ViamVjdFsnQGdyYXBoJ10gPSBbXTtcbiAgICB9XG4gICAgdmFyIGdyYXBoID0gc3ViamVjdFsnQGdyYXBoJ107XG4gICAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKG5vZGVNYXApLnNvcnQoKTtcbiAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpZHMubGVuZ3RoOyArK2lpKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVNYXBbaWRzW2lpXV07XG4gICAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzXG4gICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlKSkge1xuICAgICAgICBncmFwaC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdEdyYXBoO1xufVxuXG4vKipcbiAqIEZyYW1lcyBzdWJqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBmcmFtaW5nIHN0YXRlLlxuICogQHBhcmFtIHN1YmplY3RzIHRoZSBzdWJqZWN0cyB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gZnJhbWUgdGhlIGZyYW1lLlxuICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHN1YmplY3Qgb3IgdG9wLWxldmVsIGFycmF5LlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwYXJlbnQgcHJvcGVydHksIGluaXRpYWxpemVkIHRvIG51bGwuXG4gKi9cbmZ1bmN0aW9uIF9mcmFtZShzdGF0ZSwgc3ViamVjdHMsIGZyYW1lLCBwYXJlbnQsIHByb3BlcnR5KSB7XG4gIC8vIHZhbGlkYXRlIHRoZSBmcmFtZVxuICBfdmFsaWRhdGVGcmFtZShmcmFtZSk7XG4gIGZyYW1lID0gZnJhbWVbMF07XG5cbiAgLy8gZ2V0IGZsYWdzIGZvciBjdXJyZW50IGZyYW1lXG4gIHZhciBvcHRpb25zID0gc3RhdGUub3B0aW9ucztcbiAgdmFyIGZsYWdzID0ge1xuICAgIGVtYmVkOiBfZ2V0RnJhbWVGbGFnKGZyYW1lLCBvcHRpb25zLCAnZW1iZWQnKSxcbiAgICBleHBsaWNpdDogX2dldEZyYW1lRmxhZyhmcmFtZSwgb3B0aW9ucywgJ2V4cGxpY2l0JyksXG4gICAgcmVxdWlyZUFsbDogX2dldEZyYW1lRmxhZyhmcmFtZSwgb3B0aW9ucywgJ3JlcXVpcmVBbGwnKVxuICB9O1xuXG4gIC8vIGZpbHRlciBvdXQgc3ViamVjdHMgdGhhdCBtYXRjaCB0aGUgZnJhbWVcbiAgdmFyIG1hdGNoZXMgPSBfZmlsdGVyU3ViamVjdHMoc3RhdGUsIHN1YmplY3RzLCBmcmFtZSwgZmxhZ3MpO1xuXG4gIC8vIGFkZCBtYXRjaGVzIHRvIG91dHB1dFxuICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWF0Y2hlcykuc29ydCgpO1xuICBmb3IodmFyIGlkeCA9IDA7IGlkeCA8IGlkcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgdmFyIGlkID0gaWRzW2lkeF07XG4gICAgdmFyIHN1YmplY3QgPSBtYXRjaGVzW2lkXTtcblxuICAgIGlmKGZsYWdzLmVtYmVkID09PSAnQGxpbmsnICYmIGlkIGluIHN0YXRlLmxpbmspIHtcbiAgICAgIC8vIFRPRE86IG1heSB3YW50IHRvIGFsc28gbWF0Y2ggYW4gZXhpc3RpbmcgbGlua2VkIHN1YmplY3QgYWdhaW5zdFxuICAgICAgLy8gdGhlIGN1cnJlbnQgZnJhbWUgLi4uIHNvIGRpZmZlcmVudCBmcmFtZXMgY291bGQgcHJvZHVjZSBkaWZmZXJlbnRcbiAgICAgIC8vIHN1YmplY3RzIHRoYXQgYXJlIG9ubHkgc2hhcmVkIGluLW1lbW9yeSB3aGVuIHRoZSBmcmFtZXMgYXJlIHRoZSBzYW1lXG5cbiAgICAgIC8vIGFkZCBleGlzdGluZyBsaW5rZWQgc3ViamVjdFxuICAgICAgX2FkZEZyYW1lT3V0cHV0KHBhcmVudCwgcHJvcGVydHksIHN0YXRlLmxpbmtbaWRdKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIE5vdGU6IEluIG9yZGVyIHRvIHRyZWF0IGVhY2ggdG9wLWxldmVsIG1hdGNoIGFzIGEgY29tcGFydG1lbnRhbGl6ZWRcbiAgICByZXN1bHQsIGNsZWFyIHRoZSB1bmlxdWUgZW1iZWRkZWQgc3ViamVjdHMgbWFwIHdoZW4gdGhlIHByb3BlcnR5IGlzIG51bGwsXG4gICAgd2hpY2ggb25seSBvY2N1cnMgYXQgdGhlIHRvcC1sZXZlbC4gKi9cbiAgICBpZihwcm9wZXJ0eSA9PT0gbnVsbCkge1xuICAgICAgc3RhdGUudW5pcXVlRW1iZWRzID0ge307XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgb3V0cHV0IGZvciBzdWJqZWN0XG4gICAgdmFyIG91dHB1dCA9IHt9O1xuICAgIG91dHB1dFsnQGlkJ10gPSBpZDtcbiAgICBzdGF0ZS5saW5rW2lkXSA9IG91dHB1dDtcblxuICAgIC8vIGlmIGVtYmVkIGlzIEBuZXZlciBvciBpZiBhIGNpcmN1bGFyIHJlZmVyZW5jZSB3b3VsZCBiZSBjcmVhdGVkIGJ5IGFuXG4gICAgLy8gZW1iZWQsIHRoZSBzdWJqZWN0IGNhbm5vdCBiZSBlbWJlZGRlZCwganVzdCBhZGQgdGhlIHJlZmVyZW5jZTtcbiAgICAvLyBub3RlIHRoYXQgYSBjaXJjdWxhciByZWZlcmVuY2Ugd29uJ3Qgb2NjdXIgd2hlbiB0aGUgZW1iZWQgZmxhZyBpc1xuICAgIC8vIGBAbGlua2AgYXMgdGhlIGFib3ZlIGNoZWNrIHdpbGwgc2hvcnQtY2lyY3VpdCBiZWZvcmUgcmVhY2hpbmcgdGhpcyBwb2ludFxuICAgIGlmKGZsYWdzLmVtYmVkID09PSAnQG5ldmVyJyB8fFxuICAgICAgX2NyZWF0ZXNDaXJjdWxhclJlZmVyZW5jZShzdWJqZWN0LCBzdGF0ZS5zdWJqZWN0U3RhY2spKSB7XG4gICAgICBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIG9ubHkgdGhlIGxhc3QgbWF0Y2ggc2hvdWxkIGJlIGVtYmVkZGVkXG4gICAgaWYoZmxhZ3MuZW1iZWQgPT09ICdAbGFzdCcpIHtcbiAgICAgIC8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgZW1iZWRcbiAgICAgIGlmKGlkIGluIHN0YXRlLnVuaXF1ZUVtYmVkcykge1xuICAgICAgICBfcmVtb3ZlRW1iZWQoc3RhdGUsIGlkKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnVuaXF1ZUVtYmVkc1tpZF0gPSB7cGFyZW50OiBwYXJlbnQsIHByb3BlcnR5OiBwcm9wZXJ0eX07XG4gICAgfVxuXG4gICAgLy8gcHVzaCBtYXRjaGluZyBzdWJqZWN0IG9udG8gc3RhY2sgdG8gZW5hYmxlIGNpcmN1bGFyIGVtYmVkIGNoZWNrc1xuICAgIHN0YXRlLnN1YmplY3RTdGFjay5wdXNoKHN1YmplY3QpO1xuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIHN1YmplY3QgcHJvcGVydGllc1xuICAgIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKHN1YmplY3QpLnNvcnQoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG5cbiAgICAgIC8vIGNvcHkga2V5d29yZHMgdG8gb3V0cHV0XG4gICAgICBpZihfaXNLZXl3b3JkKHByb3ApKSB7XG4gICAgICAgIG91dHB1dFtwcm9wXSA9IF9jbG9uZShzdWJqZWN0W3Byb3BdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cGxpY2l0IGlzIG9uIGFuZCBwcm9wZXJ0eSBpc24ndCBpbiB0aGUgZnJhbWUsIHNraXAgcHJvY2Vzc2luZ1xuICAgICAgaWYoZmxhZ3MuZXhwbGljaXQgJiYgIShwcm9wIGluIGZyYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIG9iamVjdHNcbiAgICAgIHZhciBvYmplY3RzID0gc3ViamVjdFtwcm9wXTtcbiAgICAgIGZvcih2YXIgb2kgPSAwOyBvaSA8IG9iamVjdHMubGVuZ3RoOyArK29pKSB7XG4gICAgICAgIHZhciBvID0gb2JqZWN0c1tvaV07XG5cbiAgICAgICAgLy8gcmVjdXJzZSBpbnRvIGxpc3RcbiAgICAgICAgaWYoX2lzTGlzdChvKSkge1xuICAgICAgICAgIC8vIGFkZCBlbXB0eSBsaXN0XG4gICAgICAgICAgdmFyIGxpc3QgPSB7J0BsaXN0JzogW119O1xuICAgICAgICAgIF9hZGRGcmFtZU91dHB1dChvdXRwdXQsIHByb3AsIGxpc3QpO1xuXG4gICAgICAgICAgLy8gYWRkIGxpc3Qgb2JqZWN0c1xuICAgICAgICAgIHZhciBzcmMgPSBvWydAbGlzdCddO1xuICAgICAgICAgIGZvcih2YXIgbiBpbiBzcmMpIHtcbiAgICAgICAgICAgIG8gPSBzcmNbbl07XG4gICAgICAgICAgICBpZihfaXNTdWJqZWN0UmVmZXJlbmNlKG8pKSB7XG4gICAgICAgICAgICAgIHZhciBzdWJmcmFtZSA9IChwcm9wIGluIGZyYW1lID9cbiAgICAgICAgICAgICAgICBmcmFtZVtwcm9wXVswXVsnQGxpc3QnXSA6IF9jcmVhdGVJbXBsaWNpdEZyYW1lKGZsYWdzKSk7XG4gICAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byBzdWJqZWN0IHJlZmVyZW5jZVxuICAgICAgICAgICAgICBfZnJhbWUoc3RhdGUsIFtvWydAaWQnXV0sIHN1YmZyYW1lLCBsaXN0LCAnQGxpc3QnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGluY2x1ZGUgb3RoZXIgdmFsdWVzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgICAgX2FkZEZyYW1lT3V0cHV0KGxpc3QsICdAbGlzdCcsIF9jbG9uZShvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoX2lzU3ViamVjdFJlZmVyZW5jZShvKSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byBzdWJqZWN0IHJlZmVyZW5jZVxuICAgICAgICAgIHZhciBzdWJmcmFtZSA9IChwcm9wIGluIGZyYW1lID9cbiAgICAgICAgICAgIGZyYW1lW3Byb3BdIDogX2NyZWF0ZUltcGxpY2l0RnJhbWUoZmxhZ3MpKTtcbiAgICAgICAgICBfZnJhbWUoc3RhdGUsIFtvWydAaWQnXV0sIHN1YmZyYW1lLCBvdXRwdXQsIHByb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGluY2x1ZGUgb3RoZXIgdmFsdWVzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICBfYWRkRnJhbWVPdXRwdXQob3V0cHV0LCBwcm9wLCBfY2xvbmUobykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGRlZmF1bHRzXG4gICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXMoZnJhbWUpLnNvcnQoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG5cbiAgICAgIC8vIHNraXAga2V5d29yZHNcbiAgICAgIGlmKF9pc0tleXdvcmQocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG9taXQgZGVmYXVsdCBpcyBvZmYsIHRoZW4gaW5jbHVkZSBkZWZhdWx0IHZhbHVlcyBmb3IgcHJvcGVydGllc1xuICAgICAgLy8gdGhhdCBhcHBlYXIgaW4gdGhlIG5leHQgZnJhbWUgYnV0IGFyZSBub3QgaW4gdGhlIG1hdGNoaW5nIHN1YmplY3RcbiAgICAgIHZhciBuZXh0ID0gZnJhbWVbcHJvcF1bMF07XG4gICAgICB2YXIgb21pdERlZmF1bHRPbiA9IF9nZXRGcmFtZUZsYWcobmV4dCwgb3B0aW9ucywgJ29taXREZWZhdWx0Jyk7XG4gICAgICBpZighb21pdERlZmF1bHRPbiAmJiAhKHByb3AgaW4gb3V0cHV0KSkge1xuICAgICAgICB2YXIgcHJlc2VydmUgPSAnQG51bGwnO1xuICAgICAgICBpZignQGRlZmF1bHQnIGluIG5leHQpIHtcbiAgICAgICAgICBwcmVzZXJ2ZSA9IF9jbG9uZShuZXh0WydAZGVmYXVsdCddKTtcbiAgICAgICAgfVxuICAgICAgICBpZighX2lzQXJyYXkocHJlc2VydmUpKSB7XG4gICAgICAgICAgcHJlc2VydmUgPSBbcHJlc2VydmVdO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFtwcm9wXSA9IFt7J0BwcmVzZXJ2ZSc6IHByZXNlcnZlfV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIG91dHB1dCB0byBwYXJlbnRcbiAgICBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KTtcblxuICAgIC8vIHBvcCBtYXRjaGluZyBzdWJqZWN0IGZyb20gY2lyY3VsYXIgcmVmLWNoZWNraW5nIHN0YWNrXG4gICAgc3RhdGUuc3ViamVjdFN0YWNrLnBvcCgpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbXBsaWNpdCBmcmFtZSB3aGVuIHJlY3Vyc2luZyB0aHJvdWdoIHN1YmplY3QgbWF0Y2hlcy4gSWZcbiAqIGEgZnJhbWUgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGZyYW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvcGVydHksIHRoZW5cbiAqIGEgd2lsZGNhcmQgY2hpbGQgZnJhbWUgd2lsbCBiZSBjcmVhdGVkIHRoYXQgdXNlcyB0aGUgc2FtZSBmbGFncyB0aGF0IHRoZVxuICogcGFyZW50IGZyYW1lIHVzZWQuXG4gKlxuICogQHBhcmFtIGZsYWdzIHRoZSBjdXJyZW50IGZyYW1pbmcgZmxhZ3MuXG4gKlxuICogQHJldHVybiB0aGUgaW1wbGljaXQgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVJbXBsaWNpdEZyYW1lKGZsYWdzKSB7XG4gIHZhciBmcmFtZSA9IHt9O1xuICBmb3IodmFyIGtleSBpbiBmbGFncykge1xuICAgIGlmKGZsYWdzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWVbJ0AnICsga2V5XSA9IFtmbGFnc1trZXldXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtmcmFtZV07XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBjdXJyZW50IHN1YmplY3Qgc3RhY2sgdG8gc2VlIGlmIGVtYmVkZGluZyB0aGUgZ2l2ZW4gc3ViamVjdFxuICogd291bGQgY2F1c2UgYSBjaXJjdWxhciByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHN1YmplY3RUb0VtYmVkIHRoZSBzdWJqZWN0IHRvIGVtYmVkLlxuICogQHBhcmFtIHN1YmplY3RTdGFjayB0aGUgY3VycmVudCBzdGFjayBvZiBzdWJqZWN0cy5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgYSBjaXJjdWxhciByZWZlcmVuY2Ugd291bGQgYmUgY3JlYXRlZCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfY3JlYXRlc0NpcmN1bGFyUmVmZXJlbmNlKHN1YmplY3RUb0VtYmVkLCBzdWJqZWN0U3RhY2spIHtcbiAgZm9yKHZhciBpID0gc3ViamVjdFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgaWYoc3ViamVjdFN0YWNrW2ldWydAaWQnXSA9PT0gc3ViamVjdFRvRW1iZWRbJ0BpZCddKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGZyYW1lIGZsYWcgdmFsdWUgZm9yIHRoZSBnaXZlbiBmbGFnIG5hbWUuXG4gKlxuICogQHBhcmFtIGZyYW1lIHRoZSBmcmFtZS5cbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBmcmFtaW5nIG9wdGlvbnMuXG4gKiBAcGFyYW0gbmFtZSB0aGUgZmxhZyBuYW1lLlxuICpcbiAqIEByZXR1cm4gdGhlIGZsYWcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9nZXRGcmFtZUZsYWcoZnJhbWUsIG9wdGlvbnMsIG5hbWUpIHtcbiAgdmFyIGZsYWcgPSAnQCcgKyBuYW1lO1xuICB2YXIgcnZhbCA9IChmbGFnIGluIGZyYW1lID8gZnJhbWVbZmxhZ11bMF0gOiBvcHRpb25zW25hbWVdKTtcbiAgaWYobmFtZSA9PT0gJ2VtYmVkJykge1xuICAgIC8vIGRlZmF1bHQgaXMgXCJAbGFzdFwiXG4gICAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgXCJlbWJlZFwiIG1hcHM6XG4gICAgLy8gdHJ1ZSA9PiBcIkBsYXN0XCJcbiAgICAvLyBmYWxzZSA9PiBcIkBuZXZlclwiXG4gICAgaWYocnZhbCA9PT0gdHJ1ZSkge1xuICAgICAgcnZhbCA9ICdAbGFzdCc7XG4gICAgfSBlbHNlIGlmKHJ2YWwgPT09IGZhbHNlKSB7XG4gICAgICBydmFsID0gJ0BuZXZlcic7XG4gICAgfSBlbHNlIGlmKHJ2YWwgIT09ICdAYWx3YXlzJyAmJiBydmFsICE9PSAnQG5ldmVyJyAmJiBydmFsICE9PSAnQGxpbmsnKSB7XG4gICAgICBydmFsID0gJ0BsYXN0JztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgSlNPTi1MRCBmcmFtZSwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmcmFtZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSBmcmFtZSB0aGUgZnJhbWUgdG8gdmFsaWRhdGUuXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZUZyYW1lKGZyYW1lKSB7XG4gIGlmKCFfaXNBcnJheShmcmFtZSkgfHwgZnJhbWUubGVuZ3RoICE9PSAxIHx8ICFfaXNPYmplY3QoZnJhbWVbMF0pKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGEgSlNPTi1MRCBmcmFtZSBtdXN0IGJlIGEgc2luZ2xlIG9iamVjdC4nLFxuICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtmcmFtZTogZnJhbWV9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYWxsIG9mIHRoZSBzdWJqZWN0cyB0aGF0IG1hdGNoIGEgcGFyc2VkIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBmcmFtaW5nIHN0YXRlLlxuICogQHBhcmFtIHN1YmplY3RzIHRoZSBzZXQgb2Ygc3ViamVjdHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIGZyYW1lIHRoZSBwYXJzZWQgZnJhbWUuXG4gKiBAcGFyYW0gZmxhZ3MgdGhlIGZyYW1lIGZsYWdzLlxuICpcbiAqIEByZXR1cm4gYWxsIG9mIHRoZSBtYXRjaGVkIHN1YmplY3RzLlxuICovXG5mdW5jdGlvbiBfZmlsdGVyU3ViamVjdHMoc3RhdGUsIHN1YmplY3RzLCBmcmFtZSwgZmxhZ3MpIHtcbiAgLy8gZmlsdGVyIHN1YmplY3RzIGluIEBpZCBvcmRlclxuICB2YXIgcnZhbCA9IHt9O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc3ViamVjdHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaWQgPSBzdWJqZWN0c1tpXTtcbiAgICB2YXIgc3ViamVjdCA9IHN0YXRlLnN1YmplY3RzW2lkXTtcbiAgICBpZihfZmlsdGVyU3ViamVjdChzdWJqZWN0LCBmcmFtZSwgZmxhZ3MpKSB7XG4gICAgICBydmFsW2lkXSA9IHN1YmplY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ViamVjdCBtYXRjaGVzIHRoZSBnaXZlbiBmcmFtZS5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBmcmFtZSB0aGUgZnJhbWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gZmxhZ3MgdGhlIGZyYW1lIGZsYWdzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3ViamVjdCBtYXRjaGVzLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9maWx0ZXJTdWJqZWN0KHN1YmplY3QsIGZyYW1lLCBmbGFncykge1xuICAvLyBjaGVjayBAdHlwZSAob2JqZWN0IHZhbHVlIG1lYW5zICdhbnknIHR5cGUsIGZhbGwgdGhyb3VnaCB0byBkdWNrdHlwaW5nKVxuICBpZignQHR5cGUnIGluIGZyYW1lICYmXG4gICAgIShmcmFtZVsnQHR5cGUnXS5sZW5ndGggPT09IDEgJiYgX2lzT2JqZWN0KGZyYW1lWydAdHlwZSddWzBdKSkpIHtcbiAgICB2YXIgdHlwZXMgPSBmcmFtZVsnQHR5cGUnXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vIGFueSBtYXRjaGluZyBAdHlwZSBpcyBhIG1hdGNoXG4gICAgICBpZihqc29ubGQuaGFzVmFsdWUoc3ViamVjdCwgJ0B0eXBlJywgdHlwZXNbaV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjaGVjayBkdWNrdHlwZVxuICB2YXIgd2lsZGNhcmQgPSB0cnVlO1xuICB2YXIgbWF0Y2hlc1NvbWUgPSBmYWxzZTtcbiAgZm9yKHZhciBrZXkgaW4gZnJhbWUpIHtcbiAgICBpZihfaXNLZXl3b3JkKGtleSkpIHtcbiAgICAgIC8vIHNraXAgbm9uLUBpZCBhbmQgbm9uLUB0eXBlXG4gICAgICBpZihrZXkgIT09ICdAaWQnICYmIGtleSAhPT0gJ0B0eXBlJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHdpbGRjYXJkID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIEBpZCBmb3IgYSBzcGVjaWZpYyBAaWQgdmFsdWVcbiAgICAgIGlmKGtleSA9PT0gJ0BpZCcgJiYgX2lzU3RyaW5nKGZyYW1lW2tleV0pKSB7XG4gICAgICAgIGlmKHN1YmplY3Rba2V5XSAhPT0gZnJhbWVba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaGVzU29tZSA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbGRjYXJkID0gZmFsc2U7XG5cbiAgICBpZihrZXkgaW4gc3ViamVjdCkge1xuICAgICAgLy8gZnJhbWVba2V5XSA9PT0gW10gbWVhbnMgZG8gbm90IG1hdGNoIGlmIHByb3BlcnR5IGlzIHByZXNlbnRcbiAgICAgIGlmKF9pc0FycmF5KGZyYW1lW2tleV0pICYmIGZyYW1lW2tleV0ubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHN1YmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXNTb21lID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGFsbCBwcm9wZXJ0aWVzIG11c3QgbWF0Y2ggdG8gYmUgYSBkdWNrIHVubGVzcyBhIEBkZWZhdWx0IGlzIHNwZWNpZmllZFxuICAgIHZhciBoYXNEZWZhdWx0ID0gKF9pc0FycmF5KGZyYW1lW2tleV0pICYmIF9pc09iamVjdChmcmFtZVtrZXldWzBdKSAmJlxuICAgICAgJ0BkZWZhdWx0JyBpbiBmcmFtZVtrZXldWzBdKTtcbiAgICBpZihmbGFncy5yZXF1aXJlQWxsICYmICFoYXNEZWZhdWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIHRydWUgaWYgd2lsZGNhcmQgb3Igc3ViamVjdCBtYXRjaGVzIHNvbWUgcHJvcGVydGllc1xuICByZXR1cm4gd2lsZGNhcmQgfHwgbWF0Y2hlc1NvbWU7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBleGlzdGluZyBlbWJlZC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgdGhlIGN1cnJlbnQgZnJhbWluZyBzdGF0ZS5cbiAqIEBwYXJhbSBpZCB0aGUgQGlkIG9mIHRoZSBlbWJlZCB0byByZW1vdmUuXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVFbWJlZChzdGF0ZSwgaWQpIHtcbiAgLy8gZ2V0IGV4aXN0aW5nIGVtYmVkXG4gIHZhciBlbWJlZHMgPSBzdGF0ZS51bmlxdWVFbWJlZHM7XG4gIHZhciBlbWJlZCA9IGVtYmVkc1tpZF07XG4gIHZhciBwYXJlbnQgPSBlbWJlZC5wYXJlbnQ7XG4gIHZhciBwcm9wZXJ0eSA9IGVtYmVkLnByb3BlcnR5O1xuXG4gIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gcmVwbGFjZSBlbWJlZFxuICB2YXIgc3ViamVjdCA9IHsnQGlkJzogaWR9O1xuXG4gIC8vIHJlbW92ZSBleGlzdGluZyBlbWJlZFxuICBpZihfaXNBcnJheShwYXJlbnQpKSB7XG4gICAgLy8gcmVwbGFjZSBzdWJqZWN0IHdpdGggcmVmZXJlbmNlXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHBhcmVudC5sZW5ndGg7ICsraSkge1xuICAgICAgaWYoanNvbmxkLmNvbXBhcmVWYWx1ZXMocGFyZW50W2ldLCBzdWJqZWN0KSkge1xuICAgICAgICBwYXJlbnRbaV0gPSBzdWJqZWN0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVwbGFjZSBzdWJqZWN0IHdpdGggcmVmZXJlbmNlXG4gICAgdmFyIHVzZUFycmF5ID0gX2lzQXJyYXkocGFyZW50W3Byb3BlcnR5XSk7XG4gICAganNvbmxkLnJlbW92ZVZhbHVlKHBhcmVudCwgcHJvcGVydHksIHN1YmplY3QsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gICAganNvbmxkLmFkZFZhbHVlKHBhcmVudCwgcHJvcGVydHksIHN1YmplY3QsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gIH1cblxuICAvLyByZWN1cnNpdmVseSByZW1vdmUgZGVwZW5kZW50IGRhbmdsaW5nIGVtYmVkc1xuICB2YXIgcmVtb3ZlRGVwZW5kZW50cyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgLy8gZ2V0IGVtYmVkIGtleXMgYXMgYSBzZXBhcmF0ZSBhcnJheSB0byBlbmFibGUgZGVsZXRpbmcga2V5cyBpbiBtYXBcbiAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMoZW1iZWRzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbmV4dCA9IGlkc1tpXTtcbiAgICAgIGlmKG5leHQgaW4gZW1iZWRzICYmIF9pc09iamVjdChlbWJlZHNbbmV4dF0ucGFyZW50KSAmJlxuICAgICAgICBlbWJlZHNbbmV4dF0ucGFyZW50WydAaWQnXSA9PT0gaWQpIHtcbiAgICAgICAgZGVsZXRlIGVtYmVkc1tuZXh0XTtcbiAgICAgICAgcmVtb3ZlRGVwZW5kZW50cyhuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlbW92ZURlcGVuZGVudHMoaWQpO1xufVxuXG4vKipcbiAqIEFkZHMgZnJhbWluZyBvdXRwdXQgdG8gdGhlIGdpdmVuIHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgdG8gYWRkIHRvLlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwYXJlbnQgcHJvcGVydHkuXG4gKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gYWRkLlxuICovXG5mdW5jdGlvbiBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KSB7XG4gIGlmKF9pc09iamVjdChwYXJlbnQpKSB7XG4gICAganNvbmxkLmFkZFZhbHVlKHBhcmVudCwgcHJvcGVydHksIG91dHB1dCwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudC5wdXNoKG91dHB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBAcHJlc2VydmUga2V5d29yZHMgYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGUgZnJhbWluZyBhbGdvcml0aG0uXG4gKlxuICogQHBhcmFtIGN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdXNlZCB0byBjb21wYWN0IHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBpbnB1dCB0aGUgZnJhbWVkLCBjb21wYWN0ZWQgb3V0cHV0LlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGNvbXBhY3Rpb24gb3B0aW9ucyB1c2VkLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0LCBvcHRpb25zKSB7XG4gIC8vIHJlY3Vyc2UgdGhyb3VnaCBhcnJheXNcbiAgaWYoX2lzQXJyYXkoaW5wdXQpKSB7XG4gICAgdmFyIG91dHB1dCA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlc3VsdCA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0W2ldLCBvcHRpb25zKTtcbiAgICAgIC8vIGRyb3AgbnVsbHMgZnJvbSBhcnJheXNcbiAgICAgIGlmKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnB1dCA9IG91dHB1dDtcbiAgfSBlbHNlIGlmKF9pc09iamVjdChpbnB1dCkpIHtcbiAgICAvLyByZW1vdmUgQHByZXNlcnZlXG4gICAgaWYoJ0BwcmVzZXJ2ZScgaW4gaW5wdXQpIHtcbiAgICAgIGlmKGlucHV0WydAcHJlc2VydmUnXSA9PT0gJ0BudWxsJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnB1dFsnQHByZXNlcnZlJ107XG4gICAgfVxuXG4gICAgLy8gc2tpcCBAdmFsdWVzXG4gICAgaWYoX2lzVmFsdWUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzZSB0aHJvdWdoIEBsaXN0c1xuICAgIGlmKF9pc0xpc3QoaW5wdXQpKSB7XG4gICAgICBpbnB1dFsnQGxpc3QnXSA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0WydAbGlzdCddLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgaW4tbWVtb3J5IGxpbmtlZCBub2Rlc1xuICAgIHZhciBpZEFsaWFzID0gX2NvbXBhY3RJcmkoY3R4LCAnQGlkJyk7XG4gICAgaWYoaWRBbGlhcyBpbiBpbnB1dCkge1xuICAgICAgdmFyIGlkID0gaW5wdXRbaWRBbGlhc107XG4gICAgICBpZihpZCBpbiBvcHRpb25zLmxpbmspIHtcbiAgICAgICAgdmFyIGlkeCA9IG9wdGlvbnMubGlua1tpZF0uaW5kZXhPZihpbnB1dCk7XG4gICAgICAgIGlmKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBwcmV2ZW50IGNpcmN1bGFyIHZpc2l0YXRpb25cbiAgICAgICAgICBvcHRpb25zLmxpbmtbaWRdLnB1c2goaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFscmVhZHkgdmlzaXRlZFxuICAgICAgICAgIHJldHVybiBvcHRpb25zLmxpbmtbaWRdW2lkeF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByZXZlbnQgY2lyY3VsYXIgdmlzaXRhdGlvblxuICAgICAgICBvcHRpb25zLmxpbmtbaWRdID0gW2lucHV0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWN1cnNlIHRocm91Z2ggcHJvcGVydGllc1xuICAgIGZvcih2YXIgcHJvcCBpbiBpbnB1dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0W3Byb3BdLCBvcHRpb25zKTtcbiAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGN0eCwgcHJvcCwgJ0Bjb250YWluZXInKTtcbiAgICAgIGlmKG9wdGlvbnMuY29tcGFjdEFycmF5cyAmJiBfaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdFswXTtcbiAgICAgIH1cbiAgICAgIGlucHV0W3Byb3BdID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgZmlyc3QgYmFzZWQgb24gbGVuZ3RoIGFuZCB0aGVuIGxleGljb2dyYXBoaWNhbGx5LlxuICpcbiAqIEBwYXJhbSBhIHRoZSBmaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0gYiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIC0xIGlmIGEgPCBiLCAxIGlmIGEgPiBiLCAwIGlmIGEgPT0gYi5cbiAqL1xuZnVuY3Rpb24gX2NvbXBhcmVTaG9ydGVzdExlYXN0KGEsIGIpIHtcbiAgaWYoYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZihiLmxlbmd0aCA8IGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiAoYSA8IGIpID8gLTEgOiAxO1xufVxuXG4vKipcbiAqIFBpY2tzIHRoZSBwcmVmZXJyZWQgY29tcGFjdGlvbiB0ZXJtIGZyb20gdGhlIGdpdmVuIGludmVyc2UgY29udGV4dCBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlQ3R4IHRoZSBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBpcmkgdGhlIElSSSB0byBwaWNrIHRoZSB0ZXJtIGZvci5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcGljayB0aGUgdGVybSBmb3IuXG4gKiBAcGFyYW0gY29udGFpbmVycyB0aGUgcHJlZmVycmVkIGNvbnRhaW5lcnMuXG4gKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2UgZWl0aGVyICdAdHlwZScgb3IgJ0BsYW5ndWFnZScuXG4gKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2VWYWx1ZSB0aGUgcHJlZmVycmVkIHZhbHVlIGZvciAnQHR5cGUnIG9yICdAbGFuZ3VhZ2UnLlxuICpcbiAqIEByZXR1cm4gdGhlIHByZWZlcnJlZCB0ZXJtLlxuICovXG5mdW5jdGlvbiBfc2VsZWN0VGVybShcbiAgYWN0aXZlQ3R4LCBpcmksIHZhbHVlLCBjb250YWluZXJzLCB0eXBlT3JMYW5ndWFnZSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSkge1xuICBpZih0eXBlT3JMYW5ndWFnZVZhbHVlID09PSBudWxsKSB7XG4gICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9ICdAbnVsbCc7XG4gIH1cblxuICAvLyBwcmVmZXJlbmNlcyBmb3IgdGhlIHZhbHVlIG9mIEB0eXBlIG9yIEBsYW5ndWFnZVxuICB2YXIgcHJlZnMgPSBbXTtcblxuICAvLyBkZXRlcm1pbmUgcHJlZnMgZm9yIEBpZCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB2YWx1ZSBjb21wYWN0cyB0byBhIHRlcm1cbiAgaWYoKHR5cGVPckxhbmd1YWdlVmFsdWUgPT09ICdAaWQnIHx8IHR5cGVPckxhbmd1YWdlVmFsdWUgPT09ICdAcmV2ZXJzZScpICYmXG4gICAgX2lzU3ViamVjdFJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAvLyBwcmVmZXIgQHJldmVyc2UgZmlyc3RcbiAgICBpZih0eXBlT3JMYW5ndWFnZVZhbHVlID09PSAnQHJldmVyc2UnKSB7XG4gICAgICBwcmVmcy5wdXNoKCdAcmV2ZXJzZScpO1xuICAgIH1cbiAgICAvLyB0cnkgdG8gY29tcGFjdCB2YWx1ZSB0byBhIHRlcm1cbiAgICB2YXIgdGVybSA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgdmFsdWVbJ0BpZCddLCBudWxsLCB7dm9jYWI6IHRydWV9KTtcbiAgICBpZih0ZXJtIGluIGFjdGl2ZUN0eC5tYXBwaW5ncyAmJlxuICAgICAgYWN0aXZlQ3R4Lm1hcHBpbmdzW3Rlcm1dICYmXG4gICAgICBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV1bJ0BpZCddID09PSB2YWx1ZVsnQGlkJ10pIHtcbiAgICAgIC8vIHByZWZlciBAdm9jYWJcbiAgICAgIHByZWZzLnB1c2guYXBwbHkocHJlZnMsIFsnQHZvY2FiJywgJ0BpZCddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJlZmVyIEBpZFxuICAgICAgcHJlZnMucHVzaC5hcHBseShwcmVmcywgWydAaWQnLCAnQHZvY2FiJ10pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcmVmcy5wdXNoKHR5cGVPckxhbmd1YWdlVmFsdWUpO1xuICB9XG4gIHByZWZzLnB1c2goJ0Bub25lJyk7XG5cbiAgdmFyIGNvbnRhaW5lck1hcCA9IGFjdGl2ZUN0eC5pbnZlcnNlW2lyaV07XG4gIGZvcih2YXIgY2kgPSAwOyBjaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2NpKSB7XG4gICAgLy8gaWYgY29udGFpbmVyIG5vdCBhdmFpbGFibGUgaW4gdGhlIG1hcCwgY29udGludWVcbiAgICB2YXIgY29udGFpbmVyID0gY29udGFpbmVyc1tjaV07XG4gICAgaWYoIShjb250YWluZXIgaW4gY29udGFpbmVyTWFwKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVPckxhbmd1YWdlVmFsdWVNYXAgPSBjb250YWluZXJNYXBbY29udGFpbmVyXVt0eXBlT3JMYW5ndWFnZV07XG4gICAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJlZnMubGVuZ3RoOyArK3BpKSB7XG4gICAgICAvLyBpZiB0eXBlL2xhbmd1YWdlIG9wdGlvbiBub3QgYXZhaWxhYmxlIGluIHRoZSBtYXAsIGNvbnRpbnVlXG4gICAgICB2YXIgcHJlZiA9IHByZWZzW3BpXTtcbiAgICAgIGlmKCEocHJlZiBpbiB0eXBlT3JMYW5ndWFnZVZhbHVlTWFwKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2VsZWN0IHRlcm1cbiAgICAgIHJldHVybiB0eXBlT3JMYW5ndWFnZVZhbHVlTWFwW3ByZWZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvbXBhY3RzIGFuIElSSSBvciBrZXl3b3JkIGludG8gYSB0ZXJtIG9yIHByZWZpeCBpZiBpdCBjYW4gYmUuIElmIHRoZVxuICogSVJJIGhhcyBhbiBhc3NvY2lhdGVkIHZhbHVlIGl0IG1heSBiZSBwYXNzZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGlyaSB0aGUgSVJJIHRvIGNvbXBhY3QuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrIG9yIG51bGwuXG4gKiBAcGFyYW0gcmVsYXRpdmVUbyBvcHRpb25zIGZvciBob3cgdG8gY29tcGFjdCBJUklzOlxuICogICAgICAgICAgdm9jYWI6IHRydWUgdG8gc3BsaXQgYWZ0ZXIgQHZvY2FiLCBmYWxzZSBub3QgdG8uXG4gKiBAcGFyYW0gcmV2ZXJzZSB0cnVlIGlmIGEgcmV2ZXJzZSBwcm9wZXJ0eSBpcyBiZWluZyBjb21wYWN0ZWQsIGZhbHNlIGlmIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjb21wYWN0ZWQgdGVybSwgcHJlZml4LCBrZXl3b3JkIGFsaWFzLCBvciB0aGUgb3JpZ2luYWwgSVJJLlxuICovXG5mdW5jdGlvbiBfY29tcGFjdElyaShhY3RpdmVDdHgsIGlyaSwgdmFsdWUsIHJlbGF0aXZlVG8sIHJldmVyc2UpIHtcbiAgLy8gY2FuJ3QgY29tcGFjdCBudWxsXG4gIGlmKGlyaSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyBkZWZhdWx0IHZhbHVlIGFuZCBwYXJlbnQgdG8gbnVsbFxuICBpZihfaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIC8vIGRlZmF1bHQgcmV2ZXJzZSB0byBmYWxzZVxuICBpZihfaXNVbmRlZmluZWQocmV2ZXJzZSkpIHtcbiAgICByZXZlcnNlID0gZmFsc2U7XG4gIH1cbiAgcmVsYXRpdmVUbyA9IHJlbGF0aXZlVG8gfHwge307XG5cbiAgdmFyIGludmVyc2VDdHggPSBhY3RpdmVDdHguZ2V0SW52ZXJzZSgpO1xuXG4gIC8vIGlmIHRlcm0gaXMgYSBrZXl3b3JkLCBpdCBjYW4gb25seSBiZSBjb21wYWN0ZWQgdG8gYSBzaW1wbGUgYWxpYXNcbiAgaWYoX2lzS2V5d29yZChpcmkpKSB7XG4gICAgaWYoaXJpIGluIGludmVyc2VDdHgpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlQ3R4W2lyaV1bJ0Bub25lJ11bJ0B0eXBlJ11bJ0Bub25lJ107XG4gICAgfVxuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyB1c2UgaW52ZXJzZSBjb250ZXh0IHRvIHBpY2sgYSB0ZXJtIGlmIGlyaSBpcyByZWxhdGl2ZSB0byB2b2NhYlxuICBpZihyZWxhdGl2ZVRvLnZvY2FiICYmIGlyaSBpbiBpbnZlcnNlQ3R4KSB7XG4gICAgdmFyIGRlZmF1bHRMYW5ndWFnZSA9IGFjdGl2ZUN0eFsnQGxhbmd1YWdlJ10gfHwgJ0Bub25lJztcblxuICAgIC8vIHByZWZlciBAaW5kZXggaWYgYXZhaWxhYmxlIGluIHZhbHVlXG4gICAgdmFyIGNvbnRhaW5lcnMgPSBbXTtcbiAgICBpZihfaXNPYmplY3QodmFsdWUpICYmICdAaW5kZXgnIGluIHZhbHVlKSB7XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BpbmRleCcpO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHRzIGZvciB0ZXJtIHNlbGVjdGlvbiBiYXNlZCBvbiB0eXBlL2xhbmd1YWdlXG4gICAgdmFyIHR5cGVPckxhbmd1YWdlID0gJ0BsYW5ndWFnZSc7XG4gICAgdmFyIHR5cGVPckxhbmd1YWdlVmFsdWUgPSAnQG51bGwnO1xuXG4gICAgaWYocmV2ZXJzZSkge1xuICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9ICdAcmV2ZXJzZSc7XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BzZXQnKTtcbiAgICB9IGVsc2UgaWYoX2lzTGlzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIGNob29zZSB0aGUgbW9zdCBzcGVjaWZpYyB0ZXJtIHRoYXQgd29ya3MgZm9yIGFsbCBlbGVtZW50cyBpbiBAbGlzdFxuICAgICAgLy8gb25seSBzZWxlY3QgQGxpc3QgY29udGFpbmVycyBpZiBAaW5kZXggaXMgTk9UIGluIHZhbHVlXG4gICAgICBpZighKCdAaW5kZXgnIGluIHZhbHVlKSkge1xuICAgICAgICBjb250YWluZXJzLnB1c2goJ0BsaXN0Jyk7XG4gICAgICB9XG4gICAgICB2YXIgbGlzdCA9IHZhbHVlWydAbGlzdCddO1xuICAgICAgdmFyIGNvbW1vbkxhbmd1YWdlID0gKGxpc3QubGVuZ3RoID09PSAwKSA/IGRlZmF1bHRMYW5ndWFnZSA6IG51bGw7XG4gICAgICB2YXIgY29tbW9uVHlwZSA9IG51bGw7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgICAgIHZhciBpdGVtTGFuZ3VhZ2UgPSAnQG5vbmUnO1xuICAgICAgICB2YXIgaXRlbVR5cGUgPSAnQG5vbmUnO1xuICAgICAgICBpZihfaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgIGlmKCdAbGFuZ3VhZ2UnIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1MYW5ndWFnZSA9IGl0ZW1bJ0BsYW5ndWFnZSddO1xuICAgICAgICAgIH0gZWxzZSBpZignQHR5cGUnIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1UeXBlID0gaXRlbVsnQHR5cGUnXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGxhaW4gbGl0ZXJhbFxuICAgICAgICAgICAgaXRlbUxhbmd1YWdlID0gJ0BudWxsJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVR5cGUgPSAnQGlkJztcbiAgICAgICAgfVxuICAgICAgICBpZihjb21tb25MYW5ndWFnZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1vbkxhbmd1YWdlID0gaXRlbUxhbmd1YWdlO1xuICAgICAgICB9IGVsc2UgaWYoaXRlbUxhbmd1YWdlICE9PSBjb21tb25MYW5ndWFnZSAmJiBfaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgIGNvbW1vbkxhbmd1YWdlID0gJ0Bub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZihjb21tb25UeXBlID09PSBudWxsKSB7XG4gICAgICAgICAgY29tbW9uVHlwZSA9IGl0ZW1UeXBlO1xuICAgICAgICB9IGVsc2UgaWYoaXRlbVR5cGUgIT09IGNvbW1vblR5cGUpIHtcbiAgICAgICAgICBjb21tb25UeXBlID0gJ0Bub25lJztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVyZSBhcmUgZGlmZmVyZW50IGxhbmd1YWdlcyBhbmQgdHlwZXMgaW4gdGhlIGxpc3QsIHNvIGNob29zZVxuICAgICAgICAvLyB0aGUgbW9zdCBnZW5lcmljIHRlcm0sIG5vIG5lZWQgdG8ga2VlcCBpdGVyYXRpbmcgdGhlIGxpc3RcbiAgICAgICAgaWYoY29tbW9uTGFuZ3VhZ2UgPT09ICdAbm9uZScgJiYgY29tbW9uVHlwZSA9PT0gJ0Bub25lJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21tb25MYW5ndWFnZSA9IGNvbW1vbkxhbmd1YWdlIHx8ICdAbm9uZSc7XG4gICAgICBjb21tb25UeXBlID0gY29tbW9uVHlwZSB8fCAnQG5vbmUnO1xuICAgICAgaWYoY29tbW9uVHlwZSAhPT0gJ0Bub25lJykge1xuICAgICAgICB0eXBlT3JMYW5ndWFnZSA9ICdAdHlwZSc7XG4gICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSBjb21tb25UeXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9IGNvbW1vbkxhbmd1YWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihfaXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgaWYoJ0BsYW5ndWFnZScgaW4gdmFsdWUgJiYgISgnQGluZGV4JyBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICBjb250YWluZXJzLnB1c2goJ0BsYW5ndWFnZScpO1xuICAgICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSB2YWx1ZVsnQGxhbmd1YWdlJ107XG4gICAgICAgIH0gZWxzZSBpZignQHR5cGUnIGluIHZhbHVlKSB7XG4gICAgICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSB2YWx1ZVsnQHR5cGUnXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgICB0eXBlT3JMYW5ndWFnZVZhbHVlID0gJ0BpZCc7XG4gICAgICB9XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BzZXQnKTtcbiAgICB9XG5cbiAgICAvLyBkbyB0ZXJtIHNlbGVjdGlvblxuICAgIGNvbnRhaW5lcnMucHVzaCgnQG5vbmUnKTtcbiAgICB2YXIgdGVybSA9IF9zZWxlY3RUZXJtKFxuICAgICAgYWN0aXZlQ3R4LCBpcmksIHZhbHVlLCBjb250YWluZXJzLCB0eXBlT3JMYW5ndWFnZSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSk7XG4gICAgaWYodGVybSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG5cbiAgLy8gbm8gdGVybSBtYXRjaCwgdXNlIEB2b2NhYiBpZiBhdmFpbGFibGVcbiAgaWYocmVsYXRpdmVUby52b2NhYikge1xuICAgIGlmKCdAdm9jYWInIGluIGFjdGl2ZUN0eCkge1xuICAgICAgLy8gZGV0ZXJtaW5lIGlmIHZvY2FiIGlzIGEgcHJlZml4IG9mIHRoZSBpcmlcbiAgICAgIHZhciB2b2NhYiA9IGFjdGl2ZUN0eFsnQHZvY2FiJ107XG4gICAgICBpZihpcmkuaW5kZXhPZih2b2NhYikgPT09IDAgJiYgaXJpICE9PSB2b2NhYikge1xuICAgICAgICAvLyB1c2Ugc3VmZml4IGFzIHJlbGF0aXZlIGlyaSBpZiBpdCBpcyBub3QgYSB0ZXJtIGluIHRoZSBhY3RpdmUgY29udGV4dFxuICAgICAgICB2YXIgc3VmZml4ID0gaXJpLnN1YnN0cih2b2NhYi5sZW5ndGgpO1xuICAgICAgICBpZighKHN1ZmZpeCBpbiBhY3RpdmVDdHgubWFwcGluZ3MpKSB7XG4gICAgICAgICAgcmV0dXJuIHN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHRlcm0gb3IgQHZvY2FiIG1hdGNoLCBjaGVjayBmb3IgcG9zc2libGUgQ1VSSUVzXG4gIHZhciBjaG9pY2UgPSBudWxsO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIHBhcnRpYWxNYXRjaGVzID0gW107XG4gIHZhciBpcmlNYXAgPSBhY3RpdmVDdHguZmFzdEN1cmllTWFwO1xuICAvLyBjaGVjayBmb3IgcGFydGlhbCBtYXRjaGVzIG9mIGFnYWluc3QgYGlyaWAsIHdoaWNoIG1lYW5zIGxvb2sgdW50aWxcbiAgLy8gaXJpLmxlbmd0aCAtIDEsIG5vdCBmdWxsIGxlbmd0aFxuICB2YXIgbWF4UGFydGlhbExlbmd0aCA9IGlyaS5sZW5ndGggLSAxO1xuICBmb3IoOyBpZHggPCBtYXhQYXJ0aWFsTGVuZ3RoICYmIGlyaVtpZHhdIGluIGlyaU1hcDsgKytpZHgpIHtcbiAgICBpcmlNYXAgPSBpcmlNYXBbaXJpW2lkeF1dO1xuICAgIGlmKCcnIGluIGlyaU1hcCkge1xuICAgICAgcGFydGlhbE1hdGNoZXMucHVzaChpcmlNYXBbJyddWzBdKTtcbiAgICB9XG4gIH1cbiAgLy8gY2hlY2sgcGFydGlhbCBtYXRjaGVzIGluIHJldmVyc2Ugb3JkZXIgdG8gcHJlZmVyIGxvbmdlc3Qgb25lcyBmaXJzdFxuICBmb3IodmFyIGkgPSBwYXJ0aWFsTWF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIHZhciBlbnRyeSA9IHBhcnRpYWxNYXRjaGVzW2ldO1xuICAgIHZhciB0ZXJtcyA9IGVudHJ5LnRlcm1zO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IHRlcm1zLmxlbmd0aDsgKyt0aSkge1xuICAgICAgLy8gYSBDVVJJRSBpcyB1c2FibGUgaWY6XG4gICAgICAvLyAxLiBpdCBoYXMgbm8gbWFwcGluZywgT1JcbiAgICAgIC8vIDIuIHZhbHVlIGlzIG51bGwsIHdoaWNoIG1lYW5zIHdlJ3JlIG5vdCBjb21wYWN0aW5nIGFuIEB2YWx1ZSwgQU5EXG4gICAgICAvLyAgIHRoZSBtYXBwaW5nIG1hdGNoZXMgdGhlIElSSVxuICAgICAgdmFyIGN1cmllID0gdGVybXNbdGldICsgJzonICsgaXJpLnN1YnN0cihlbnRyeS5pcmkubGVuZ3RoKTtcbiAgICAgIHZhciBpc1VzYWJsZUN1cmllID0gKCEoY3VyaWUgaW4gYWN0aXZlQ3R4Lm1hcHBpbmdzKSB8fFxuICAgICAgICAodmFsdWUgPT09IG51bGwgJiYgYWN0aXZlQ3R4Lm1hcHBpbmdzW2N1cmllXVsnQGlkJ10gPT09IGlyaSkpO1xuXG4gICAgICAvLyBzZWxlY3QgY3VyaWUgaWYgaXQgaXMgc2hvcnRlciBvciB0aGUgc2FtZSBsZW5ndGggYnV0IGxleGljb2dyYXBoaWNhbGx5XG4gICAgICAvLyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgY2hvaWNlXG4gICAgICBpZihpc1VzYWJsZUN1cmllICYmIChjaG9pY2UgPT09IG51bGwgfHxcbiAgICAgICAgX2NvbXBhcmVTaG9ydGVzdExlYXN0KGN1cmllLCBjaG9pY2UpIDwgMCkpIHtcbiAgICAgICAgY2hvaWNlID0gY3VyaWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIGNob3NlbiBjdXJpZVxuICBpZihjaG9pY2UgIT09IG51bGwpIHtcbiAgICByZXR1cm4gY2hvaWNlO1xuICB9XG5cbiAgLy8gY29tcGFjdCBJUkkgcmVsYXRpdmUgdG8gYmFzZVxuICBpZighcmVsYXRpdmVUby52b2NhYikge1xuICAgIHJldHVybiBfcmVtb3ZlQmFzZShhY3RpdmVDdHhbJ0BiYXNlJ10sIGlyaSk7XG4gIH1cblxuICAvLyByZXR1cm4gSVJJIGFzIGlzXG4gIHJldHVybiBpcmk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdmFsdWUgY29tcGFjdGlvbiBvbiBhbiBvYmplY3Qgd2l0aCAnQHZhbHVlJyBvciAnQGlkJyBhcyB0aGUgb25seVxuICogcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQuXG4gKiBAcGFyYW0gYWN0aXZlUHJvcGVydHkgdGhlIGFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHBvaW50cyB0byB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNvbXBhY3QuXG4gKlxuICogQHJldHVybiB0aGUgY29tcGFjdGlvbiByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIF9jb21wYWN0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgdmFsdWUpIHtcbiAgLy8gdmFsdWUgaXMgYSBAdmFsdWVcbiAgaWYoX2lzVmFsdWUodmFsdWUpKSB7XG4gICAgLy8gZ2V0IGNvbnRleHQgcnVsZXNcbiAgICB2YXIgdHlwZSA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0B0eXBlJyk7XG4gICAgdmFyIGxhbmd1YWdlID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAbGFuZ3VhZ2UnKTtcbiAgICB2YXIgY29udGFpbmVyID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG5cbiAgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsdWUgaGFzIGFuIEBpbmRleCB0aGF0IG11c3QgYmUgcHJlc2VydmVkXG4gICAgdmFyIHByZXNlcnZlSW5kZXggPSAoKCdAaW5kZXgnIGluIHZhbHVlKSAmJlxuICAgICAgY29udGFpbmVyICE9PSAnQGluZGV4Jyk7XG5cbiAgICAvLyBpZiB0aGVyZSdzIG5vIEBpbmRleCB0byBwcmVzZXJ2ZSAuLi5cbiAgICBpZighcHJlc2VydmVJbmRleCkge1xuICAgICAgLy8gbWF0Y2hpbmcgQHR5cGUgb3IgQGxhbmd1YWdlIHNwZWNpZmllZCBpbiBjb250ZXh0LCBjb21wYWN0IHZhbHVlXG4gICAgICBpZih2YWx1ZVsnQHR5cGUnXSA9PT0gdHlwZSB8fCB2YWx1ZVsnQGxhbmd1YWdlJ10gPT09IGxhbmd1YWdlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVsnQHZhbHVlJ107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGp1c3QgdGhlIHZhbHVlIG9mIEB2YWx1ZSBpZiBhbGwgYXJlIHRydWU6XG4gICAgLy8gMS4gQHZhbHVlIGlzIHRoZSBvbmx5IGtleSBvciBAaW5kZXggaXNuJ3QgYmVpbmcgcHJlc2VydmVkXG4gICAgLy8gMi4gdGhlcmUgaXMgbm8gZGVmYXVsdCBsYW5ndWFnZSBvciBAdmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yXG4gICAgLy8gICB0aGUga2V5IGhhcyBhIG1hcHBpbmcgd2l0aCBhIG51bGwgQGxhbmd1YWdlXG4gICAgdmFyIGtleUNvdW50ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcbiAgICB2YXIgaXNWYWx1ZU9ubHlLZXkgPSAoa2V5Q291bnQgPT09IDEgfHxcbiAgICAgIChrZXlDb3VudCA9PT0gMiAmJiAoJ0BpbmRleCcgaW4gdmFsdWUpICYmICFwcmVzZXJ2ZUluZGV4KSk7XG4gICAgdmFyIGhhc0RlZmF1bHRMYW5ndWFnZSA9ICgnQGxhbmd1YWdlJyBpbiBhY3RpdmVDdHgpO1xuICAgIHZhciBpc1ZhbHVlU3RyaW5nID0gX2lzU3RyaW5nKHZhbHVlWydAdmFsdWUnXSk7XG4gICAgdmFyIGhhc051bGxNYXBwaW5nID0gKGFjdGl2ZUN0eC5tYXBwaW5nc1thY3RpdmVQcm9wZXJ0eV0gJiZcbiAgICAgIGFjdGl2ZUN0eC5tYXBwaW5nc1thY3RpdmVQcm9wZXJ0eV1bJ0BsYW5ndWFnZSddID09PSBudWxsKTtcbiAgICBpZihpc1ZhbHVlT25seUtleSAmJlxuICAgICAgKCFoYXNEZWZhdWx0TGFuZ3VhZ2UgfHwgIWlzVmFsdWVTdHJpbmcgfHwgaGFzTnVsbE1hcHBpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsdWVbJ0B2YWx1ZSddO1xuICAgIH1cblxuICAgIHZhciBydmFsID0ge307XG5cbiAgICAvLyBwcmVzZXJ2ZSBAaW5kZXhcbiAgICBpZihwcmVzZXJ2ZUluZGV4KSB7XG4gICAgICBydmFsW19jb21wYWN0SXJpKGFjdGl2ZUN0eCwgJ0BpbmRleCcpXSA9IHZhbHVlWydAaW5kZXgnXTtcbiAgICB9XG5cbiAgICBpZignQHR5cGUnIGluIHZhbHVlKSB7XG4gICAgICAvLyBjb21wYWN0IEB0eXBlIElSSVxuICAgICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAdHlwZScpXSA9IF9jb21wYWN0SXJpKFxuICAgICAgICBhY3RpdmVDdHgsIHZhbHVlWydAdHlwZSddLCBudWxsLCB7dm9jYWI6IHRydWV9KTtcbiAgICB9IGVsc2UgaWYoJ0BsYW5ndWFnZScgaW4gdmFsdWUpIHtcbiAgICAgIC8vIGFsaWFzIEBsYW5ndWFnZVxuICAgICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAbGFuZ3VhZ2UnKV0gPSB2YWx1ZVsnQGxhbmd1YWdlJ107XG4gICAgfVxuXG4gICAgLy8gYWxpYXMgQHZhbHVlXG4gICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAdmFsdWUnKV0gPSB2YWx1ZVsnQHZhbHVlJ107XG5cbiAgICByZXR1cm4gcnZhbDtcbiAgfVxuXG4gIC8vIHZhbHVlIGlzIGEgc3ViamVjdCByZWZlcmVuY2VcbiAgdmFyIGV4cGFuZGVkUHJvcGVydHkgPSBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHt2b2NhYjogdHJ1ZX0pO1xuICB2YXIgdHlwZSA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0B0eXBlJyk7XG4gIHZhciBjb21wYWN0ZWQgPSBfY29tcGFjdElyaShcbiAgICBhY3RpdmVDdHgsIHZhbHVlWydAaWQnXSwgbnVsbCwge3ZvY2FiOiB0eXBlID09PSAnQHZvY2FiJ30pO1xuXG4gIC8vIGNvbXBhY3QgdG8gc2NhbGFyXG4gIGlmKHR5cGUgPT09ICdAaWQnIHx8IHR5cGUgPT09ICdAdm9jYWInIHx8IGV4cGFuZGVkUHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgcmV0dXJuIGNvbXBhY3RlZDtcbiAgfVxuXG4gIHZhciBydmFsID0ge307XG4gIHJ2YWxbX2NvbXBhY3RJcmkoYWN0aXZlQ3R4LCAnQGlkJyldID0gY29tcGFjdGVkO1xuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVybSBkZWZpbml0aW9uIGR1cmluZyBjb250ZXh0IHByb2Nlc3NpbmcuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBsb2NhbEN0eCB0aGUgbG9jYWwgY29udGV4dCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdGVybSB0aGUgdGVybSBpbiB0aGUgbG9jYWwgY29udGV4dCB0byBkZWZpbmUgdGhlIG1hcHBpbmcgZm9yLlxuICogQHBhcmFtIGRlZmluZWQgYSBtYXAgb2YgZGVmaW5pbmcvZGVmaW5lZCBrZXlzIHRvIGRldGVjdCBjeWNsZXMgYW5kIHByZXZlbnRcbiAqICAgICAgICAgIGRvdWJsZSBkZWZpbml0aW9ucy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVRlcm1EZWZpbml0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIHRlcm0sIGRlZmluZWQpIHtcbiAgaWYodGVybSBpbiBkZWZpbmVkKSB7XG4gICAgLy8gdGVybSBhbHJlYWR5IGRlZmluZWRcbiAgICBpZihkZWZpbmVkW3Rlcm1dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGN5Y2xlIGRldGVjdGVkXG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0N5Y2xpY2FsIGNvbnRleHQgZGVmaW5pdGlvbiBkZXRlY3RlZC4nLFxuICAgICAgJ2pzb25sZC5DeWNsaWNhbENvbnRleHQnLFxuICAgICAge2NvZGU6ICdjeWNsaWMgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eCwgdGVybTogdGVybX0pO1xuICB9XG5cbiAgLy8gbm93IGRlZmluaW5nIHRlcm1cbiAgZGVmaW5lZFt0ZXJtXSA9IGZhbHNlO1xuXG4gIGlmKF9pc0tleXdvcmQodGVybSkpIHtcbiAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsga2V5d29yZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4uJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAge2NvZGU6ICdrZXl3b3JkIHJlZGVmaW5pdGlvbicsIGNvbnRleHQ6IGxvY2FsQ3R4LCB0ZXJtOiB0ZXJtfSk7XG4gIH1cblxuICBpZih0ZXJtID09PSAnJykge1xuICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIHRlcm0gY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICB7Y29kZTogJ2ludmFsaWQgdGVybSBkZWZpbml0aW9uJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBvbGQgbWFwcGluZ1xuICBpZihhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0pIHtcbiAgICBkZWxldGUgYWN0aXZlQ3R4Lm1hcHBpbmdzW3Rlcm1dO1xuICB9XG5cbiAgLy8gZ2V0IGNvbnRleHQgdGVybSB2YWx1ZVxuICB2YXIgdmFsdWUgPSBsb2NhbEN0eFt0ZXJtXTtcblxuICAvLyBjbGVhciBjb250ZXh0IGVudHJ5XG4gIGlmKHZhbHVlID09PSBudWxsIHx8IChfaXNPYmplY3QodmFsdWUpICYmIHZhbHVlWydAaWQnXSA9PT0gbnVsbCkpIHtcbiAgICBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0gPSBudWxsO1xuICAgIGRlZmluZWRbdGVybV0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgc2hvcnQtaGFuZCB2YWx1ZSB0byBvYmplY3Qgdy9AaWRcbiAgaWYoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhbHVlID0geydAaWQnOiB2YWx1ZX07XG4gIH1cblxuICBpZighX2lzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSAnICtcbiAgICAgICdzdHJpbmdzIG9yIG9iamVjdHMuJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAge2NvZGU6ICdpbnZhbGlkIHRlcm0gZGVmaW5pdGlvbicsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gIH1cblxuICAvLyBjcmVhdGUgbmV3IG1hcHBpbmdcbiAgdmFyIG1hcHBpbmcgPSBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0gPSB7fTtcbiAgbWFwcGluZy5yZXZlcnNlID0gZmFsc2U7XG5cbiAgaWYoJ0ByZXZlcnNlJyBpbiB2YWx1ZSkge1xuICAgIGlmKCdAaWQnIGluIHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEByZXZlcnNlIHRlcm0gZGVmaW5pdGlvbiBtdXN0IG5vdCAnICtcbiAgICAgICAgJ2NvbnRhaW4gQGlkLicsICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgcmV2ZXJzZSBwcm9wZXJ0eScsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIHZhciByZXZlcnNlID0gdmFsdWVbJ0ByZXZlcnNlJ107XG4gICAgaWYoIV9pc1N0cmluZyhyZXZlcnNlKSkge1xuICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgYSBAY29udGV4dCBAcmV2ZXJzZSB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eH0pO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBhbmQgYWRkIEBpZCBtYXBwaW5nXG4gICAgdmFyIGlkID0gX2V4cGFuZElyaShcbiAgICAgIGFjdGl2ZUN0eCwgcmV2ZXJzZSwge3ZvY2FiOiB0cnVlLCBiYXNlOiBmYWxzZX0sIGxvY2FsQ3R4LCBkZWZpbmVkKTtcbiAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEBjb250ZXh0IEByZXZlcnNlIHZhbHVlIG11c3QgYmUgYW4gJyArXG4gICAgICAgICdhYnNvbHV0ZSBJUkkgb3IgYSBibGFuayBub2RlIGlkZW50aWZpZXIuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnaW52YWxpZCBJUkkgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIG1hcHBpbmdbJ0BpZCddID0gaWQ7XG4gICAgbWFwcGluZy5yZXZlcnNlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmKCdAaWQnIGluIHZhbHVlKSB7XG4gICAgdmFyIGlkID0gdmFsdWVbJ0BpZCddO1xuICAgIGlmKCFfaXNTdHJpbmcoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEBjb250ZXh0IEBpZCB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5ICcgK1xuICAgICAgICAnb2Ygc3RyaW5ncyBvciBhIHN0cmluZy4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIElSSSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG4gICAgaWYoaWQgIT09IHRlcm0pIHtcbiAgICAgIC8vIGV4cGFuZCBhbmQgYWRkIEBpZCBtYXBwaW5nXG4gICAgICBpZCA9IF9leHBhbmRJcmkoXG4gICAgICAgIGFjdGl2ZUN0eCwgaWQsIHt2b2NhYjogdHJ1ZSwgYmFzZTogZmFsc2V9LCBsb2NhbEN0eCwgZGVmaW5lZCk7XG4gICAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpICYmICFfaXNLZXl3b3JkKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGEgQGNvbnRleHQgQGlkIHZhbHVlIG11c3QgYmUgYW4gJyArXG4gICAgICAgICAgJ2Fic29sdXRlIElSSSwgYSBibGFuayBub2RlIGlkZW50aWZpZXIsIG9yIGEga2V5d29yZC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBJUkkgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgICB9XG4gICAgICBtYXBwaW5nWydAaWQnXSA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFsd2F5cyBjb21wdXRlIHdoZXRoZXIgdGVybSBoYXMgYSBjb2xvbiBhcyBhbiBvcHRpbWl6YXRpb24gZm9yXG4gIC8vIF9jb21wYWN0SXJpXG4gIHZhciBjb2xvbiA9IHRlcm0uaW5kZXhPZignOicpO1xuICBtYXBwaW5nLl90ZXJtSGFzQ29sb24gPSAoY29sb24gIT09IC0xKTtcblxuICBpZighKCdAaWQnIGluIG1hcHBpbmcpKSB7XG4gICAgLy8gc2VlIGlmIHRoZSB0ZXJtIGhhcyBhIHByZWZpeFxuICAgIGlmKG1hcHBpbmcuX3Rlcm1IYXNDb2xvbikge1xuICAgICAgdmFyIHByZWZpeCA9IHRlcm0uc3Vic3RyKDAsIGNvbG9uKTtcbiAgICAgIGlmKHByZWZpeCBpbiBsb2NhbEN0eCkge1xuICAgICAgICAvLyBkZWZpbmUgcGFyZW50IHByZWZpeFxuICAgICAgICBfY3JlYXRlVGVybURlZmluaXRpb24oYWN0aXZlQ3R4LCBsb2NhbEN0eCwgcHJlZml4LCBkZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgaWYoYWN0aXZlQ3R4Lm1hcHBpbmdzW3ByZWZpeF0pIHtcbiAgICAgICAgLy8gc2V0IEBpZCBiYXNlZCBvbiBwcmVmaXggcGFyZW50XG4gICAgICAgIHZhciBzdWZmaXggPSB0ZXJtLnN1YnN0cihjb2xvbiArIDEpO1xuICAgICAgICBtYXBwaW5nWydAaWQnXSA9IGFjdGl2ZUN0eC5tYXBwaW5nc1twcmVmaXhdWydAaWQnXSArIHN1ZmZpeDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRlcm0gaXMgYW4gYWJzb2x1dGUgSVJJXG4gICAgICAgIG1hcHBpbmdbJ0BpZCddID0gdGVybTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9uLUlSSXMgKm11c3QqIGRlZmluZSBAaWRzIGlmIEB2b2NhYiBpcyBub3QgYXZhaWxhYmxlXG4gICAgICBpZighKCdAdm9jYWInIGluIGFjdGl2ZUN0eCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCB0ZXJtcyBtdXN0IGRlZmluZSBhbiBAaWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eCwgdGVybTogdGVybX0pO1xuICAgICAgfVxuICAgICAgLy8gcHJlcGVuZCB2b2NhYiB0byB0ZXJtXG4gICAgICBtYXBwaW5nWydAaWQnXSA9IGFjdGl2ZUN0eFsnQHZvY2FiJ10gKyB0ZXJtO1xuICAgIH1cbiAgfVxuXG4gIC8vIElSSSBtYXBwaW5nIG5vdyBkZWZpbmVkXG4gIGRlZmluZWRbdGVybV0gPSB0cnVlO1xuXG4gIGlmKCdAdHlwZScgaW4gdmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHZhbHVlWydAdHlwZSddO1xuICAgIGlmKCFfaXNTdHJpbmcodHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIEBjb250ZXh0IEB0eXBlIHZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgdHlwZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG5cbiAgICBpZih0eXBlICE9PSAnQGlkJyAmJiB0eXBlICE9PSAnQHZvY2FiJykge1xuICAgICAgLy8gZXhwYW5kIEB0eXBlIHRvIGZ1bGwgSVJJXG4gICAgICB0eXBlID0gX2V4cGFuZElyaShcbiAgICAgICAgYWN0aXZlQ3R4LCB0eXBlLCB7dm9jYWI6IHRydWUsIGJhc2U6IGZhbHNlfSwgbG9jYWxDdHgsIGRlZmluZWQpO1xuICAgICAgaWYoIV9pc0Fic29sdXRlSXJpKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgYW4gQGNvbnRleHQgQHR5cGUgdmFsdWUgbXVzdCBiZSBhbiAnICtcbiAgICAgICAgICAnYWJzb2x1dGUgSVJJLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHR5cGUgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgICB9XG4gICAgICBpZih0eXBlLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhbiBAY29udGV4dCBAdHlwZSB2YWx1ZXMgbXVzdCBiZSBhbiBJUkksICcgK1xuICAgICAgICAgICdub3QgYSBibGFuayBub2RlIGlkZW50aWZpZXIuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgdHlwZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgQHR5cGUgdG8gbWFwcGluZ1xuICAgIG1hcHBpbmdbJ0B0eXBlJ10gPSB0eXBlO1xuICB9XG5cbiAgaWYoJ0Bjb250YWluZXInIGluIHZhbHVlKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHZhbHVlWydAY29udGFpbmVyJ107XG4gICAgaWYoY29udGFpbmVyICE9PSAnQGxpc3QnICYmIGNvbnRhaW5lciAhPT0gJ0BzZXQnICYmXG4gICAgICBjb250YWluZXIgIT09ICdAaW5kZXgnICYmIGNvbnRhaW5lciAhPT0gJ0BsYW5ndWFnZScpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IEBjb250YWluZXIgdmFsdWUgbXVzdCBiZSAnICtcbiAgICAgICAgJ29uZSBvZiB0aGUgZm9sbG93aW5nOiBAbGlzdCwgQHNldCwgQGluZGV4LCBvciBAbGFuZ3VhZ2UuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBjb250YWluZXIgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIGlmKG1hcHBpbmcucmV2ZXJzZSAmJiBjb250YWluZXIgIT09ICdAaW5kZXgnICYmIGNvbnRhaW5lciAhPT0gJ0BzZXQnICYmXG4gICAgICBjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IEBjb250YWluZXIgdmFsdWUgZm9yIGEgQHJldmVyc2UgJyArXG4gICAgICAgICd0eXBlIGRlZmluaXRpb24gbXVzdCBiZSBAaW5kZXggb3IgQHNldC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHknLCBjb250ZXh0OiBsb2NhbEN0eH0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBAY29udGFpbmVyIHRvIG1hcHBpbmdcbiAgICBtYXBwaW5nWydAY29udGFpbmVyJ10gPSBjb250YWluZXI7XG4gIH1cblxuICBpZignQGxhbmd1YWdlJyBpbiB2YWx1ZSAmJiAhKCdAdHlwZScgaW4gdmFsdWUpKSB7XG4gICAgdmFyIGxhbmd1YWdlID0gdmFsdWVbJ0BsYW5ndWFnZSddO1xuICAgIGlmKGxhbmd1YWdlICE9PSBudWxsICYmICFfaXNTdHJpbmcobGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBAbGFuZ3VhZ2UgdmFsdWUgbXVzdCBiZSAnICtcbiAgICAgICAgJ2Egc3RyaW5nIG9yIG51bGwuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgQGxhbmd1YWdlIHRvIG1hcHBpbmdcbiAgICBpZihsYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBtYXBwaW5nWydAbGFuZ3VhZ2UnXSA9IGxhbmd1YWdlO1xuICB9XG5cbiAgLy8gZGlzYWxsb3cgYWxpYXNpbmcgQGNvbnRleHQgYW5kIEBwcmVzZXJ2ZVxuICB2YXIgaWQgPSBtYXBwaW5nWydAaWQnXTtcbiAgaWYoaWQgPT09ICdAY29udGV4dCcgfHwgaWQgPT09ICdAcHJlc2VydmUnKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IGFuZCBAcHJlc2VydmUgY2Fubm90IGJlIGFsaWFzZWQuJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQga2V5d29yZCBhbGlhcycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBhbmRzIGEgc3RyaW5nIHRvIGEgZnVsbCBJUkkuIFRoZSBzdHJpbmcgbWF5IGJlIGEgdGVybSwgYSBwcmVmaXgsIGFcbiAqIHJlbGF0aXZlIElSSSwgb3IgYW4gYWJzb2x1dGUgSVJJLiBUaGUgYXNzb2NpYXRlZCBhYnNvbHV0ZSBJUkkgd2lsbCBiZVxuICogcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHRvIGV4cGFuZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVRvIG9wdGlvbnMgZm9yIGhvdyB0byByZXNvbHZlIHJlbGF0aXZlIElSSXM6XG4gKiAgICAgICAgICBiYXNlOiB0cnVlIHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgYmFzZSBJUkksIGZhbHNlIG5vdCB0by5cbiAqICAgICAgICAgIHZvY2FiOiB0cnVlIHRvIGNvbmNhdGVuYXRlIGFmdGVyIEB2b2NhYiwgZmFsc2Ugbm90IHRvLlxuICogQHBhcmFtIGxvY2FsQ3R4IHRoZSBsb2NhbCBjb250ZXh0IGJlaW5nIHByb2Nlc3NlZCAob25seSBnaXZlbiBpZiBjYWxsZWRcbiAqICAgICAgICAgIGR1cmluZyBjb250ZXh0IHByb2Nlc3NpbmcpLlxuICogQHBhcmFtIGRlZmluZWQgYSBtYXAgZm9yIHRyYWNraW5nIGN5Y2xlcyBpbiBjb250ZXh0IGRlZmluaXRpb25zIChvbmx5IGdpdmVuXG4gKiAgICAgICAgICBpZiBjYWxsZWQgZHVyaW5nIGNvbnRleHQgcHJvY2Vzc2luZykuXG4gKlxuICogQHJldHVybiB0aGUgZXhwYW5kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9leHBhbmRJcmkoYWN0aXZlQ3R4LCB2YWx1ZSwgcmVsYXRpdmVUbywgbG9jYWxDdHgsIGRlZmluZWQpIHtcbiAgLy8gYWxyZWFkeSBleHBhbmRlZFxuICBpZih2YWx1ZSA9PT0gbnVsbCB8fCBfaXNLZXl3b3JkKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIGVuc3VyZSB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZ1xuICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgLy8gZGVmaW5lIHRlcm0gZGVwZW5kZW5jeSBpZiBub3QgZGVmaW5lZFxuICBpZihsb2NhbEN0eCAmJiB2YWx1ZSBpbiBsb2NhbEN0eCAmJiBkZWZpbmVkW3ZhbHVlXSAhPT0gdHJ1ZSkge1xuICAgIF9jcmVhdGVUZXJtRGVmaW5pdGlvbihhY3RpdmVDdHgsIGxvY2FsQ3R4LCB2YWx1ZSwgZGVmaW5lZCk7XG4gIH1cblxuICByZWxhdGl2ZVRvID0gcmVsYXRpdmVUbyB8fCB7fTtcbiAgaWYocmVsYXRpdmVUby52b2NhYikge1xuICAgIHZhciBtYXBwaW5nID0gYWN0aXZlQ3R4Lm1hcHBpbmdzW3ZhbHVlXTtcblxuICAgIC8vIHZhbHVlIGlzIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoIGEgbnVsbCBtYXBwaW5nXG4gICAgaWYobWFwcGluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYobWFwcGluZykge1xuICAgICAgLy8gdmFsdWUgaXMgYSB0ZXJtXG4gICAgICByZXR1cm4gbWFwcGluZ1snQGlkJ107XG4gICAgfVxuICB9XG5cbiAgLy8gc3BsaXQgdmFsdWUgaW50byBwcmVmaXg6c3VmZml4XG4gIHZhciBjb2xvbiA9IHZhbHVlLmluZGV4T2YoJzonKTtcbiAgaWYoY29sb24gIT09IC0xKSB7XG4gICAgdmFyIHByZWZpeCA9IHZhbHVlLnN1YnN0cigwLCBjb2xvbik7XG4gICAgdmFyIHN1ZmZpeCA9IHZhbHVlLnN1YnN0cihjb2xvbiArIDEpO1xuXG4gICAgLy8gZG8gbm90IGV4cGFuZCBibGFuayBub2RlcyAocHJlZml4IG9mICdfJykgb3IgYWxyZWFkeS1hYnNvbHV0ZVxuICAgIC8vIElSSXMgKHN1ZmZpeCBvZiAnLy8nKVxuICAgIGlmKHByZWZpeCA9PT0gJ18nIHx8IHN1ZmZpeC5pbmRleE9mKCcvLycpID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gcHJlZml4IGRlcGVuZGVuY3kgbm90IGRlZmluZWQsIGRlZmluZSBpdFxuICAgIGlmKGxvY2FsQ3R4ICYmIHByZWZpeCBpbiBsb2NhbEN0eCkge1xuICAgICAgX2NyZWF0ZVRlcm1EZWZpbml0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIHByZWZpeCwgZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gdXNlIG1hcHBpbmcgaWYgcHJlZml4IGlzIGRlZmluZWRcbiAgICB2YXIgbWFwcGluZyA9IGFjdGl2ZUN0eC5tYXBwaW5nc1twcmVmaXhdO1xuICAgIGlmKG1hcHBpbmcpIHtcbiAgICAgIHJldHVybiBtYXBwaW5nWydAaWQnXSArIHN1ZmZpeDtcbiAgICB9XG5cbiAgICAvLyBhbHJlYWR5IGFic29sdXRlIElSSVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHByZXBlbmQgdm9jYWJcbiAgaWYocmVsYXRpdmVUby52b2NhYiAmJiAnQHZvY2FiJyBpbiBhY3RpdmVDdHgpIHtcbiAgICByZXR1cm4gYWN0aXZlQ3R4WydAdm9jYWInXSArIHZhbHVlO1xuICB9XG5cbiAgLy8gcHJlcGVuZCBiYXNlXG4gIHZhciBydmFsID0gdmFsdWU7XG4gIGlmKHJlbGF0aXZlVG8uYmFzZSkge1xuICAgIHJ2YWwgPSBqc29ubGQucHJlcGVuZEJhc2UoYWN0aXZlQ3R4WydAYmFzZSddLCBydmFsKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG5mdW5jdGlvbiBfcHJlcGVuZEJhc2UoYmFzZSwgaXJpKSB7XG4gIC8vIHNraXAgSVJJIHByb2Nlc3NpbmdcbiAgaWYoYmFzZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cbiAgLy8gYWxyZWFkeSBhbiBhYnNvbHV0ZSBJUklcbiAgaWYoaXJpLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gaXJpO1xuICB9XG5cbiAgLy8gcGFyc2UgYmFzZSBpZiBpdCBpcyBhIHN0cmluZ1xuICBpZihfaXNTdHJpbmcoYmFzZSkpIHtcbiAgICBiYXNlID0ganNvbmxkLnVybC5wYXJzZShiYXNlIHx8ICcnKTtcbiAgfVxuXG4gIC8vIHBhcnNlIGdpdmVuIElSSVxuICB2YXIgcmVsID0ganNvbmxkLnVybC5wYXJzZShpcmkpO1xuXG4gIC8vIHBlciBSRkMzOTg2IDUuMi4yXG4gIHZhciB0cmFuc2Zvcm0gPSB7XG4gICAgcHJvdG9jb2w6IGJhc2UucHJvdG9jb2wgfHwgJydcbiAgfTtcblxuICBpZihyZWwuYXV0aG9yaXR5ICE9PSBudWxsKSB7XG4gICAgdHJhbnNmb3JtLmF1dGhvcml0eSA9IHJlbC5hdXRob3JpdHk7XG4gICAgdHJhbnNmb3JtLnBhdGggPSByZWwucGF0aDtcbiAgICB0cmFuc2Zvcm0ucXVlcnkgPSByZWwucXVlcnk7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNmb3JtLmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuXG4gICAgaWYocmVsLnBhdGggPT09ICcnKSB7XG4gICAgICB0cmFuc2Zvcm0ucGF0aCA9IGJhc2UucGF0aDtcbiAgICAgIGlmKHJlbC5xdWVyeSAhPT0gbnVsbCkge1xuICAgICAgICB0cmFuc2Zvcm0ucXVlcnkgPSByZWwucXVlcnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2Zvcm0ucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihyZWwucGF0aC5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgICAgLy8gSVJJIHJlcHJlc2VudHMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAgICB0cmFuc2Zvcm0ucGF0aCA9IHJlbC5wYXRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWVyZ2UgcGF0aHNcbiAgICAgICAgdmFyIHBhdGggPSBiYXNlLnBhdGg7XG5cbiAgICAgICAgLy8gYXBwZW5kIHJlbGF0aXZlIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBkaXJlY3RvcnkgZnJvbSBiYXNlXG4gICAgICAgIGlmKHJlbC5wYXRoICE9PSAnJykge1xuICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICAgICAgICBpZihwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aC5zdWJzdHIoLTEpICE9PSAnLycpIHtcbiAgICAgICAgICAgIHBhdGggKz0gJy8nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoICs9IHJlbC5wYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhbnNmb3JtLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgICAgdHJhbnNmb3JtLnF1ZXJ5ID0gcmVsLnF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBzbGFzaGVzIGFuZCBkb3RzIGluIHBhdGhcbiAgdHJhbnNmb3JtLnBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHModHJhbnNmb3JtLnBhdGgsICEhdHJhbnNmb3JtLmF1dGhvcml0eSk7XG5cbiAgLy8gY29uc3RydWN0IFVSTFxuICB2YXIgcnZhbCA9IHRyYW5zZm9ybS5wcm90b2NvbDtcbiAgaWYodHJhbnNmb3JtLmF1dGhvcml0eSAhPT0gbnVsbCkge1xuICAgIHJ2YWwgKz0gJy8vJyArIHRyYW5zZm9ybS5hdXRob3JpdHk7XG4gIH1cbiAgcnZhbCArPSB0cmFuc2Zvcm0ucGF0aDtcbiAgaWYodHJhbnNmb3JtLnF1ZXJ5ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnPycgKyB0cmFuc2Zvcm0ucXVlcnk7XG4gIH1cbiAgaWYocmVsLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnIycgKyByZWwuZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBoYW5kbGUgZW1wdHkgYmFzZVxuICBpZihydmFsID09PSAnJykge1xuICAgIHJ2YWwgPSAnLi8nO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGJhc2UgSVJJIGZyb20gdGhlIGdpdmVuIGFic29sdXRlIElSSS5cbiAqXG4gKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBJUkkuXG4gKiBAcGFyYW0gaXJpIHRoZSBhYnNvbHV0ZSBJUkkuXG4gKlxuICogQHJldHVybiB0aGUgcmVsYXRpdmUgSVJJIGlmIHJlbGF0aXZlIHRvIGJhc2UsIG90aGVyd2lzZSB0aGUgYWJzb2x1dGUgSVJJLlxuICovXG5mdW5jdGlvbiBfcmVtb3ZlQmFzZShiYXNlLCBpcmkpIHtcbiAgLy8gc2tpcCBJUkkgcHJvY2Vzc2luZ1xuICBpZihiYXNlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGlyaTtcbiAgfVxuXG4gIGlmKF9pc1N0cmluZyhiYXNlKSkge1xuICAgIGJhc2UgPSBqc29ubGQudXJsLnBhcnNlKGJhc2UgfHwgJycpO1xuICB9XG5cbiAgLy8gZXN0YWJsaXNoIGJhc2Ugcm9vdFxuICB2YXIgcm9vdCA9ICcnO1xuICBpZihiYXNlLmhyZWYgIT09ICcnKSB7XG4gICAgcm9vdCArPSAoYmFzZS5wcm90b2NvbCB8fCAnJykgKyAnLy8nICsgKGJhc2UuYXV0aG9yaXR5IHx8ICcnKTtcbiAgfSBlbHNlIGlmKGlyaS5pbmRleE9mKCcvLycpKSB7XG4gICAgLy8gc3VwcG9ydCBuZXR3b3JrLXBhdGggcmVmZXJlbmNlIHdpdGggZW1wdHkgYmFzZVxuICAgIHJvb3QgKz0gJy8vJztcbiAgfVxuXG4gIC8vIElSSSBub3QgcmVsYXRpdmUgdG8gYmFzZVxuICBpZihpcmkuaW5kZXhPZihyb290KSAhPT0gMCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyByZW1vdmUgcm9vdCBmcm9tIElSSSBhbmQgcGFyc2UgcmVtYWluZGVyXG4gIHZhciByZWwgPSBqc29ubGQudXJsLnBhcnNlKGlyaS5zdWJzdHIocm9vdC5sZW5ndGgpKTtcblxuICAvLyByZW1vdmUgcGF0aCBzZWdtZW50cyB0aGF0IG1hdGNoIChkbyBub3QgcmVtb3ZlIGxhc3Qgc2VnbWVudCB1bmxlc3MgdGhlcmVcbiAgLy8gaXMgYSBoYXNoIG9yIHF1ZXJ5KVxuICB2YXIgYmFzZVNlZ21lbnRzID0gYmFzZS5ub3JtYWxpemVkUGF0aC5zcGxpdCgnLycpO1xuICB2YXIgaXJpU2VnbWVudHMgPSByZWwubm9ybWFsaXplZFBhdGguc3BsaXQoJy8nKTtcbiAgdmFyIGxhc3QgPSAocmVsLmZyYWdtZW50IHx8IHJlbC5xdWVyeSkgPyAwIDogMTtcbiAgd2hpbGUoYmFzZVNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgaXJpU2VnbWVudHMubGVuZ3RoID4gbGFzdCkge1xuICAgIGlmKGJhc2VTZWdtZW50c1swXSAhPT0gaXJpU2VnbWVudHNbMF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBiYXNlU2VnbWVudHMuc2hpZnQoKTtcbiAgICBpcmlTZWdtZW50cy5zaGlmdCgpO1xuICB9XG5cbiAgLy8gdXNlICcuLi8nIGZvciBlYWNoIG5vbi1tYXRjaGluZyBiYXNlIHNlZ21lbnRcbiAgdmFyIHJ2YWwgPSAnJztcbiAgaWYoYmFzZVNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBkb24ndCBjb3VudCB0aGUgbGFzdCBzZWdtZW50IChpZiBpdCBlbmRzIHdpdGggJy8nIGxhc3QgcGF0aCBkb2Vzbid0XG4gICAgLy8gY291bnQgYW5kIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggJy8nIGl0IGlzbid0IGEgcGF0aClcbiAgICBiYXNlU2VnbWVudHMucG9wKCk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhc2VTZWdtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgcnZhbCArPSAnLi4vJztcbiAgICB9XG4gIH1cblxuICAvLyBwcmVwZW5kIHJlbWFpbmluZyBzZWdtZW50c1xuICBydmFsICs9IGlyaVNlZ21lbnRzLmpvaW4oJy8nKTtcblxuICAvLyBhZGQgcXVlcnkgYW5kIGhhc2hcbiAgaWYocmVsLnF1ZXJ5ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnPycgKyByZWwucXVlcnk7XG4gIH1cbiAgaWYocmVsLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnIycgKyByZWwuZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBoYW5kbGUgZW1wdHkgYmFzZVxuICBpZihydmFsID09PSAnJykge1xuICAgIHJ2YWwgPSAnLi8nO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW5pdGlhbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgZG9jdW1lbnQgYmFzZSBJUkkuXG4gKlxuICogQHJldHVybiB0aGUgaW5pdGlhbCBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucykge1xuICB2YXIgYmFzZSA9IGpzb25sZC51cmwucGFyc2Uob3B0aW9ucy5iYXNlIHx8ICcnKTtcbiAgcmV0dXJuIHtcbiAgICAnQGJhc2UnOiBiYXNlLFxuICAgIG1hcHBpbmdzOiB7fSxcbiAgICBpbnZlcnNlOiBudWxsLFxuICAgIGdldEludmVyc2U6IF9jcmVhdGVJbnZlcnNlQ29udGV4dCxcbiAgICBjbG9uZTogX2Nsb25lQWN0aXZlQ29udGV4dFxuICB9O1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZXJzZSBjb250ZXh0IGZvciB1c2UgaW4gdGhlIGNvbXBhY3Rpb24gYWxnb3JpdGhtLCBpZlxuICAgKiBub3QgYWxyZWFkeSBnZW5lcmF0ZWQgZm9yIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgaW52ZXJzZSBjb250ZXh0LlxuICAgKi9cbiAgZnVuY3Rpb24gX2NyZWF0ZUludmVyc2VDb250ZXh0KCkge1xuICAgIHZhciBhY3RpdmVDdHggPSB0aGlzO1xuXG4gICAgLy8gbGF6aWx5IGNyZWF0ZSBpbnZlcnNlXG4gICAgaWYoYWN0aXZlQ3R4LmludmVyc2UpIHtcbiAgICAgIHJldHVybiBhY3RpdmVDdHguaW52ZXJzZTtcbiAgICB9XG4gICAgdmFyIGludmVyc2UgPSBhY3RpdmVDdHguaW52ZXJzZSA9IHt9O1xuXG4gICAgLy8gdmFyaWFibGVzIGZvciBidWlsZGluZyBmYXN0IENVUklFIG1hcFxuICAgIHZhciBmYXN0Q3VyaWVNYXAgPSBhY3RpdmVDdHguZmFzdEN1cmllTWFwID0ge307XG4gICAgdmFyIGlyaXNUb1Rlcm1zID0ge307XG5cbiAgICAvLyBoYW5kbGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgIHZhciBkZWZhdWx0TGFuZ3VhZ2UgPSBhY3RpdmVDdHhbJ0BsYW5ndWFnZSddIHx8ICdAbm9uZSc7XG5cbiAgICAvLyBjcmVhdGUgdGVybSBzZWxlY3Rpb25zIGZvciBlYWNoIG1hcHBpbmcgaW4gdGhlIGNvbnRleHQsIG9yZGVyZWQgYnlcbiAgICAvLyBzaG9ydGVzdCBhbmQgdGhlbiBsZXhpY29ncmFwaGljYWxseSBsZWFzdFxuICAgIHZhciBtYXBwaW5ncyA9IGFjdGl2ZUN0eC5tYXBwaW5ncztcbiAgICB2YXIgdGVybXMgPSBPYmplY3Qua2V5cyhtYXBwaW5ncykuc29ydChfY29tcGFyZVNob3J0ZXN0TGVhc3QpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0ZXJtcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHRlcm0gPSB0ZXJtc1tpXTtcbiAgICAgIHZhciBtYXBwaW5nID0gbWFwcGluZ3NbdGVybV07XG4gICAgICBpZihtYXBwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGFpbmVyID0gbWFwcGluZ1snQGNvbnRhaW5lciddIHx8ICdAbm9uZSc7XG5cbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBldmVyeSBJUkkgaW4gdGhlIG1hcHBpbmdcbiAgICAgIHZhciBpZHMgPSBtYXBwaW5nWydAaWQnXTtcbiAgICAgIGlmKCFfaXNBcnJheShpZHMpKSB7XG4gICAgICAgIGlkcyA9IFtpZHNdO1xuICAgICAgfVxuICAgICAgZm9yKHZhciBpaSA9IDA7IGlpIDwgaWRzLmxlbmd0aDsgKytpaSkge1xuICAgICAgICB2YXIgaXJpID0gaWRzW2lpXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gaW52ZXJzZVtpcmldO1xuICAgICAgICB2YXIgaXNLZXl3b3JkID0gX2lzS2V5d29yZChpcmkpO1xuXG4gICAgICAgIGlmKCFlbnRyeSkge1xuICAgICAgICAgIC8vIGluaXRpYWxpemUgZW50cnlcbiAgICAgICAgICBpbnZlcnNlW2lyaV0gPSBlbnRyeSA9IHt9O1xuXG4gICAgICAgICAgaWYoIWlzS2V5d29yZCAmJiAhbWFwcGluZy5fdGVybUhhc0NvbG9uKSB7XG4gICAgICAgICAgICAvLyBpbml0IElSSSB0byB0ZXJtIG1hcCBhbmQgZmFzdCBDVVJJRSBwcmVmaXhlc1xuICAgICAgICAgICAgaXJpc1RvVGVybXNbaXJpXSA9IFt0ZXJtXTtcbiAgICAgICAgICAgIHZhciBmYXN0Q3VyaWVFbnRyeSA9IHtpcmk6IGlyaSwgdGVybXM6IGlyaXNUb1Rlcm1zW2lyaV19O1xuICAgICAgICAgICAgaWYoaXJpWzBdIGluIGZhc3RDdXJpZU1hcCkge1xuICAgICAgICAgICAgICBmYXN0Q3VyaWVNYXBbaXJpWzBdXS5wdXNoKGZhc3RDdXJpZUVudHJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhc3RDdXJpZU1hcFtpcmlbMF1dID0gW2Zhc3RDdXJpZUVudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZighaXNLZXl3b3JkICYmICFtYXBwaW5nLl90ZXJtSGFzQ29sb24pIHtcbiAgICAgICAgICAvLyBhZGQgSVJJIHRvIHRlcm0gbWF0Y2hcbiAgICAgICAgICBpcmlzVG9UZXJtc1tpcmldLnB1c2godGVybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbmV3IGVudHJ5XG4gICAgICAgIGlmKCFlbnRyeVtjb250YWluZXJdKSB7XG4gICAgICAgICAgZW50cnlbY29udGFpbmVyXSA9IHtcbiAgICAgICAgICAgICdAbGFuZ3VhZ2UnOiB7fSxcbiAgICAgICAgICAgICdAdHlwZSc6IHt9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyeSA9IGVudHJ5W2NvbnRhaW5lcl07XG5cbiAgICAgICAgaWYobWFwcGluZy5yZXZlcnNlKSB7XG4gICAgICAgICAgLy8gdGVybSBpcyBwcmVmZXJyZWQgZm9yIHZhbHVlcyB1c2luZyBAcmV2ZXJzZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCAnQHJldmVyc2UnKTtcbiAgICAgICAgfSBlbHNlIGlmKCdAdHlwZScgaW4gbWFwcGluZykge1xuICAgICAgICAgIC8vIHRlcm0gaXMgcHJlZmVycmVkIGZvciB2YWx1ZXMgdXNpbmcgc3BlY2lmaWMgdHlwZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCBtYXBwaW5nWydAdHlwZSddKTtcbiAgICAgICAgfSBlbHNlIGlmKCdAbGFuZ3VhZ2UnIGluIG1hcHBpbmcpIHtcbiAgICAgICAgICAvLyB0ZXJtIGlzIHByZWZlcnJlZCBmb3IgdmFsdWVzIHVzaW5nIHNwZWNpZmljIGxhbmd1YWdlXG4gICAgICAgICAgdmFyIGxhbmd1YWdlID0gbWFwcGluZ1snQGxhbmd1YWdlJ10gfHwgJ0BudWxsJztcbiAgICAgICAgICBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeVsnQGxhbmd1YWdlJ10sIGxhbmd1YWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0ZXJtIGlzIHByZWZlcnJlZCBmb3IgdmFsdWVzIHcvZGVmYXVsdCBsYW5ndWFnZSBvciBubyB0eXBlIGFuZFxuICAgICAgICAgIC8vIG5vIGxhbmd1YWdlXG4gICAgICAgICAgLy8gYWRkIGFuIGVudHJ5IGZvciB0aGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAbGFuZ3VhZ2UnXSwgZGVmYXVsdExhbmd1YWdlKTtcblxuICAgICAgICAgIC8vIGFkZCBlbnRyaWVzIGZvciBubyB0eXBlIGFuZCBubyBsYW5ndWFnZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCAnQG5vbmUnKTtcbiAgICAgICAgICBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeVsnQGxhbmd1YWdlJ10sICdAbm9uZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnVpbGQgZmFzdCBDVVJJRSBtYXBcbiAgICBmb3IodmFyIGtleSBpbiBmYXN0Q3VyaWVNYXApIHtcbiAgICAgIF9idWlsZElyaU1hcChmYXN0Q3VyaWVNYXAsIGtleSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludmVyc2U7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gdG8gYnVpbGQgYSBsb29rdXAgbWFwIGZvciBxdWlja2x5IGZpbmRpbmdcbiAgICogcG90ZW50aWFsIENVUklFcy5cbiAgICpcbiAgICogQHBhcmFtIGlyaU1hcCB0aGUgbWFwIHRvIGJ1aWxkLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBjdXJyZW50IGtleSBpbiB0aGUgbWFwIHRvIHdvcmsgb24uXG4gICAqIEBwYXJhbSBpZHggdGhlIGluZGV4IGludG8gdGhlIElSSSB0byBjb21wYXJlLlxuICAgKi9cbiAgZnVuY3Rpb24gX2J1aWxkSXJpTWFwKGlyaU1hcCwga2V5LCBpZHgpIHtcbiAgICB2YXIgZW50cmllcyA9IGlyaU1hcFtrZXldO1xuICAgIHZhciBuZXh0ID0gaXJpTWFwW2tleV0gPSB7fTtcblxuICAgIHZhciBpcmk7XG4gICAgdmFyIGxldHRlcjtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgaXJpID0gZW50cmllc1tpXS5pcmk7XG4gICAgICBpZihpZHggPj0gaXJpLmxlbmd0aCkge1xuICAgICAgICBsZXR0ZXIgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldHRlciA9IGlyaVtpZHhdO1xuICAgICAgfVxuICAgICAgaWYobGV0dGVyIGluIG5leHQpIHtcbiAgICAgICAgbmV4dFtsZXR0ZXJdLnB1c2goZW50cmllc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0W2xldHRlcl0gPSBbZW50cmllc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKHZhciBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYoa2V5ID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIF9idWlsZElyaU1hcChuZXh0LCBrZXksIGlkeCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSB0ZXJtIGZvciB0aGUgZ2l2ZW4gZW50cnkgaWYgbm90IGFscmVhZHkgYWRkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBtYXBwaW5nIHRoZSB0ZXJtIG1hcHBpbmcuXG4gICAqIEBwYXJhbSB0ZXJtIHRoZSB0ZXJtIHRvIGFkZC5cbiAgICogQHBhcmFtIGVudHJ5IHRoZSBpbnZlcnNlIGNvbnRleHQgdHlwZU9yTGFuZ3VhZ2UgZW50cnkgdG8gYWRkIHRvLlxuICAgKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2VWYWx1ZSB0aGUga2V5IGluIHRoZSBlbnRyeSB0byBhZGQgdG8uXG4gICAqL1xuICBmdW5jdGlvbiBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSkge1xuICAgIGlmKCEodHlwZU9yTGFuZ3VhZ2VWYWx1ZSBpbiBlbnRyeSkpIHtcbiAgICAgIGVudHJ5W3R5cGVPckxhbmd1YWdlVmFsdWVdID0gdGVybTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIGFuIGFjdGl2ZSBjb250ZXh0LCBjcmVhdGluZyBhIGNoaWxkIGFjdGl2ZSBjb250ZXh0LlxuICAgKlxuICAgKiBAcmV0dXJuIGEgY2xvbmUgKGNoaWxkKSBvZiB0aGUgYWN0aXZlIGNvbnRleHQuXG4gICAqL1xuICBmdW5jdGlvbiBfY2xvbmVBY3RpdmVDb250ZXh0KCkge1xuICAgIHZhciBjaGlsZCA9IHt9O1xuICAgIGNoaWxkWydAYmFzZSddID0gdGhpc1snQGJhc2UnXTtcbiAgICBjaGlsZC5tYXBwaW5ncyA9IF9jbG9uZSh0aGlzLm1hcHBpbmdzKTtcbiAgICBjaGlsZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgY2hpbGQuaW52ZXJzZSA9IG51bGw7XG4gICAgY2hpbGQuZ2V0SW52ZXJzZSA9IHRoaXMuZ2V0SW52ZXJzZTtcbiAgICBpZignQGxhbmd1YWdlJyBpbiB0aGlzKSB7XG4gICAgICBjaGlsZFsnQGxhbmd1YWdlJ10gPSB0aGlzWydAbGFuZ3VhZ2UnXTtcbiAgICB9XG4gICAgaWYoJ0B2b2NhYicgaW4gdGhpcykge1xuICAgICAgY2hpbGRbJ0B2b2NhYiddID0gdGhpc1snQHZvY2FiJ107XG4gICAgfVxuICAgIHJldHVybiBjaGlsZDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHZhbHVlIGlzIGEga2V5d29yZC5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGtleXdvcmQsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzS2V5d29yZCh2KSB7XG4gIGlmKCFfaXNTdHJpbmcodikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoKHYpIHtcbiAgY2FzZSAnQGJhc2UnOlxuICBjYXNlICdAY29udGV4dCc6XG4gIGNhc2UgJ0Bjb250YWluZXInOlxuICBjYXNlICdAZGVmYXVsdCc6XG4gIGNhc2UgJ0BlbWJlZCc6XG4gIGNhc2UgJ0BleHBsaWNpdCc6XG4gIGNhc2UgJ0BncmFwaCc6XG4gIGNhc2UgJ0BpZCc6XG4gIGNhc2UgJ0BpbmRleCc6XG4gIGNhc2UgJ0BsYW5ndWFnZSc6XG4gIGNhc2UgJ0BsaXN0JzpcbiAgY2FzZSAnQG9taXREZWZhdWx0JzpcbiAgY2FzZSAnQHByZXNlcnZlJzpcbiAgY2FzZSAnQHJlcXVpcmVBbGwnOlxuICBjYXNlICdAcmV2ZXJzZSc6XG4gIGNhc2UgJ0BzZXQnOlxuICBjYXNlICdAdHlwZSc6XG4gIGNhc2UgJ0B2YWx1ZSc6XG4gIGNhc2UgJ0B2b2NhYic6XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gT2JqZWN0LlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIE9iamVjdCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNPYmplY3Qodikge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gZW1wdHkgT2JqZWN0LlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IE9iamVjdCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNFbXB0eU9iamVjdCh2KSB7XG4gIHJldHVybiBfaXNPYmplY3QodikgJiYgT2JqZWN0LmtleXModikubGVuZ3RoID09PSAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gQXJyYXkuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gQXJyYXksIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzQXJyYXkodikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBAdHlwZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZVR5cGVWYWx1ZSh2KSB7XG4gIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBlbXB0eSBvYmplY3RcbiAgaWYoX2lzU3RyaW5nKHYpIHx8IF9pc0VtcHR5T2JqZWN0KHYpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBhcnJheVxuICB2YXIgaXNWYWxpZCA9IGZhbHNlO1xuICBpZihfaXNBcnJheSh2KSkge1xuICAgIC8vIG11c3QgY29udGFpbiBvbmx5IHN0cmluZ3NcbiAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSkge1xuICAgICAgaWYoIShfaXNTdHJpbmcodltpXSkpKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYoIWlzVmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAdHlwZVwiIHZhbHVlIG11c3QgYSBzdHJpbmcsIGFuIGFycmF5IG9mICcgK1xuICAgICAgJ3N0cmluZ3MsIG9yIGFuIGVtcHR5IG9iamVjdC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgIHtjb2RlOiAnaW52YWxpZCB0eXBlIHZhbHVlJywgdmFsdWU6IHZ9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBTdHJpbmcuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBTdHJpbmcsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzU3RyaW5nKHYpIHtcbiAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHxcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodikgPT09ICdbb2JqZWN0IFN0cmluZ10nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgTnVtYmVyLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgTnVtYmVyLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc051bWJlcih2KSB7XG4gIHJldHVybiAodHlwZW9mIHYgPT09ICdudW1iZXInIHx8XG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBOdW1iZXJdJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRvdWJsZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGRvdWJsZSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNEb3VibGUodikge1xuICByZXR1cm4gX2lzTnVtYmVyKHYpICYmIFN0cmluZyh2KS5pbmRleE9mKCcuJykgIT09IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbnVtZXJpYy5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc051bWVyaWModikge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodikpICYmIGlzRmluaXRlKHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBCb29sZWFuLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgQm9vbGVhbiwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNCb29sZWFuKHYpIHtcbiAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBCb29sZWFuXScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNVbmRlZmluZWQodikge1xuICByZXR1cm4gKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHN1YmplY3Qgd2l0aCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3ViamVjdCB3aXRoIHByb3BlcnRpZXMsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzU3ViamVjdCh2KSB7XG4gIC8vIE5vdGU6IEEgdmFsdWUgaXMgYSBzdWJqZWN0IGlmIGFsbCBvZiB0aGVzZSBob2xkIHRydWU6XG4gIC8vIDEuIEl0IGlzIGFuIE9iamVjdC5cbiAgLy8gMi4gSXQgaXMgbm90IGEgQHZhbHVlLCBAc2V0LCBvciBAbGlzdC5cbiAgLy8gMy4gSXQgaGFzIG1vcmUgdGhhbiAxIGtleSBPUiBhbnkgZXhpc3Rpbmcga2V5IGlzIG5vdCBAaWQuXG4gIHZhciBydmFsID0gZmFsc2U7XG4gIGlmKF9pc09iamVjdCh2KSAmJlxuICAgICEoKCdAdmFsdWUnIGluIHYpIHx8ICgnQHNldCcgaW4gdikgfHwgKCdAbGlzdCcgaW4gdikpKSB7XG4gICAgdmFyIGtleUNvdW50ID0gT2JqZWN0LmtleXModikubGVuZ3RoO1xuICAgIHJ2YWwgPSAoa2V5Q291bnQgPiAxIHx8ICEoJ0BpZCcgaW4gdikpO1xuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBzdWJqZWN0IHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN1YmplY3QgcmVmZXJlbmNlLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc1N1YmplY3RSZWZlcmVuY2Uodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgc3ViamVjdCByZWZlcmVuY2UgaWYgYWxsIG9mIHRoZXNlIGhvbGQgdHJ1ZTpcbiAgLy8gMS4gSXQgaXMgYW4gT2JqZWN0LlxuICAvLyAyLiBJdCBoYXMgYSBzaW5nbGUga2V5OiBAaWQuXG4gIHJldHVybiAoX2lzT2JqZWN0KHYpICYmIE9iamVjdC5rZXlzKHYpLmxlbmd0aCA9PT0gMSAmJiAoJ0BpZCcgaW4gdikpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBAdmFsdWUuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBAdmFsdWUsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzVmFsdWUodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgQHZhbHVlIGlmIGFsbCBvZiB0aGVzZSBob2xkIHRydWU6XG4gIC8vIDEuIEl0IGlzIGFuIE9iamVjdC5cbiAgLy8gMi4gSXQgaGFzIHRoZSBAdmFsdWUgcHJvcGVydHkuXG4gIHJldHVybiBfaXNPYmplY3QodikgJiYgKCdAdmFsdWUnIGluIHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBAbGlzdC5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIEBsaXN0LCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc0xpc3Qodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgQGxpc3QgaWYgYWxsIG9mIHRoZXNlIGhvbGQgdHJ1ZTpcbiAgLy8gMS4gSXQgaXMgYW4gT2JqZWN0LlxuICAvLyAyLiBJdCBoYXMgdGhlIEBsaXN0IHByb3BlcnR5LlxuICByZXR1cm4gX2lzT2JqZWN0KHYpICYmICgnQGxpc3QnIGluIHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBibGFuayBub2RlLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgYmxhbmsgbm9kZSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNCbGFua05vZGUodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgYmxhbmsgbm9kZSBpZiBhbGwgb2YgdGhlc2UgaG9sZCB0cnVlOlxuICAvLyAxLiBJdCBpcyBhbiBPYmplY3QuXG4gIC8vIDIuIElmIGl0IGhhcyBhbiBAaWQga2V5IGl0cyB2YWx1ZSBiZWdpbnMgd2l0aCAnXzonLlxuICAvLyAzLiBJdCBoYXMgbm8ga2V5cyBPUiBpcyBub3QgYSBAdmFsdWUsIEBzZXQsIG9yIEBsaXN0LlxuICB2YXIgcnZhbCA9IGZhbHNlO1xuICBpZihfaXNPYmplY3QodikpIHtcbiAgICBpZignQGlkJyBpbiB2KSB7XG4gICAgICBydmFsID0gKHZbJ0BpZCddLmluZGV4T2YoJ186JykgPT09IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBydmFsID0gKE9iamVjdC5rZXlzKHYpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAhKCgnQHZhbHVlJyBpbiB2KSB8fCAoJ0BzZXQnIGluIHYpIHx8ICgnQGxpc3QnIGluIHYpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gYWJzb2x1dGUgSVJJLCBmYWxzZSBpZiBub3QuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYWJzb2x1dGUgSVJJLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc0Fic29sdXRlSXJpKHYpIHtcbiAgcmV0dXJuIF9pc1N0cmluZyh2KSAmJiB2LmluZGV4T2YoJzonKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG9iamVjdCwgYXJyYXksIG9yIHN0cmluZy9udW1iZXIuIElmIGEgdHlwZWQgSmF2YVNjcmlwdCBvYmplY3RcbiAqIGlzIGdpdmVuLCBzdWNoIGFzIGEgRGF0ZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9jbG9uZSh2YWx1ZSkge1xuICBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJ2YWw7XG4gICAgaWYoX2lzQXJyYXkodmFsdWUpKSB7XG4gICAgICBydmFsID0gW107XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcnZhbFtpXSA9IF9jbG9uZSh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKF9pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJ2YWwgPSB7fTtcbiAgICAgIGZvcih2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHJ2YWxba2V5XSA9IF9jbG9uZSh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcnZhbCA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBydmFsO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgQGNvbnRleHQgVVJMcyBpbiB0aGUgZ2l2ZW4gSlNPTi1MRCBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gdXJscyBhIG1hcCBvZiBVUkxzICh1cmwgPT4gZmFsc2UvQGNvbnRleHRzKS5cbiAqIEBwYXJhbSByZXBsYWNlIHRydWUgdG8gcmVwbGFjZSB0aGUgVVJMcyBpbiB0aGUgZ2l2ZW4gaW5wdXQgd2l0aCB0aGVcbiAqICAgICAgICAgICBAY29udGV4dHMgZnJvbSB0aGUgdXJscyBtYXAsIGZhbHNlIG5vdCB0by5cbiAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIElSSSB0byB1c2UgdG8gcmVzb2x2ZSByZWxhdGl2ZSBJUklzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgVVJMcyB0byByZXRyaWV2ZSB3ZXJlIGZvdW5kLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9maW5kQ29udGV4dFVybHMoaW5wdXQsIHVybHMsIHJlcGxhY2UsIGJhc2UpIHtcbiAgdmFyIGNvdW50ID0gT2JqZWN0LmtleXModXJscykubGVuZ3RoO1xuICBpZihfaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9maW5kQ29udGV4dFVybHMoaW5wdXRbaV0sIHVybHMsIHJlcGxhY2UsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGNvdW50IDwgT2JqZWN0LmtleXModXJscykubGVuZ3RoKTtcbiAgfSBlbHNlIGlmKF9pc09iamVjdChpbnB1dCkpIHtcbiAgICBmb3IodmFyIGtleSBpbiBpbnB1dCkge1xuICAgICAgaWYoa2V5ICE9PSAnQGNvbnRleHQnKSB7XG4gICAgICAgIF9maW5kQ29udGV4dFVybHMoaW5wdXRba2V5XSwgdXJscywgcmVwbGFjZSwgYmFzZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgQGNvbnRleHRcbiAgICAgIHZhciBjdHggPSBpbnB1dFtrZXldO1xuXG4gICAgICAvLyBhcnJheSBAY29udGV4dFxuICAgICAgaWYoX2lzQXJyYXkoY3R4KSkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gY3R4Lmxlbmd0aDtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIF9jdHggPSBjdHhbaV07XG4gICAgICAgICAgaWYoX2lzU3RyaW5nKF9jdHgpKSB7XG4gICAgICAgICAgICBfY3R4ID0ganNvbmxkLnByZXBlbmRCYXNlKGJhc2UsIF9jdHgpO1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB3L0Bjb250ZXh0IGlmIHJlcXVlc3RlZFxuICAgICAgICAgICAgaWYocmVwbGFjZSkge1xuICAgICAgICAgICAgICBfY3R4ID0gdXJsc1tfY3R4XTtcbiAgICAgICAgICAgICAgaWYoX2lzQXJyYXkoX2N0eCkpIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgZmxhdHRlbmVkIGNvbnRleHRcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGN0eCwgW2ksIDFdLmNvbmNhdChfY3R4KSk7XG4gICAgICAgICAgICAgICAgaSArPSBfY3R4Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gY3R4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHhbaV0gPSBfY3R4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYoIShfY3R4IGluIHVybHMpKSB7XG4gICAgICAgICAgICAgIC8vIEBjb250ZXh0IFVSTCBmb3VuZFxuICAgICAgICAgICAgICB1cmxzW19jdHhdID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoX2lzU3RyaW5nKGN0eCkpIHtcbiAgICAgICAgLy8gc3RyaW5nIEBjb250ZXh0XG4gICAgICAgIGN0eCA9IGpzb25sZC5wcmVwZW5kQmFzZShiYXNlLCBjdHgpO1xuICAgICAgICAvLyByZXBsYWNlIHcvQGNvbnRleHQgaWYgcmVxdWVzdGVkXG4gICAgICAgIGlmKHJlcGxhY2UpIHtcbiAgICAgICAgICBpbnB1dFtrZXldID0gdXJsc1tjdHhdO1xuICAgICAgICB9IGVsc2UgaWYoIShjdHggaW4gdXJscykpIHtcbiAgICAgICAgICAvLyBAY29udGV4dCBVUkwgZm91bmRcbiAgICAgICAgICB1cmxzW2N0eF0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKGNvdW50IDwgT2JqZWN0LmtleXModXJscykubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGV4dGVybmFsIEBjb250ZXh0IFVSTHMgdXNpbmcgdGhlIGdpdmVuIGRvY3VtZW50IGxvYWRlci4gRXZlcnlcbiAqIGluc3RhbmNlIG9mIEBjb250ZXh0IGluIHRoZSBpbnB1dCB0aGF0IHJlZmVycyB0byBhIFVSTCB3aWxsIGJlIHJlcGxhY2VkXG4gKiB3aXRoIHRoZSBKU09OIEBjb250ZXh0IGZvdW5kIGF0IHRoYXQgVVJMLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgSlNPTi1MRCBpbnB1dCB3aXRoIHBvc3NpYmxlIGNvbnRleHRzLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBpbnB1dCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmZ1bmN0aW9uIF9yZXRyaWV2ZUNvbnRleHRVcmxzKGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAvLyBpZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyBVUkwgcmVzb2x1dGlvbiwgcXVpdFxuICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gIC8vIHJlY3Vyc2l2ZSBkb2N1bWVudCBsb2FkZXJcbiAgdmFyIGRvY3VtZW50TG9hZGVyID0gb3B0aW9ucy5kb2N1bWVudExvYWRlcjtcbiAgdmFyIHJldHJpZXZlID0gZnVuY3Rpb24oaW5wdXQsIGN5Y2xlcywgZG9jdW1lbnRMb2FkZXIsIGJhc2UsIGNhbGxiYWNrKSB7XG4gICAgaWYoT2JqZWN0LmtleXMoY3ljbGVzKS5sZW5ndGggPiBNQVhfQ09OVEVYVF9VUkxTKSB7XG4gICAgICBlcnJvciA9IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ01heGltdW0gbnVtYmVyIG9mIEBjb250ZXh0IFVSTHMgZXhjZWVkZWQuJyxcbiAgICAgICAgJ2pzb25sZC5Db250ZXh0VXJsRXJyb3InLFxuICAgICAgICB7Y29kZTogJ2xvYWRpbmcgcmVtb3RlIGNvbnRleHQgZmFpbGVkJywgbWF4OiBNQVhfQ09OVEVYVF9VUkxTfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGZvciB0cmFja2luZyB0aGUgVVJMcyB0byByZXRyaWV2ZVxuICAgIHZhciB1cmxzID0ge307XG5cbiAgICAvLyBmaW5pc2hlZCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBVUkwgcXVldWUgaXMgZW1wdHlcbiAgICB2YXIgZmluaXNoZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIHJlcGxhY2UgYWxsIFVSTHMgaW4gdGhlIGlucHV0XG4gICAgICBfZmluZENvbnRleHRVcmxzKGlucHV0LCB1cmxzLCB0cnVlLCBiYXNlKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gZmluZCBhbGwgVVJMcyBpbiB0aGUgZ2l2ZW4gaW5wdXRcbiAgICBpZighX2ZpbmRDb250ZXh0VXJscyhpbnB1dCwgdXJscywgZmFsc2UsIGJhc2UpKSB7XG4gICAgICAvLyBubyBuZXcgVVJMcyBpbiBpbnB1dFxuICAgICAgcmV0dXJuIGZpbmlzaGVkKCk7XG4gICAgfVxuXG4gICAgLy8gcXVldWUgYWxsIHVucmV0cmlldmVkIFVSTHNcbiAgICB2YXIgcXVldWUgPSBbXTtcbiAgICBmb3IodmFyIHVybCBpbiB1cmxzKSB7XG4gICAgICBpZih1cmxzW3VybF0gPT09IGZhbHNlKSB7XG4gICAgICAgIHF1ZXVlLnB1c2godXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXRyaWV2ZSBVUkxzIGluIHF1ZXVlXG4gICAgdmFyIGNvdW50ID0gcXVldWUubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgKGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgY29udGV4dCBVUkwgY3ljbGVcbiAgICAgICAgaWYodXJsIGluIGN5Y2xlcykge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgJ0N5Y2xpY2FsIEBjb250ZXh0IFVSTHMgZGV0ZWN0ZWQuJyxcbiAgICAgICAgICAgICdqc29ubGQuQ29udGV4dFVybEVycm9yJyxcbiAgICAgICAgICAgIHtjb2RlOiAncmVjdXJzaXZlIGNvbnRleHQgaW5jbHVzaW9uJywgdXJsOiB1cmx9KTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfY3ljbGVzID0gX2Nsb25lKGN5Y2xlcyk7XG4gICAgICAgIF9jeWNsZXNbdXJsXSA9IHRydWU7XG4gICAgICAgIHZhciBkb25lID0gZnVuY3Rpb24oZXJyLCByZW1vdGVEb2MpIHtcbiAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIGFub3RoZXIgVVJMXG4gICAgICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3R4ID0gcmVtb3RlRG9jID8gcmVtb3RlRG9jLmRvY3VtZW50IDogbnVsbDtcblxuICAgICAgICAgIC8vIHBhcnNlIHN0cmluZyBjb250ZXh0IGFzIEpTT05cbiAgICAgICAgICBpZighZXJyICYmIF9pc1N0cmluZyhjdHgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjdHggPSBKU09OLnBhcnNlKGN0eCk7XG4gICAgICAgICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgICAgICAgIGVyciA9IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVuc3VyZSBjdHggaXMgYW4gb2JqZWN0XG4gICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdEZXJlZmVyZW5jaW5nIGEgVVJMIGRpZCBub3QgcmVzdWx0IGluIGEgdmFsaWQgSlNPTi1MRCBvYmplY3QuICcgK1xuICAgICAgICAgICAgICAnUG9zc2libGUgY2F1c2VzIGFyZSBhbiBpbmFjY2Vzc2libGUgVVJMIHBlcmhhcHMgZHVlIHRvICcgK1xuICAgICAgICAgICAgICAnYSBzYW1lLW9yaWdpbiBwb2xpY3kgKGVuc3VyZSB0aGUgc2VydmVyIHVzZXMgQ09SUyBpZiB5b3UgYXJlICcgK1xuICAgICAgICAgICAgICAndXNpbmcgY2xpZW50LXNpZGUgSmF2YVNjcmlwdCksIHRvbyBtYW55IHJlZGlyZWN0cywgYSAnICtcbiAgICAgICAgICAgICAgJ25vbi1KU09OIHJlc3BvbnNlLCBvciBtb3JlIHRoYW4gb25lIEhUVFAgTGluayBIZWFkZXIgd2FzICcgK1xuICAgICAgICAgICAgICAncHJvdmlkZWQgZm9yIGEgcmVtb3RlIGNvbnRleHQuJyxcbiAgICAgICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJyxcbiAgICAgICAgICAgICAge2NvZGU6ICdsb2FkaW5nIHJlbW90ZSBjb250ZXh0IGZhaWxlZCcsIHVybDogdXJsLCBjYXVzZTogZXJyfSk7XG4gICAgICAgICAgfSBlbHNlIGlmKCFfaXNPYmplY3QoY3R4KSkge1xuICAgICAgICAgICAgZXJyID0gbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgICAnRGVyZWZlcmVuY2luZyBhIFVSTCBkaWQgbm90IHJlc3VsdCBpbiBhIEpTT04gb2JqZWN0LiBUaGUgJyArXG4gICAgICAgICAgICAgICdyZXNwb25zZSB3YXMgdmFsaWQgSlNPTiwgYnV0IGl0IHdhcyBub3QgYSBKU09OIG9iamVjdC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLFxuICAgICAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgcmVtb3RlIGNvbnRleHQnLCB1cmw6IHVybCwgY2F1c2U6IGVycn0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB1c2UgZW1wdHkgY29udGV4dCBpZiBubyBAY29udGV4dCBrZXkgaXMgcHJlc2VudFxuICAgICAgICAgIGlmKCEoJ0Bjb250ZXh0JyBpbiBjdHgpKSB7XG4gICAgICAgICAgICBjdHggPSB7J0Bjb250ZXh0Jzoge319O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHggPSB7J0Bjb250ZXh0JzogY3R4WydAY29udGV4dCddfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhcHBlbmQgY29udGV4dCBVUkwgdG8gY29udGV4dCBpZiBnaXZlblxuICAgICAgICAgIGlmKHJlbW90ZURvYy5jb250ZXh0VXJsKSB7XG4gICAgICAgICAgICBpZighX2lzQXJyYXkoY3R4WydAY29udGV4dCddKSkge1xuICAgICAgICAgICAgICBjdHhbJ0Bjb250ZXh0J10gPSBbY3R4WydAY29udGV4dCddXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eFsnQGNvbnRleHQnXS5wdXNoKHJlbW90ZURvYy5jb250ZXh0VXJsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyByZWN1cnNlXG4gICAgICAgICAgcmV0cmlldmUoY3R4LCBfY3ljbGVzLCBkb2N1bWVudExvYWRlciwgdXJsLCBmdW5jdGlvbihlcnIsIGN0eCkge1xuICAgICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsc1t1cmxdID0gY3R4WydAY29udGV4dCddO1xuICAgICAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgICAgIGlmKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgIGZpbmlzaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBwcm9taXNlID0gZG9jdW1lbnRMb2FkZXIodXJsLCBkb25lKTtcbiAgICAgICAgaWYocHJvbWlzZSAmJiAndGhlbicgaW4gcHJvbWlzZSkge1xuICAgICAgICAgIHByb21pc2UudGhlbihkb25lLmJpbmQobnVsbCwgbnVsbCksIGRvbmUpO1xuICAgICAgICB9XG4gICAgICB9KHF1ZXVlW2ldKSk7XG4gICAgfVxuICB9O1xuICByZXRyaWV2ZShpbnB1dCwge30sIGRvY3VtZW50TG9hZGVyLCBvcHRpb25zLmJhc2UsIGNhbGxiYWNrKTtcbn1cblxuLy8gZGVmaW5lIGpzIDEuOC41IE9iamVjdC5rZXlzIG1ldGhvZCBpZiBub3QgcHJlc2VudFxuaWYoIU9iamVjdC5rZXlzKSB7XG4gIE9iamVjdC5rZXlzID0gZnVuY3Rpb24obykge1xuICAgIGlmKG8gIT09IE9iamVjdChvKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcbiAgICB9XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICBmb3IodmFyIHAgaW4gbykge1xuICAgICAgaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSB7XG4gICAgICAgIHJ2YWwucHVzaChwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIFJERiBpbiB0aGUgZm9ybSBvZiBOLVF1YWRzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgTi1RdWFkcyBpbnB1dCB0byBwYXJzZS5cbiAqXG4gKiBAcmV0dXJuIGFuIFJERiBkYXRhc2V0LlxuICovXG5mdW5jdGlvbiBfcGFyc2VOUXVhZHMoaW5wdXQpIHtcbiAgLy8gZGVmaW5lIHBhcnRpYWwgcmVnZXhlc1xuICB2YXIgaXJpID0gJyg/OjwoW146XSs6W14+XSopPiknO1xuICB2YXIgYm5vZGUgPSAnKF86KD86W0EtWmEtejAtOV0rKSknO1xuICB2YXIgcGxhaW4gPSAnXCIoW15cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlwiXFxcXFxcXFxdKikqKVwiJztcbiAgdmFyIGRhdGF0eXBlID0gJyg/OlxcXFxeXFxcXF4nICsgaXJpICsgJyknO1xuICB2YXIgbGFuZ3VhZ2UgPSAnKD86QChbYS16XSsoPzotW2EtejAtOV0rKSopKSc7XG4gIHZhciBsaXRlcmFsID0gJyg/OicgKyBwbGFpbiArICcoPzonICsgZGF0YXR5cGUgKyAnfCcgKyBsYW5ndWFnZSArICcpPyknO1xuICB2YXIgY29tbWVudCA9ICcoPzojLiopPyc7XG4gIHZhciB3cyA9ICdbIFxcXFx0XSsnO1xuICB2YXIgd3NvID0gJ1sgXFxcXHRdKic7XG4gIHZhciBlb2xuID0gLyg/Olxcclxcbil8KD86XFxuKXwoPzpcXHIpL2c7XG4gIHZhciBlbXB0eSA9IG5ldyBSZWdFeHAoJ14nICsgd3NvICsgY29tbWVudCArICckJyk7XG5cbiAgLy8gZGVmaW5lIHF1YWQgcGFydCByZWdleGVzXG4gIHZhciBzdWJqZWN0ID0gJyg/OicgKyBpcmkgKyAnfCcgKyBibm9kZSArICcpJyArIHdzO1xuICB2YXIgcHJvcGVydHkgPSBpcmkgKyB3cztcbiAgdmFyIG9iamVjdCA9ICcoPzonICsgaXJpICsgJ3wnICsgYm5vZGUgKyAnfCcgKyBsaXRlcmFsICsgJyknICsgd3NvO1xuICB2YXIgZ3JhcGhOYW1lID0gJyg/OlxcXFwufCg/Oig/OicgKyBpcmkgKyAnfCcgKyBibm9kZSArICcpJyArIHdzbyArICdcXFxcLikpJztcblxuICAvLyBmdWxsIHF1YWQgcmVnZXhcbiAgdmFyIHF1YWQgPSBuZXcgUmVnRXhwKFxuICAgICdeJyArIHdzbyArIHN1YmplY3QgKyBwcm9wZXJ0eSArIG9iamVjdCArIGdyYXBoTmFtZSArIHdzbyArIGNvbW1lbnQgKyAnJCcpO1xuXG4gIC8vIGJ1aWxkIFJERiBkYXRhc2V0XG4gIHZhciBkYXRhc2V0ID0ge307XG5cbiAgLy8gc3BsaXQgTi1RdWFkIGlucHV0IGludG8gbGluZXNcbiAgdmFyIGxpbmVzID0gaW5wdXQuc3BsaXQoZW9sbik7XG4gIHZhciBsaW5lTnVtYmVyID0gMDtcbiAgZm9yKHZhciBsaSA9IDA7IGxpIDwgbGluZXMubGVuZ3RoOyArK2xpKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc1tsaV07XG4gICAgbGluZU51bWJlcisrO1xuXG4gICAgLy8gc2tpcCBlbXB0eSBsaW5lc1xuICAgIGlmKGVtcHR5LnRlc3QobGluZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHF1YWRcbiAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHF1YWQpO1xuICAgIGlmKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdFcnJvciB3aGlsZSBwYXJzaW5nIE4tUXVhZHM7IGludmFsaWQgcXVhZC4nLFxuICAgICAgICAnanNvbmxkLlBhcnNlRXJyb3InLCB7bGluZTogbGluZU51bWJlcn0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBSREYgdHJpcGxlXG4gICAgdmFyIHRyaXBsZSA9IHt9O1xuXG4gICAgLy8gZ2V0IHN1YmplY3RcbiAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzFdKSkge1xuICAgICAgdHJpcGxlLnN1YmplY3QgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBtYXRjaFsxXX07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IG1hdGNoWzJdfTtcbiAgICB9XG5cbiAgICAvLyBnZXQgcHJlZGljYXRlXG4gICAgdHJpcGxlLnByZWRpY2F0ZSA9IHt0eXBlOiAnSVJJJywgdmFsdWU6IG1hdGNoWzNdfTtcblxuICAgIC8vIGdldCBvYmplY3RcbiAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzRdKSkge1xuICAgICAgdHJpcGxlLm9iamVjdCA9IHt0eXBlOiAnSVJJJywgdmFsdWU6IG1hdGNoWzRdfTtcbiAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs1XSkpIHtcbiAgICAgIHRyaXBsZS5vYmplY3QgPSB7dHlwZTogJ2JsYW5rIG5vZGUnLCB2YWx1ZTogbWF0Y2hbNV19O1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlwbGUub2JqZWN0ID0ge3R5cGU6ICdsaXRlcmFsJ307XG4gICAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzddKSkge1xuICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gbWF0Y2hbN107XG4gICAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs4XSkpIHtcbiAgICAgICAgdHJpcGxlLm9iamVjdC5kYXRhdHlwZSA9IFJERl9MQU5HU1RSSU5HO1xuICAgICAgICB0cmlwbGUub2JqZWN0Lmxhbmd1YWdlID0gbWF0Y2hbOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gWFNEX1NUUklORztcbiAgICAgIH1cbiAgICAgIHZhciB1bmVzY2FwZWQgPSBtYXRjaFs2XVxuICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcdC9nLCAnXFx0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgICAucmVwbGFjZSgvXFxcXHIvZywgJ1xccicpXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgdHJpcGxlLm9iamVjdC52YWx1ZSA9IHVuZXNjYXBlZDtcbiAgICB9XG5cbiAgICAvLyBnZXQgZ3JhcGggbmFtZSAoJ0BkZWZhdWx0JyBpcyB1c2VkIGZvciB0aGUgZGVmYXVsdCBncmFwaClcbiAgICB2YXIgbmFtZSA9ICdAZGVmYXVsdCc7XG4gICAgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs5XSkpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFs5XTtcbiAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFsxMF0pKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMTBdO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgZ3JhcGggaW4gZGF0YXNldFxuICAgIGlmKCEobmFtZSBpbiBkYXRhc2V0KSkge1xuICAgICAgZGF0YXNldFtuYW1lXSA9IFt0cmlwbGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhZGQgdHJpcGxlIGlmIHVuaXF1ZSB0byBpdHMgZ3JhcGhcbiAgICAgIHZhciB1bmlxdWUgPSB0cnVlO1xuICAgICAgdmFyIHRyaXBsZXMgPSBkYXRhc2V0W25hbWVdO1xuICAgICAgZm9yKHZhciB0aSA9IDA7IHVuaXF1ZSAmJiB0aSA8IHRyaXBsZXMubGVuZ3RoOyArK3RpKSB7XG4gICAgICAgIGlmKF9jb21wYXJlUkRGVHJpcGxlcyh0cmlwbGVzW3RpXSwgdHJpcGxlKSkge1xuICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih1bmlxdWUpIHtcbiAgICAgICAgdHJpcGxlcy5wdXNoKHRyaXBsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGFzZXQ7XG59XG5cbi8vIHJlZ2lzdGVyIHRoZSBOLVF1YWRzIFJERiBwYXJzZXJcbmpzb25sZC5yZWdpc3RlclJERlBhcnNlcignYXBwbGljYXRpb24vbnF1YWRzJywgX3BhcnNlTlF1YWRzKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgZGF0YXNldCB0byBOLVF1YWRzLlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0IHRoZSBSREYgZGF0YXNldCB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIE4tUXVhZHMgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBfdG9OUXVhZHMoZGF0YXNldCkge1xuICB2YXIgcXVhZHMgPSBbXTtcbiAgZm9yKHZhciBncmFwaE5hbWUgaW4gZGF0YXNldCkge1xuICAgIHZhciB0cmlwbGVzID0gZGF0YXNldFtncmFwaE5hbWVdO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IHRyaXBsZXMubGVuZ3RoOyArK3RpKSB7XG4gICAgICB2YXIgdHJpcGxlID0gdHJpcGxlc1t0aV07XG4gICAgICBpZihncmFwaE5hbWUgPT09ICdAZGVmYXVsdCcpIHtcbiAgICAgICAgZ3JhcGhOYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHF1YWRzLnB1c2goX3RvTlF1YWQodHJpcGxlLCBncmFwaE5hbWUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHF1YWRzLnNvcnQoKS5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgdHJpcGxlIGFuZCBncmFwaCBuYW1lIHRvIGFuIE4tUXVhZCBzdHJpbmcgKGEgc2luZ2xlIHF1YWQpLlxuICpcbiAqIEBwYXJhbSB0cmlwbGUgdGhlIFJERiB0cmlwbGUgb3IgcXVhZCB0byBjb252ZXJ0IChhIHRyaXBsZSBvciBxdWFkIG1heSBiZVxuICogICAgICAgICAgcGFzc2VkLCBpZiBhIHRyaXBsZSBpcyBwYXNzZWQgdGhlbiBgZ3JhcGhOYW1lYCBzaG91bGQgYmUgZ2l2ZW5cbiAqICAgICAgICAgIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGdyYXBoIHRoZSB0cmlwbGUgaXMgaW4sIGBudWxsYCBmb3JcbiAqICAgICAgICAgIHRoZSBkZWZhdWx0IGdyYXBoKS5cbiAqIEBwYXJhbSBncmFwaE5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyYXBoIGNvbnRhaW5pbmcgdGhlIHRyaXBsZSwgbnVsbCBmb3JcbiAqICAgICAgICAgIHRoZSBkZWZhdWx0IGdyYXBoLlxuICpcbiAqIEByZXR1cm4gdGhlIE4tUXVhZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIF90b05RdWFkKHRyaXBsZSwgZ3JhcGhOYW1lKSB7XG4gIHZhciBzID0gdHJpcGxlLnN1YmplY3Q7XG4gIHZhciBwID0gdHJpcGxlLnByZWRpY2F0ZTtcbiAgdmFyIG8gPSB0cmlwbGUub2JqZWN0O1xuICB2YXIgZyA9IGdyYXBoTmFtZSB8fCBudWxsO1xuICBpZignbmFtZScgaW4gdHJpcGxlICYmIHRyaXBsZS5uYW1lKSB7XG4gICAgZyA9IHRyaXBsZS5uYW1lLnZhbHVlO1xuICB9XG5cbiAgdmFyIHF1YWQgPSAnJztcblxuICAvLyBzdWJqZWN0IGlzIGFuIElSSVxuICBpZihzLnR5cGUgPT09ICdJUkknKSB7XG4gICAgcXVhZCArPSAnPCcgKyBzLnZhbHVlICsgJz4nO1xuICB9IGVsc2Uge1xuICAgIHF1YWQgKz0gcy52YWx1ZTtcbiAgfVxuICBxdWFkICs9ICcgJztcblxuICAvLyBwcmVkaWNhdGUgaXMgYW4gSVJJXG4gIGlmKHAudHlwZSA9PT0gJ0lSSScpIHtcbiAgICBxdWFkICs9ICc8JyArIHAudmFsdWUgKyAnPic7XG4gIH0gZWxzZSB7XG4gICAgcXVhZCArPSBwLnZhbHVlO1xuICB9XG4gIHF1YWQgKz0gJyAnO1xuXG4gIC8vIG9iamVjdCBpcyBJUkksIGJub2RlLCBvciBsaXRlcmFsXG4gIGlmKG8udHlwZSA9PT0gJ0lSSScpIHtcbiAgICBxdWFkICs9ICc8JyArIG8udmFsdWUgKyAnPic7XG4gIH0gZWxzZSBpZihvLnR5cGUgPT09ICdibGFuayBub2RlJykge1xuICAgIHF1YWQgKz0gby52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXNjYXBlZCA9IG8udmFsdWVcbiAgICAgIC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpXG4gICAgICAucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpXG4gICAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgICAucmVwbGFjZSgvXFxyL2csICdcXFxccicpXG4gICAgICAucmVwbGFjZSgvXFxcIi9nLCAnXFxcXFwiJyk7XG4gICAgcXVhZCArPSAnXCInICsgZXNjYXBlZCArICdcIic7XG4gICAgaWYoby5kYXRhdHlwZSA9PT0gUkRGX0xBTkdTVFJJTkcpIHtcbiAgICAgIGlmKG8ubGFuZ3VhZ2UpIHtcbiAgICAgICAgcXVhZCArPSAnQCcgKyBvLmxhbmd1YWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihvLmRhdGF0eXBlICE9PSBYU0RfU1RSSU5HKSB7XG4gICAgICBxdWFkICs9ICdeXjwnICsgby5kYXRhdHlwZSArICc+JztcbiAgICB9XG4gIH1cblxuICAvLyBncmFwaFxuICBpZihnICE9PSBudWxsICYmIGcgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmKGcuaW5kZXhPZignXzonKSAhPT0gMCkge1xuICAgICAgcXVhZCArPSAnIDwnICsgZyArICc+JztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVhZCArPSAnICcgKyBnO1xuICAgIH1cbiAgfVxuXG4gIHF1YWQgKz0gJyAuXFxuJztcbiAgcmV0dXJuIHF1YWQ7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBSREYgZGF0YXNldCBmb3VuZCB2aWEgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIFJERmEgQVBJLlxuICpcbiAqIEBwYXJhbSBkYXRhIHRoZSBSREZhIEFQSSBkYXRhIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBSREYgZGF0YXNldC5cbiAqL1xuZnVuY3Rpb24gX3BhcnNlUmRmYUFwaURhdGEoZGF0YSkge1xuICB2YXIgZGF0YXNldCA9IHt9O1xuICBkYXRhc2V0WydAZGVmYXVsdCddID0gW107XG5cbiAgdmFyIHN1YmplY3RzID0gZGF0YS5nZXRTdWJqZWN0cygpO1xuICBmb3IodmFyIHNpID0gMDsgc2kgPCBzdWJqZWN0cy5sZW5ndGg7ICsrc2kpIHtcbiAgICB2YXIgc3ViamVjdCA9IHN1YmplY3RzW3NpXTtcbiAgICBpZihzdWJqZWN0ID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgYWxsIHJlbGF0ZWQgdHJpcGxlc1xuICAgIHZhciB0cmlwbGVzID0gZGF0YS5nZXRTdWJqZWN0VHJpcGxlcyhzdWJqZWN0KTtcbiAgICBpZih0cmlwbGVzID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHByZWRpY2F0ZXMgPSB0cmlwbGVzLnByZWRpY2F0ZXM7XG4gICAgZm9yKHZhciBwcmVkaWNhdGUgaW4gcHJlZGljYXRlcykge1xuICAgICAgLy8gaXRlcmF0ZSBvdmVyIG9iamVjdHNcbiAgICAgIHZhciBvYmplY3RzID0gcHJlZGljYXRlc1twcmVkaWNhdGVdLm9iamVjdHM7XG4gICAgICBmb3IodmFyIG9pID0gMDsgb2kgPCBvYmplY3RzLmxlbmd0aDsgKytvaSkge1xuICAgICAgICB2YXIgb2JqZWN0ID0gb2JqZWN0c1tvaV07XG5cbiAgICAgICAgLy8gY3JlYXRlIFJERiB0cmlwbGVcbiAgICAgICAgdmFyIHRyaXBsZSA9IHt9O1xuXG4gICAgICAgIC8vIGFkZCBzdWJqZWN0XG4gICAgICAgIGlmKHN1YmplY3QuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IHN1YmplY3R9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdJUkknLCB2YWx1ZTogc3ViamVjdH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcHJlZGljYXRlXG4gICAgICAgIGlmKHByZWRpY2F0ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgdHJpcGxlLnByZWRpY2F0ZSA9IHt0eXBlOiAnYmxhbmsgbm9kZScsIHZhbHVlOiBwcmVkaWNhdGV9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyaXBsZS5wcmVkaWNhdGUgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBwcmVkaWNhdGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VyaWFsaXplIFhNTCBsaXRlcmFsXG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdC52YWx1ZTtcbiAgICAgICAgaWYob2JqZWN0LnR5cGUgPT09IFJERl9YTUxfTElURVJBTCkge1xuICAgICAgICAgIC8vIGluaXRpYWxpemUgWE1MU2VyaWFsaXplclxuICAgICAgICAgIGlmKCFYTUxTZXJpYWxpemVyKSB7XG4gICAgICAgICAgICBfZGVmaW5lWE1MU2VyaWFsaXplcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICBmb3IodmFyIHggPSAwOyB4IDwgb2JqZWN0LnZhbHVlLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZihvYmplY3QudmFsdWVbeF0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcob2JqZWN0LnZhbHVlW3hdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihvYmplY3QudmFsdWVbeF0ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IG9iamVjdC52YWx1ZVt4XS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIG9iamVjdFxuICAgICAgICB0cmlwbGUub2JqZWN0ID0ge307XG5cbiAgICAgICAgLy8gb2JqZWN0IGlzIGFuIElSSVxuICAgICAgICBpZihvYmplY3QudHlwZSA9PT0gUkRGX09CSkVDVCkge1xuICAgICAgICAgIGlmKG9iamVjdC52YWx1ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgICB0cmlwbGUub2JqZWN0LnR5cGUgPSAnYmxhbmsgbm9kZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaXBsZS5vYmplY3QudHlwZSA9ICdJUkknO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvYmplY3QgaXMgYSBsaXRlcmFsXG4gICAgICAgICAgdHJpcGxlLm9iamVjdC50eXBlID0gJ2xpdGVyYWwnO1xuICAgICAgICAgIGlmKG9iamVjdC50eXBlID09PSBSREZfUExBSU5fTElURVJBTCkge1xuICAgICAgICAgICAgaWYob2JqZWN0Lmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgIHRyaXBsZS5vYmplY3QuZGF0YXR5cGUgPSBSREZfTEFOR1NUUklORztcbiAgICAgICAgICAgICAgdHJpcGxlLm9iamVjdC5sYW5ndWFnZSA9IG9iamVjdC5sYW5ndWFnZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaXBsZS5vYmplY3QuZGF0YXR5cGUgPSBYU0RfU1RSSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gb2JqZWN0LnR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyaXBsZS5vYmplY3QudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAvLyBhZGQgdHJpcGxlIHRvIGRhdGFzZXQgaW4gZGVmYXVsdCBncmFwaFxuICAgICAgICBkYXRhc2V0WydAZGVmYXVsdCddLnB1c2godHJpcGxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YXNldDtcbn1cblxuLy8gcmVnaXN0ZXIgdGhlIFJERmEgQVBJIFJERiBwYXJzZXJcbmpzb25sZC5yZWdpc3RlclJERlBhcnNlcigncmRmYS1hcGknLCBfcGFyc2VSZGZhQXBpRGF0YSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJZGVudGlmaWVySXNzdWVyLiBBIElkZW50aWZpZXJJc3N1ZXIgaXNzdWVzIHVuaXF1ZVxuICogaWRlbnRpZmllcnMsIGtlZXBpbmcgdHJhY2sgb2YgYW55IHByZXZpb3VzbHkgaXNzdWVkIGlkZW50aWZpZXJzLlxuICpcbiAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byB1c2UgKCc8cHJlZml4Pjxjb3VudGVyPicpLlxuICovXG5mdW5jdGlvbiBJZGVudGlmaWVySXNzdWVyKHByZWZpeCkge1xuICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgdGhpcy5jb3VudGVyID0gMDtcbiAgdGhpcy5leGlzdGluZyA9IHt9O1xufVxuanNvbmxkLklkZW50aWZpZXJJc3N1ZXIgPSBJZGVudGlmaWVySXNzdWVyO1xuLy8gYmFja3dhcmRzLWNvbXBhYmlsaXR5XG5qc29ubGQuVW5pcXVlTmFtZXIgPSBJZGVudGlmaWVySXNzdWVyO1xuXG4vKipcbiAqIENvcGllcyB0aGlzIElkZW50aWZpZXJJc3N1ZXIuXG4gKlxuICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBJZGVudGlmaWVySXNzdWVyLlxuICovXG5JZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29weSA9IG5ldyBJZGVudGlmaWVySXNzdWVyKHRoaXMucHJlZml4KTtcbiAgY29weS5jb3VudGVyID0gdGhpcy5jb3VudGVyO1xuICBjb3B5LmV4aXN0aW5nID0gX2Nsb25lKHRoaXMuZXhpc3RpbmcpO1xuICByZXR1cm4gY29weTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbmV3IGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiBvbGQgaWRlbnRpZmllciwgd2hlcmUgaWYgbm8gb2xkXG4gKiBpZGVudGlmaWVyIGlzIGdpdmVuIGEgbmV3IGlkZW50aWZpZXIgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKlxuICogQHBhcmFtIFtvbGRdIHRoZSBvbGQgaWRlbnRpZmllciB0byBnZXQgdGhlIG5ldyBpZGVudGlmaWVyIGZvci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXcgaWRlbnRpZmllci5cbiAqL1xuSWRlbnRpZmllcklzc3Vlci5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbihvbGQpIHtcbiAgLy8gcmV0dXJuIGV4aXN0aW5nIG9sZCBpZGVudGlmaWVyXG4gIGlmKG9sZCAmJiBvbGQgaW4gdGhpcy5leGlzdGluZykge1xuICAgIHJldHVybiB0aGlzLmV4aXN0aW5nW29sZF07XG4gIH1cblxuICAvLyBnZXQgbmV4dCBpZGVudGlmaWVyXG4gIHZhciBpZGVudGlmaWVyID0gdGhpcy5wcmVmaXggKyB0aGlzLmNvdW50ZXI7XG4gIHRoaXMuY291bnRlciArPSAxO1xuXG4gIC8vIHNhdmUgbWFwcGluZ1xuICBpZihvbGQpIHtcbiAgICB0aGlzLmV4aXN0aW5nW29sZF0gPSBpZGVudGlmaWVyO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59O1xuLy8gYWxpYXNcbklkZW50aWZpZXJJc3N1ZXIucHJvdG90eXBlLmdldE5hbWUgPSBJZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5nZXROYW1lO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2xkIGlkZW50aWZlciBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkIGEgbmV3XG4gKiBpZGVudGlmaWVyLlxuICpcbiAqIEBwYXJhbSBvbGQgdGhlIG9sZCBpZGVudGlmaWVyIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2xkIGlkZW50aWZpZXIgaGFzIGJlZW4gYXNzaWduZWQgYSBuZXcgaWRlbnRpZmllciwgZmFsc2VcbiAqICAgaWYgbm90LlxuICovXG5JZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uKG9sZCkge1xuICByZXR1cm4gKG9sZCBpbiB0aGlzLmV4aXN0aW5nKTtcbn07XG4vLyBhbGlhc1xuSWRlbnRpZmllcklzc3Vlci5wcm90b3R5cGUuaXNOYW1lZCA9IElkZW50aWZpZXJJc3N1ZXIucHJvdG90eXBlLmhhc0lkO1xuXG4vKipcbiAqIEEgUGVybXV0YXRvciBpdGVyYXRlcyBvdmVyIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhlIGdpdmVuIGFycmF5XG4gKiBvZiBlbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0gbGlzdCB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gaXRlcmF0ZSBvdmVyLlxuICovXG52YXIgUGVybXV0YXRvciA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgLy8gb3JpZ2luYWwgYXJyYXlcbiAgdGhpcy5saXN0ID0gbGlzdC5zb3J0KCk7XG4gIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBlcm11dGF0aW9uc1xuICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgLy8gZGlyZWN0aW9uYWwgaW5mbyBmb3IgcGVybXV0YXRpb24gYWxnb3JpdGhtXG4gIHRoaXMubGVmdCA9IHt9O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHRoaXMubGVmdFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFub3RoZXIgcGVybXV0YXRpb24uXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFub3RoZXIgcGVybXV0YXRpb24sIGZhbHNlIGlmIG5vdC5cbiAqL1xuUGVybXV0YXRvci5wcm90b3R5cGUuaGFzTmV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMuZG9uZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBwZXJtdXRhdGlvbi4gQ2FsbCBoYXNOZXh0KCkgdG8gZW5zdXJlIHRoZXJlIGlzIGFub3RoZXIgb25lXG4gKiBmaXJzdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXh0IHBlcm11dGF0aW9uLlxuICovXG5QZXJtdXRhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvcHkgY3VycmVudCBwZXJtdXRhdGlvblxuICB2YXIgcnZhbCA9IHRoaXMubGlzdC5zbGljZSgpO1xuXG4gIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBwZXJtdXRhdGlvbiB1c2luZyB0aGUgU3RlaW5oYXVzLUpvaG5zb24tVHJvdHRlclxuICAgcGVybXV0YXRpb24gYWxnb3JpdGhtLiAqL1xuXG4gIC8vIGdldCBsYXJnZXN0IG1vYmlsZSBlbGVtZW50IGtcbiAgLy8gKG1vYmlsZTogZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIG9uZSBpdCBpcyBsb29raW5nIGF0KVxuICB2YXIgayA9IG51bGw7XG4gIHZhciBwb3MgPSAwO1xuICB2YXIgbGVuZ3RoID0gdGhpcy5saXN0Lmxlbmd0aDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLmxpc3RbaV07XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxlZnRbZWxlbWVudF07XG4gICAgaWYoKGsgPT09IG51bGwgfHwgZWxlbWVudCA+IGspICYmXG4gICAgICAoKGxlZnQgJiYgaSA+IDAgJiYgZWxlbWVudCA+IHRoaXMubGlzdFtpIC0gMV0pIHx8XG4gICAgICAoIWxlZnQgJiYgaSA8IChsZW5ndGggLSAxKSAmJiBlbGVtZW50ID4gdGhpcy5saXN0W2kgKyAxXSkpKSB7XG4gICAgICBrID0gZWxlbWVudDtcbiAgICAgIHBvcyA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gbm8gbW9yZSBwZXJtdXRhdGlvbnNcbiAgaWYoayA9PT0gbnVsbCkge1xuICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gc3dhcCBrIGFuZCB0aGUgZWxlbWVudCBpdCBpcyBsb29raW5nIGF0XG4gICAgdmFyIHN3YXAgPSB0aGlzLmxlZnRba10gPyBwb3MgLSAxIDogcG9zICsgMTtcbiAgICB0aGlzLmxpc3RbcG9zXSA9IHRoaXMubGlzdFtzd2FwXTtcbiAgICB0aGlzLmxpc3Rbc3dhcF0gPSBrO1xuXG4gICAgLy8gcmV2ZXJzZSB0aGUgZGlyZWN0aW9uIG9mIGFsbCBlbGVtZW50cyBsYXJnZXIgdGhhbiBrXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZih0aGlzLmxpc3RbaV0gPiBrKSB7XG4gICAgICAgIHRoaXMubGVmdFt0aGlzLmxpc3RbaV1dID0gIXRoaXMubGVmdFt0aGlzLmxpc3RbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBOT1JNQUxJWkFUSU9OIEhBU0ggQVBJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTm9ybWFsaXplSGFzaCBmb3IgdXNlIGJ5IHRoZSBnaXZlbiBub3JtYWxpemF0aW9uIGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0gYWxnb3JpdGhtIHRoZSBSREYgRGF0YXNldCBOb3JtYWxpemF0aW9uIGFsZ29yaXRobSB0byB1c2U6XG4gKiAgICAgICAgICAnVVJETkEyMDE1JyBvciAnVVJHTkEyMDEyJy5cbiAqL1xudmFyIE5vcm1hbGl6ZUhhc2ggPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgTm9ybWFsaXplSGFzaCkpIHtcbiAgICByZXR1cm4gbmV3IE5vcm1hbGl6ZUhhc2goYWxnb3JpdGhtKTtcbiAgfVxuICBpZihbJ1VSRE5BMjAxNScsICdVUkdOQTIwMTInXS5pbmRleE9mKGFsZ29yaXRobSkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgUkRGIERhdGFzZXQgTm9ybWFsaXphdGlvbiBhbGdvcml0aG06ICcgKyBhbGdvcml0aG0pO1xuICB9XG4gIE5vcm1hbGl6ZUhhc2guX2luaXQuY2FsbCh0aGlzLCBhbGdvcml0aG0pO1xufTtcbk5vcm1hbGl6ZUhhc2guaGFzaE5RdWFkcyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwgbnF1YWRzKSB7XG4gIHZhciBtZCA9IG5ldyBOb3JtYWxpemVIYXNoKGFsZ29yaXRobSk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBucXVhZHMubGVuZ3RoOyArK2kpIHtcbiAgICBtZC51cGRhdGUobnF1YWRzW2ldKTtcbiAgfVxuICByZXR1cm4gbWQuZGlnZXN0KCk7XG59O1xuXG4vLyBzd2l0Y2ggZGVmaW5pdGlvbiBvZiBOb3JtYWxpemVIYXNoIGJhc2VkIG9uIGVudmlyb25tZW50XG4oZnVuY3Rpb24oX25vZGVqcykge1xuXG5pZihfbm9kZWpzKSB7XG4gIC8vIGRlZmluZSBOb3JtYWxpemVIYXNoIHVzaW5nIG5hdGl2ZSBjcnlwdG8gbGliXG4gIHZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgTm9ybWFsaXplSGFzaC5faW5pdCA9IGZ1bmN0aW9uKGFsZ29yaXRobSkge1xuICAgIGlmKGFsZ29yaXRobSA9PT0gJ1VSRE5BMjAxNScpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEyNTYnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhc3N1bWUgVVJHTkEyMDEyXG4gICAgICBhbGdvcml0aG0gPSAnc2hhMSc7XG4gICAgfVxuICAgIHRoaXMubWQgPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pO1xuICB9O1xuICBOb3JtYWxpemVIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihtc2cpIHtcbiAgICByZXR1cm4gdGhpcy5tZC51cGRhdGUobXNnLCAndXRmOCcpO1xuICB9O1xuICBOb3JtYWxpemVIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tZC5kaWdlc3QoJ2hleCcpO1xuICB9O1xuICByZXR1cm47XG59XG5cbi8vIGRlZmluZSBOb3JtYWxpemVIYXNoIHVzaW5nIEphdmFTY3JpcHRcbk5vcm1hbGl6ZUhhc2guX2luaXQgPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoYWxnb3JpdGhtID09PSAnVVJETkEyMDE1Jykge1xuICAgIGFsZ29yaXRobSA9IG5ldyBzaGEyNTYuQWxnb3JpdGhtKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYXNzdW1lIFVSR05BMjAxMlxuICAgIGFsZ29yaXRobSA9IG5ldyBzaGExLkFsZ29yaXRobSgpO1xuICB9XG4gIHRoaXMubWQgPSBuZXcgTWVzc2FnZURpZ2VzdChhbGdvcml0aG0pO1xufTtcbk5vcm1hbGl6ZUhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1zZykge1xuICByZXR1cm4gdGhpcy5tZC51cGRhdGUobXNnKTtcbn07XG5Ob3JtYWxpemVIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubWQuZGlnZXN0KCkudG9IZXgoKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBERUZJTkUgTUVTU0FHRSBESUdFU1QgQVBJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IE1lc3NhZ2VEaWdlc3QuXG4gKlxuICogQHBhcmFtIGFsZ29yaXRobSB0aGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAqL1xudmFyIE1lc3NhZ2VEaWdlc3QgPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgTWVzc2FnZURpZ2VzdCkpIHtcbiAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWdlc3QoYWxnb3JpdGhtKTtcbiAgfVxuXG4gIHRoaXMuX2FsZ29yaXRobSA9IGFsZ29yaXRobTtcblxuICAvLyBjcmVhdGUgc2hhcmVkIHBhZGRpbmcgYXMgbmVlZGVkXG4gIGlmKCFNZXNzYWdlRGlnZXN0Ll9wYWRkaW5nIHx8XG4gICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZy5sZW5ndGggPCB0aGlzLl9hbGdvcml0aG0uYmxvY2tTaXplKSB7XG4gICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4KTtcbiAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMCk7XG4gICAgdmFyIG4gPSA2NDtcbiAgICB3aGlsZShuID4gMCkge1xuICAgICAgaWYobiAmIDEpIHtcbiAgICAgICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZyArPSBjO1xuICAgICAgfVxuICAgICAgbiA+Pj49IDE7XG4gICAgICBpZihuID4gMCkge1xuICAgICAgICBjICs9IGM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gc3RhcnQgZGlnZXN0IGF1dG9tYXRpY2FsbHkgZm9yIGZpcnN0IHRpbWVcbiAgdGhpcy5zdGFydCgpO1xufTtcblxuLyoqXG4gKiBTdGFydHMgdGhlIGRpZ2VzdC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgZGlnZXN0IG9iamVjdC5cbiAqL1xuTWVzc2FnZURpZ2VzdC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgLy8gdXAgdG8gNTYtYml0IG1lc3NhZ2UgbGVuZ3RoIGZvciBjb252ZW5pZW5jZVxuICB0aGlzLm1lc3NhZ2VMZW5ndGggPSAwO1xuXG4gIC8vIGZ1bGwgbWVzc2FnZSBsZW5ndGhcbiAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aCA9IFtdO1xuICB2YXIgaW50MzJzID0gdGhpcy5fYWxnb3JpdGhtLm1lc3NhZ2VMZW5ndGhTaXplIC8gNDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGludDMyczsgKytpKSB7XG4gICAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aC5wdXNoKDApO1xuICB9XG5cbiAgLy8gaW5wdXQgYnVmZmVyXG4gIHRoaXMuX2lucHV0ID0gbmV3IE1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlcigpO1xuXG4gIC8vIGdldCBzdGFydGluZyBzdGF0ZVxuICB0aGlzLnN0YXRlID0gdGhpcy5fYWxnb3JpdGhtLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGRpZ2VzdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGlucHV0LiBUaGUgaW5wdXQgbXVzdCBiZVxuICogYSBzdHJpbmcgb2YgY2hhcmFjdGVycy5cbiAqXG4gKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIGlucHV0IHRvIHVwZGF0ZSB3aXRoIChCeXRlQnVmZmVyIG9yIHN0cmluZykuXG4gKlxuICogQHJldHVybiB0aGlzIGRpZ2VzdCBvYmplY3QuXG4gKi9cbk1lc3NhZ2VEaWdlc3QucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1zZykge1xuICAvLyBlbmNvZGUgbWVzc2FnZSBhcyBhIFVURi04IGVuY29kZWQgYmluYXJ5IHN0cmluZ1xuICBtc2cgPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChtc2cpKSk7XG5cbiAgLy8gdXBkYXRlIG1lc3NhZ2UgbGVuZ3RoXG4gIHRoaXMubWVzc2FnZUxlbmd0aCArPSBtc2cubGVuZ3RoKCk7XG4gIHZhciBsZW4gPSBtc2cubGVuZ3RoKCk7XG4gIGxlbiA9IFsobGVuIC8gMHgxMDAwMDAwMDApID4+PiAwLCBsZW4gPj4+IDBdO1xuICBmb3IodmFyIGkgPSB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSArPSBsZW5bMV07XG4gICAgbGVuWzFdID0gbGVuWzBdICsgKCh0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldID0gdGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSA+Pj4gMDtcbiAgICBsZW5bMF0gPSAoKGxlblsxXSAvIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIH1cblxuICAvLyBhZGQgYnl0ZXMgdG8gaW5wdXQgYnVmZmVyXG4gIHRoaXMuX2lucHV0LnB1dEJ5dGVzKG1zZy5ieXRlcygpKTtcblxuICAvLyBkaWdlc3QgYmxvY2tzXG4gIHdoaWxlKHRoaXMuX2lucHV0Lmxlbmd0aCgpID49IHRoaXMuX2FsZ29yaXRobS5ibG9ja1NpemUpIHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5fYWxnb3JpdGhtLmRpZ2VzdCh0aGlzLnN0YXRlLCB0aGlzLl9pbnB1dCk7XG4gIH1cblxuICAvLyBjb21wYWN0IGlucHV0IGJ1ZmZlciBldmVyeSAySyBvciBpZiBlbXB0eVxuICBpZih0aGlzLl9pbnB1dC5yZWFkID4gMjA0OCB8fCB0aGlzLl9pbnB1dC5sZW5ndGgoKSA9PT0gMCkge1xuICAgIHRoaXMuX2lucHV0LmNvbXBhY3QoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQcm9kdWNlcyB0aGUgZGlnZXN0LlxuICpcbiAqIEByZXR1cm4gYSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkaWdlc3QgdmFsdWUuXG4gKi9cbk1lc3NhZ2VEaWdlc3QucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uKCkge1xuICAvKiBOb3RlOiBIZXJlIHdlIGNvcHkgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZCBhZGQgdGhlXG4gIGFwcHJvcHJpYXRlIHBhZGRpbmcuIFRoZW4gd2UgZG8gdGhlIGZpbmFsIHVwZGF0ZSBvbiBhIGNvcHkgb2YgdGhlIHN0YXRlIHNvXG4gIHRoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZ2V0IGludGVybWVkaWF0ZSBkaWdlc3RzIHRoZXkgY2FuIGRvIHNvLiAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZSB0b1xuICBlbnN1cmUgaXRzIGxlbmd0aCBpcyBhcHByb3ByaWF0ZWx5IGNvbmdydWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBkYXRhIHRvXG4gIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBgYmxvY2tTaXplYC4gVGhpcyBkYXRhIGluY2x1ZGVzIHRoZVxuICBtZXNzYWdlLCBzb21lIHBhZGRpbmcsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLiBTaW5jZSB0aGUgbGVuZ3RoIG9mXG4gIHRoZSBtZXNzYWdlIHdpbGwgYmUgZW5jb2RlZCBhcyBgbWVzc2FnZUxlbmd0aFNpemVgIGJ5dGVzLCB0aGF0IG1lYW5zIHRoYXRcbiAgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZGF0YSBtdXN0IGhhdmUgYGJsb2NrU2l6ZWAgLSBgbWVzc2FnZUxlbmd0aFNpemVgXG4gIGJ5dGVzIG9mIG1lc3NhZ2UgYW5kIHBhZGRpbmcuIFRoZXJlZm9yZSwgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBwbHVzIHRoZVxuICBwYWRkaW5nIG11c3QgYmUgY29uZ3J1ZW50IHRvIFggbW9kIGBibG9ja1NpemVgIGJlY2F1c2VcbiAgYGJsb2NrU2l6ZWAgLSBgbWVzc2FnZUxlbmd0aFNpemVgID0gWC5cblxuICBGb3IgZXhhbXBsZSwgU0hBLTEgaXMgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyIGFuZCBTSEEtNTEyIGlzIGNvbmdydWVudCB0b1xuICA4OTYgbW9kIDEwMjQuIFNIQS0xIHVzZXMgYSBgYmxvY2tTaXplYCBvZiA2NCBieXRlcyAoNTEyIGJpdHMpIGFuZCBhXG4gIGBtZXNzYWdlTGVuZ3RoU2l6ZWAgb2YgOCBieXRlcyAoNjQgYml0cykuIFNIQS01MTIgdXNlcyBhIGBibG9ja1NpemVgIG9mXG4gIDEyOCBieXRlcyAoMTAyNCBiaXRzKSBhbmQgYSBgbWVzc2FnZUxlbmd0aFNpemVgIG9mIDE2IGJ5dGVzICgxMjggYml0cykuXG5cbiAgSW4gb3JkZXIgdG8gZmlsbCB1cCB0aGUgbWVzc2FnZSBsZW5ndGggaXQgbXVzdCBiZSBmaWxsZWQgd2l0aCBwYWRkaW5nIHRoYXRcbiAgYmVnaW5zIHdpdGggMSBiaXQgZm9sbG93ZWQgYnkgYWxsIDAgYml0cy4gUGFkZGluZyBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsXG4gIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5IGNvbmdydWVudCwgdGhlbiBgYmxvY2tTaXplYCBwYWRkaW5nIGJpdHNcbiAgbXVzdCBiZSBhZGRlZC4gKi9cblxuICAvLyBjcmVhdGUgZmluYWwgYmxvY2tcbiAgdmFyIGZpbmFsQmxvY2sgPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKCk7XG4gIGZpbmFsQmxvY2sucHV0Qnl0ZXModGhpcy5faW5wdXQuYnl0ZXMoKSk7XG5cbiAgLy8gY29tcHV0ZSByZW1haW5pbmcgc2l6ZSB0byBiZSBkaWdlc3RlZCAoaW5jbHVkZSBtZXNzYWdlIGxlbmd0aCBzaXplKVxuICB2YXIgcmVtYWluaW5nID0gKFxuICAgIHRoaXMuZnVsbE1lc3NhZ2VMZW5ndGhbdGhpcy5mdWxsTWVzc2FnZUxlbmd0aC5sZW5ndGggLSAxXSArXG4gICAgdGhpcy5fYWxnb3JpdGhtLm1lc3NhZ2VMZW5ndGhTaXplKTtcblxuICAvLyBhZGQgcGFkZGluZyBmb3Igb3ZlcmZsb3cgYmxvY2tTaXplIC0gb3ZlcmZsb3dcbiAgLy8gX3BhZGRpbmcgc3RhcnRzIHdpdGggMSBieXRlIHdpdGggZmlyc3QgYml0IGlzIHNldCAoYnl0ZSB2YWx1ZSAxMjgpLCB0aGVuXG4gIC8vIHRoZXJlIG1heSBiZSB1cCB0byAoYmxvY2tTaXplIC0gMSkgb3RoZXIgcGFkIGJ5dGVzXG4gIHZhciBvdmVyZmxvdyA9IHJlbWFpbmluZyAmICh0aGlzLl9hbGdvcml0aG0uYmxvY2tTaXplIC0gMSk7XG4gIGZpbmFsQmxvY2sucHV0Qnl0ZXMoTWVzc2FnZURpZ2VzdC5fcGFkZGluZy5zdWJzdHIoXG4gICAgMCwgdGhpcy5fYWxnb3JpdGhtLmJsb2NrU2l6ZSAtIG92ZXJmbG93KSk7XG5cbiAgLy8gc2VyaWFsaXplIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMgaW4gYmlnLWVuZGlhbiBvcmRlcjsgc2luY2UgbGVuZ3RoXG4gIC8vIGlzIHN0b3JlZCBpbiBieXRlcyB3ZSBtdWx0aXBseSBieSA4IChsZWZ0IHNoaWZ0IGJ5IDMgYW5kIG1lcmdlIGluXG4gIC8vIHJlbWFpbmRlciBmcm9tIClcbiAgdmFyIG1lc3NhZ2VMZW5ndGggPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aDsgKytpKSB7XG4gICAgbWVzc2FnZUxlbmd0aC5wdXRJbnQzMigodGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSA8PCAzKSB8XG4gICAgICAodGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpICsgMV0gPj4+IDI4KSk7XG4gIH1cblxuICAvLyB3cml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIChhbGdvcml0aG0tc3BlY2lmaWMpXG4gIHRoaXMuX2FsZ29yaXRobS53cml0ZU1lc3NhZ2VMZW5ndGgoZmluYWxCbG9jaywgbWVzc2FnZUxlbmd0aCk7XG5cbiAgLy8gZGlnZXN0IGZpbmFsIGJsb2NrXG4gIHZhciBzdGF0ZSA9IHRoaXMuX2FsZ29yaXRobS5kaWdlc3QodGhpcy5zdGF0ZS5jb3B5KCksIGZpbmFsQmxvY2spO1xuXG4gIC8vIHdyaXRlIHN0YXRlIHRvIGJ1ZmZlclxuICB2YXIgcnZhbCA9IG5ldyBNZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIoKTtcbiAgc3RhdGUud3JpdGUocnZhbCk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2ltcGxlIGJ5dGUgYnVmZmVyIGZvciBtZXNzYWdlIGRpZ2VzdCBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHB1dCBpbiB0aGUgYnVmZmVyLlxuICovXG5NZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIgPSBmdW5jdGlvbihkYXRhKSB7XG4gIGlmKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cbiAgdGhpcy5yZWFkID0gMDtcbn07XG5cbi8qKlxuICogUHV0cyBhIDMyLWJpdCBpbnRlZ2VyIGludG8gdGhpcyBidWZmZXIgaW4gYmlnLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMzItYml0IGludGVnZXIuXG4gKi9cbk1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucHV0SW50MzIgPSBmdW5jdGlvbihpKSB7XG4gIHRoaXMuZGF0YSArPSAoXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDI0ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiAxNiAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgPj4gOCAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgJiAweEZGKSk7XG59O1xuXG4vKipcbiAqIEdldHMgYSAzMi1iaXQgaW50ZWdlciBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kXG4gKiBhZHZhbmNlcyB0aGUgcmVhZCBwb2ludGVyIGJ5IDQuXG4gKlxuICogQHJldHVybiB0aGUgd29yZC5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IChcbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQpIDw8IDI0IF5cbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQgKyAxKSA8PCAxNiBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMikgPDwgOCBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMykpO1xuICB0aGlzLnJlYWQgKz0gNDtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIFB1dHMgdGhlIGdpdmVuIGJ5dGVzIGludG8gdGhpcyBidWZmZXIuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZy5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5wdXRCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHRoaXMuZGF0YSArPSBieXRlcztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKlxuICogQHJldHVybiBhIHN0cmluZyBmdWxsIG9mIFVURi04IGVuY29kZWQgY2hhcmFjdGVycy5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLnNsaWNlKHRoaXMucmVhZCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKi9cbk1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIC0gdGhpcy5yZWFkO1xufTtcblxuLyoqXG4gKiBDb21wYWN0cyB0aGlzIGJ1ZmZlci5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnJlYWQpO1xuICB0aGlzLnJlYWQgPSAwO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIGJ1ZmZlciB0byBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICovXG5NZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gJyc7XG4gIGZvcih2YXIgaSA9IHRoaXMucmVhZDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBiID0gdGhpcy5kYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYoYiA8IDE2KSB7XG4gICAgICBydmFsICs9ICcwJztcbiAgICB9XG4gICAgcnZhbCArPSBiLnRvU3RyaW5nKDE2KTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBTSEEtMSBBTEdPUklUSE0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIHNoYTEgPSB7XG4gIC8vIHVzZWQgZm9yIHdvcmQgc3RvcmFnZVxuICBfdzogbnVsbFxufTtcblxuc2hhMS5BbGdvcml0aG0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5uYW1lID0gJ3NoYTEnLFxuICB0aGlzLmJsb2NrU2l6ZSA9IDY0O1xuICB0aGlzLmRpZ2VzdExlbmd0aCA9IDIwO1xuICB0aGlzLm1lc3NhZ2VMZW5ndGhTaXplID0gODtcbn07XG5cbnNoYTEuQWxnb3JpdGhtLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICBpZighc2hhMS5fdykge1xuICAgIHNoYTEuX3cgPSBuZXcgQXJyYXkoODApO1xuICB9XG4gIHJldHVybiBzaGExLl9jcmVhdGVTdGF0ZSgpO1xufTtcblxuc2hhMS5BbGdvcml0aG0ucHJvdG90eXBlLndyaXRlTWVzc2FnZUxlbmd0aCA9IGZ1bmN0aW9uKFxuICBmaW5hbEJsb2NrLCBtZXNzYWdlTGVuZ3RoKSB7XG4gIC8vIG1lc3NhZ2UgbGVuZ3RoIGlzIGluIGJpdHMgYW5kIGluIGJpZy1lbmRpYW4gb3JkZXI7IHNpbXBseSBhcHBlbmRcbiAgZmluYWxCbG9jay5wdXRCeXRlcyhtZXNzYWdlTGVuZ3RoLmJ5dGVzKCkpO1xufTtcblxuc2hhMS5BbGdvcml0aG0ucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uKHMsIGlucHV0KSB7XG4gIC8vIGNvbnN1bWUgNTEyIGJpdCAoNjQgYnl0ZSkgY2h1bmtzXG4gIHZhciB0LCBhLCBiLCBjLCBkLCBlLCBmLCBpO1xuICB2YXIgbGVuID0gaW5wdXQubGVuZ3RoKCk7XG4gIHZhciBfdyA9IHNoYTEuX3c7XG4gIHdoaWxlKGxlbiA+PSA2NCkge1xuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuXG4gICAgLy8gdGhlIF93IGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc2l4dGVlbiAzMi1iaXQgYmlnLWVuZGlhbiB3b3Jkc1xuICAgIC8vIGFuZCB0aGVuIGV4dGVuZGVkIGludG8gODAgMzItYml0IHdvcmRzIGFjY29yZGluZyB0byBTSEEtMSBhbGdvcml0aG1cbiAgICAvLyBhbmQgZm9yIDMyLTc5IHVzaW5nIE1heCBMb2NrdHl1a2hpbidzIG9wdGltaXphdGlvblxuXG4gICAgLy8gcm91bmQgMVxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHQgPSBpbnB1dC5nZXRJbnQzMigpO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGQgXiAoYiAmIChjIF4gZCkpO1xuICAgICAgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyAweDVBODI3OTk5ICsgdDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDIwOyArK2kpIHtcbiAgICAgIHQgPSAoX3dbaSAtIDNdIF4gX3dbaSAtIDhdIF4gX3dbaSAtIDE0XSBeIF93W2kgLSAxNl0pO1xuICAgICAgdCA9ICh0IDw8IDEpIHwgKHQgPj4+IDMxKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSBkIF4gKGIgJiAoYyBeIGQpKTtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg1QTgyNzk5OSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDJcbiAgICBmb3IoOyBpIDwgMzI7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gM10gXiBfd1tpIC0gOF0gXiBfd1tpIC0gMTRdIF4gX3dbaSAtIDE2XSk7XG4gICAgICB0ID0gKHQgPDwgMSkgfCAodCA+Pj4gMzEpO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg2RUQ5RUJBMSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIGZvcig7IGkgPCA0MDsgKytpKSB7XG4gICAgICB0ID0gKF93W2kgLSA2XSBeIF93W2kgLSAxNl0gXiBfd1tpIC0gMjhdIF4gX3dbaSAtIDMyXSk7XG4gICAgICB0ID0gKHQgPDwgMikgfCAodCA+Pj4gMzApO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg2RUQ5RUJBMSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDNcbiAgICBmb3IoOyBpIDwgNjA7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gNl0gXiBfd1tpIC0gMTZdIF4gX3dbaSAtIDI4XSBeIF93W2kgLSAzMl0pO1xuICAgICAgdCA9ICh0IDw8IDIpIHwgKHQgPj4+IDMwKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiBeIGMpKTtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg4RjFCQkNEQyArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDRcbiAgICBmb3IoOyBpIDwgODA7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gNl0gXiBfd1tpIC0gMTZdIF4gX3dbaSAtIDI4XSBeIF93W2kgLSAzMl0pO1xuICAgICAgdCA9ICh0IDw8IDIpIHwgKHQgPj4+IDMwKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4Q0E2MkMxRDYgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSAoYiA8PCAzMCkgfCAoYiA+Pj4gMik7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSB0O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBoYXNoIHN0YXRlXG4gICAgcy5oMCA9IChzLmgwICsgYSkgfCAwO1xuICAgIHMuaDEgPSAocy5oMSArIGIpIHwgMDtcbiAgICBzLmgyID0gKHMuaDIgKyBjKSB8IDA7XG4gICAgcy5oMyA9IChzLmgzICsgZCkgfCAwO1xuICAgIHMuaDQgPSAocy5oNCArIGUpIHwgMDtcblxuICAgIGxlbiAtPSA2NDtcbiAgfVxuXG4gIHJldHVybiBzO1xufTtcblxuc2hhMS5fY3JlYXRlU3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YXRlID0ge1xuICAgIGgwOiAweDY3NDUyMzAxLFxuICAgIGgxOiAweEVGQ0RBQjg5LFxuICAgIGgyOiAweDk4QkFEQ0ZFLFxuICAgIGgzOiAweDEwMzI1NDc2LFxuICAgIGg0OiAweEMzRDJFMUYwXG4gIH07XG4gIHN0YXRlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcnZhbCA9IHNoYTEuX2NyZWF0ZVN0YXRlKCk7XG4gICAgcnZhbC5oMCA9IHN0YXRlLmgwO1xuICAgIHJ2YWwuaDEgPSBzdGF0ZS5oMTtcbiAgICBydmFsLmgyID0gc3RhdGUuaDI7XG4gICAgcnZhbC5oMyA9IHN0YXRlLmgzO1xuICAgIHJ2YWwuaDQgPSBzdGF0ZS5oNDtcbiAgICByZXR1cm4gcnZhbDtcbiAgfTtcbiAgc3RhdGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDApO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oMSk7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgyKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDMpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oNCk7XG4gIH07XG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gREVGSU5FIFNIQS0yNTYgQUxHT1JJVEhNIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIHNoYTI1NiA9IHtcbiAgLy8gc2hhcmVkIHN0YXRlXG4gIF9rOiBudWxsLFxuICBfdzogbnVsbFxufTtcblxuc2hhMjU2LkFsZ29yaXRobSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLm5hbWUgPSAnc2hhMjU2JyxcbiAgdGhpcy5ibG9ja1NpemUgPSA2NDtcbiAgdGhpcy5kaWdlc3RMZW5ndGggPSAzMjtcbiAgdGhpcy5tZXNzYWdlTGVuZ3RoU2l6ZSA9IDg7XG59O1xuXG5zaGEyNTYuQWxnb3JpdGhtLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICBpZighc2hhMjU2Ll9rKSB7XG4gICAgc2hhMjU2Ll9pbml0KCk7XG4gIH1cbiAgcmV0dXJuIHNoYTI1Ni5fY3JlYXRlU3RhdGUoKTtcbn07XG5cbnNoYTI1Ni5BbGdvcml0aG0ucHJvdG90eXBlLndyaXRlTWVzc2FnZUxlbmd0aCA9IGZ1bmN0aW9uKFxuICBmaW5hbEJsb2NrLCBtZXNzYWdlTGVuZ3RoKSB7XG4gIC8vIG1lc3NhZ2UgbGVuZ3RoIGlzIGluIGJpdHMgYW5kIGluIGJpZy1lbmRpYW4gb3JkZXI7IHNpbXBseSBhcHBlbmRcbiAgZmluYWxCbG9jay5wdXRCeXRlcyhtZXNzYWdlTGVuZ3RoLmJ5dGVzKCkpO1xufTtcblxuc2hhMjU2LkFsZ29yaXRobS5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24ocywgaW5wdXQpIHtcbiAgLy8gY29uc3VtZSA1MTIgYml0ICg2NCBieXRlKSBjaHVua3NcbiAgdmFyIHQxLCB0MiwgczAsIHMxLCBjaCwgbWFqLCBpLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoO1xuICB2YXIgbGVuID0gaW5wdXQubGVuZ3RoKCk7XG4gIHZhciBfayA9IHNoYTI1Ni5faztcbiAgdmFyIF93ID0gc2hhMjU2Ll93O1xuICB3aGlsZShsZW4gPj0gNjQpIHtcbiAgICAvLyB0aGUgdyBhcnJheSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHNpeHRlZW4gMzItYml0IGJpZy1lbmRpYW4gd29yZHNcbiAgICAvLyBhbmQgdGhlbiBleHRlbmRlZCBpbnRvIDY0IDMyLWJpdCB3b3JkcyBhY2NvcmRpbmcgdG8gU0hBLTI1NlxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIF93W2ldID0gaW5wdXQuZ2V0SW50MzIoKTtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDY0OyArK2kpIHtcbiAgICAgIC8vIFhPUiB3b3JkIDIgd29yZHMgYWdvIHJvdCByaWdodCAxNywgcm90IHJpZ2h0IDE5LCBzaGZ0IHJpZ2h0IDEwXG4gICAgICB0MSA9IF93W2kgLSAyXTtcbiAgICAgIHQxID1cbiAgICAgICAgKCh0MSA+Pj4gMTcpIHwgKHQxIDw8IDE1KSkgXlxuICAgICAgICAoKHQxID4+PiAxOSkgfCAodDEgPDwgMTMpKSBeXG4gICAgICAgICh0MSA+Pj4gMTApO1xuICAgICAgLy8gWE9SIHdvcmQgMTUgd29yZHMgYWdvIHJvdCByaWdodCA3LCByb3QgcmlnaHQgMTgsIHNoZnQgcmlnaHQgM1xuICAgICAgdDIgPSBfd1tpIC0gMTVdO1xuICAgICAgdDIgPVxuICAgICAgICAoKHQyID4+PiA3KSB8ICh0MiA8PCAyNSkpIF5cbiAgICAgICAgKCh0MiA+Pj4gMTgpIHwgKHQyIDw8IDE0KSkgXlxuICAgICAgICAodDIgPj4+IDMpO1xuICAgICAgLy8gc3VtKHQxLCB3b3JkIDcgYWdvLCB0Miwgd29yZCAxNiBhZ28pIG1vZHVsbyAyXjMyXG4gICAgICBfd1tpXSA9ICh0MSArIF93W2kgLSA3XSArIHQyICsgX3dbaSAtIDE2XSkgfCAwO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuICAgIGYgPSBzLmg1O1xuICAgIGcgPSBzLmg2O1xuICAgIGggPSBzLmg3O1xuXG4gICAgLy8gcm91bmQgZnVuY3Rpb25cbiAgICBmb3IoaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgICAvLyBTdW0xKGUpXG4gICAgICBzMSA9XG4gICAgICAgICgoZSA+Pj4gNikgfCAoZSA8PCAyNikpIF5cbiAgICAgICAgKChlID4+PiAxMSkgfCAoZSA8PCAyMSkpIF5cbiAgICAgICAgKChlID4+PiAyNSkgfCAoZSA8PCA3KSk7XG4gICAgICAvLyBDaChlLCBmLCBnKSAob3B0aW1pemVkIHRoZSBzYW1lIHdheSBhcyBTSEEtMSlcbiAgICAgIGNoID0gZyBeIChlICYgKGYgXiBnKSk7XG4gICAgICAvLyBTdW0wKGEpXG4gICAgICBzMCA9XG4gICAgICAgICgoYSA+Pj4gMikgfCAoYSA8PCAzMCkpIF5cbiAgICAgICAgKChhID4+PiAxMykgfCAoYSA8PCAxOSkpIF5cbiAgICAgICAgKChhID4+PiAyMikgfCAoYSA8PCAxMCkpO1xuICAgICAgLy8gTWFqKGEsIGIsIGMpIChvcHRpbWl6ZWQgdGhlIHNhbWUgd2F5IGFzIFNIQS0xKVxuICAgICAgbWFqID0gKGEgJiBiKSB8IChjICYgKGEgXiBiKSk7XG5cbiAgICAgIC8vIG1haW4gYWxnb3JpdGhtXG4gICAgICB0MSA9IGggKyBzMSArIGNoICsgX2tbaV0gKyBfd1tpXTtcbiAgICAgIHQyID0gczAgKyBtYWo7XG4gICAgICBoID0gZztcbiAgICAgIGcgPSBmO1xuICAgICAgZiA9IGU7XG4gICAgICBlID0gKGQgKyB0MSkgfCAwO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gYjtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9ICh0MSArIHQyKSB8IDA7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGhhc2ggc3RhdGVcbiAgICBzLmgwID0gKHMuaDAgKyBhKSB8IDA7XG4gICAgcy5oMSA9IChzLmgxICsgYikgfCAwO1xuICAgIHMuaDIgPSAocy5oMiArIGMpIHwgMDtcbiAgICBzLmgzID0gKHMuaDMgKyBkKSB8IDA7XG4gICAgcy5oNCA9IChzLmg0ICsgZSkgfCAwO1xuICAgIHMuaDUgPSAocy5oNSArIGYpIHwgMDtcbiAgICBzLmg2ID0gKHMuaDYgKyBnKSB8IDA7XG4gICAgcy5oNyA9IChzLmg3ICsgaCkgfCAwO1xuICAgIGxlbiAtPSA2NDtcbiAgfVxuXG4gIHJldHVybiBzO1xufTtcblxuc2hhMjU2Ll9jcmVhdGVTdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB7XG4gICAgaDA6IDB4NkEwOUU2NjcsXG4gICAgaDE6IDB4QkI2N0FFODUsXG4gICAgaDI6IDB4M0M2RUYzNzIsXG4gICAgaDM6IDB4QTU0RkY1M0EsXG4gICAgaDQ6IDB4NTEwRTUyN0YsXG4gICAgaDU6IDB4OUIwNTY4OEMsXG4gICAgaDY6IDB4MUY4M0Q5QUIsXG4gICAgaDc6IDB4NUJFMENEMTlcbiAgfTtcbiAgc3RhdGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBydmFsID0gc2hhMjU2Ll9jcmVhdGVTdGF0ZSgpO1xuICAgIHJ2YWwuaDAgPSBzdGF0ZS5oMDtcbiAgICBydmFsLmgxID0gc3RhdGUuaDE7XG4gICAgcnZhbC5oMiA9IHN0YXRlLmgyO1xuICAgIHJ2YWwuaDMgPSBzdGF0ZS5oMztcbiAgICBydmFsLmg0ID0gc3RhdGUuaDQ7XG4gICAgcnZhbC5oNSA9IHN0YXRlLmg1O1xuICAgIHJ2YWwuaDYgPSBzdGF0ZS5oNjtcbiAgICBydmFsLmg3ID0gc3RhdGUuaDc7XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG4gIHN0YXRlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgwKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDEpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oMik7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgzKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDQpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oNSk7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmg2KTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDcpO1xuICB9O1xuICByZXR1cm4gc3RhdGU7XG59O1xuXG5zaGEyNTYuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY3JlYXRlIEsgdGFibGUgZm9yIFNIQS0yNTZcbiAgc2hhMjU2Ll9rID0gW1xuICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gICAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gICAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gICAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdO1xuXG4gIC8vIHVzZWQgZm9yIHdvcmQgc3RvcmFnZVxuICBzaGEyNTYuX3cgPSBuZXcgQXJyYXkoNjQpO1xufTtcblxufSkoX25vZGVqcyk7IC8vIGVuZCBkZWZpbml0aW9uIG9mIE5vcm1hbGl6ZUhhc2hcblxuaWYoIVhNTFNlcmlhbGl6ZXIpIHtcblxudmFyIF9kZWZpbmVYTUxTZXJpYWxpemVyID0gZnVuY3Rpb24oKSB7XG4gIFhNTFNlcmlhbGl6ZXIgPSByZXF1aXJlKCd4bWxkb20nKS5YTUxTZXJpYWxpemVyO1xufTtcblxufSAvLyBlbmQgX2RlZmluZVhNTFNlcmlhbGl6ZXJcblxuLy8gZGVmaW5lIFVSTCBwYXJzZXJcbi8vIHBhcnNlVXJpIDEuMi4yXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxuLy8gd2l0aCBsb2NhbCBqc29ubGQuanMgbW9kaWZpY2F0aW9uc1xuanNvbmxkLnVybCA9IHt9O1xuanNvbmxkLnVybC5wYXJzZXJzID0ge1xuICBzaW1wbGU6IHtcbiAgICAvLyBSRkMgMzk4NiBiYXNpYyBwYXJ0c1xuICAgIGtleXM6IFsnaHJlZicsJ3NjaGVtZScsJ2F1dGhvcml0eScsJ3BhdGgnLCdxdWVyeScsJ2ZyYWdtZW50J10sXG4gICAgcmVnZXg6IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKFteXFwvPyNdKikpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IyguKikpPy9cbiAgfSxcbiAgZnVsbDoge1xuICAgIGtleXM6IFsnaHJlZicsJ3Byb3RvY29sJywnc2NoZW1lJywnYXV0aG9yaXR5JywnYXV0aCcsJ3VzZXInLCdwYXNzd29yZCcsJ2hvc3RuYW1lJywncG9ydCcsJ3BhdGgnLCdkaXJlY3RvcnknLCdmaWxlJywncXVlcnknLCdmcmFnbWVudCddLFxuICAgIHJlZ2V4OiAvXigoW146XFwvPyNdKyk6KT8oPzpcXC9cXC8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyg/OigoKD86W14/I1xcL10qXFwvKSopKFtePyNdKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvXG4gIH1cbn07XG5qc29ubGQudXJsLnBhcnNlID0gZnVuY3Rpb24oc3RyLCBwYXJzZXIpIHtcbiAgdmFyIHBhcnNlZCA9IHt9O1xuICB2YXIgbyA9IGpzb25sZC51cmwucGFyc2Vyc1twYXJzZXIgfHwgJ2Z1bGwnXTtcbiAgdmFyIG0gPSBvLnJlZ2V4LmV4ZWMoc3RyKTtcbiAgdmFyIGkgPSBvLmtleXMubGVuZ3RoO1xuICB3aGlsZShpLS0pIHtcbiAgICBwYXJzZWRbby5rZXlzW2ldXSA9IChtW2ldID09PSB1bmRlZmluZWQpID8gbnVsbCA6IG1baV07XG4gIH1cbiAgcGFyc2VkLm5vcm1hbGl6ZWRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHBhcnNlZC5wYXRoLCAhIXBhcnNlZC5hdXRob3JpdHkpO1xuICByZXR1cm4gcGFyc2VkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGRvdCBzZWdtZW50cyBmcm9tIGEgVVJMIHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcmVtb3ZlIGRvdCBzZWdtZW50cyBmcm9tLlxuICogQHBhcmFtIGhhc0F1dGhvcml0eSB0cnVlIGlmIHRoZSBVUkwgaGFzIGFuIGF1dGhvcml0eSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCwgaGFzQXV0aG9yaXR5KSB7XG4gIHZhciBydmFsID0gJyc7XG5cbiAgaWYocGF0aC5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICBydmFsID0gJy8nO1xuICB9XG5cbiAgLy8gUkZDIDM5ODYgNS4yLjQgKHJld29ya2VkKVxuICB2YXIgaW5wdXQgPSBwYXRoLnNwbGl0KCcvJyk7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgd2hpbGUoaW5wdXQubGVuZ3RoID4gMCkge1xuICAgIGlmKGlucHV0WzBdID09PSAnLicgfHwgKGlucHV0WzBdID09PSAnJyAmJiBpbnB1dC5sZW5ndGggPiAxKSkge1xuICAgICAgaW5wdXQuc2hpZnQoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZihpbnB1dFswXSA9PT0gJy4uJykge1xuICAgICAgaW5wdXQuc2hpZnQoKTtcbiAgICAgIGlmKGhhc0F1dGhvcml0eSB8fFxuICAgICAgICAob3V0cHV0Lmxlbmd0aCA+IDAgJiYgb3V0cHV0W291dHB1dC5sZW5ndGggLSAxXSAhPT0gJy4uJykpIHtcbiAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGVhZGluZyByZWxhdGl2ZSBVUkwgJy4uJ1xuICAgICAgICBvdXRwdXQucHVzaCgnLi4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBvdXRwdXQucHVzaChpbnB1dC5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBydmFsICsgb3V0cHV0LmpvaW4oJy8nKTtcbn1cblxuaWYoX25vZGVqcykge1xuICAvLyB1c2Ugbm9kZSBkb2N1bWVudCBsb2FkZXIgYnkgZGVmYXVsdFxuICBqc29ubGQudXNlRG9jdW1lbnRMb2FkZXIoJ25vZGUnKTtcbn0gZWxzZSBpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIHVzZSB4aHIgZG9jdW1lbnQgbG9hZGVyIGJ5IGRlZmF1bHRcbiAganNvbmxkLnVzZURvY3VtZW50TG9hZGVyKCd4aHInKTtcbn1cblxuaWYoX25vZGVqcykge1xuICBqc29ubGQudXNlID0gZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgc3dpdGNoKGV4dGVuc2lvbikge1xuICAgICAgLy8gVE9ETzogRGVwcmVjYXRlZCBhcyBvZiAwLjQuMC4gUmVtb3ZlIGF0IHNvbWUgcG9pbnQuXG4gICAgICBjYXNlICdyZXF1ZXN0JzpcbiAgICAgICAgLy8gdXNlIG5vZGUgSlNPTi1MRCByZXF1ZXN0IGV4dGVuc2lvblxuICAgICAgICBqc29ubGQucmVxdWVzdCA9IHJlcXVpcmUoJ2pzb25sZC1yZXF1ZXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVbmtub3duIGV4dGVuc2lvbi4nLFxuICAgICAgICAgICdqc29ubGQuVW5rbm93bkV4dGVuc2lvbicsIHtleHRlbnNpb246IGV4dGVuc2lvbn0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBleHBvc2UgdmVyc2lvblxuICB2YXIgX21vZHVsZSA9IHtleHBvcnRzOiB7fSwgZmlsZW5hbWU6IF9fZGlybmFtZX07XG4gIHJlcXVpcmUoJ3BrZ2luZm8nKShfbW9kdWxlLCAndmVyc2lvbicpO1xuICBqc29ubGQudmVyc2lvbiA9IF9tb2R1bGUuZXhwb3J0cy52ZXJzaW9uO1xufVxuXG4vLyBlbmQgb2YganNvbmxkIEFQSSBmYWN0b3J5XG5yZXR1cm4ganNvbmxkO1xufTtcblxuLy8gZXh0ZXJuYWwgQVBJczpcblxuLy8gdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBqc29ubGQgQVBJIGluc3RhbmNlXG52YXIgZmFjdG9yeSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gd3JhcHBlcihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFjdG9yeSgpO1xuICB9KTtcbn07XG5cbmlmKCFfbm9kZWpzICYmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpKSB7XG4gIC8vIGV4cG9ydCBBTUQgQVBJXG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgLy8gbm93IHRoYXQgbW9kdWxlIGlzIGRlZmluZWQsIHdyYXAgbWFpbiBqc29ubGQgQVBJIGluc3RhbmNlXG4gICAgd3JhcHBlcihmYWN0b3J5KTtcbiAgICByZXR1cm4gZmFjdG9yeTtcbiAgfSk7XG59IGVsc2Uge1xuICAvLyB3cmFwIHRoZSBtYWluIGpzb25sZCBBUEkgaW5zdGFuY2VcbiAgd3JhcHBlcihmYWN0b3J5KTtcblxuICBpZih0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgLy8gZXhwb3J0IENvbW1vbkpTL25vZGVqcyBBUElcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG4gIH1cblxuICBpZihfYnJvd3Nlcikge1xuICAgIC8vIGV4cG9ydCBzaW1wbGUgYnJvd3NlciBBUElcbiAgICBpZih0eXBlb2YganNvbmxkID09PSAndW5kZWZpbmVkJykge1xuICAgICAganNvbmxkID0ganNvbmxkanMgPSBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICBqc29ubGRqcyA9IGZhY3Rvcnk7XG4gICAgfVxuICB9XG59XG5cbnJldHVybiBmYWN0b3J5O1xuXG59KSgpO1xuIiwidmFyIHBrZyA9IHJlcXVpcmUoJy4vc3JjL2xpYnNiZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwa2c7XG4iLCJ2YXIgTjMgPSByZXF1aXJlKCduMycpO1xuXG52YXIgbnMgPSB7fTtcblxubnMucHJlZml4ZXMgPSB7XHRyZGY6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1wiLFxuXHRcdFx0ICAgIGJxbW9kZWw6IFwiaHR0cDovL2Jpb21vZGVscy5uZXQvbW9kZWwtcXVhbGlmaWVycy9cIixcblx0XHRcdCAgICBicWJpb2w6IFwiaHR0cDovL2Jpb21vZGVscy5uZXQvYmlvbG9neS1xdWFsaWZpZXJzL1wiLFxuXHRcdFx0ICAgIHNpbzogXCJodHRwOi8vc2VtYW50aWNzY2llbmNlLm9yZy9yZXNvdXJjZS9cIixcblx0XHRcdCAgICBlaXNibTogXCJodHRwOi8vd3d3LmVpc2JtLm9yZy9cIn07XG5cbi8vIHB1cmUgc2hvcnRjdXQgZnVuY3Rpb25cbm5zLmV4cGFuZFByZWZpeCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuXHRyZXR1cm4gTjMuVXRpbC5leHBhbmRQcmVmaXhlZE5hbWUocHJlZml4LCBucy5wcmVmaXhlcylcbn07XG5cbi8vIGNvbW1vbmx5IHVzZWQgc3RyaW5nc1xuc3RyX3NpbzIyMyA9IFwic2lvOlNJT18wMDAyMjNcIjtcbnN0cl9zaW8yMjNleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3NpbzIyMyk7XG5zdHJfc2lvMTE2ID0gXCJzaW86U0lPXzAwMDExNlwiO1xuc3RyX3NpbzExNmV4cCA9IG5zLmV4cGFuZFByZWZpeChzdHJfc2lvMTE2KTtcbnN0cl9yZGZ2YWx1ZSA9IFwicmRmOnZhbHVlXCI7XG5zdHJfcmRmdmFsdWVleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3JkZnZhbHVlKTtcbnN0cl9yZGZ0eXBlID0gXCJyZGY6dHlwZVwiO1xuc3RyX3JkZnR5cGVleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3JkZnR5cGUpO1xuc3RyX3JkZmJhZyA9IFwicmRmOkJhZ1wiO1xuc3RyX3JkZmJhZ2V4cCA9IG5zLmV4cGFuZFByZWZpeChzdHJfcmRmYmFnKTtcblxuY29udHJvbGxlZFZvY2FidWxhcnlMaXN0ID0gW1xuXHRcImJxbW9kZWw6aXNcIixcblx0XCJicW1vZGVsOmlzRGVyaXZlZEZyb21cIixcblx0XCJicW1vZGVsOmlzRGVzY3JpYmVkQnlcIixcblx0XCJicW1vZGVsOmlzSW5zdGFuY2VPZlwiLFxuXHRcImJxbW9kZWw6aGFzSW5zdGFuY2VcIixcblxuXHRcImJxYmlvbDppc1wiLFxuXHRcImJxYmlvbDplbmNvZGVzXCIsXG5cdFwiYnFiaW9sOmhhc1BhcnRcIixcblx0XCJicWJpb2w6aGFzUHJvcGVydHlcIixcblx0XCJicWJpb2w6aGFzVmVyc2lvblwiLFxuXHRcImJxYmlvbDppc0Rlc2NyaWJlZEJ5XCIsXG5cdFwiYnFiaW9sOmlzRW5jb2RlZEJ5XCIsXG5cdFwiYnFiaW9sOmlzSG9tb2xvZ1RvXCIsXG5cdFwiYnFiaW9sOmlzUGFydE9mXCIsXG5cdFwiYnFiaW9sOmlzUHJvcGVydHlPZlwiLFxuXHRcImJxYmlvbDppc1ZlcnNpb25PZlwiLFxuXHRcImJxYmlvbDpvY2N1cnNJblwiLFxuXHRcImJxYmlvbDpoYXNUYXhvblwiLFxuXG5cdFwic2lvOlNJT18wMDAyMjNcIlxuXTtcblxubnMuaXNDb250cm9sbGVkVm9jYWJ1bGFyeSA9IHt9O1xuZm9yKHZhciBpPTA7IGk8Y29udHJvbGxlZFZvY2FidWxhcnlMaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdHZhciB0ZXJtID0gY29udHJvbGxlZFZvY2FidWxhcnlMaXN0W2ldO1xuXHRucy5pc0NvbnRyb2xsZWRWb2NhYnVsYXJ5W25zLmV4cGFuZFByZWZpeCh0ZXJtKV0gPSB0cnVlO1xufVxuXG5ucy5yZWR1Y2VQcmVmaXggPSBmdW5jdGlvbiAoZXhwYW5kZWRTdHJpbmcpIHtcblx0Zm9yICh2YXIga2V5IGluIG5zLnByZWZpeGVzKSB7XG5cdFx0dmFyIGNvbXBsZXRlUHJlZml4ID0gbnMucHJlZml4ZXNba2V5XTtcblx0XHRpZiAoZXhwYW5kZWRTdHJpbmcuc3RhcnRzV2l0aChjb21wbGV0ZVByZWZpeCkpIHtcblx0XHRcdHJldHVybiBleHBhbmRlZFN0cmluZy5yZXBsYWNlKGNvbXBsZXRlUHJlZml4LCBrZXkrJzonKTtcblx0XHR9XG5cdH1cblx0Ly8gbm8gcHJlZml4IGNvdWxkIGJlIHJlY29nbml6ZWRcblx0cmV0dXJuIGV4cGFuZGVkU3RyaW5nO1xufTtcblxubnMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkKSB7XG5cdHZhciBrdnJlc3VsdCA9IHt9O1xuXHQvL2NvbnNvbGUubG9nKGdyYXBoLmdldFRyaXBsZXMoKSk7XG5cdHZhciBwcm9wQmFncyA9IGdyYXBoLmdldFRyaXBsZXMoaWQsIHN0cl9zaW8yMjMsIG51bGwpO1xuXHQvL2NvbnNvbGUubG9nKHByb3BCYWdzKTtcblx0Zm9yKHZhciBpPTA7IGk8cHJvcEJhZ3MubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgcHJvcEJhZyA9IHByb3BCYWdzW2ldLm9iamVjdDtcblx0XHQvL2NvbnNvbGUubG9nKHByb3BCYWcpO1xuXHRcdHZhciBwcm9wZXJ0eUNvbnRhaW5lcnMgPSBncmFwaC5nZXRUcmlwbGVzKHByb3BCYWcsIG51bGwsIG51bGwpO1xuXHRcdC8vY29uc29sZS5sb2cocHJvcGVydHlDb250YWluZXJzKTtcblx0XHRmb3IodmFyIGo9MDsgajxwcm9wZXJ0eUNvbnRhaW5lcnMubGVuZ3RoOyBqKyspIHtcblx0XHRcdHZhciBwcm9wZXJ0eUNvbnRhaW5lciA9IHByb3BlcnR5Q29udGFpbmVyc1tqXS5vYmplY3Q7XG5cdFx0XHRpZihwcm9wZXJ0eUNvbnRhaW5lciA9PSBzdHJfcmRmYmFnZXhwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Ly9jb25zb2xlLmxvZyhcImNvbnRhaW5lclwiLCBwcm9wZXJ0eUNvbnRhaW5lcik7XG5cdFx0XHR2YXIgdmFsdWUgPSBncmFwaC5nZXRPYmplY3RzKHByb3BlcnR5Q29udGFpbmVyLCBzdHJfcmRmdmFsdWVleHAsIG51bGwpWzBdO1xuXHRcdFx0dmFsdWUgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR2YXIga2V5ID0gZ3JhcGguZ2V0T2JqZWN0cyhwcm9wZXJ0eUNvbnRhaW5lciwgc3RyX3NpbzExNmV4cCwgbnVsbClbMF07XG5cdFx0XHRrZXkgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZShrZXkpO1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcblx0XHRcdGt2cmVzdWx0W2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGt2cmVzdWx0O1xufTtcblxubnMuZ2V0QWxsSWRzID0gZnVuY3Rpb24gKGdyYXBoKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0dmFyIGFsbCA9IGdyYXBoLmdldFN1YmplY3RzKCk7XG5cdC8vY29uc29sZS5sb2coZ3JhcGguZ2V0VHJpcGxlcygpKTtcblx0Ly9jb25zb2xlLmxvZyhhbGwpO1xuXHRmb3IodmFyIGk9MDsgaTxhbGwubGVuZ3RoOyBpKyspIHtcblx0XHRpZighIE4zLlV0aWwuaXNCbGFuayhhbGxbaV0pKSB7XG5cdFx0XHR2YXIgc3ViamVjdCA9IGFsbFtpXTsgLy8gcG90ZW50aWFsIElEc1xuXHRcdFx0Ly8gbm93IGNoZWNrIGlmIHRoZXkgYXJlbid0IHVzZWQgYXMgb2JqZWN0IG9mIG90aGVyIHRyaXBsZXNcblx0XHRcdHZhciBpZEFzT2JqZWN0ID0gZ3JhcGguY291bnRUcmlwbGVzKG51bGwsIG51bGwsIHN1YmplY3QpO1xuXHRcdFx0aWYgKGlkQXNPYmplY3QgPT0gMCkgeyAvLyBub3RoaW5nIGlzIG92ZXIgdGhpcyBpZCwgdHJ1ZSBpZFxuXHRcdFx0XHRyZXN1bHQucHVzaChzdWJqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2lsbCBhZGQgdHJpcGxlcyB0byByZXByZXNlbnQga2V5L3ZhbHVlIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8gdGhlIGlkXG4gKiBrdk9iamVjdCBjYW4gaGF2ZSBvbmUgb3IgbXVsdGlwbGUgcHJvcGVydGllc1xuICovXG5ucy5hZGRDdXN0b21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChncmFwaCwgaWQsIGt2T2JqZWN0KSB7XG5cdHZhciBzaW8yMjNFbGVtZW50ID0gbnMuZ2V0UmVsYXRpb25zaGlwKGdyYXBoLCBpZCwgc3RyX3NpbzIyMylbMF07IC8vIGRvZXNuJ3QgbWF0dGVyIGlmIG1vcmUgdGhhbiBvbmVcblx0Ly9jb25zb2xlLmxvZyhcImFkZCBrdiB0b1wiLCBoYXNQcm9wRWxlbWVudCk7XG5cdGZvcih2YXIga2V5IGluIGt2T2JqZWN0KSB7XG5cdFx0Ly8gdXNpbmcgZWxlbW50IGNvdW50IGFzIGluZGV4IG1heSBiZSBkYW5nZXJvdXMgaWYgcHJldmlvdXMgbWFuaXB1bGF0aW9uIG9mXG5cdFx0Ly8gdGhlIGVsZW1lbnRzIGhhcyBoYXBwZW5lZC4gTGlrZSByZW1vdmluZyBvbmUuIFxuXHRcdHZhciBwcm9wSW5kZXggPSBucy5jb3VudEJhZ0VsZW1lbnRzKGdyYXBoLCBzaW8yMjNFbGVtZW50KSArIDE7XG5cdFx0Ly9jb25zb2xlLmxvZyhcImVsZW1lbnRzIGluIGJhZzpcIiwgcHJvcEluZGV4KTtcblx0XHR2YXIgbmV3QmxhbmsgPSBncmFwaC5jcmVhdGVCbGFua05vZGUoKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiZXhwYW5kIGxpc3QgZWxlbWVudFwiLCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCkpO1xuXHRcdGdyYXBoLmFkZFRyaXBsZShzaW8yMjNFbGVtZW50LCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCksIG5ld0JsYW5rKTtcblx0XHRncmFwaC5hZGRUcmlwbGUobmV3QmxhbmssIHN0cl9zaW8xMTZleHAsIE4zLlV0aWwuY3JlYXRlTGl0ZXJhbChrZXkpKTtcblx0XHRncmFwaC5hZGRUcmlwbGUobmV3QmxhbmssIHN0cl9yZGZ2YWx1ZWV4cCwgTjMuVXRpbC5jcmVhdGVMaXRlcmFsKGt2T2JqZWN0W2tleV0pKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWRkZWRcIiwga2V5LCBrdk9iamVjdFtrZXldKTtcblx0fVxufTtcblxubnMuaGFzUmVsYXRpb25zaGlwID0gZnVuY3Rpb24gKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKSB7XG5cdHZhciBjb3VudFByb3AgPSBncmFwaC5jb3VudFRyaXBsZXMoaWQsIHJlbGF0aW9uc2hpcCwgbnVsbCk7XG5cdHJldHVybiBjb3VudFByb3AgPiAwO1xufTtcblxubnMuY291bnRCYWdFbGVtZW50cyA9IGZ1bmN0aW9uKGdyYXBoLCBzdWJqZWN0KSB7XG5cdHJldHVybiBncmFwaC5jb3VudFRyaXBsZXMoc3ViamVjdCwgbnVsbCwgbnVsbCkgLSAxO1xufTtcblxubnMuZ2V0UmVzb3VyY2VzT2ZJZCA9IGZ1bmN0aW9uKGdyYXBoLCBpZCkge1xuXHR2YXIgcmVzdWx0ID0ge307XG5cdGdyYXBoLmZvckVhY2goZnVuY3Rpb24oaW5pdF90cmlwbGUpeyAvLyBpdGVyYXRlIG92ZXIgYWxsIGlkIHJlbGF0aW9uc2hpcHNcblx0XHQvLyB3ZSB3YW50IGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYSBzaW1wZWwga2V5L3ZhbHVlIHByb3BlcnR5XG5cdFx0aWYoaW5pdF90cmlwbGUucHJlZGljYXRlICE9IHN0cl9zaW8yMjNleHApIHtcblx0XHRcdHZhciByZWxhdGlvbiA9IGluaXRfdHJpcGxlLnByZWRpY2F0ZTtcblx0XHRcdC8vIGluaXRpYWxpemUgcmVsYXRpb24gYXJyYXkgaWYgbmV2ZXIgZW5jb3VudGVyZWQgYmVmb3JlXG5cdFx0XHRpZighcmVzdWx0Lmhhc093blByb3BlcnR5KHJlbGF0aW9uKSkge1xuXHRcdFx0XHRyZXN1bHRbcmVsYXRpb25dID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIG11bHRpcGxlIHJlc291cmNlcyBzcGVjaWZpZWQsIG9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBzZXZlcmFsIGF0dHJpYnV0ZXMsXG5cdFx0XHQvLyBibGFuayBub2RlIGlzIGludm9sdmVkLCBwb3NzaWJseSB3aXRoIGEgYmFnIGF0dHJpYnV0ZVxuXHRcdFx0aWYoTjMuVXRpbC5pc0JsYW5rKGluaXRfdHJpcGxlLm9iamVjdCkpIHtcblx0XHRcdFx0dmFyIHJlc291cmNlQ29udGFpbmVyID0gaW5pdF90cmlwbGUub2JqZWN0O1xuXHRcdFx0XHRncmFwaC5mb3JFYWNoKGZ1bmN0aW9uKHRyaXBsZSl7IC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJlbGF0aW9uc2hpcFxuXHRcdFx0XHRcdC8vIHJlbGF0aW9uc2hpcCBtYXkgYmUgYSBiYWcsIGFuZCB0aHVzIGNvbnRhaW5zIHVuZGVzaXJhYmxlIHJkZjp0eXBlIGJhZyBsaW5lXG5cdFx0XHRcdFx0aWYodHJpcGxlLm9iamVjdCAhPSBzdHJfcmRmYmFnZXhwKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzb3VyY2UgPSB0cmlwbGUub2JqZWN0O1xuXHRcdFx0XHRcdFx0cmVzdWx0W3JlbGF0aW9uXS5wdXNoKHJlc291cmNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHJlc291cmNlQ29udGFpbmVyLCBudWxsLCBudWxsKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgeyBcblx0XHRcdFx0Ly8gc2ltcGxlIGNhc2UsIG5vIGJhZywgb25seSAxIHJlc291cmNlIGlzIGxpbmtlZCB3aXRoIDEgYXR0cmlidXRlXG5cdFx0XHRcdHZhciByZXNvdXJjZSA9IGluaXRfdHJpcGxlLm9iamVjdDtcblx0XHRcdFx0cmVzdWx0W3JlbGF0aW9uXS5wdXNoKHJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIGlkLCBudWxsLCBudWxsKTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogcmV0dXJucyB0aGUgaWQgb2YgYSBuZXdseSBjcmVhdGVkIGJsYW5rIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBIYXNQcm9wZXJ0eSBwcmVkaWNhdGVcbiAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyBpdHMgaWRcbiAqIHJldHVybnMgYXJyYXksIHBvdGVudGlhbGx5IHNldmVyYWwgU0lPMjIzIHByZXNlbnRcbiAqL1xubnMuZ2V0UmVsYXRpb25zaGlwID0gZnVuY3Rpb24gKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKSB7XG5cdGlmIChucy5oYXNSZWxhdGlvbnNoaXAoZ3JhcGgsIGlkLCByZWxhdGlvbnNoaXApKSB7XG5cdFx0dmFyIG9iamVjdCA9IGdyYXBoLmdldE9iamVjdHMoaWQsIHJlbGF0aW9uc2hpcCwgbnVsbClbMF07IC8vIGNhcmVmdWwgaGVyZVxuXHRcdGlmICghTjMuVXRpbC5pc0JsYW5rKG9iamVjdCkpe1xuXHRcdFx0Ly8gb2JqZWN0IG9mIHJlbGF0aW9uc2hpcCBpc24ndCBhIGJhZy4gTmVlZCB0byB0dXJuIGl0IGludG8gYSBiYWcuXG5cdFx0XHR2YXIgbmV3QmFnID0gbnMuY3JlYXRlQmFnKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKTtcblx0XHRcdGdyYXBoLmFkZFRyaXBsZShpZCwgcmVsYXRpb25zaGlwLCBuZXdCYWcpO1xuXHRcdFx0Z3JhcGguYWRkVHJpcGxlKG5ld0JhZywgbnMuZXhwYW5kUHJlZml4KFwicmRmOl8xXCIpLCBvYmplY3QpO1xuXHRcdFx0cmV0dXJuIFtuZXdCYWddO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJldHVybiBncmFwaC5nZXRPYmplY3RzKGlkLCByZWxhdGlvbnNoaXAsIG51bGwpO1xuXHRcdH1cblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm4gW25zLmNyZWF0ZUJhZyhncmFwaCwgaWQsIHJlbGF0aW9uc2hpcCldO1xuXHR9XG59O1xuXG5ucy5jcmVhdGVCYWcgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkLCByZWxhdGlvbnNoaXApIHtcblx0dmFyIG5ld0JsYW5rID0gZ3JhcGguY3JlYXRlQmxhbmtOb2RlKCk7XG5cdGdyYXBoLmFkZFRyaXBsZShpZCwgbnMuZXhwYW5kUHJlZml4KHJlbGF0aW9uc2hpcCksIG5ld0JsYW5rKTtcblx0Z3JhcGguYWRkVHJpcGxlKG5ld0JsYW5rLCBzdHJfcmRmdHlwZWV4cCwgc3RyX3JkZmJhZ2V4cCk7XG5cdHJldHVybiBuZXdCbGFuaztcbn07XG5cbi8qKlxuICoga3ZvYmplY3QgY29udGFpbnMgYmlvbG9neSBxdWFsaWZpZXIgYXMga2V5IGFuZCBtaXJpYW0gcmVzb3VyY2UgYXMgdmFsdWVcbiAqL1xubnMuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkLCBrdk9iamVjdCkge1xuXHRmb3IodmFyIHJlbGF0aW9uIGluIGt2T2JqZWN0KSB7XG5cdFx0Ly9jb25zb2xlLmxvZyhcInJlbGF0aW9uXCIsIHJlbGF0aW9uKTtcblx0XHR2YXIgcmVsYXRpb25FbGVtZW50ID0gbnMuZ2V0UmVsYXRpb25zaGlwKGdyYXBoLCBpZCwgcmVsYXRpb24pWzBdOyAvLyBkb2Vzbid0IG1hdHRlciBpZiBtb3JlIHRoYW4gb25lXG5cdFx0Ly9jb25zb2xlLmxvZyhcImFmdGVyIGdldCByZWxhdGlvblwiLHJlbGF0aW9uRWxlbWVudCwgZ3JhcGguZ2V0VHJpcGxlcyhpZCwgcmVsYXRpb24pKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWZ0ZXIgZ2V0IHJlYWx0aW9uXCIsIGdyYXBoLmdldFRyaXBsZXMoKSk7XG5cdFx0Ly8gdXNpbmcgZWxlbW50IGNvdW50IGFzIGluZGV4IG1heSBiZSBkYW5nZXJvdXMgaWYgcHJldmlvdXMgbWFuaXB1bGF0aW9uIG9mXG5cdFx0Ly8gdGhlIGVsZW1lbnRzIGhhcyBoYXBwZW5lZC4gTGlrZSByZW1vdmluZyBvbmUuIFxuXHRcdHZhciBwcm9wSW5kZXggPSBucy5jb3VudEJhZ0VsZW1lbnRzKGdyYXBoLCByZWxhdGlvbkVsZW1lbnQpICsgMTtcblx0XHQvL2NvbnNvbGUubG9nKFwiZWxlbWVudHMgaW4gYmFnOlwiLCBwcm9wSW5kZXgpO1xuXHRcdC8vY29uc29sZS5sb2coXCJuZXcgYmxhbmsgbm9kZVwiLCBncmFwaC5nZXRUcmlwbGVzKCkpO1xuXHRcdC8vY29uc29sZS5sb2coXCJXaWxsIGFkZFwiLCByZWxhdGlvbkVsZW1lbnQsIG5zLmV4cGFuZFByZWZpeChcInJkZjpfXCIrcHJvcEluZGV4KSwga3ZPYmplY3RbcmVsYXRpb25dKTtcblx0XHRncmFwaC5hZGRUcmlwbGUocmVsYXRpb25FbGVtZW50LCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCksIGt2T2JqZWN0W3JlbGF0aW9uXSk7XG5cdFx0Ly9jb25zb2xlLmxvZyhcImVuZCByZXN1bHRcIiwgZ3JhcGguZ2V0VHJpcGxlcygpKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWRkZWRcIiwgcmVsYXRpb24sIGt2T2JqZWN0W3JlbGF0aW9uXSk7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbnM7IiwiLyoqXG4gKiBUaGlzIHN1Ym1vZHVsZSBtYW5hZ2VzIHRoZSBhbm5vdGF0aW9ucyBleHRlbnNpb24uIEl0IGFkZHMgdGhlIGFiaWxpdHkgdG8gc2F2ZSBzZW1hbnRpYyBkYXRhIGludG9cbiAqIFNCR04tTUwgaW4gdGhlIGZvcm0gb2YgUkRGIGVsZW1lbnRzLiBBbnkgU0JHTiBlbGVtZW50IHRoYXQgY2FuIGhvc3QgYW4gZXh0ZW5zaW9uIHRhZyBjYW4gYWxzbyBcbiAqIGdldCBSREYgYW5ub3RhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBhbG1vc3QgZXZlcnkgZWxlbWVudCBjYW4gZ2V0IGFubm90YXRlZC5cbiAqXG4gKiBUaGUgYW5ub3RhdGlvbnMgaGVyZSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0d28gd2F5czpcbiAqIC0gd2l0aCBjb250cm9sbGVkIHZvY2FidWxhcnkgYW5kIHJlc291cmNlcywgYXMgc3VnZ2VzdGVkIGJ5IENPTUJJTkUsIHdpdGggdGhlIGhlbHAgb2YgTUlSSUFNXG4gKiAgIGlkZW50aWZpZXJzLlxuICogLSBhcyBhIG1lYW4gdG8gYXR0YWNoIGFyYml0cmFyeSBkYXRhIGluIHRoZSBmb3JtIG9mIGtleS12YWx1ZSBwcm9wZXJ0aWVzLlxuICpcbiAqICMgQ29udHJvbGxlZCB2b2NhYnVsYXJ5XG4gKlxuICogVGhlIGZvcm1hbCB3YXkgb2YgdXNpbmcgYW5ub3RhdGlvbnMgaXMgdG8gdXNlIHNwZWNpZmljIHZvY2FidWxhcnkgd2l0aCBzcGVjaWZpYyBpZGVudGlmaWVycyB0b1xuICogcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIG5vdCBiZSBjb252ZXllZCBvdGhlcndpc2UgdGhyb3VnaCB0aGUgU0JHTiBmb3JtYXQuXG4gKiBTZWUgLS1saW5rIHRvIGNvbWJpbmUgcXVhbGlmaWVycy0tIGFuZCAtLWxpbmsgdG8gaWRlbnRpZmllcnMub3JnIGFuZCBNSVJJQU0tLS1cbiAqIFRoaXMgd2FzIGFsc28gYmFzZWQgb24gdGhlIGFubm90YXRpb24gZXh0ZW5zaW9uIG9mIFNCTUwgLS1saW5rIHRvIGFubm90YXRpb24gcHJvcG9zYWwgZm9yIFNCTUwtLVxuICpcbiAqXG4gKiBTZWUge0BsaW5rIEV4dGVuc2lvbn0gZm9yIG1vcmUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiBleHRlbnNpb25zIGluIHRoZSBTQkdOLU1MIGZvcm1hdC5cbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMgbGlrZSB0aGlzOiA8Y29kZT5saWJzYmduLmFubm90LkFubm90YXRpb248L2NvZGU+XG4gKlxuICogQG1vZHVsZSBsaWJzYmduLWFubm90YXRpb25zXG4gKiBAbmFtZXNwYWNlIGxpYnNiZ24uYW5ub3RcbiovXG5cbnZhciBjaGVja1BhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzJykuY2hlY2tQYXJhbXM7XG52YXIgJHJkZiA9IHJlcXVpcmUoJ3JkZmxpYicpO1xudmFyIE4zID0gcmVxdWlyZSgnbjMnKTtcbnZhciBVdGlsID0gcmVxdWlyZSgnLi9hbm5vdGF0aW9uLXV0aWxzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxpdGllcycpO1xuXG52YXIgbnMgPSB7fTtcblxuLy9ucy54bWxucyA9IFwiaHR0cDovL3d3dy5zYm1sLm9yZy9zYm1sL2xldmVsMy92ZXJzaW9uMS9yZW5kZXIvdmVyc2lvbjFcIjtcblxuLy8gLS0tLS0tLSBBTk5PVEFUSU9OIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2Fubm90YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1JkZkVsZW1lbnQ9fSBwYXJhbXMucmRmRWxlbWVudFxuICovXG52YXIgQW5ub3RhdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydyZGZFbGVtZW50J10pO1xuXHR0aGlzLnJkZkVsZW1lbnQgPSBwYXJhbXMucmRmRWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSZGZFbGVtZW50fSByZGZFbGVtZW50XG4gKi9cbkFubm90YXRpb24ucHJvdG90eXBlLnNldFJkZkVsZW1lbnQgPSBmdW5jdGlvbihyZGZFbGVtZW50KSB7XG5cdHRoaXMucmRmRWxlbWVudCA9IHJkZkVsZW1lbnQ7XG59O1xuXG5Bbm5vdGF0aW9uLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgYW5ub3RhdGlvbkpzb25PYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoYW5ub3RhdGlvbkpzb25PYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkpzb25PYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuQW5ub3RhdGlvbi5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHthbm5vdGF0aW9uOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG5Bbm5vdGF0aW9uLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhbm5vdGF0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb24uZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmdLZWVwUHJlZml4KHN0cmluZywgZm4pO1xuICAgIHJldHVybiBhbm5vdGF0aW9uO1xufTtcblxuQW5ub3RhdGlvbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouYW5ub3RhdGlvbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgYW5ub3RhdGlvbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgYW5ub3RhdGlvbiA9IG5ldyBucy5Bbm5vdGF0aW9uKCk7XG5cdGpzT2JqID0ganNPYmouYW5ub3RhdGlvbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gYW5ub3RhdGlvbjtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqWydyZGY6UkRGJ10pIHtcblx0XHQvKnZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbnMuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5mcm9tT2JqKHtsaXN0T2ZDb2xvckRlZmluaXRpb25zOiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mQ29sb3JEZWZpbml0aW9ucyhsaXN0T2ZDb2xvckRlZmluaXRpb25zKTsqL1xuXG5cdFx0dmFyIG9iaiA9IHt9O1xuXHRcdG9ialsncmRmOlJERiddID0ganNPYmpbJ3JkZjpSREYnXVswXTtcblx0XHR2YXIgcmRmID0gbnMuUmRmRWxlbWVudC5mcm9tT2JqKG9iaik7XG5cdFx0YW5ub3RhdGlvbi5zZXRSZGZFbGVtZW50KHJkZik7XG5cdH1cblxuXHRyZXR1cm4gYW5ub3RhdGlvbjtcbn07XG5cbm5zLkFubm90YXRpb24gPSBBbm5vdGF0aW9uO1xuLy8gLS0tLS0tLSBFTkQgQU5OT1RBVElPTiAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gU1RPUkVPQkpFQ1QgLS0tLS0tLVxudmFyIFN0b3JlT2JqZWN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3N0b3JlJ10pO1xuXHRpZiAocGFyYW1zLnN0b3JlKSB7XG5cdFx0dGhpcy5zdG9yZSA9IHBhcmFtcy5zdG9yZTtcblx0fVxuXHRlbHNlIHtcblx0XHR2YXIgc3RvcmUgPSBOMy5TdG9yZSgpO1xuXHRcdHN0b3JlLmFkZFByZWZpeGVzKFV0aWwucHJlZml4ZXMpO1xuXHRcdHRoaXMuc3RvcmUgPSBzdG9yZTtcblx0fVxufTtcblxuU3RvcmVPYmplY3QucHJvdG90eXBlLmdldEN1c3RvbVByb3BlcnRpZXNPZklkID0gZnVuY3Rpb24gKGlkKSB7XG5cdHJldHVybiBVdGlsLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKHRoaXMuc3RvcmUsIGlkKTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5nZXRBbGxJZHMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBVdGlsLmdldEFsbElkcyh0aGlzLnN0b3JlKTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5hZGRDdXN0b21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChpZCwga3ZPYmplY3QpIHtcblx0cmV0dXJuIFV0aWwuYWRkQ3VzdG9tUHJvcGVydHkodGhpcy5zdG9yZSwgaWQsIGt2T2JqZWN0KTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5nZXRSZXNvdXJjZXNPZklkID0gZnVuY3Rpb24oaWQpIHtcblx0cmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VzT2ZJZCh0aGlzLnN0b3JlLCBpZCk7XG59O1xuXG5TdG9yZU9iamVjdC5wcm90b3R5cGUuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbiAoaWQsIGt2T2JqZWN0KSB7XG5cdHJldHVybiBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkLCBrdk9iamVjdCk7XG59O1xuXG5ucy5TdG9yZU9iamVjdCA9IFN0b3JlT2JqZWN0O1xuLy8gLS0tLS0tLSBFTkQgU1RPUkVPQkpFQ1QgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEdMT0JBTFNUT1JFIC0tLS0tLS1cbnZhciBHbG9iYWxSZGZTdG9yZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0bnMuU3RvcmVPYmplY3QuY2FsbCh0aGlzLCBwYXJhbXMpO1xufTtcbkdsb2JhbFJkZlN0b3JlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU3RvcmVPYmplY3QucHJvdG90eXBlKTtcbkdsb2JhbFJkZlN0b3JlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdsb2JhbFJkZlN0b3JlO1xuXG5HbG9iYWxSZGZTdG9yZS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChhbm5vdGF0aW9ucykge1xuXHRmb3IodmFyIGk9MDsgaTxhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBhbm5vdCA9IGFubm90YXRpb25zW2ldO1xuXHRcdGlmKGFubm90LnJkZkVsZW1lbnQgIT0gbnVsbCkge1xuXHRcdFx0dmFyIHJkZkVsZW1lbnQgPSBhbm5vdC5yZGZFbGVtZW50cztcblx0XHRcdHRoaXMuc3RvcmUuYWRkVHJpcGxlcyhyZGZFbGVtZW50LnN0b3JlLmdldFRyaXBsZXMoKSk7XG5cdFx0fVxuXHR9XG5cdHRoaXMuc3RvcmUuYWRkUHJlZml4ZXMoVXRpbC5wcmVmaXhlcyk7XG59O1xuXG5HbG9iYWxSZGZTdG9yZS5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uICgpIHtcblx0Y29uc29sZS5sb2coXCJnbG9iYWxzdG9yZSB0ZXN0XCIpO1xuXHR2YXIgaWQyID0gXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMlwiO1xuXHR2YXIgaWQxID0gXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMVwiO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkMlwiLCB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkMikpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBpZHNcIiwgdGhpcy5nZXRBbGxJZHMoKSk7XG5cdGNvbnNvbGUubG9nKFwiaGFzU0lPXCIsIFV0aWwuaGFzUmVsYXRpb25zaGlwKHRoaXMuc3RvcmUsIGlkMiwgXCJzaW86U0lPXzAwMDIyM1wiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWRkIGhhc3Byb3BcIiwgVXRpbC5nZXRSZWxhdGlvbnNoaXAodGhpcy5zdG9yZSwgaWQxLCBcInNpbzpTSU9fMDAwMjIzXCIpKTtcblx0Y29uc29sZS5sb2coXCJhZGQgaGFzcHJvcDJcIiwgVXRpbC5nZXRSZWxhdGlvbnNoaXAodGhpcy5zdG9yZSwgaWQyLCBcInNpbzpTSU9fMDAwMjIzXCIpKTtcblx0Y29uc29sZS5sb2coXCJoYXNTSU8yXCIsIFV0aWwuaGFzUmVsYXRpb25zaGlwKHRoaXMuc3RvcmUsIGlkMiwgXCJzaW86U0lPXzAwMDIyM1wiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWRkIGt2cHJvcFwiLCBVdGlsLmFkZEN1c3RvbVByb3BlcnR5KHRoaXMuc3RvcmUsIGlkMiwge3Rlc3Q6IFwidGVzdHZhbHVlXCJ9KSk7XG5cdGNvbnNvbGUubG9nKFwiYWxsIHByb3BlcnRpZXMgb2YgaWQyXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoaWQyKSk7XG5cdGNvbnNvbGUubG9nKFwiLS0tLS0tLVwiKTtcblx0Y29uc29sZS5sb2coXCJhbGwgcHJvcGVydGllcyBvZiBpZFwiLCB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkMSkpO1xuXHRjb25zb2xlLmxvZyhcImFkZCBrdnByb3BcIiwgVXRpbC5hZGRDdXN0b21Qcm9wZXJ0eSh0aGlzLnN0b3JlLCBpZDEsIHt0ZXN0OiBcInRlc3R2YWx1ZVwifSkpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoaWQxKSk7XG5cdGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcblx0Y29uc29sZS5sb2coXCJnZXQgYWxsIHJlc291cmNlc1wiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQxKSk7XG5cdGNvbnNvbGUubG9nKFwiZ2V0IGFsbCByZXNvdXJjZXMgZm9yIGlkMlwiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQyKSk7XG5cdGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcblx0Y29uc29sZS5sb2coXCJhZGQgcmVzb3VyY2UgZm9yIGlkMlwiLCBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkMiwge1wiYnFiaW9sOmlzXCI6IFwiaHR0cDovL2FVUkxcIn0pKTtcblx0Y29uc29sZS5sb2coXCJnZXQgYWxsIHJlc291cmNlcyBmb3IgaWQyXCIsIFV0aWwuZ2V0UmVzb3VyY2VzT2ZJZCh0aGlzLnN0b3JlLCBpZDIpKTtcblx0Y29uc29sZS5sb2coXCJhZGQgcmVzb3VyY2UgZm9yIGlkMlwiLCBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkMiwge1wiYnFtb2RlbDppc1wiOiBcImh0dHA6Ly9hVVJMWlpaXCJ9KSk7XG5cdGNvbnNvbGUubG9nKFwiZ2V0IGFsbCByZXNvdXJjZXMgZm9yIGlkMlwiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQyKSk7XG5cdC8qdmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLmdldEFsbElkcygpLmZvckVhY2goZnVuY3Rpb24oZSl7XG5cdFx0Y29uc29sZS5sb2coZSwgc2VsZi5nZXRDdXN0b21Qcm9wZXJ0aWVzT2ZJZChlKSk7XG5cdH0pOyovXG59O1xuXG5ucy5HbG9iYWxSZGZTdG9yZSA9IEdsb2JhbFJkZlN0b3JlO1xuLy8gLS0tLS0tLSBFTkQgR0xPQkFMU1RPUkUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFJERkVMRU1FTlQgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cmQ6UkRGZiZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqL1xudmFyIFJkZkVsZW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdG5zLlN0b3JlT2JqZWN0LmNhbGwodGhpcywgcGFyYW1zKTtcbn07XG5SZGZFbGVtZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU3RvcmVPYmplY3QucHJvdG90eXBlKTtcblJkZkVsZW1lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmRmRWxlbWVudDtcblxuUmRmRWxlbWVudC51cmkgPSAnaHR0cDovL3d3dy5laXNibS5vcmcvJztcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblJkZkVsZW1lbnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24oKSB7XG5cdC8qXG5cdFx0QWRkIHNvbWUgZnVuY3Rpb25zIHRvIHRoZSB3cml0ZXIgb2JqZWN0IG9mIE4zXG5cdFx0VGhvc2UgZnVuY3Rpb25zIHdpbGwgYWxsb3cgdXMgdG8gc2VyaWFsaXplIHRyaXBsZXMgc3luY2hyb25vdXNseS5cblx0XHRXaXRob3V0IGl0LCB3ZSB3b3VsZCBiZSBmb3JjZWQgdG8gdXNlIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb25zLlxuXHQqL1xuXHRmdW5jdGlvbiBhZGRTaW1wbGVXcml0ZSAod3JpdGVyKSB7XG5cdFx0Ly8gcmVwbGljYXRlcyB0aGUgd3JpdGVyLl93cml0ZSBmdW5jdGlvbiBidXQgcmV0dXJucyBhIHN0cmluZ1xuXHRcdHdyaXRlci5zaW1wbGVXcml0ZVRyaXBsZSA9IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpICtcblx0XHRcdChncmFwaCA/ICcgJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcuXFxuJyA6ICcuXFxuJylcblx0XHR9O1xuXHRcdC8vIGFsbG93cyB0byBwcm92aWRlIGFuIGFycmF5IG9mIHRyaXBsZXMgYW5kIGNvbmNhdGVuYXRlIHRoZWlyIHNlcmlhbGl6ZWQgc3RyaW5nc1xuXHRcdHdyaXRlci5zaW1wbGVXcml0ZVRyaXBsZXMgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHZhciBzdHJpbmdOMyA9ICcnO1xuXHRcdFx0Zm9yICh2YXIgaT0wOyBpPGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciB0cmlwbGUgPSBhcnJheVtpXTtcblx0XHRcdFx0c3RyaW5nTjMgKz0gdGhpcy5zaW1wbGVXcml0ZVRyaXBsZSh0cmlwbGUuc3ViamVjdCwgdHJpcGxlLnByZWRpY2F0ZSwgdHJpcGxlLm9iamVjdCwgdHJpcGxlLmdyYXBoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzdHJpbmdOMztcblx0XHR9O1xuXHR9XG5cblx0Ly8gc2VyaWFsaXplIHRoZSBzdG9yZWQgZ3JhcGggdG8gTjNcblx0dmFyIHdyaXRlciA9IE4zLldyaXRlcih7IHByZWZpeGVzOiBVdGlsLnByZWZpeGVzLCBmb3JtYXQ6ICdOLVRyaXBsZXMnIH0pO1xuXHRhZGRTaW1wbGVXcml0ZSh3cml0ZXIpOyAvLyBhZGQgb3VyIGN1c3RvbSBtZXRob2RzIHRvIHRoZSB3cml0ZXJcblx0dmFyIHN0cmluZ04zID0gd3JpdGVyLnNpbXBsZVdyaXRlVHJpcGxlcyh0aGlzLnN0b3JlLmdldFRyaXBsZXMoKSk7IC8vIHVzZSBjdXN0b20gbWV0aG9kIHRvIHNlcmlhbGl6ZSB0cmlwbGVzXG5cblx0Ly8gcmVhZCBOMyBmb3JtYXRcblx0dmFyIGdyYXBoID0gJHJkZi5ncmFwaCgpO1xuXHR0cnkge1xuXHQgICAgJHJkZi5wYXJzZShzdHJpbmdOMywgZ3JhcGgsIFJkZkVsZW1lbnQudXJpLCAndGV4dC9uMycpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0ICAgIGNvbnNvbGUubG9nKGVycik7XG5cdH1cblx0Lypcblx0XHRUaGUgbmFtZXNwYWNlIHByZWZpeGVzIGFyZSBsb3N0IGluIHRoZSBuMyBmb3JtYXQsIHNvIHJkZmxpYiB3aWxsIGd1ZXNzIHRoZW0gb24gaXRzIG93bi5cblx0XHRUaGUgcmVzdWx0IGdpdmVzIHdlaXJkIHdyb25nIHByZWZpeGVzLiBIZXJlIHdlIHByb3ZpZGUgdGhlIG9yaWdpbmFsIG5hbWVzLiBBZXN0aGV0aWMgcHVycG9zZSBvbmx5LlxuXHQqL1xuXHRncmFwaC5uYW1lc3BhY2VzID0gVXRpbC5wcmVmaXhlcztcblxuXHQvKlxuXHRcdHNlcmlhbGl6ZSB0byBSREYrWE1MIFxuXHRcdHByb2JsZW0sIHRoZSBvdXRwdXQgZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCBYTUwuIHJkZmxpYiBleHBhbmRzIGNvbGxlY3Rpb25zIGxpa2UgQmFnLCBhbmQgXG5cdFx0ZWxlbWVudHMgd2l0aCBvbmx5IGF0cmlidXRlcy4gSXQgYWxzbyBtYWtlcyB0aGluZ3MgbGVzcyByZWFkYWJsZS5cblx0XHRXZSBuZWVkIHRvIHJlcGxhY2Ugc2V2ZXJhbCB0aGluZ3MgdG8ga2VlcCBvdXRwdXQgdGhlIHNhbWUgYXMgaW5wdXQuIFxuXHQqL1xuXHR2YXIgc2VyaWFsaXplID0gJHJkZi5zZXJpYWxpemUoJHJkZi5zeW0oUmRmRWxlbWVudC51cmkpLCBncmFwaCwgdW5kZWZpbmVkLCAnYXBwbGljYXRpb24vcmRmK3htbCcpO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2VMaShzdHJpbmcpIHtcblx0XHR2YXIgcmVnZXhwTGkgPSAvPHJkZjpsaSggcmRmOnBhcnNlVHlwZT1cIlJlc291cmNlXCIpPz5bXFxzXFxTXSo/PChcXHcrKTpTSU9fMDAwMTE2PihbXFxzXFxTXSo/KTxcXC9cXDI6U0lPXzAwMDExNj5bXFxzXFxTXSo/PHJkZjp2YWx1ZT4oW1xcc1xcU10qPyk8XFwvcmRmOnZhbHVlPltcXHNcXFNdKj88XFwvcmRmOmxpPi9nO1xuXHRcdHZhciByZXN1bHQgPSBzdHJpbmcucmVwbGFjZShyZWdleHBMaSwgJzxyZGY6bGkgJDI6U0lPXzAwMDExNj1cIiQzXCIgcmRmOnZhbHVlPVwiJDRcIi8+Jyk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlcGxhY2VCYWcoc3RyaW5nKSB7XG5cdFx0Ly8gcmVnZXhwIHdpbGwgc3BvdCBhIHRyYW5zZm9ybWVkIGJhZyBhbmQgY2FwdHVyZSBpdHMgY29udGVudFxuXHRcdHZhciByZWdleHBCYWcgPSAvKDxyZGY6RGVzY3JpcHRpb24+KFtcXHNcXFNdKj8pPHJkZjp0eXBlIHJkZjpyZXNvdXJjZT1cImh0dHA6XFwvXFwvd3d3XFwudzNcXC5vcmdcXC8xOTk5XFwvMDJcXC8yMi1yZGYtc3ludGF4LW5zI0JhZ1wiXFwvPltcXHNcXFNdKj88XFwvcmRmOkRlc2NyaXB0aW9uPikvZztcblx0XHR2YXIgcmVzdWx0MSA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4cEJhZywgJzxyZGY6QmFnPiQyPC9yZGY6QmFnPicpO1xuXHRcdHZhciByZXN1bHQyID0gcmVzdWx0MS5yZXBsYWNlKC8gICAgPFxcL3JkZjpCYWc+L2csICc8L3JkZjpCYWc+Jyk7XG5cdFx0cmV0dXJuIHJlc3VsdDI7XG5cdH1cblxuXHRmdW5jdGlvbiByZXBsYWNlUGFyc2VUeXBlKHN0cmluZykge1xuXHRcdHZhciByZWdleHAgPSAvIHJkZjpwYXJzZVR5cGU9XCJSZXNvdXJjZVwiL2c7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlZ2V4cCwgJycpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVwbGFjZVNsYXNoSW5JRChzdHJpbmcpIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UobmV3IFJlZ0V4cCgvcmRmOmFib3V0PVwiXFwvL2cpLCAncmRmOmFib3V0PVwiJyk7XG5cdH1cblx0XG5cdHZhciByZXN1bHQgPSByZXBsYWNlU2xhc2hJbklEKHJlcGxhY2VQYXJzZVR5cGUocmVwbGFjZUxpKHJlcGxhY2VCYWcoc2VyaWFsaXplKSkpKTtcblx0XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0geG1sXG4gKiBAcmV0dXJuIHtSZGZFbGVtZW50fVxuICovXG5SZGZFbGVtZW50LmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nWG1sKSB7XG5cblx0dmFyIHJkZkVsZW1lbnQgPSBuZXcgUmRmRWxlbWVudCgpO1xuXHR2YXIgZ3JhcGggPSAkcmRmLmdyYXBoKCk7XG5cblx0Ly8gcmRmbGliIG9ubHkgYWNjZXB0cyBzdHJpbmcgYXMgaW5wdXQsIG5vdCB4bWwgZWxlbWVudHNcblx0dHJ5IHtcblx0ICAgICRyZGYucGFyc2Uoc3RyaW5nWG1sLCBncmFwaCwgUmRmRWxlbWVudC51cmksICdhcHBsaWNhdGlvbi9yZGYreG1sJyk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHQgICAgY29uc29sZS5sb2coZXJyKTtcblx0fVxuXHRcblx0Ly8gY29udmVydCB0byB0dXJ0bGUgdG8gZmVlZCB0byBOM1xuXHR2YXIgdHVydGxlID0gJHJkZi5zZXJpYWxpemUoJHJkZi5zeW0oUmRmRWxlbWVudC51cmkpLCBncmFwaCwgdW5kZWZpbmVkLCAndGV4dC90dXJ0bGUnKTtcblxuXHR2YXIgcGFyc2VyID0gTjMuUGFyc2VyKCk7XG5cdHZhciBzdG9yZSA9IE4zLlN0b3JlKCk7XG5cdHN0b3JlLmFkZFByZWZpeGVzKFV0aWwucHJlZml4ZXMpO1xuXHRzdG9yZS5hZGRUcmlwbGVzKHBhcnNlci5wYXJzZSh0dXJ0bGUpKTtcblx0XG5cdHJkZkVsZW1lbnQuc3RvcmUgPSBzdG9yZTtcblxuXHRyZXR1cm4gcmRmRWxlbWVudDtcbn07XG5cblJkZkVsZW1lbnQuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHJkZkVsZW1lbnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICByZGZFbGVtZW50ID0gUmRmRWxlbWVudC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZ0tlZXBQcmVmaXgoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIHJkZkVsZW1lbnQ7XG59O1xuXG5SZGZFbGVtZW50LmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09ialsncmRmOlJERiddID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSByZGY6UkRGLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciByZGZFbGVtZW50ID0gbmV3IG5zLlJkZkVsZW1lbnQoKTtcblx0anNPYmogPSBqc09ialsncmRmOlJERiddO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiByZGZFbGVtZW50O1xuXHR9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHRvYmpbJ3JkZjpSREYnXSA9IGpzT2JqO1xuXHRyZGZFbGVtZW50ID0gbnMuUmRmRWxlbWVudC5mcm9tU3RyaW5nKHV0aWxzLmJ1aWxkU3RyaW5nKG9iaikpO1xuXG5cdHJldHVybiByZGZFbGVtZW50O1xufTtcblxuUmRmRWxlbWVudC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKCkge1xuXHQvL2NvbnNvbGUubG9nKHRoaXMuc3RvcmUpO1xuXHQvL2NvbnNvbGUubG9nKHRoaXMuc3RvcmUuZ2V0VHJpcGxlcyhcImh0dHA6Ly9sb2NhbC9hbklEMDAwMDAxXCIsIG51bGwsIG51bGwpKTtcblx0Y29uc29sZS5sb2coXCJleHBhbmQgcHJlZml4IHNob3J0Y3V0XCIsIFV0aWwuZXhwYW5kUHJlZml4KFwic2lvOlNJT18wMDAxMTZcIikpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMVwiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWxsIGlkc1wiLCB0aGlzLmdldEFsbElkcygpKTtcbn07XG5cbm5zLlJkZkVsZW1lbnQgPSBSZGZFbGVtZW50O1xuLy8gLS0tLS0tLSBFTkQgUkRGRUxFTUVOVCAtLS0tLS0tXG5cblxubnMucmRmbGliID0gJHJkZjtcbm5zLlV0aWwgPSBVdGlsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5zO1xuIiwiLyoqXG4gKiBUaGlzIHN1Ym1vZHVsZSBjb250YWlucyB0aGUgY2xhc3NlcyB0byBtYW5hZ2UgdGhlIHJlbmRlciBleHRlbnNpb24ncyB4bWwgYW5kIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKiBJdCBhZGRzIHRoZSBhYmlsaXR5IHRvIHNhdmUgdGhlIHN0eWxlcyBhbmQgY29sb3JzIHVzZWQgaW4gYW4gU0JHTiBtYXAsIGFzIGZlYXR1cmVzIGxpa2UgYmFja2dyb3VuZC1jb2xvcixcbiAqIGJvcmRlciB0aGlja25lc3Mgb3IgZm9udCBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgU0JHTiBzdGFuZGFyZC5cbiAqXG4gKiBJdCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSB7QGxpbmsgaHR0cDovL3NibWwub3JnL0RvY3VtZW50cy9TcGVjaWZpY2F0aW9ucy9TQk1MX0xldmVsXzMvUGFja2FnZXMvcmVuZGVyfHJlbmRlciBleHRlbnNpb24gb2YgdGhlIFNCTUwgZm9ybWF0fS5cbiAqIEEgc3Vic2V0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBoYXMgYmVlbiBhZGFwdGVkIGZvciBTQkdOLU1MIGludGVncmF0aW9uLlxuICpcbiAqIFNlZSB7QGxpbmsgRXh0ZW5zaW9ufSBmb3IgbW9yZSBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIGV4dGVuc2lvbnMgaW4gdGhlIFNCR04tTUwgZm9ybWF0LlxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBsaWtlIHRoaXM6IDxjb2RlPmxpYnNiZ24ucmVuZGVyLkNvbG9yRGVmaW5pdGlvbjwvY29kZT5cbiAqXG4gKiBAbW9kdWxlIGxpYnNiZ24tcmVuZGVyXG4gKiBAbmFtZXNwYWNlIGxpYnNiZ24ucmVuZGVyXG4qL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxpdGllcycpO1xudmFyIGNoZWNrUGFyYW1zID0gdXRpbHMuY2hlY2tQYXJhbXM7XG52YXIgeG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG5cbnZhciBucyA9IHt9O1xuXG5ucy54bWxucyA9IFwiaHR0cDovL3d3dy5zYm1sLm9yZy9zYm1sL2xldmVsMy92ZXJzaW9uMS9yZW5kZXIvdmVyc2lvbjFcIjtcblxuLy8gLS0tLS0tLSBDT0xPUkRFRklOSVRJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7Y29sb3JEZWZpbml0aW9uJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuaWRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnZhbHVlXG4gKi9cbnZhciBDb2xvckRlZmluaXRpb24gPSBmdW5jdGlvbihwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydpZCcsICd2YWx1ZSddKTtcblx0dGhpcy5pZCBcdD0gcGFyYW1zLmlkO1xuXHR0aGlzLnZhbHVlIFx0PSBwYXJhbXMudmFsdWU7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5Db2xvckRlZmluaXRpb24ucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBjb2xvcmRlZk9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5pZCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7XG5cdH1cblx0aWYodGhpcy52YWx1ZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy52YWx1ZSA9IHRoaXMudmFsdWU7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhjb2xvcmRlZk9iaiwgYXR0cmlidXRlcyk7XG5cdHJldHVybiBjb2xvcmRlZk9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5Db2xvckRlZmluaXRpb24ucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2NvbG9yRGVmaW5pdGlvbjogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtDb2xvckRlZmluaXRpb259XG4gKi9cbkNvbG9yRGVmaW5pdGlvbi5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgY29sb3JEZWZpbml0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgY29sb3JEZWZpbml0aW9uID0gQ29sb3JEZWZpbml0aW9uLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBjb2xvckRlZmluaXRpb247XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtDb2xvckRlZmluaXRpb259XG4gKi9cbkNvbG9yRGVmaW5pdGlvbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouY29sb3JEZWZpbml0aW9uID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBjb2xvckRlZmluaXRpb24sIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGNvbG9yRGVmaW5pdGlvbiA9IG5ldyBucy5Db2xvckRlZmluaXRpb24oKTtcblx0anNPYmogPSBqc09iai5jb2xvckRlZmluaXRpb247XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGNvbG9yRGVmaW5pdGlvbjtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0Y29sb3JEZWZpbml0aW9uLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdGNvbG9yRGVmaW5pdGlvbi52YWx1ZSA9IGF0dHJpYnV0ZXMudmFsdWUgfHwgbnVsbDtcblx0fVxuXHRyZXR1cm4gY29sb3JEZWZpbml0aW9uO1xufTtcblxubnMuQ29sb3JEZWZpbml0aW9uID0gQ29sb3JEZWZpbml0aW9uO1xuLy8gLS0tLS0tLSBFTkQgQ09MT1JERUZJTklUSU9OIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBMSVNUT0ZDT0xPUkRFRklOSVRJT05TIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2xpc3RPZkNvbG9yRGVmaW5pdGlvbnMmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKi9cbnZhciBMaXN0T2ZDb2xvckRlZmluaXRpb25zID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLmNvbG9yRGVmaW5pdGlvbnMgPSBbXTtcblx0dGhpcy5jb2xvckluZGV4ID0ge307XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29sb3JEZWZpbml0aW9ufSBjb2xvckRlZmluaXRpb25cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuYWRkQ29sb3JEZWZpbml0aW9uID0gZnVuY3Rpb24gKGNvbG9yRGVmaW5pdGlvbikge1xuXHR0aGlzLmNvbG9yRGVmaW5pdGlvbnMucHVzaChjb2xvckRlZmluaXRpb24pO1xuXHR0aGlzLmNvbG9ySW5kZXhbY29sb3JEZWZpbml0aW9uLmlkXSA9IGNvbG9yRGVmaW5pdGlvbi52YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVuaWVudCBtZXRob2QgdG8gZ2V0IGEgY29sb3IgdmFsdWUgZGlyZWN0bHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuZ2V0Q29sb3JCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG5cdHJldHVybiB0aGlzLmNvbG9ySW5kZXhbaWRdO1xufTtcblxuLyoqXG4gKiBDb252ZW5pZW50IG1ldGhvZCB0byBnZXQgYWxsIHRoZSBjb2xvciB2YWx1ZXMgaW4gdGhlIGxpc3QuXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuZ2V0QWxsQ29sb3JzID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbG9ySW5kZXgpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnNPYmogPSB7fTtcblxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuY29sb3JEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRsaXN0T2ZDb2xvckRlZmluaXRpb25zT2JqLmNvbG9yRGVmaW5pdGlvbiA9IFtdO1xuXHRcdH1cblx0XHRsaXN0T2ZDb2xvckRlZmluaXRpb25zT2JqLmNvbG9yRGVmaW5pdGlvbi5wdXNoKHRoaXMuY29sb3JEZWZpbml0aW9uc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cblx0cmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7bGlzdE9mQ29sb3JEZWZpbml0aW9uczogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfVxuICovXG5MaXN0T2ZDb2xvckRlZmluaXRpb25zLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgbGlzdE9mQ29sb3JEZWZpbml0aW9ucyA9IExpc3RPZkNvbG9yRGVmaW5pdGlvbnMuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfVxuICovXG5MaXN0T2ZDb2xvckRlZmluaXRpb25zLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBsaXN0T2ZDb2xvckRlZmluaXRpb25zLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbmV3IG5zLkxpc3RPZkNvbG9yRGVmaW5pdGlvbnMoKTtcblx0anNPYmogPSBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmouY29sb3JEZWZpbml0aW9uKSB7XG5cdFx0dmFyIGNvbG9yRGVmaW5pdGlvbnMgPSBqc09iai5jb2xvckRlZmluaXRpb247XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgY29sb3JEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNvbG9yRGVmaW5pdGlvbiA9IG5zLkNvbG9yRGVmaW5pdGlvbi5mcm9tT2JqKHtjb2xvckRlZmluaXRpb246IGNvbG9yRGVmaW5pdGlvbnNbaV19KTtcblx0XHRcdGxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuYWRkQ29sb3JEZWZpbml0aW9uKGNvbG9yRGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG59O1xuXG5ucy5MaXN0T2ZDb2xvckRlZmluaXRpb25zID0gTGlzdE9mQ29sb3JEZWZpbml0aW9ucztcbi8vIC0tLS0tLS0gRU5EIExJU1RPRkNPTE9SREVGSU5JVElPTlMgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFJFTkRFUkdST1VQIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2cmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuZm9udFNpemVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRGYW1pbHlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRXZWlnaHRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRTdHlsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudGV4dEFuY2hvclxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudnRleHRBbmNob3JcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZpbGwgVGhlIGVsZW1lbnQncyBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zdHJva2UgQm9yZGVyIGNvbG9yIGZvciBnbHlwaHMsIGxpbmUgY29sb3IgZm9yIGFyY3MuXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zdHJva2VXaWR0aFxuICovXG52YXIgUmVuZGVyR3JvdXAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdC8vIGVhY2ggb2YgdGhvc2UgYXJlIG9wdGlvbmFsLCBzbyB0ZXN0IGlmIGl0IGlzIGRlZmluZWQgaXMgbWFuZGF0b3J5XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnZm9udFNpemUnLCAnZm9udEZhbWlseScsICdmb250V2VpZ2h0JywgXG5cdFx0J2ZvbnRTdHlsZScsICd0ZXh0QW5jaG9yJywgJ3Z0ZXh0QW5jaG9yJywgJ2ZpbGwnLCAnaWQnLCAnc3Ryb2tlJywgJ3N0cm9rZVdpZHRoJ10pO1xuXHQvLyBzcGVjaWZpYyB0byByZW5kZXJHcm91cFxuXHR0aGlzLmZvbnRTaXplIFx0XHQ9IHBhcmFtcy5mb250U2l6ZTtcblx0dGhpcy5mb250RmFtaWx5IFx0PSBwYXJhbXMuZm9udEZhbWlseTtcblx0dGhpcy5mb250V2VpZ2h0IFx0PSBwYXJhbXMuZm9udFdlaWdodDtcblx0dGhpcy5mb250U3R5bGUgXHRcdD0gcGFyYW1zLmZvbnRTdHlsZTtcblx0dGhpcy50ZXh0QW5jaG9yIFx0PSBwYXJhbXMudGV4dEFuY2hvcjsgLy8gcHJvYmFibHkgdXNlbGVzc1xuXHR0aGlzLnZ0ZXh0QW5jaG9yIFx0PSBwYXJhbXMudnRleHRBbmNob3I7IC8vIHByb2JhYmx5IHVzZWxlc3Ncblx0Ly8gZnJvbSBHcmFwaGljYWxQcmltaXRpdmUyRFxuXHR0aGlzLmZpbGwgXHRcdFx0PSBwYXJhbXMuZmlsbDsgLy8gZmlsbCBjb2xvclxuXHQvLyBmcm9tIEdyYXBoaWNhbFByaW1pdGl2ZTFEXG5cdHRoaXMuaWQgXHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMuc3Ryb2tlIFx0XHQ9IHBhcmFtcy5zdHJva2U7IC8vIHN0cm9rZSBjb2xvclxuXHR0aGlzLnN0cm9rZVdpZHRoIFx0PSBwYXJhbXMuc3Ryb2tlV2lkdGg7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5SZW5kZXJHcm91cC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJlbmRlckdyb3VwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmlkICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkID0gdGhpcy5pZDtcblx0fVxuXHRpZih0aGlzLmZvbnRTaXplICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcblx0fVxuXHRpZih0aGlzLmZvbnRGYW1pbHkgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZm9udEZhbWlseSA9IHRoaXMuZm9udEZhbWlseTtcblx0fVxuXHRpZih0aGlzLmZvbnRXZWlnaHQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZm9udFdlaWdodCA9IHRoaXMuZm9udFdlaWdodDtcblx0fVxuXHRpZih0aGlzLmZvbnRTdHlsZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5mb250U3R5bGUgPSB0aGlzLmZvbnRTdHlsZTtcblx0fVxuXHRpZih0aGlzLnRleHRBbmNob3IgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGV4dEFuY2hvciA9IHRoaXMudGV4dEFuY2hvcjtcblx0fVxuXHRpZih0aGlzLnZ0ZXh0QW5jaG9yICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnZ0ZXh0QW5jaG9yID0gdGhpcy52dGV4dEFuY2hvcjtcblx0fVxuXHRpZih0aGlzLnN0cm9rZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5zdHJva2UgPSB0aGlzLnN0cm9rZTtcblx0fVxuXHRpZih0aGlzLnN0cm9rZVdpZHRoICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnN0cm9rZVdpZHRoID0gdGhpcy5zdHJva2VXaWR0aDtcblx0fVxuXHRpZih0aGlzLmZpbGwgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZmlsbCA9IHRoaXMuZmlsbDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKHJlbmRlckdyb3VwT2JqLCBhdHRyaWJ1dGVzKTtcblx0cmV0dXJuIHJlbmRlckdyb3VwT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblJlbmRlckdyb3VwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtnOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1JlbmRlckdyb3VwfVxuICovXG5SZW5kZXJHcm91cC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgZztcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGcgPSBSZW5kZXJHcm91cC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge1JlbmRlckdyb3VwfVxuICovXG5SZW5kZXJHcm91cC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouZyA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZywgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZyA9IG5ldyBucy5SZW5kZXJHcm91cCgpO1xuXHRqc09iaiA9IGpzT2JqLmc7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGc7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGcuaWQgXHRcdFx0PSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0Zy5mb250U2l6ZSBcdFx0PSBhdHRyaWJ1dGVzLmZvbnRTaXplIHx8IG51bGw7XG5cdFx0Zy5mb250RmFtaWx5IFx0PSBhdHRyaWJ1dGVzLmZvbnRGYW1pbHkgfHwgbnVsbDtcblx0XHRnLmZvbnRXZWlnaHQgXHQ9IGF0dHJpYnV0ZXMuZm9udFdlaWdodCB8fCBudWxsO1xuXHRcdGcuZm9udFN0eWxlIFx0PSBhdHRyaWJ1dGVzLmZvbnRTdHlsZSB8fCBudWxsO1xuXHRcdGcudGV4dEFuY2hvciBcdD0gYXR0cmlidXRlcy50ZXh0QW5jaG9yIHx8IG51bGw7XG5cdFx0Zy52dGV4dEFuY2hvciBcdD0gYXR0cmlidXRlcy52dGV4dEFuY2hvciB8fCBudWxsO1xuXHRcdGcuc3Ryb2tlIFx0XHQ9IGF0dHJpYnV0ZXMuc3Ryb2tlIHx8IG51bGw7XG5cdFx0Zy5zdHJva2VXaWR0aCBcdD0gYXR0cmlidXRlcy5zdHJva2VXaWR0aCB8fCBudWxsO1xuXHRcdGcuZmlsbCBcdFx0XHQ9IGF0dHJpYnV0ZXMuZmlsbCB8fCBudWxsO1xuXHR9XG5cdHJldHVybiBnO1xufTtcblxubnMuUmVuZGVyR3JvdXAgPSBSZW5kZXJHcm91cDtcbi8vIC0tLS0tLS0gRU5EIFJFTkRFUkdST1VQIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBTVFlMRSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZExpc3RcbiAqIEBwYXJhbSB7UmVuZGVyR3JvdXA9fSBwYXJhbXMucmVuZGVyR3JvdXBcbiAqL1xudmFyIFN0eWxlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnbmFtZScsICdpZExpc3QnLCAncmVuZGVyR3JvdXAnXSk7XG5cdHRoaXMuaWQgXHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMubmFtZSBcdFx0XHQ9IHBhcmFtcy5uYW1lO1xuXHR0aGlzLmlkTGlzdCBcdFx0PSBwYXJhbXMuaWRMaXN0OyAvLyBUT0RPIGFkZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhpcyAoc2hvdWxkIGJlIGFycmF5KVxuXHR0aGlzLnJlbmRlckdyb3VwIFx0PSBwYXJhbXMucmVuZGVyR3JvdXA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVuZGVyR3JvdXB9IHJlbmRlckdyb3VwXG4gKi9cblN0eWxlLnByb3RvdHlwZS5zZXRSZW5kZXJHcm91cCA9IGZ1bmN0aW9uIChyZW5kZXJHcm91cCkge1xuXHR0aGlzLnJlbmRlckdyb3VwID0gcmVuZGVyR3JvdXA7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5TdHlsZS5wcm90b3R5cGUuZ2V0SWRMaXN0QXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuaWRMaXN0LnNwbGl0KCcgJyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gaWRBcnJheVxuICovXG5TdHlsZS5wcm90b3R5cGUuc2V0SWRMaXN0RnJvbUFycmF5ID0gZnVuY3Rpb24gKGlkQXJyYXkpIHtcblx0dGhpcy5pZExpc3QgPSBpZEFycmF5LmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiByZXR1cm5pbmcgYSBtYXAgb2YgaWRzIHRvIHRoZWlyIHJlc3BlY3RpdmUgUmVuZGVyR3JvdXAgb2JqZWN0LlxuICogVGhlIHN0eWxlIHByb3BlcnRpZXMgY2FuIHRoZW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQuIEV4YW1wbGU6IG1hcFtpZF0uc3Ryb2tlXG4gKiBAcmV0dXJuIHtPYmplY3QuPHN0cmluZywgUmVuZGVyR3JvdXA+fVxuICovXG5TdHlsZS5wcm90b3R5cGUuZ2V0U3R5bGVNYXAgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBpbmRleCA9IHt9O1xuXHR2YXIgaWRzID0gdGhpcy5nZXRJZExpc3RBc0FycmF5KCk7XG5cdGZvcih2YXIgaT0wOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGlkID0gaWRzW2ldO1xuXHRcdGluZGV4W2lkXSA9IHRoaXMucmVuZGVyR3JvdXA7XG5cdH1cblx0cmV0dXJuIGluZGV4O1xufTtcbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblN0eWxlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3R5bGVPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMubmFtZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lO1xuXHR9XG5cdGlmKHRoaXMuaWRMaXN0ICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkTGlzdCA9IHRoaXMuaWRMaXN0O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3R5bGVPYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKHRoaXMucmVuZGVyR3JvdXAgIT0gbnVsbCkge1xuXHRcdHN0eWxlT2JqLmcgPSAgdGhpcy5yZW5kZXJHcm91cC5idWlsZEpzT2JqKCk7XG5cdH1cblx0cmV0dXJuIHN0eWxlT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblN0eWxlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdHlsZTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdHlsZX1cbiAqL1xuU3R5bGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHN0eWxlO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgc3R5bGUgPSBTdHlsZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3R5bGU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHlsZX1cbiAqL1xuU3R5bGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLnN0eWxlID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBzdHlsZSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgc3R5bGUgPSBuZXcgbnMuU3R5bGUoKTtcblx0anNPYmogPSBqc09iai5zdHlsZTtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3R5bGU7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0eWxlLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdHN0eWxlLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgbnVsbDtcblx0XHRzdHlsZS5pZExpc3QgPSBhdHRyaWJ1dGVzLmlkTGlzdCB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmouZykge1xuXHRcdHZhciBnID0gbnMuUmVuZGVyR3JvdXAuZnJvbU9iaih7ZzoganNPYmouZ1swXX0pO1xuXHRcdHN0eWxlLnNldFJlbmRlckdyb3VwKGcpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlO1xufTtcblxubnMuU3R5bGUgPSBTdHlsZTtcbi8vIC0tLS0tLS0gRU5EIFNUWUxFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBMSVNUT0ZTVFlMRVMgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bGlzdE9mU3R5bGVzJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICovXG52YXIgTGlzdE9mU3R5bGVzID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc3R5bGVzID0gW107XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3R5bGV9IHN0eWxlXG4gKi9cbkxpc3RPZlN0eWxlcy5wcm90b3R5cGUuYWRkU3R5bGUgPSBmdW5jdGlvbiAoc3R5bGUpIHtcblx0dGhpcy5zdHlsZXMucHVzaChzdHlsZSk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHJldHVybmluZyBhIG1hcCBvZiBpZHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBSZW5kZXJHcm91cCBvYmplY3QsXG4gKiBmb3IgYWxsIHRoZSBzdHlsZXMuXG4gKiBUaGUgc3R5bGUgcHJvcGVydGllcyBjYW4gdGhlbiBiZSBkaXJlY3RseSBhY2Nlc3NlZC4gRXhhbXBsZTogbWFwW2lkXS5zdHJva2VcbiAqIEByZXR1cm4ge09iamVjdC48c3RyaW5nLCBSZW5kZXJHcm91cD59XG4gKi9cbkxpc3RPZlN0eWxlcy5wcm90b3R5cGUuZ2V0U3R5bGVNYXAgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBpbmRleCA9IHt9O1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHN0eWxlID0gdGhpcy5zdHlsZXNbaV07XG5cdFx0dmFyIHN1YkluZGV4ID0gc3R5bGUuZ2V0U3R5bGVNYXAoKTtcblx0XHRmb3IodmFyIGlkIGluIHN1YkluZGV4KSB7XG5cdFx0XHRpbmRleFtpZF0gPSBzdWJJbmRleFtpZF07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGlzdE9mU3R5bGVzLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbGlzdE9mU3R5bGVzT2JqID0ge307XG5cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLnN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRsaXN0T2ZTdHlsZXNPYmouc3R5bGUgPSBbXTtcblx0XHR9XG5cdFx0bGlzdE9mU3R5bGVzT2JqLnN0eWxlLnB1c2godGhpcy5zdHlsZXNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXG5cdHJldHVybiBsaXN0T2ZTdHlsZXNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mU3R5bGVzLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtsaXN0T2ZTdHlsZXM6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TGlzdE9mU3R5bGVzfVxuICovXG5MaXN0T2ZTdHlsZXMuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGxpc3RPZlN0eWxlcztcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGxpc3RPZlN0eWxlcyA9IExpc3RPZlN0eWxlcy5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gbGlzdE9mU3R5bGVzO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TGlzdE9mU3R5bGVzfVxuICovXG5MaXN0T2ZTdHlsZXMuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmxpc3RPZlN0eWxlcyA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgbGlzdE9mU3R5bGVzLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBsaXN0T2ZTdHlsZXMgPSBuZXcgbnMuTGlzdE9mU3R5bGVzKCk7XG5cdGpzT2JqID0ganNPYmoubGlzdE9mU3R5bGVzO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBsaXN0T2ZTdHlsZXM7XG5cdH1cblxuXHQvLyBjaGlsZHJlblxuXHRpZihqc09iai5zdHlsZSkge1xuXHRcdHZhciBzdHlsZXMgPSBqc09iai5zdHlsZTtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBzdHlsZSA9IG5zLlN0eWxlLmZyb21PYmooe3N0eWxlOiBzdHlsZXNbaV19KTtcblx0XHRcdGxpc3RPZlN0eWxlcy5hZGRTdHlsZShzdHlsZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGxpc3RPZlN0eWxlcztcbn07XG5cbm5zLkxpc3RPZlN0eWxlcyA9IExpc3RPZlN0eWxlcztcbi8vIC0tLS0tLS0gRU5EIExJU1RPRlNUWUxFUyAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gUkVOREVSSU5GT1JNQVRJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cmVuZGVySW5mb3JtYXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMubmFtZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMucHJvZ3JhbU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnByb2dyYW1WZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5iYWNrZ3JvdW5kQ29sb3JcbiAqIEBwYXJhbSB7TGlzdE9mQ29sb3JEZWZpbml0aW9ucz19IHBhcmFtcy5saXN0T2ZDb2xvckRlZmluaXRpb25zXG4gKiBAcGFyYW0ge0xpc3RPZlN0eWxlcz19IHBhcmFtcy5saXN0T2ZTdHlsZXNcbiAqL1xudmFyIFJlbmRlckluZm9ybWF0aW9uID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ25hbWUnLCAncHJvZ3JhbU5hbWUnLCBcblx0XHQncHJvZ3JhbVZlcnNpb24nLCAnYmFja2dyb3VuZENvbG9yJywgJ2xpc3RPZkNvbG9yRGVmaW5pdGlvbnMnLCAnbGlzdE9mU3R5bGVzJ10pO1xuXHR0aGlzLmlkIFx0XHRcdFx0XHQ9IHBhcmFtcy5pZDsgLy8gcmVxdWlyZWQsIHJlc3QgaXMgb3B0aW9uYWxcblx0dGhpcy5uYW1lIFx0XHRcdFx0XHQ9IHBhcmFtcy5uYW1lO1xuXHR0aGlzLnByb2dyYW1OYW1lIFx0XHRcdD0gcGFyYW1zLnByb2dyYW1OYW1lO1xuXHR0aGlzLnByb2dyYW1WZXJzaW9uIFx0XHQ9IHBhcmFtcy5wcm9ncmFtVmVyc2lvbjtcblx0dGhpcy5iYWNrZ3JvdW5kQ29sb3IgXHRcdD0gcGFyYW1zLmJhY2tncm91bmRDb2xvcjtcblx0dGhpcy5saXN0T2ZDb2xvckRlZmluaXRpb25zID0gcGFyYW1zLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG5cdHRoaXMubGlzdE9mU3R5bGVzIFx0XHRcdD0gcGFyYW1zLmxpc3RPZlN0eWxlcztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfSBsaXN0T2ZDb2xvckRlZmluaXRpb25zXG4gKi9cblJlbmRlckluZm9ybWF0aW9uLnByb3RvdHlwZS5zZXRMaXN0T2ZDb2xvckRlZmluaXRpb25zID0gZnVuY3Rpb24obGlzdE9mQ29sb3JEZWZpbml0aW9ucykge1xuXHR0aGlzLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnMgPSBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0xpc3RPZlN0eWxlc30gbGlzdE9mU3R5bGVzXG4gKi9cblJlbmRlckluZm9ybWF0aW9uLnByb3RvdHlwZS5zZXRMaXN0T2ZTdHlsZXMgPSBmdW5jdGlvbihsaXN0T2ZTdHlsZXMpIHtcblx0dGhpcy5saXN0T2ZTdHlsZXMgPSBsaXN0T2ZTdHlsZXM7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5SZW5kZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJlbmRlckluZm9ybWF0aW9uT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRhdHRyaWJ1dGVzLnhtbG5zID0gbnMueG1sbnM7XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMubmFtZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lO1xuXHR9XG5cdGlmKHRoaXMucHJvZ3JhbU5hbWUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMucHJvZ3JhbU5hbWUgPSB0aGlzLnByb2dyYW1OYW1lO1xuXHR9XG5cdGlmKHRoaXMucHJvZ3JhbVZlcnNpb24gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMucHJvZ3JhbVZlcnNpb24gPSB0aGlzLnByb2dyYW1WZXJzaW9uO1xuXHR9XG5cdGlmKHRoaXMuYmFja2dyb3VuZENvbG9yICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMocmVuZGVySW5mb3JtYXRpb25PYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKHRoaXMubGlzdE9mQ29sb3JEZWZpbml0aW9ucyAhPSBudWxsKSB7XG5cdFx0cmVuZGVySW5mb3JtYXRpb25PYmoubGlzdE9mQ29sb3JEZWZpbml0aW9ucyA9ICB0aGlzLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMubGlzdE9mU3R5bGVzICE9IG51bGwpIHtcblx0XHRyZW5kZXJJbmZvcm1hdGlvbk9iai5saXN0T2ZTdHlsZXMgPSAgdGhpcy5saXN0T2ZTdHlsZXMuYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiByZW5kZXJJbmZvcm1hdGlvbk9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5SZW5kZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtyZW5kZXJJbmZvcm1hdGlvbjogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtSZW5kZXJJbmZvcm1hdGlvbn1cbiAqL1xuUmVuZGVySW5mb3JtYXRpb24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHJlbmRlckluZm9ybWF0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24gPSBSZW5kZXJJbmZvcm1hdGlvbi5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtSZW5kZXJJbmZvcm1hdGlvbn1cbiAqL1xuUmVuZGVySW5mb3JtYXRpb24uZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLnJlbmRlckluZm9ybWF0aW9uID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSByZW5kZXJJbmZvcm1hdGlvbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgcmVuZGVySW5mb3JtYXRpb24gPSBuZXcgbnMuUmVuZGVySW5mb3JtYXRpb24oKTtcblx0anNPYmogPSBqc09iai5yZW5kZXJJbmZvcm1hdGlvbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHJlbmRlckluZm9ybWF0aW9uLmlkIFx0XHRcdFx0PSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24ubmFtZSBcdFx0XHRcdD0gYXR0cmlidXRlcy5uYW1lIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24ucHJvZ3JhbU5hbWUgXHRcdD0gYXR0cmlidXRlcy5wcm9ncmFtTmFtZSB8fCBudWxsO1xuXHRcdHJlbmRlckluZm9ybWF0aW9uLnByb2dyYW1WZXJzaW9uIFx0PSBhdHRyaWJ1dGVzLnByb2dyYW1WZXJzaW9uIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uYmFja2dyb3VuZENvbG9yIFx0PSBhdHRyaWJ1dGVzLmJhY2tncm91bmRDb2xvciB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoubGlzdE9mQ29sb3JEZWZpbml0aW9ucykge1xuXHRcdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbnMuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5mcm9tT2JqKHtsaXN0T2ZDb2xvckRlZmluaXRpb25zOiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mQ29sb3JEZWZpbml0aW9ucyhsaXN0T2ZDb2xvckRlZmluaXRpb25zKTtcblx0fVxuXHRpZihqc09iai5saXN0T2ZTdHlsZXMpIHtcblx0XHR2YXIgbGlzdE9mU3R5bGVzID0gbnMuTGlzdE9mU3R5bGVzLmZyb21PYmooe2xpc3RPZlN0eWxlczoganNPYmoubGlzdE9mU3R5bGVzWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mU3R5bGVzKGxpc3RPZlN0eWxlcyk7XG5cdH1cblxuXHRyZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG59O1xuXG5ucy5SZW5kZXJJbmZvcm1hdGlvbiA9IFJlbmRlckluZm9ybWF0aW9uO1xuLy8gLS0tLS0tLSBFTkQgUkVOREVSSU5GT1JNQVRJT04gLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5zOyIsIi8qKlxuICogVGhlIEFQSSBjb250YWlucyB0d28gb3RoZXIgc3VibW9kdWxlczoge0BsaW5rIGxpYnNiZ24ucmVuZGVyfSBhbmQge0BsaW5rIGxpYnNiZ24uYW5ub3R9XG4gKiBAbW9kdWxlIGxpYnNiZ25cbiAqIEBuYW1lc3BhY2UgbGlic2JnblxuKi9cblxudmFyIHJlbmRlckV4dCA9IHJlcXVpcmUoJy4vbGlic2Jnbi1yZW5kZXInKTtcbnZhciBhbm5vdEV4dCA9IHJlcXVpcmUoJy4vbGlic2Jnbi1hbm5vdGF0aW9ucycpO1xudmFyIHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMnKTtcbnZhciBjaGVja1BhcmFtcyA9IHV0aWxzLmNoZWNrUGFyYW1zO1xuXG52YXIgbnMgPSB7fTsgLy8gbmFtZXNwYWNlIHRoYXQgZW5jYXBzdWxhdGVzIGFsbCBleHBvcnRhYmxlIGZlYXR1cmVzXG5cbm5zLnhtbG5zID0gXCJodHRwOi8vc2Jnbi5vcmcvbGlic2Jnbi8wLjNcIjtcblxuLy8gLS0tLS0tLSBTQkdOQmFzZSAtLS0tLS0tXG4vKipcbiAqIFBhcmVudCBjbGFzcyBmb3Igc2V2ZXJhbCBzYmduIGVsZW1lbnRzLiBVc2VkIHRvIHByb3ZpZGUgZXh0ZW5zaW9uIGFuZCBub3RlcyBlbGVtZW50LlxuICogRW5kIHVzZXJzIGRvbid0IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBpdC4gSXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge0V4dGVuc2lvbj19IHBhcmFtcy5leHRlbnNpb25cbiAqIEBwYXJhbSB7Tm90ZXM9fSBwYXJhbXMubm90ZXNcbiAqL1xudmFyIFNCR05CYXNlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2V4dGVuc2lvbicsICdub3RlcyddKTtcblx0dGhpcy5leHRlbnNpb24gXHQ9IHBhcmFtcy5leHRlbnNpb247XG5cdHRoaXMubm90ZXMgPSBwYXJhbXMubm90ZXM7XG59O1xuXG4vKipcbiAqIEFsbG93cyBpbmhlcml0aW5nIG9iamVjdHMgdG8gZ2V0IGFuIGV4dGVuc2lvbiBlbGVtZW50LlxuICogQHBhcmFtIHtFeHRlbnNpb259IGV4dGVuc2lvblxuICovXG5TQkdOQmFzZS5wcm90b3R5cGUuc2V0RXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuXHR0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjtcbn07XG5cbi8qKlxuICogQWxsb3dzIGluaGVyaXRpbmcgb2JqZWN0cyB0byBnZXQgYSBub3RlcyBlbGVtZW50LlxuICogQHBhcmFtIHtOb3Rlc30gbm90ZXNcbiAqL1xuU0JHTkJhc2UucHJvdG90eXBlLnNldE5vdGVzID0gZnVuY3Rpb24gKG5vdGVzKSB7XG5cdHRoaXMubm90ZXMgPSBub3Rlcztcbn07XG5cbi8qKlxuICogQWRkIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIHRvIGpzT2JqLlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU0JHTkJhc2UucHJvdG90eXBlLmJhc2VUb0pzT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmKHRoaXMuZXh0ZW5zaW9uICE9IG51bGwpIHtcblx0XHRqc09iai5leHRlbnNpb24gPSB0aGlzLmV4dGVuc2lvbi5idWlsZEpzT2JqKCk7XG5cdH1cblx0aWYodGhpcy5ub3RlcyAhPSBudWxsKSB7XG5cdFx0anNPYmoubm90ZXMgPSB0aGlzLm5vdGVzLmJ1aWxkSnNPYmooKTtcblx0fVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgZnJvbSBqc09iai5cbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblNCR05CYXNlLnByb3RvdHlwZS5iYXNlRnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAoanNPYmouZXh0ZW5zaW9uKSB7XG5cdFx0dmFyIGV4dGVuc2lvbiA9IG5zLkV4dGVuc2lvbi5mcm9tT2JqKHtleHRlbnNpb246IGpzT2JqLmV4dGVuc2lvblswXX0pO1xuXHRcdHRoaXMuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7XG5cdH1cblx0aWYgKGpzT2JqLm5vdGVzKSB7XG5cdFx0dmFyIG5vdGVzID0gbnMuTm90ZXMuZnJvbU9iaih7bm90ZXM6IGpzT2JqLm5vdGVzWzBdfSk7XG5cdFx0dGhpcy5zZXROb3Rlcyhub3Rlcyk7XG5cdH1cbn07XG5ucy5TQkdOQmFzZSA9IFNCR05CYXNlO1xuLy8gLS0tLS0tLSBFTkQgU0JHTkJhc2UgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFNCR04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7c2JnbiZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFNCR05CYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy54bWxuc1xuICogQHBhcmFtIHtNYXBbXT19IHBhcmFtcy5tYXBzXG4gKi9cbnZhciBTYmduID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneG1sbnMnLCAnbWFwcyddKTtcblx0dGhpcy54bWxucyBcdD0gcGFyYW1zLnhtbG5zO1xuXHR0aGlzLm1hcHMgXHQ9IHBhcmFtcy5tYXBzIHx8IFtdO1xufTtcblxuU2Jnbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5TYmduLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNiZ247XG5cbi8qKlxuICogQHBhcmFtIHtNYXB9IG1hcFxuICovXG5TYmduLnByb3RvdHlwZS5hZGRNYXAgPSBmdW5jdGlvbiAobWFwKSB7XG5cdHRoaXMubWFwcy5wdXNoKG1hcCk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5TYmduLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2Jnbk9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy54bWxucyAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy54bWxucyA9IHRoaXMueG1sbnM7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhzYmduT2JqLCBhdHRyaWJ1dGVzKTtcblxuXHQvLyBjaGlsZHJlblxuXHR0aGlzLmJhc2VUb0pzT2JqKHNiZ25PYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMubWFwcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRzYmduT2JqLm1hcCA9IFtdO1xuXHRcdH1cblx0XHRzYmduT2JqLm1hcC5wdXNoKHRoaXMubWFwc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdHJldHVybiBzYmduT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblNiZ24ucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3NiZ246IHRoaXMuYnVpbGRKc09iaigpfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1NiZ259XG4gKi9cblNiZ24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICB2YXIgc2JnbjtcbiAgICBmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgc2JnbiA9IFNiZ24uZnJvbU9iaihyZXN1bHQpO1xuICAgIH1cbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc2JnbjtcblxufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7U2Jnbn1cbiAqL1xuU2Jnbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc2JnbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgc2JnbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgc2JnbiA9IG5ldyBucy5TYmduKCk7XG5cdGpzT2JqID0ganNPYmouc2Jnbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc2Jnbjtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRzYmduLnhtbG5zID0gYXR0cmlidXRlcy54bWxucyB8fCBudWxsO1xuXG5cdFx0Ly8gZ2V0dGluZyBhdHRyaWJ1dGUgd2l0aCAneG1sbnMnIGRvZXNuJ3Qgd29yayBpZiBzb21lIG5hbWVzcGFjZSBpcyBkZWZpbmVkIGxpa2UgJ3htbG5zOnNiZ24nXG5cdFx0Ly8gc28gaWYgdGhlcmUgaXMgc29tZSBhdHRyaWJ1dGUgdGhlcmUsIGFuZCB3ZSBkaWRuJ3QgZmluZCB0aGUgeG1sbnMgZGlyZWN0bHksIHdlIG5lZWQgdG8gaW50byBpdFxuXHRcdGlmKCFzYmduLnhtbG5zICYmIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIHNiZ24gaXMgbm90IHN1cHBvc2VkIHRvIGhhdmUgYW55IG90aGVyIGF0dHJpYnV0ZSB0aGFuIGFuIHhtbG5zLCBzbyB3ZSBhc3N1bWUgdGhlIGZpcnN0IGF0dHIgaXMgdGhlIHhtbG5zXG5cdFx0XHR2YXIga2V5ID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcylbMF07XG5cdFx0XHRpZihrZXkuc3RhcnRzV2l0aCgneG1sbnMnKSkge1xuXHRcdFx0XHRzYmduLnhtbG5zID0gYXR0cmlidXRlc1trZXldO1xuXHRcdFx0XHRzYmduLm5hbWVzcGFjZVByZWZpeCA9IGtleS5yZXBsYWNlKCd4bWxuczonLCAnJyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCB4bWxucyBkZWZpbml0aW9uIGluIHNiZ24gZWxlbWVudFwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZihqc09iai5tYXApIHtcblx0XHR2YXIgbWFwcyA9IGpzT2JqLm1hcDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgbWFwID0gbnMuTWFwLmZyb21PYmooe21hcDogbWFwc1tpXX0pO1xuXHRcdFx0c2Jnbi5hZGRNYXAobWFwKTtcblx0XHR9XG5cdH1cblxuXHRzYmduLmJhc2VGcm9tT2JqKGpzT2JqKTsgLy8gY2FsbCB0byBwYXJlbnQgY2xhc3Ncblx0cmV0dXJuIHNiZ247XG59O1xubnMuU2JnbiA9IFNiZ247XG4vLyAtLS0tLS0tIEVORCBTQkdOIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBNQVAgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bWFwJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgU0JHTkJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5sYW5ndWFnZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudmVyc2lvblxuICogQHBhcmFtIHtHbHlwaFtdPX0gcGFyYW1zLmdseXBoc1xuICogQHBhcmFtIHtBcmNbXT19IHBhcmFtcy5hcmNzXG4gKiBAcGFyYW0ge0Jib3g9fSBwYXJhbXMuYmJveFxuICogQHBhcmFtIHtBcmNncm91cFtdPX0gcGFyYW1zLmFyY2dyb3Vwc1xuICovXG52YXIgTWFwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnbGFuZ3VhZ2UnLCAndmVyc2lvbicsICdnbHlwaHMnLCAnYXJjcycsICdiYm94JywgJ2FyY2dyb3VwcyddKTtcblx0dGhpcy5pZCBcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMubGFuZ3VhZ2UgXHQ9IHBhcmFtcy5sYW5ndWFnZTtcblx0dGhpcy52ZXJzaW9uXHQ9IHBhcmFtcy52ZXJzaW9uO1xuXHR0aGlzLmJib3ggXHRcdD0gcGFyYW1zLmJib3g7XG5cdHRoaXMuZ2x5cGhzIFx0PSBwYXJhbXMuZ2x5cGhzIHx8IFtdO1xuXHR0aGlzLmFyY3MgXHRcdD0gcGFyYW1zLmFyY3MgfHwgW107XG5cdHRoaXMuYXJjZ3JvdXBzIFx0PSBwYXJhbXMuYXJjZ3JvdXBzIHx8IFtdO1xufTtcblxuTWFwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU0JHTkJhc2UucHJvdG90eXBlKTtcbk1hcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXA7XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuTWFwLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuXHR0aGlzLmdseXBocy5wdXNoKGdseXBoKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBcmN9IGFyY1xuICovXG5NYXAucHJvdG90eXBlLmFkZEFyYyA9IGZ1bmN0aW9uIChhcmMpIHtcblx0dGhpcy5hcmNzLnB1c2goYXJjKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYm94fSBiYm94XG4gKi9cbk1hcC5wcm90b3R5cGUuc2V0QmJveCA9IGZ1bmN0aW9uIChiYm94KSB7XG5cdHRoaXMuYmJveCA9IGJib3g7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJjZ3JvdXB9IGFyY1xuICovXG5NYXAucHJvdG90eXBlLmFkZEFyY2dyb3VwID0gZnVuY3Rpb24gKGFyY2dyb3VwKSB7XG5cdHRoaXMuYXJjZ3JvdXBzLnB1c2goYXJjZ3JvdXApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NfXG4gKiBAcmV0dXJuIHtHeXBoW119XG4gKi9cbk1hcC5wcm90b3R5cGUuZ2V0R2x5cGhzQnlDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc18pIHtcblx0dmFyIHJlc3VsdEdseXBocyA9IFtdO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGdseXBoID0gdGhpcy5nbHlwaHNbaV07XG5cdFx0aWYoZ2x5cGguY2xhc3NfID09IGNsYXNzXykge1xuXHRcdFx0cmVzdWx0R2x5cGhzLnB1c2goZ2x5cGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0R2x5cGhzO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTWFwLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbWFwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmlkICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkID0gdGhpcy5pZDtcblx0fVxuXHRpZih0aGlzLmxhbmd1YWdlICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcblx0fVxuXHRpZih0aGlzLnZlcnNpb24gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmVyc2lvbiA9IHRoaXMudmVyc2lvbjtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKG1hcE9iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihtYXBPYmopO1xuXHRpZih0aGlzLmJib3ggIT0gbnVsbCkge1xuXHRcdG1hcE9iai5iYm94ID0gIHRoaXMuYmJveC5idWlsZEpzT2JqKCk7XG5cdH1cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLmdseXBocy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRtYXBPYmouZ2x5cGggPSBbXTtcblx0XHR9XG5cdFx0bWFwT2JqLmdseXBoLnB1c2godGhpcy5nbHlwaHNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRtYXBPYmouYXJjID0gW107XG5cdFx0fVxuXHRcdG1hcE9iai5hcmMucHVzaCh0aGlzLmFyY3NbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdG1hcE9iai5hcmNncm91cCA9IFtdO1xuXHRcdH1cblx0XHRtYXBPYmouYXJjZ3JvdXAucHVzaCh0aGlzLmFyY2dyb3Vwc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdHJldHVybiBtYXBPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTWFwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHttYXA6IHRoaXMuYnVpbGRKc09iaigpfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge01hcH1cbiAqL1xuTWFwLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBtYXA7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBtYXAgPSBNYXAuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIG1hcDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge01hcH1cbiAqL1xuTWFwLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5tYXAgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIG1hcCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgbWFwID0gbmV3IG5zLk1hcCgpO1xuXHRqc09iaiA9IGpzT2JqLm1hcDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gbWFwO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRtYXAuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0bWFwLmxhbmd1YWdlID0gYXR0cmlidXRlcy5sYW5ndWFnZSB8fCBudWxsO1xuXHRcdG1hcC52ZXJzaW9uID0gYXR0cmlidXRlcy52ZXJzaW9uIHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5iYm94KSB7XG5cdFx0dmFyIGJib3ggPSBucy5CYm94LmZyb21PYmooe2Jib3g6IGpzT2JqLmJib3hbMF19KTtcblx0XHRtYXAuc2V0QmJveChiYm94KTtcblx0fVxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdG1hcC5hZGRHbHlwaChnbHlwaCk7XG5cdFx0fVxuXHR9XG5cdGlmKGpzT2JqLmFyYykge1xuXHRcdHZhciBhcmNzID0ganNPYmouYXJjO1xuXHRcdGZvciAodmFyIGk9MDsgaSA8IGFyY3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmMgPSBucy5BcmMuZnJvbU9iaih7YXJjOiBhcmNzW2ldfSk7XG5cdFx0XHRtYXAuYWRkQXJjKGFyYyk7XG5cdFx0fVxuXHR9XG5cdGlmKGpzT2JqLmFyY2dyb3VwKSB7XG5cdFx0dmFyIGFyY2dyb3VwcyA9IGpzT2JqLmFyY2dyb3VwO1xuXHRcdGZvciAodmFyIGk9MDsgaSA8IGFyY2dyb3Vwcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyY2dyb3VwID0gbnMuQXJjZ3JvdXAuZnJvbU9iaih7YXJjZ3JvdXA6IGFyY2dyb3Vwc1tpXX0pO1xuXHRcdFx0bWFwLmFkZEFyY2dyb3VwKGFyY2dyb3VwKTtcblx0XHR9XG5cdH1cblxuXHRtYXAuYmFzZUZyb21PYmooanNPYmopO1xuXHRyZXR1cm4gbWFwO1xufTtcblxubnMuTWFwID0gTWFwO1xuLy8gLS0tLS0tLSBFTkQgTUFQIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBFWFRFTlNJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZXh0ZW5zaW9uJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICovXG52YXIgRXh0ZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuXHQvLyBjb25zaWRlciBmaXJzdCBvcmRlciBjaGlsZHJlbiwgYWRkIHRoZW0gd2l0aCB0aGVpciB0YWduYW1lIGFzIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0XG5cdC8vIHN0b3JlIHN0cmluZyBpZiBubyBzdXBwb3J0ZWQgcGFyc2luZyAodW5yZWNvZ25pemVkIGV4dGVuc2lvbnMpXG5cdC8vIGVsc2Ugc3RvcmUgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvblxuXHR0aGlzLmxpc3QgPSB7fTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd8cmVuZGVyLlJlbmRlckluZm9ybWF0aW9ufGFubm90LkFubm90YXRpb259IGV4dGVuc2lvblxuICovXG5FeHRlbnNpb24ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChleHRlbnNpb24pIHtcblx0aWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbikge1xuXHRcdHRoaXMubGlzdFsncmVuZGVySW5mb3JtYXRpb24nXSA9IGV4dGVuc2lvbjtcblx0fVxuXHRlbHNlIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBhbm5vdEV4dC5Bbm5vdGF0aW9uKSB7XG5cdFx0dGhpcy5saXN0Wydhbm5vdGF0aW9uJ10gPSBleHRlbnNpb247XG5cdH1cblx0ZWxzZSBpZih0eXBlb2YgZXh0ZW5zaW9uID09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgcGFyc2VkQXNPYmo7XG5cdFx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG5cdCAgICAgICAgcGFyc2VkQXNPYmogPSByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgdXRpbHMucGFyc2VTdHJpbmcoZXh0ZW5zaW9uLCBmbik7XG5cdCAgICB2YXIgbmFtZSA9IE9iamVjdC5rZXlzKHBhcnNlZEFzT2JqKVswXTtcblx0ICAgIGlmKG5hbWUgPT0gXCJyZW5kZXJJbmZvcm1hdGlvblwiKSB7XG5cdCAgICBcdHZhciByZW5kZXJJbmZvcm1hdGlvbiA9IHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbi5mcm9tWE1MKGV4dGVuc2lvbik7XG5cdFx0XHR0aGlzLmxpc3RbJ3JlbmRlckluZm9ybWF0aW9uJ10gPSByZW5kZXJJbmZvcm1hdGlvbjtcblx0ICAgIH1cblx0ICAgIGVsc2UgaWYobmFtZSA9PSBcImFubm90YXRpb25cIikge1xuXHQgICAgXHR2YXIgYW5ub3RhdGlvbiA9IGFubm90RXh0LkFubm90YXRpb24uZnJvbVhNTChleHRlbnNpb24pO1xuXHRcdFx0dGhpcy5saXN0Wydhbm5vdGF0aW9uJ10gPSByZW5kZXJJbmZvcm1hdGlvbjtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgXHR0aGlzLmxpc3RbbmFtZV0gPSBleHRlbnNpb247XG5cdCAgICB9XG5cdH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbk5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkV4dGVuc2lvbi5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGV4dGVuc2lvbk5hbWUpIHtcblx0cmV0dXJuIHRoaXMubGlzdC5oYXNPd25Qcm9wZXJ0eShleHRlbnNpb25OYW1lKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbk5hbWVcbiAqIEByZXR1cm4ge1N0cmluZ3xyZW5kZXIuUmVuZGVySW5mb3JtYXRpb258YW5ub3QuQW5ub3RhdGlvbn1cbiAqL1xuRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoZXh0ZW5zaW9uTmFtZSkge1xuXHRpZiAodGhpcy5oYXMoZXh0ZW5zaW9uTmFtZSkpIHtcblx0XHRyZXR1cm4gdGhpcy5saXN0W2V4dGVuc2lvbk5hbWVdO1xuXHR9XG5cdGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5FeHRlbnNpb24ucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBleHRlbnNpb25PYmogPSB7fTtcblxuXHRmb3IgKHZhciBleHRJbnN0YW5jZSBpbiB0aGlzLmxpc3QpIHtcblx0XHRpZiAoZXh0SW5zdGFuY2UgPT0gXCJyZW5kZXJJbmZvcm1hdGlvblwiKSB7XG5cdFx0XHRleHRlbnNpb25PYmoucmVuZGVySW5mb3JtYXRpb24gPSAgdGhpcy5nZXQoZXh0SW5zdGFuY2UpLmJ1aWxkSnNPYmooKTtcblx0XHR9IFxuXHRcdGVsc2UgaWYgKGV4dEluc3RhbmNlID09IFwiYW5ub3RhdGlvblwiKSB7XG5cdFx0XHRleHRlbnNpb25PYmouYW5ub3RhdGlvbiA9ICB0aGlzLmdldChleHRJbnN0YW5jZSkuYnVpbGRKc09iaigpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIHVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgYXJlIHN0b3JlZCBhcyBpcywgYXMgeG1sIHN0cmluZ1xuXHRcdFx0Ly8gd2UgbmVlZCB0byBwYXJzZSBpdCB0byBidWlsZCB0aGUganMgb2JqZWN0XG5cdFx0XHR2YXIgdW5zdXBwb3J0ZWRFeHRPYmo7XG5cdFx0XHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcblx0XHQgICAgICAgIHVuc3VwcG9ydGVkRXh0T2JqID0gcmVzdWx0O1xuXHRcdCAgICB9O1xuXHRcdCAgICB1dGlscy5wYXJzZVN0cmluZyh0aGlzLmdldChleHRJbnN0YW5jZSksIGZuKTtcblx0XHRcdGV4dGVuc2lvbk9ialtleHRJbnN0YW5jZV0gPSB1bnN1cHBvcnRlZEV4dE9ialtleHRJbnN0YW5jZV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHRlbnNpb25PYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRXh0ZW5zaW9uLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtleHRlbnNpb246IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7RXh0ZW5zaW9ufVxuICovXG5FeHRlbnNpb24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGV4dGVuc2lvbjtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGV4dGVuc2lvbiA9IEV4dGVuc2lvbi5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7RXh0ZW5zaW9ufVxuICovXG5FeHRlbnNpb24uZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmV4dGVuc2lvbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZXh0ZW5zaW9uLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKCk7XG5cdGpzT2JqID0ganNPYmouZXh0ZW5zaW9uO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBleHRlbnNpb247XG5cdH1cblxuXHQvL3ZhciBjaGlsZHJlbiA9IE9iamVjdC5rZXlzKGpzT2JqKTtcblx0Zm9yICh2YXIgZXh0TmFtZSBpbiBqc09iaikge1xuXHRcdC8vdmFyIGV4dE5hbWUgPSBPYmplY3Qua2V5cyhqc09ialtpXSlbMF07XG5cdFx0dmFyIGV4dEpzT2JqID0ganNPYmpbZXh0TmFtZV07XG5cblx0XHQvL2V4dGVuc2lvbi5hZGQoZXh0SW5zdGFuY2UpO1xuXHRcdGlmIChleHROYW1lID09ICdyZW5kZXJJbmZvcm1hdGlvbicpIHtcblx0XHRcdHZhciByZW5kZXJJbmZvcm1hdGlvbiA9IHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbi5mcm9tT2JqKHtyZW5kZXJJbmZvcm1hdGlvbjogZXh0SnNPYmpbMF19KTtcblx0XHRcdGV4dGVuc2lvbi5hZGQocmVuZGVySW5mb3JtYXRpb24pO1xuXHRcdH1cblx0XHRlbHNlIGlmIChleHROYW1lID09ICdhbm5vdGF0aW9uJykge1xuXHRcdFx0dmFyIGFubm90YXRpb24gPSBhbm5vdEV4dC5Bbm5vdGF0aW9uLmZyb21PYmooe2Fubm90YXRpb246IGV4dEpzT2JqWzBdfSk7XG5cdFx0XHRleHRlbnNpb24uYWRkKGFubm90YXRpb24pO1xuXHRcdH1cblx0XHRlbHNlIHsgLy8gdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLCB3ZSBzdGlsbCBzdG9yZSB0aGUgZGF0YSBhcyBpc1xuXHRcdFx0dmFyIHVuc3VwcG9ydGVkRXh0ID0ge307XG5cdFx0XHR1bnN1cHBvcnRlZEV4dFtleHROYW1lXSA9IGV4dEpzT2JqWzBdOyAvLyBtYWtlIGV4dGVuc2lvbiBzZXJpYWxpc2FibGVcblx0XHRcdHZhciBzdHJpbmdFeHQgPSB1dGlscy5idWlsZFN0cmluZyh1bnN1cHBvcnRlZEV4dCk7IC8vIHNlcmlhbGlzZSB0byBzdHJpbmdcblx0XHRcdGV4dGVuc2lvbi5hZGQoc3RyaW5nRXh0KTsgLy8gc2F2ZSBpdFxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBleHRlbnNpb247XG59O1xuXG5ucy5FeHRlbnNpb24gPSBFeHRlbnNpb247XG4vLyAtLS0tLS0tIEVORCBFWFRFTlNJT04gLS0tLS0tLVxuXG4vLyAtLS0tLS0tIE5PVEVTIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O25vdGVzJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEl0cyBzaW5nbGUgY29udGVudCBhdHRyaWJ1dGUgc3RvcmVzIHhodG1sIGVsZW1lbnRzIGFzIHN0cmluZy5cbiAqIEBjbGFzc1xuICovXG52YXIgTm90ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuY29udGVudCA9IFwiXCI7XG59O1xuXG4vKipcbiAqIE92ZXJ3cml0ZSB0aGUgY29udGVudC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqL1xuTm90ZXMucHJvdG90eXBlLnNldENvbnRlbnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHRoaXMuY29udGVudCA9IHN0cmluZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICovXG5Ob3Rlcy5wcm90b3R5cGUuYXBwZW5kQ29udGVudCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dGhpcy5jb250ZW50ICs9IHN0cmluZztcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbk5vdGVzLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBwYXJzZWRDb250ZW50O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHRoaXMuY29udGVudCwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHBhcnNlZENvbnRlbnQgPSByZXN1bHQ7XG4gICAgfSk7XG5cblx0cmV0dXJuIHBhcnNlZENvbnRlbnQ7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTm90ZXMucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe25vdGVzOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge05vdGVzfVxuICovXG5Ob3Rlcy5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgbm90ZXM7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBub3RlcyA9IE5vdGVzLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBub3Rlcztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge05vdGVzfVxuICovXG5Ob3Rlcy5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoubm90ZXMgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIG5vdGVzLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBub3RlcyA9IG5ldyBOb3RlcygpO1xuXHRqc09iaiA9IGpzT2JqLm5vdGVzO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBub3Rlcztcblx0fVxuXG5cdHZhciBzdHJpbmdFeHQgPSB1dGlscy5idWlsZFN0cmluZyh7bm90ZXM6IGpzT2JqfSk7IC8vIHNlcmlhbGlzZSB0byBzdHJpbmdcblx0Ly8geG1sMmpzIGRvZXMgd2VpcmQgdGhpbmdzIHdoZW4geW91IGp1c3Qgd2FudCB0byBzZXJpYWxpemUgdGhlIGNvbnRlbnRcblx0Ly8gbmVlZCB0byBpbmNsdWRlIHRoZSA8bm90ZXM+IHJvb3QgdG8gZ2V0IGl0IHByb3Blcmx5LCBhbmQgdGhlbiByZW1vdmUgaXQgaW4gdGhlIHJlc3VsdCBzdHJpbmcuXG5cdHN0cmluZ0V4dCA9IHN0cmluZ0V4dC5yZXBsYWNlKCc8bm90ZXM+JywgJycpO1xuXHRzdHJpbmdFeHQgPSBzdHJpbmdFeHQucmVwbGFjZSgnPC9ub3Rlcz4nLCAnJyk7XG5cdG5vdGVzLmNvbnRlbnQgPSBzdHJpbmdFeHQ7IC8vIHNhdmUgaXRcblxuXHRyZXR1cm4gbm90ZXM7XG59O1xuXG5ucy5Ob3RlcyA9IE5vdGVzO1xuLy8gLS0tLS0tLSBFTkQgTk9URVMgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEdMWVBIIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2dseXBoJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBHbHlwaFxuICogQGV4dGVuZHMgU0JHTkJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5jbGFzc19cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmNvbXBhcnRtZW50UmVmXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMuY29tcGFydG1lbnRPcmRlclxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMubWFwUmVmXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy50YWdSZWZcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLm9yaWVudGF0aW9uXG4gKiBAcGFyYW0ge0xhYmVsPX0gcGFyYW1zLmxhYmVsXG4gKiBAcGFyYW0ge0Jib3g9fSBwYXJhbXMuYmJveFxuICogQHBhcmFtIHtTdGF0ZVR5cGU9fSBwYXJhbXMuc3RhdGVcbiAqIEBwYXJhbSB7Q2xvbmVUeXBlPX0gcGFyYW1zLmNsb25lXG4gKiBAcGFyYW0ge0NhbGxvdXQ9fSBwYXJhbXMuY2FsbG91dFxuICogQHBhcmFtIHtFbnRpdHlUeXBlPX0gcGFyYW1zLmVudGl0eVxuICogQHBhcmFtIHtHbHlwaFtdPX0gcGFyYW1zLmdseXBoTWVtYmVyc1xuICogQHBhcmFtIHtQb3J0W109fSBwYXJhbXMucG9ydHNcbiAqL1xudmFyIEdseXBoID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnY2xhc3NfJywgJ2NvbXBhcnRtZW50UmVmJywgJ2NvbXBhcnRtZW50T3JkZXInLCAnbWFwUmVmJyxcblx0XHQndGFnUmVmJywgJ29yaWVudGF0aW9uJywgJ2xhYmVsJywgJ2Jib3gnLCAnZ2x5cGhNZW1iZXJzJywgJ3BvcnRzJywgJ3N0YXRlJywgJ2Nsb25lJywgJ2VudGl0eScsICdjYWxsb3V0J10pO1xuXHR0aGlzLmlkIFx0XHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMuY2xhc3NfXHRcdFx0XHQ9IHBhcmFtcy5jbGFzc187XG5cdHRoaXMuY29tcGFydG1lbnRSZWZcdFx0PSBwYXJhbXMuY29tcGFydG1lbnRSZWY7XG5cdHRoaXMuY29tcGFydG1lbnRPcmRlclx0PSBwYXJzZUZsb2F0KHBhcmFtcy5jb21wYXJ0bWVudE9yZGVyKTtcblx0dGhpcy5tYXBSZWZcdFx0XHRcdD0gcGFyYW1zLm1hcFJlZjtcblx0dGhpcy50YWdSZWZcdFx0XHRcdD0gcGFyYW1zLnRhZ1JlZjtcblx0dGhpcy5vcmllbnRhdGlvblx0XHQ9IHBhcmFtcy5vcmllbnRhdGlvbjtcblxuXHQvLyBjaGlsZHJlblxuXHR0aGlzLmxhYmVsIFx0XHRcdD0gcGFyYW1zLmxhYmVsO1xuXHR0aGlzLnN0YXRlIFx0XHRcdD0gcGFyYW1zLnN0YXRlO1xuXHR0aGlzLmNsb25lIFx0XHRcdD0gcGFyYW1zLmNsb25lO1xuXHR0aGlzLmNhbGxvdXQgXHRcdD0gcGFyYW1zLmNhbGxvdXQ7XG5cdHRoaXMuZW50aXR5IFx0XHQ9IHBhcmFtcy5lbnRpdHk7XG5cdHRoaXMuYmJveCBcdFx0XHQ9IHBhcmFtcy5iYm94O1xuXHR0aGlzLmdseXBoTWVtYmVycyBcdD0gcGFyYW1zLmdseXBoTWVtYmVycyB8fCBbXTsgLy8gY2FzZSBvZiBjb21wbGV4LCBjYW4gaGF2ZSBhcmJpdHJhcnkgbGlzdCBvZiBuZXN0ZWQgZ2x5cGhzXG5cdHRoaXMucG9ydHMgXHRcdFx0PSBwYXJhbXMucG9ydHMgfHwgW107XG59O1xuXG5HbHlwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5HbHlwaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHbHlwaDtcblxuLyoqXG4gKiBAcGFyYW0ge0xhYmVsfSBsYWJlbFxuICovXG5HbHlwaC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAobGFiZWwpIHtcblx0dGhpcy5sYWJlbCA9IGxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0YXRlVHlwZX0gc3RhdGVcbiAqL1xuR2x5cGgucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG5cdHRoaXMuc3RhdGUgPSBzdGF0ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYm94fSBiYm94XG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRCYm94ID0gZnVuY3Rpb24gKGJib3gpIHtcblx0dGhpcy5iYm94ID0gYmJveDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtDbG9uZVR5cGV9IGNsb25lXG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRDbG9uZSA9IGZ1bmN0aW9uIChjbG9uZSkge1xuXHR0aGlzLmNsb25lID0gY2xvbmU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Q2FsbG91dH0gY2FsbG91dFxuICovXG5HbHlwaC5wcm90b3R5cGUuc2V0Q2FsbG91dCA9IGZ1bmN0aW9uIChjYWxsb3V0KSB7XG5cdHRoaXMuY2FsbG91dCA9IGNhbGxvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RW50aXR5VHlwZX0gZW50aXR5XG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRFbnRpdHkgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG5cdHRoaXMuZW50aXR5ID0gZW50aXR5O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0dseXBofSBnbHlwaE1lbWJlclxuICovXG5HbHlwaC5wcm90b3R5cGUuYWRkR2x5cGhNZW1iZXIgPSBmdW5jdGlvbiAoZ2x5cGhNZW1iZXIpIHtcblx0dGhpcy5nbHlwaE1lbWJlcnMucHVzaChnbHlwaE1lbWJlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UG9ydH0gcG9ydFxuICovXG5HbHlwaC5wcm90b3R5cGUuYWRkUG9ydCA9IGZ1bmN0aW9uIChwb3J0KSB7XG5cdHRoaXMucG9ydHMucHVzaChwb3J0KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkdseXBoLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgZ2x5cGhPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMuY2xhc3NfICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmNsYXNzID0gdGhpcy5jbGFzc187XG5cdH1cblx0aWYodGhpcy5jb21wYXJ0bWVudFJlZiAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5jb21wYXJ0bWVudFJlZiA9IHRoaXMuY29tcGFydG1lbnRSZWY7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMuY29tcGFydG1lbnRPcmRlcikpIHtcblx0XHRhdHRyaWJ1dGVzLmNvbXBhcnRtZW50T3JkZXIgPSB0aGlzLmNvbXBhcnRtZW50T3JkZXI7XG5cdH1cblx0aWYodGhpcy5tYXBSZWYgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMubWFwUmVmID0gdGhpcy5tYXBSZWY7XG5cdH1cblx0aWYodGhpcy50YWdSZWYgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGFnUmVmID0gdGhpcy50YWdSZWY7XG5cdH1cblx0aWYodGhpcy5vcmllbnRhdGlvbiAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5vcmllbnRhdGlvbiA9IHRoaXMub3JpZW50YXRpb247XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhnbHlwaE9iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihnbHlwaE9iaik7XG5cdGlmKHRoaXMubGFiZWwgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLmxhYmVsID0gIHRoaXMubGFiZWwuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuc3RhdGUgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLnN0YXRlID0gIHRoaXMuc3RhdGUuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuY2xvbmUgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLmNsb25lID0gIHRoaXMuY2xvbmUuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuY2FsbG91dCAhPSBudWxsKSB7XG5cdFx0Z2x5cGhPYmouY2FsbG91dCA9ICB0aGlzLmNhbGxvdXQuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuZW50aXR5ICE9IG51bGwpIHtcblx0XHRnbHlwaE9iai5lbnRpdHkgPSAgdGhpcy5lbnRpdHkuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuYmJveCAhPSBudWxsKSB7XG5cdFx0Z2x5cGhPYmouYmJveCA9ICB0aGlzLmJib3guYnVpbGRKc09iaigpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgdGhpcy5nbHlwaE1lbWJlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoaT09MCkge1xuXHRcdFx0Z2x5cGhPYmouZ2x5cGggPSBbXTtcblx0XHR9XG5cdFx0Z2x5cGhPYmouZ2x5cGgucHVzaCh0aGlzLmdseXBoTWVtYmVyc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgdGhpcy5wb3J0cy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRnbHlwaE9iai5wb3J0ID0gW107XG5cdFx0fVxuXHRcdGdseXBoT2JqLnBvcnQucHVzaCh0aGlzLnBvcnRzW2ldLmJ1aWxkSnNPYmooKSk7XG5cdH1cblx0cmV0dXJuIGdseXBoT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkdseXBoLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtnbHlwaDogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtHbHlwaH1cbiAqL1xuR2x5cGguZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGdseXBoO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgZ2x5cGggPSBHbHlwaC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZ2x5cGg7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtHbHlwaH1cbiAqL1xuR2x5cGguZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmdseXBoID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBnbHlwaCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZ2x5cGggPSBuZXcgbnMuR2x5cGgoKTtcblx0anNPYmogPSBqc09iai5nbHlwaDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gZ2x5cGg7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGdseXBoLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdGdseXBoLmNsYXNzXyA9IGF0dHJpYnV0ZXMuY2xhc3MgfHwgbnVsbDtcblx0XHRnbHlwaC5jb21wYXJ0bWVudFJlZiA9IGF0dHJpYnV0ZXMuY29tcGFydG1lbnRSZWYgfHwgbnVsbDtcblx0XHRnbHlwaC5jb21wYXJ0bWVudE9yZGVyID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLmNvbXBhcnRtZW50T3JkZXIpO1xuXHRcdGdseXBoLm1hcFJlZiA9IGF0dHJpYnV0ZXMubWFwUmVmIHx8IG51bGw7XG5cdFx0Z2x5cGgudGFnUmVmID0gYXR0cmlidXRlcy50YWdSZWYgfHwgbnVsbDtcblx0XHRnbHlwaC5vcmllbnRhdGlvbiA9IGF0dHJpYnV0ZXMub3JpZW50YXRpb24gfHwgbnVsbDtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqLmxhYmVsKSB7XG5cdFx0dmFyIGxhYmVsID0gbnMuTGFiZWwuZnJvbU9iaih7bGFiZWw6IGpzT2JqLmxhYmVsWzBdfSk7XG5cdFx0Z2x5cGguc2V0TGFiZWwobGFiZWwpO1xuXHR9XG5cdGlmKGpzT2JqLnN0YXRlKSB7XG5cdFx0dmFyIHN0YXRlID0gbnMuU3RhdGVUeXBlLmZyb21PYmooe3N0YXRlOiBqc09iai5zdGF0ZVswXX0pO1xuXHRcdGdseXBoLnNldFN0YXRlKHN0YXRlKTtcblx0fVxuXHRpZihqc09iai5jbG9uZSkge1xuXHRcdHZhciBjbG9uZSA9IG5zLkNsb25lVHlwZS5mcm9tT2JqKHtjbG9uZToganNPYmouY2xvbmVbMF19KTtcblx0XHRnbHlwaC5zZXRDbG9uZShjbG9uZSk7XG5cdH1cblx0aWYoanNPYmouY2FsbG91dCkge1xuXHRcdHZhciBjYWxsb3V0ID0gbnMuQ2FsbG91dC5mcm9tT2JqKHtjYWxsb3V0OiBqc09iai5jYWxsb3V0WzBdfSk7XG5cdFx0Z2x5cGguc2V0Q2FsbG91dChjYWxsb3V0KTtcblx0fVxuXHRpZihqc09iai5lbnRpdHkpIHtcblx0XHR2YXIgZW50aXR5ID0gbnMuRW50aXR5VHlwZS5mcm9tT2JqKHtlbnRpdHk6IGpzT2JqLmVudGl0eVswXX0pO1xuXHRcdGdseXBoLnNldEVudGl0eShlbnRpdHkpO1xuXHR9XG5cdGlmKGpzT2JqLmJib3gpIHtcblx0XHR2YXIgYmJveCA9IG5zLkJib3guZnJvbU9iaih7YmJveDoganNPYmouYmJveFswXX0pO1xuXHRcdGdseXBoLnNldEJib3goYmJveCk7XG5cdH1cblxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaE1lbWJlciA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGdseXBoLmFkZEdseXBoTWVtYmVyKGdseXBoTWVtYmVyKTtcblx0XHR9XG5cdH1cblx0aWYoanNPYmoucG9ydCkge1xuXHRcdHZhciBwb3J0cyA9IGpzT2JqLnBvcnQ7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgcG9ydHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBwb3J0ID0gbnMuUG9ydC5mcm9tT2JqKHtwb3J0OiBwb3J0c1tpXX0pO1xuXHRcdFx0Z2x5cGguYWRkUG9ydChwb3J0KTtcblx0XHR9XG5cdH1cblxuXHRnbHlwaC5iYXNlRnJvbU9iaihqc09iaik7XG5cdHJldHVybiBnbHlwaDtcbn07XG5cbm5zLkdseXBoID0gR2x5cGg7XG4vLyAtLS0tLS0tIEVORCBHTFlQSCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gTEFCRUwgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bGFiZWwmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIExhYmVsXG4gKiBAZXh0ZW5kcyBTQkdOQmFzZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudGV4dFxuICogQHBhcmFtIHtCYm94PX0gcGFyYW1zLmJib3hcbiAqL1xudmFyIExhYmVsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsndGV4dCcsICdiYm94J10pO1xuXHR0aGlzLnRleHQgPSBwYXJhbXMudGV4dDtcblx0dGhpcy5iYm94ID0gcGFyYW1zLmJib3g7XG59O1xuXG5MYWJlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5MYWJlbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBucy5MYWJlbDtcblxuLyoqXG4gKiBAcGFyYW0ge0Jib3h9IGJib3hcbiAqL1xuTGFiZWwucHJvdG90eXBlLnNldEJib3ggPSBmdW5jdGlvbiAoYmJveCkge1xuXHR0aGlzLmJib3ggPSBiYm94O1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGFiZWwucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBsYWJlbE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy50ZXh0ICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnRleHQgPSB0aGlzLnRleHQ7XG5cdH1cblx0ZWxzZSB7IC8vIHRleHQgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGVcblx0XHRhdHRyaWJ1dGVzLnRleHQgPSBcIlwiO1xuXHR9XG5cdC8vIGVuc3VyZSBlbmNvZGluZyBvZiBsaW5lIGJyZWFrcyBpcyBhbHdheXMgcmVzcGVjdGVkXG5cdC8vYXR0cmlidXRlcy50ZXh0ID0gYXR0cmlidXRlcy50ZXh0LnJlcGxhY2UoJ1xcbicsICdcXG4nKTsgLy8nJiN4QTsnKTtcblx0dXRpbHMuYWRkQXR0cmlidXRlcyhsYWJlbE9iaiwgYXR0cmlidXRlcyk7XG5cblx0dGhpcy5iYXNlVG9Kc09iaihsYWJlbE9iaik7XG5cdGlmKHRoaXMuYmJveCAhPSBudWxsKSB7XG5cdFx0bGFiZWxPYmouYmJveCA9ICB0aGlzLmJib3guYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiBsYWJlbE9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5MYWJlbC5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7bGFiZWw6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TGFiZWx9XG4gKi9cbkxhYmVsLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBsYWJlbDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGxhYmVsID0gTGFiZWwuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TGFiZWx9XG4gKi9cbkxhYmVsLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5sYWJlbCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgbGFiZWwsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGxhYmVsID0gbmV3IG5zLkxhYmVsKCk7XG5cdGpzT2JqID0ganNPYmoubGFiZWw7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGxhYmVsO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRsYWJlbC50ZXh0ID0gYXR0cmlidXRlcy50ZXh0IHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5iYm94KSB7XG5cdFx0dmFyIGJib3ggPSBucy5CYm94LmZyb21PYmooe2Jib3g6IGpzT2JqLmJib3hbMF19KTtcblx0XHRsYWJlbC5zZXRCYm94KGJib3gpO1xuXHR9XG5cdGxhYmVsLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGxhYmVsO1xufTtcblxubnMuTGFiZWwgPSBMYWJlbDtcbi8vIC0tLS0tLS0gRU5EIExBQkVMIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBCQk9YIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2Jib3gmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIEJib3hcbiAqIEBleHRlbmRzIFNCR05CYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy53XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMuaFxuICovXG52YXIgQmJveCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0bnMuU0JHTkJhc2UuY2FsbCh0aGlzLCBwYXJhbXMpO1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3gnLCAneScsICd3JywgJ2gnXSk7XG5cdHRoaXMueCA9IHBhcnNlRmxvYXQocGFyYW1zLngpO1xuXHR0aGlzLnkgPSBwYXJzZUZsb2F0KHBhcmFtcy55KTtcblx0dGhpcy53ID0gcGFyc2VGbG9hdChwYXJhbXMudyk7XG5cdHRoaXMuaCA9IHBhcnNlRmxvYXQocGFyYW1zLmgpO1xufTtcblxuQmJveC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5CYm94LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG5zLkJib3g7XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkJib3gucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBiYm94T2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZighaXNOYU4odGhpcy54KSkge1xuXHRcdGF0dHJpYnV0ZXMueCA9IHRoaXMueDtcblx0fVxuXHRpZighaXNOYU4odGhpcy55KSkge1xuXHRcdGF0dHJpYnV0ZXMueSA9IHRoaXMueTtcblx0fVxuXHRpZighaXNOYU4odGhpcy53KSkge1xuXHRcdGF0dHJpYnV0ZXMudyA9IHRoaXMudztcblx0fVxuXHRpZighaXNOYU4odGhpcy5oKSkge1xuXHRcdGF0dHJpYnV0ZXMuaCA9IHRoaXMuaDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGJib3hPYmosIGF0dHJpYnV0ZXMpO1xuXHR0aGlzLmJhc2VUb0pzT2JqKGJib3hPYmopO1xuXHRyZXR1cm4gYmJveE9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5CYm94LnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtiYm94OiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0Jib3h9XG4gKi9cbkJib3guZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGJib3g7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBiYm94ID0gQmJveC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gYmJveDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0Jib3h9XG4gKi9cbkJib3guZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmJib3ggPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGJib3gsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGJib3ggPSBuZXcgbnMuQmJveCgpO1xuXHRqc09iaiA9IGpzT2JqLmJib3g7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGJib3g7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGJib3gueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRiYm94LnkgPSBwYXJzZUZsb2F0KGF0dHJpYnV0ZXMueSk7XG5cdFx0YmJveC53ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLncpO1xuXHRcdGJib3guaCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy5oKTtcblx0fVxuXHRiYm94LmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGJib3g7XG59O1xuXG5ucy5CYm94ID0gQmJveDtcbi8vIC0tLS0tLS0gRU5EIEJCT1ggLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFNUQVRFIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3N0YXRlJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBTdGF0ZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy52YXJpYWJsZVxuICovXG52YXIgU3RhdGVUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3ZhbHVlJywgJ3ZhcmlhYmxlJ10pO1xuXHR0aGlzLnZhbHVlID0gcGFyYW1zLnZhbHVlO1xuXHR0aGlzLnZhcmlhYmxlID0gcGFyYW1zLnZhcmlhYmxlO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU3RhdGVUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3RhdGVPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMudmFsdWUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmFsdWUgPSB0aGlzLnZhbHVlO1xuXHR9XG5cdGlmKHRoaXMudmFyaWFibGUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmFyaWFibGUgPSB0aGlzLnZhcmlhYmxlO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gc3RhdGVPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuU3RhdGVUeXBlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdGF0ZTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdGF0ZVR5cGV9XG4gKi9cblN0YXRlVHlwZS5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgc3RhdGU7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBzdGF0ZSA9IFN0YXRlVHlwZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdGF0ZVR5cGV9XG4gKi9cblN0YXRlVHlwZS5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc3RhdGUgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHN0YXRlLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBzdGF0ZSA9IG5ldyBucy5TdGF0ZVR5cGUoKTtcblx0anNPYmogPSBqc09iai5zdGF0ZTtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0YXRlLnZhbHVlID0gYXR0cmlidXRlcy52YWx1ZSB8fCBudWxsO1xuXHRcdHN0YXRlLnZhcmlhYmxlID0gYXR0cmlidXRlcy52YXJpYWJsZSB8fCBudWxsO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbm5zLlN0YXRlVHlwZSA9IFN0YXRlVHlwZTtcbi8vIC0tLS0tLS0gRU5EIFNUQVRFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBDTE9ORSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtjbG9uZSZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3MgQ2xvbmVUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5sYWJlbFxuICovXG52YXIgQ2xvbmVUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10pO1xuXHR0aGlzLmxhYmVsID0gcGFyYW1zLmxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0xhYmVsfSBsYWJlbFxuICovXG5DbG9uZVR5cGUucHJvdG90eXBlLnNldExhYmVsID0gZnVuY3Rpb24gKGxhYmVsKSB7XG5cdHRoaXMubGFiZWwgPSBsYWJlbDtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkNsb25lVHlwZS5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGNsb25lT2JqID0ge307XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYodGhpcy5sYWJlbCAhPSBudWxsKSB7XG5cdFx0Y2xvbmVPYmoubGFiZWwgPSAgdGhpcy5sYWJlbC5idWlsZEpzT2JqKCk7XG5cdH1cblx0cmV0dXJuIGNsb25lT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkNsb25lVHlwZS5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7Y2xvbmU6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7Q2xvbmVUeXBlfVxuICovXG5DbG9uZVR5cGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGNsb25lO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgY2xvbmUgPSBDbG9uZVR5cGUuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGNsb25lO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7Q2xvbmVUeXBlfVxuICovXG5DbG9uZVR5cGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmNsb25lID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBjbG9uZSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgY2xvbmUgPSBuZXcgbnMuQ2xvbmVUeXBlKCk7XG5cdGpzT2JqID0ganNPYmouY2xvbmU7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoubGFiZWwpIHtcblx0XHR2YXIgbGFiZWwgPSBucy5MYWJlbC5mcm9tT2JqKHtsYWJlbDoganNPYmoubGFiZWxbMF19KTtcblx0XHRjbG9uZS5zZXRMYWJlbChsYWJlbCk7XG5cdH1cblx0cmV0dXJuIGNsb25lO1xufTtcblxubnMuQ2xvbmVUeXBlID0gQ2xvbmVUeXBlO1xuLy8gLS0tLS0tLSBFTkQgQ0xPTkUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEVOVElUWVRZUEUgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBFbnRpdHlUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5uYW1lXG4gKi9cbnZhciBFbnRpdHlUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ25hbWUnXSk7XG5cdHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuRW50aXR5VHlwZS5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGVudGl0eU9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5uYW1lICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLm5hbWUgPSB0aGlzLm5hbWU7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhlbnRpdHlPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gZW50aXR5T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkVudGl0eVR5cGUucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2VudGl0eTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtFbnRpdHlUeXBlfVxuICovXG5FbnRpdHlUeXBlLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBlbnRpdHk7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBlbnRpdHkgPSBFbnRpdHlUeXBlLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBlbnRpdHk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtFbnRpdHlUeXBlfVxuICovXG5FbnRpdHlUeXBlLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5lbnRpdHkgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGVudGl0eSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZW50aXR5ID0gbmV3IG5zLkVudGl0eVR5cGUoKTtcblx0anNPYmogPSBqc09iai5lbnRpdHk7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGVudGl0eTtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0ZW50aXR5Lm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgbnVsbDtcblx0fVxuXHRyZXR1cm4gZW50aXR5O1xufTtcblxubnMuRW50aXR5VHlwZSA9IEVudGl0eVR5cGU7XG4vLyAtLS0tLS0tIEVORCBFTlRJVFlUWVBFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBQT1JUIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3BvcnQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIFBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIFBvcnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdG5zLlNCR05CYXNlLmNhbGwodGhpcywgcGFyYW1zKTtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydpZCcsICd4JywgJ3knXSk7XG5cdHRoaXMuaWQgPSBwYXJhbXMuaWQ7XG5cdHRoaXMueCBcdD0gcGFyc2VGbG9hdChwYXJhbXMueCk7XG5cdHRoaXMueSBcdD0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuXG5Qb3J0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU0JHTkJhc2UucHJvdG90eXBlKTtcblBvcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnMuUG9ydDtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuUG9ydC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHBvcnRPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLngpKSB7XG5cdFx0YXR0cmlidXRlcy54ID0gdGhpcy54O1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLnkpKSB7XG5cdFx0YXR0cmlidXRlcy55ID0gdGhpcy55O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMocG9ydE9iaiwgYXR0cmlidXRlcyk7XG5cdHRoaXMuYmFzZVRvSnNPYmoocG9ydE9iaik7XG5cdHJldHVybiBwb3J0T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblBvcnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3BvcnQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7UG9ydH1cbiAqL1xuUG9ydC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcG9ydDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHBvcnQgPSBQb3J0LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBwb3J0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7UG9ydH1cbiAqL1xuUG9ydC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoucG9ydCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgcG9ydCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgcG9ydCA9IG5ldyBucy5Qb3J0KCk7XG5cdGpzT2JqID0ganNPYmoucG9ydDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gcG9ydDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0cG9ydC54ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLngpO1xuXHRcdHBvcnQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0XHRwb3J0LmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHR9XG5cdHBvcnQuYmFzZUZyb21PYmooanNPYmopO1xuXHRyZXR1cm4gcG9ydDtcbn07XG5cbm5zLlBvcnQgPSBQb3J0O1xuLy8gLS0tLS0tLSBFTkQgUE9SVCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gQVJDIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2FyYyZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3MgQXJjXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuY2xhc3NfXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnRhcmdldFxuICogQHBhcmFtIHtTdGFydFR5cGU9fSBwYXJhbXMuc3RhcnRcbiAqIEBwYXJhbSB7RW5kVHlwZT19IHBhcmFtcy5lbmRcbiAqIEBwYXJhbSB7TmV4dFR5cGU9fSBwYXJhbXMubmV4dHNcbiAqIEBwYXJhbSB7R2x5cGhbXT19IHBhcmFtcy5nbHlwaHMgVGhlIGFyYydzIGNhcmRpbmFsaXR5LiBQb3NzaWJpbGl0eSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggaXMgbGVmdCBvcGVuLlxuICovXG52YXIgQXJjID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnY2xhc3NfJywgJ3NvdXJjZScsICd0YXJnZXQnLCAnc3RhcnQnLCAnZW5kJywgJ25leHRzJywgJ2dseXBocyddKTtcblx0dGhpcy5pZCBcdD0gcGFyYW1zLmlkO1xuXHR0aGlzLmNsYXNzXyA9IHBhcmFtcy5jbGFzc187XG5cdHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcblx0dGhpcy50YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuXG5cdHRoaXMuc3RhcnQgXHQ9IHBhcmFtcy5zdGFydDtcblx0dGhpcy5lbmQgXHQ9IHBhcmFtcy5lbmQ7XG5cdHRoaXMubmV4dHMgXHQ9IHBhcmFtcy5uZXh0cyB8fCBbXTtcblx0dGhpcy5nbHlwaHMgPSBwYXJhbXMuZ2x5cGhzIHx8wqBbXTtcbn07XG5cbkFyYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5BcmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnMuQXJjO1xuXG4vKipcbiAqIEBwYXJhbSB7U3RhcnRUeXBlfSBzdGFydFxuICovXG5BcmMucHJvdG90eXBlLnNldFN0YXJ0ID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdHRoaXMuc3RhcnQgPSBzdGFydDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbmRUeXBlfSBlbmRcbiAqL1xuQXJjLnByb3RvdHlwZS5zZXRFbmQgPSBmdW5jdGlvbiAoZW5kKSB7XG5cdHRoaXMuZW5kID0gZW5kO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge05leHRUeXBlfSBuZXh0XG4gKi9cbkFyYy5wcm90b3R5cGUuYWRkTmV4dCA9IGZ1bmN0aW9uIChuZXh0KSB7XG5cdHRoaXMubmV4dHMucHVzaChuZXh0KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuQXJjLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuXHR0aGlzLmdseXBocy5wdXNoKGdseXBoKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkFyYy5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFyY09iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5pZCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7XG5cdH1cblx0aWYodGhpcy5jbGFzc18gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuY2xhc3MgPSB0aGlzLmNsYXNzXztcblx0fVxuXHRpZih0aGlzLnNvdXJjZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5zb3VyY2UgPSB0aGlzLnNvdXJjZTtcblx0fVxuXHRpZih0aGlzLnRhcmdldCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy50YXJnZXQgPSB0aGlzLnRhcmdldDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGFyY09iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihhcmNPYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY09iai5nbHlwaCA9IFtdO1xuXHRcdH1cblx0XHRhcmNPYmouZ2x5cGgucHVzaCh0aGlzLmdseXBoc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGlmKHRoaXMuc3RhcnQgIT0gbnVsbCkge1xuXHRcdGFyY09iai5zdGFydCA9ICB0aGlzLnN0YXJ0LmJ1aWxkSnNPYmooKTtcblx0fVxuXHRpZih0aGlzLnN0YXRlICE9IG51bGwpIHtcblx0XHRhcmNPYmouc3RhdGUgPSAgdGhpcy5zdGF0ZS5idWlsZEpzT2JqKCk7XG5cdH1cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLm5leHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY09iai5uZXh0ID0gW107XG5cdFx0fVxuXHRcdGFyY09iai5uZXh0LnB1c2godGhpcy5uZXh0c1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGlmKHRoaXMuZW5kICE9IG51bGwpIHtcblx0XHRhcmNPYmouZW5kID0gIHRoaXMuZW5kLmJ1aWxkSnNPYmooKTtcblx0fVxuXHRyZXR1cm4gYXJjT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkFyYy5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7YXJjOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0FyY31cbiAqL1xuQXJjLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhcmM7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBhcmMgPSBBcmMuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGFyYztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0FyY31cbiAqL1xuQXJjLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5hcmMgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGFyYywgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgYXJjID0gbmV3IG5zLkFyYygpO1xuXHRqc09iaiA9IGpzT2JqLmFyYztcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gYXJjO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRhcmMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0YXJjLmNsYXNzXyA9IGF0dHJpYnV0ZXMuY2xhc3MgfHwgbnVsbDtcblx0XHRhcmMuc291cmNlID0gYXR0cmlidXRlcy5zb3VyY2UgfHwgbnVsbDtcblx0XHRhcmMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgbnVsbDtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqLnN0YXJ0KSB7XG5cdFx0dmFyIHN0YXJ0ID0gbnMuU3RhcnRUeXBlLmZyb21PYmooe3N0YXJ0OiBqc09iai5zdGFydFswXX0pO1xuXHRcdGFyYy5zZXRTdGFydChzdGFydCk7XG5cdH1cblx0aWYoanNPYmoubmV4dCkge1xuXHRcdHZhciBuZXh0cyA9IGpzT2JqLm5leHQ7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgbmV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBuZXh0ID0gbnMuTmV4dFR5cGUuZnJvbU9iaih7bmV4dDogbmV4dHNbaV19KTtcblx0XHRcdGFyYy5hZGROZXh0KG5leHQpO1xuXHRcdH1cblx0fVxuXHRpZihqc09iai5lbmQpIHtcblx0XHR2YXIgZW5kID0gbnMuRW5kVHlwZS5mcm9tT2JqKHtlbmQ6IGpzT2JqLmVuZFswXX0pO1xuXHRcdGFyYy5zZXRFbmQoZW5kKTtcblx0fVxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGFyYy5hZGRHbHlwaChnbHlwaCk7XG5cdFx0fVxuXHR9XG5cblx0YXJjLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGFyYztcbn07XG5cbm5zLkFyYyA9IEFyYztcbi8vIC0tLS0tLS0gRU5EIEFSQyAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gU1RBUlRUWVBFIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3N0YXJ0Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBTdGFydFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy54XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueVxuICovXG52YXIgU3RhcnRUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3gnLCAneSddKTtcblx0dGhpcy54ID0gcGFyc2VGbG9hdChwYXJhbXMueCk7XG5cdHRoaXMueSA9IHBhcnNlRmxvYXQocGFyYW1zLnkpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU3RhcnRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3RhcnRPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKCFpc05hTih0aGlzLngpKSB7XG5cdFx0YXR0cmlidXRlcy54ID0gdGhpcy54O1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLnkpKSB7XG5cdFx0YXR0cmlidXRlcy55ID0gdGhpcy55O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3RhcnRPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gc3RhcnRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuU3RhcnRUeXBlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdGFydDogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdGFydFR5cGV9XG4gKi9cblN0YXJ0VHlwZS5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgc3RhcnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBzdGFydCA9IFN0YXJ0VHlwZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdGFydFR5cGV9XG4gKi9cblN0YXJ0VHlwZS5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc3RhcnQgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHN0YXJ0LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBzdGFydCA9IG5ldyBucy5TdGFydFR5cGUoKTtcblx0anNPYmogPSBqc09iai5zdGFydDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3RhcnQ7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0YXJ0LnggPSBwYXJzZUZsb2F0KGF0dHJpYnV0ZXMueCk7XG5cdFx0c3RhcnQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gc3RhcnQ7XG59O1xuXG5ucy5TdGFydFR5cGUgPSBTdGFydFR5cGU7XG4vLyAtLS0tLS0tIEVORCBTVEFSVFRZUEUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEVORFRZUEUgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZW5kJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBFbmRUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIEVuZFR5cGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneCcsICd5J10pO1xuXHR0aGlzLnggPSBwYXJzZUZsb2F0KHBhcmFtcy54KTtcblx0dGhpcy55ID0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5FbmRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgZW5kT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZighaXNOYU4odGhpcy54KSkge1xuXHRcdGF0dHJpYnV0ZXMueCA9IHRoaXMueDtcblx0fVxuXHRpZighaXNOYU4odGhpcy55KSkge1xuXHRcdGF0dHJpYnV0ZXMueSA9IHRoaXMueTtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGVuZE9iaiwgYXR0cmlidXRlcyk7XG5cdHJldHVybiBlbmRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW5kVHlwZS5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7ZW5kOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0VuZFR5cGV9XG4gKi9cbkVuZFR5cGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGVuZDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGVuZCA9IEVuZFR5cGUuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGVuZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0VuZFR5cGV9XG4gKi9cbkVuZFR5cGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmVuZCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZW5kLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBlbmQgPSBuZXcgbnMuRW5kVHlwZSgpO1xuXHRqc09iaiA9IGpzT2JqLmVuZDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gZW5kO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRlbmQueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRlbmQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gZW5kO1xufTtcblxubnMuRW5kVHlwZSA9IEVuZFR5cGU7XG4vLyAtLS0tLS0tIEVORCBFTkRUWVBFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBORVhUVFlQRSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtuZXh0Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBOZXh0VHlwZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnhcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy55XG4gKi9cbnZhciBOZXh0VHlwZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWyd4JywgJ3knXSk7XG5cdHRoaXMueCA9IHBhcnNlRmxvYXQocGFyYW1zLngpO1xuXHR0aGlzLnkgPSBwYXJzZUZsb2F0KHBhcmFtcy55KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbk5leHRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbmV4dE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYoIWlzTmFOKHRoaXMueCkpIHtcblx0XHRhdHRyaWJ1dGVzLnggPSB0aGlzLng7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMueSkpIHtcblx0XHRhdHRyaWJ1dGVzLnkgPSB0aGlzLnk7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhuZXh0T2JqLCBhdHRyaWJ1dGVzKTtcblx0cmV0dXJuIG5leHRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTmV4dFR5cGUucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe25leHQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TmV4dFR5cGV9XG4gKi9cbk5leHRUeXBlLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBuZXh0O1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgbmV4dCA9IE5leHRUeXBlLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBuZXh0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TmV4dFR5cGV9XG4gKi9cbk5leHRUeXBlLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5uZXh0ID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBuZXh0LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBuZXh0ID0gbmV3IG5zLk5leHRUeXBlKCk7XG5cdGpzT2JqID0ganNPYmoubmV4dDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gbmV4dDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0bmV4dC54ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLngpO1xuXHRcdG5leHQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gbmV4dDtcbn07XG5cbm5zLk5leHRUeXBlID0gTmV4dFR5cGU7XG4vLyAtLS0tLS0tIEVORCBORVhUVFlQRSAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gUE9JTlQgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cG9pbnQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIFBvaW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneCcsICd5J10pO1xuXHR0aGlzLnggPSBwYXJzZUZsb2F0KHBhcmFtcy54KTtcblx0dGhpcy55ID0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuUG9pbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShucy5TQkdOQmFzZS5wcm90b3R5cGUpO1xuUG9pbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnQ7XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblBvaW50LnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcG9pbnRKc09iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYoIWlzTmFOKHRoaXMueCkpIHtcblx0XHRhdHRyaWJ1dGVzLnggPSB0aGlzLng7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMueSkpIHtcblx0XHRhdHRyaWJ1dGVzLnkgPSB0aGlzLnk7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhwb2ludEpzT2JqLCBhdHRyaWJ1dGVzKTtcblx0dGhpcy5iYXNlVG9Kc09iaihwb2ludEpzT2JqKTtcblx0cmV0dXJuIHBvaW50SnNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuUG9pbnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3BvaW50OiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1BvaW50fVxuICovXG5Qb2ludC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcG9pbnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBwb2ludCA9IFBvaW50LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBwb2ludDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge1BvaW50fVxuICovXG5Qb2ludC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoucG9pbnQgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHBvaW50LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBwb2ludCA9IG5ldyBucy5Qb2ludCgpO1xuXHRqc09iaiA9IGpzT2JqLnBvaW50O1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBwb2ludDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0cG9pbnQueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRwb2ludC55ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLnkpO1xuXHR9XG5cdHBvaW50LmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIHBvaW50O1xufTtcblxubnMuUG9pbnQgPSBQb2ludDtcbi8vIC0tLS0tLS0gRU5EIFBPSU5UIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBDQUxMT1VUIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2NhbGxvdXQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIENhbGxvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnRhcmdldFxuICogQHBhcmFtIHtQb2ludD19IHBhcmFtcy5wb2ludFxuICovXG52YXIgQ2FsbG91dCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWyd0YXJnZXQnLCAncG9pbnQnXSk7XG5cdHRoaXMudGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcblx0dGhpcy5wb2ludCA9IHBhcmFtcy5wb2ludDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQb2ludH0gcG9pbnRcbiAqL1xuQ2FsbG91dC5wcm90b3R5cGUuc2V0UG9pbnQgPSBmdW5jdGlvbihwb2ludCkge1xuXHR0aGlzLnBvaW50ID0gcG9pbnQ7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5DYWxsb3V0LnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgY2FsbG91dE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy50YXJnZXQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhjYWxsb3V0T2JqLCBhdHRyaWJ1dGVzKTtcblxuXHQvLyBjaGlsZHJlblxuXHRpZih0aGlzLnBvaW50ICE9IG51bGwpIHtcblx0XHRjYWxsb3V0T2JqLnBvaW50ID0gIHRoaXMucG9pbnQuYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiBjYWxsb3V0T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkNhbGxvdXQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2NhbGxvdXQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7Q2FsbG91dH1cbiAqL1xuQ2FsbG91dC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgY2FsbG91dDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGNhbGxvdXQgPSBDYWxsb3V0LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBjYWxsb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7Q2FsbG91dH1cbiAqL1xuQ2FsbG91dC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouY2FsbG91dCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgY2FsbG91dCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgY2FsbG91dCA9IG5ldyBucy5DYWxsb3V0KCk7XG5cdGpzT2JqID0ganNPYmouY2FsbG91dDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gY2FsbG91dDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0Y2FsbG91dC50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoucG9pbnQpIHtcblx0XHR2YXIgcG9pbnQgPSBucy5Qb2ludC5mcm9tT2JqKHtwb2ludDoganNPYmoucG9pbnRbMF19KTtcblx0XHRjYWxsb3V0LnNldFBvaW50KHBvaW50KTtcblx0fVxuXHRyZXR1cm4gY2FsbG91dDtcbn07XG5cbm5zLkNhbGxvdXQgPSBDYWxsb3V0O1xuLy8gLS0tLS0tLSBFTkQgQ0FMTE9VVCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gQVJDR1JPVVAgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7YXJjZ3JvdXAmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBTQkdOQmFzZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuY2xhc3NfXG4gKiBAcGFyYW0ge0dseXBoW109fSBwYXJhbXMuZ2x5cGhzXG4gKiBAcGFyYW0ge0FyY1tdPX0gcGFyYW1zLmFyY3NcbiAqL1xudmFyIEFyY2dyb3VwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnY2xhc3NfJywgJ2dseXBocycsICdhcmNzJ10pO1xuXHR0aGlzLmNsYXNzXyBcdFx0PSBwYXJhbXMuY2xhc3NfO1xuXHR0aGlzLmdseXBocyBcdD0gcGFyYW1zLmdseXBocyB8fCBbXTtcblx0dGhpcy5hcmNzIFx0XHQ9IHBhcmFtcy5hcmNzIHx8IFtdO1xufTtcblxuQXJjZ3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShucy5TQkdOQmFzZS5wcm90b3R5cGUpO1xuQXJjZ3JvdXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjZ3JvdXA7XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuQXJjZ3JvdXAucHJvdG90eXBlLmFkZEdseXBoID0gZnVuY3Rpb24gKGdseXBoKSB7XG5cdHRoaXMuZ2x5cGhzLnB1c2goZ2x5cGgpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FyY30gYXJjXG4gKi9cbkFyY2dyb3VwLnByb3RvdHlwZS5hZGRBcmMgPSBmdW5jdGlvbiAoYXJjKSB7XG5cdHRoaXMuYXJjcy5wdXNoKGFyYyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5BcmNncm91cC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFyY2dyb3VwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmNsYXNzXyAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5jbGFzcyA9IHRoaXMuY2xhc3NfO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoYXJjZ3JvdXBPYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdHRoaXMuYmFzZVRvSnNPYmooYXJjZ3JvdXBPYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY2dyb3VwT2JqLmdseXBoID0gW107XG5cdFx0fVxuXHRcdGFyY2dyb3VwT2JqLmdseXBoLnB1c2godGhpcy5nbHlwaHNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRhcmNncm91cE9iai5hcmMgPSBbXTtcblx0XHR9XG5cdFx0YXJjZ3JvdXBPYmouYXJjLnB1c2godGhpcy5hcmNzW2ldLmJ1aWxkSnNPYmooKSk7XG5cdH1cblx0cmV0dXJuIGFyY2dyb3VwT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkFyY2dyb3VwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHthcmNncm91cDogdGhpcy5idWlsZEpzT2JqKCl9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7QXJjZ3JvdXB9XG4gKi9cbkFyY2dyb3VwLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhcmNncm91cDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGFyY2dyb3VwID0gQXJjZ3JvdXAuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGFyY2dyb3VwO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7QXJjZ3JvdXB9XG4gKi9cbkFyY2dyb3VwLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5hcmNncm91cCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgYXJjZ3JvdXAsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGFyY2dyb3VwID0gbmV3IG5zLkFyY2dyb3VwKCk7XG5cdGpzT2JqID0ganNPYmouYXJjZ3JvdXA7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGFyY2dyb3VwO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRhcmNncm91cC5jbGFzc18gPSBhdHRyaWJ1dGVzLmNsYXNzIHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGFyY2dyb3VwLmFkZEdseXBoKGdseXBoKTtcblx0XHR9XG5cdH1cblx0aWYoanNPYmouYXJjKSB7XG5cdFx0dmFyIGFyY3MgPSBqc09iai5hcmM7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyYyA9IG5zLkFyYy5mcm9tT2JqKHthcmM6IGFyY3NbaV19KTtcblx0XHRcdGFyY2dyb3VwLmFkZEFyYyhhcmMpO1xuXHRcdH1cblx0fVxuXG5cdGFyY2dyb3VwLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGFyY2dyb3VwO1xufTtcblxubnMuQXJjZ3JvdXAgPSBBcmNncm91cDtcbi8vIC0tLS0tLS0gRU5EIEFSQ0dST1VQIC0tLS0tLS1cblxubnMucmVuZGVyID0gcmVuZGVyRXh0O1xubnMuYW5ub3QgPSBhbm5vdEV4dDtcbm1vZHVsZS5leHBvcnRzID0gbnM7IiwidmFyIG5zID0ge307XG52YXIgeG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG5cbi8qXG5cdGd1YXJhbnRlZXMgdG8gcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdpdmVuIGFyZ3MgYmVpbmcgc2V0IHRvIG51bGwgaWYgbm90IHByZXNlbnQsIG90aGVyIGFyZ3MgcmV0dXJuZWQgYXMgaXNcbiovXG5ucy5jaGVja1BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMsIG5hbWVzKSB7XG5cdGlmICh0eXBlb2YgcGFyYW1zID09IFwidW5kZWZpbmVkXCIgfHwgcGFyYW1zID09IG51bGwpIHtcblx0XHRwYXJhbXMgPSB7fTtcblx0fVxuXHRpZiAodHlwZW9mIHBhcmFtcyAhPSAnb2JqZWN0Jykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBwYXJhbXMuIE9iamVjdCB3aXRoIG5hbWVkIHBhcmFtZXRlcnMgbXVzdCBiZSBwYXNzZWQuXCIpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgYXJnTmFtZSA9IG5hbWVzW2ldO1xuXHRcdGlmICh0eXBlb2YgcGFyYW1zW2FyZ05hbWVdID09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRwYXJhbXNbYXJnTmFtZV0gPSBudWxsO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGFyYW1zO1xufVxuXG5ucy5nZXRGaXJzdExldmVsQnlOYW1lID0gZnVuY3Rpb24gKHhtbE9iaiwgbG9jYWxOYW1lKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0Zm9yKHZhciBpPTA7IGk8eG1sT2JqLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgY2hpbGQgPSB4bWxPYmouY2hpbGROb2Rlc1tpXTtcblx0XHRpZiAoY2hpbGQubG9jYWxOYW1lICYmIGNoaWxkLmxvY2FsTmFtZSA9PSBsb2NhbE5hbWUpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbm5zLmFkZEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoanNPYmosIGF0dHJpYnV0ZXMpIHtcblx0anNPYmouJCA9IGF0dHJpYnV0ZXM7XG59O1xuXG5ucy5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcsIGZuKSB7XG5cdHZhciBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG5cdFx0dGFnTmFtZVByb2Nlc3NvcnM6IFt4bWwyanMucHJvY2Vzc29ycy5zdHJpcFByZWZpeF0sXG5cdFx0YXR0clZhbHVlUHJvY2Vzc29yczogW3htbDJqcy5wcm9jZXNzb3JzLnBhcnNlTnVtYmVycywgeG1sMmpzLnByb2Nlc3NvcnMucGFyc2VCb29sZWFuc11cblx0fSk7XG5cdHBhcnNlci5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbn07XG5cbm5zLnBhcnNlU3RyaW5nS2VlcFByZWZpeCA9IGZ1bmN0aW9uIChzdHJpbmcsIGZuKSB7XG5cdHZhciBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG5cdFx0YXR0clZhbHVlUHJvY2Vzc29yczogW3htbDJqcy5wcm9jZXNzb3JzLnBhcnNlTnVtYmVycywgeG1sMmpzLnByb2Nlc3NvcnMucGFyc2VCb29sZWFuc11cblx0fSk7XG5cdHBhcnNlci5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbn07XG5cbm5zLmJ1aWxkU3RyaW5nID0gZnVuY3Rpb24gKG9iaikge1xuXHR2YXIgeG1sU3RyaW5nID0gIG5ldyB4bWwyanMuQnVpbGRlcih7XG5cdFx0aGVhZGxlc3M6IHRydWUsXG5cdFx0cmVuZGVyT3B0czoge3ByZXR0eTogZmFsc2V9XG5cdH0pLmJ1aWxkT2JqZWN0KG9iaik7XG5cblx0LyogXHRkaXJ0eSBoYWNrIG5lZWRlZCB0byBzb2x2ZSB0aGUgbmV3bGluZSBjaGFyIGVuY29kaW5nIHByb2JsZW1cblx0XHR4bWwyanMgZG9lc24ndCBlbmNvZGUgXFxuIGFzICYjeEE7IHdlIG5lZWQgdG8gZG8gaXQgbWFudWFsbHlcblx0Ki9cblx0dmFyIHJlID0gLzxsYWJlbCB0ZXh0PVwiKCgufFxcbispKz8pXCIvZ207XG5cdHZhciB4bWxTdHJpbmdfY29ycmVjdExhYmVsID0geG1sU3RyaW5nLnJlcGxhY2UocmUsIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIpIHtcblx0XHRyZXR1cm4gJzxsYWJlbCB0ZXh0PVwiJytwMS5yZXBsYWNlKC9cXG4vZywgXCImI3hBO1wiKSsnXCInO1xuXHR9KTtcblx0cmV0dXJuIHhtbFN0cmluZ19jb3JyZWN0TGFiZWw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5zOyIsIi8vIFJlcGxhY2UgbG9jYWwgcmVxdWlyZSBieSBhIGxhenkgbG9hZGVyXG52YXIgZ2xvYmFsUmVxdWlyZSA9IHJlcXVpcmU7XG5yZXF1aXJlID0gZnVuY3Rpb24gKCkge307XG5cbi8vIEV4cG9zZSBzdWJtb2R1bGVzXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBMZXhlcjogICAgICAgIHJlcXVpcmUoJy4vbGliL04zTGV4ZXInKSxcbiAgUGFyc2VyOiAgICAgICByZXF1aXJlKCcuL2xpYi9OM1BhcnNlcicpLFxuICBXcml0ZXI6ICAgICAgIHJlcXVpcmUoJy4vbGliL04zV3JpdGVyJyksXG4gIFN0b3JlOiAgICAgICAgcmVxdWlyZSgnLi9saWIvTjNTdG9yZScpLFxuICBTdHJlYW1QYXJzZXI6IHJlcXVpcmUoJy4vbGliL04zU3RyZWFtUGFyc2VyJyksXG4gIFN0cmVhbVdyaXRlcjogcmVxdWlyZSgnLi9saWIvTjNTdHJlYW1Xcml0ZXInKSxcbiAgVXRpbDogICAgICAgICByZXF1aXJlKCcuL2xpYi9OM1V0aWwnKSxcbn07XG5cbi8vIExvYWQgc3VibW9kdWxlcyBvbiBmaXJzdCBhY2Nlc3Ncbk9iamVjdC5rZXlzKGV4cG9ydHMpLmZvckVhY2goZnVuY3Rpb24gKHN1Ym1vZHVsZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgc3VibW9kdWxlLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWxldGUgZXhwb3J0c1tzdWJtb2R1bGVdO1xuICAgICAgcmV0dXJuIGV4cG9ydHNbc3VibW9kdWxlXSA9IGdsb2JhbFJlcXVpcmUoJy4vbGliL04zJyArIHN1Ym1vZHVsZSk7XG4gICAgfSxcbiAgfSk7XG59KTtcbiIsIi8vICoqTjNMZXhlcioqIHRva2VuaXplcyBOMyBkb2N1bWVudHMuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBpbW1lZGlhdGVseSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgPyBzZXRJbW1lZGlhdGUgOlxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZ1bmMpIHsgc2V0VGltZW91dChmdW5jLCAwKTsgfTtcblxuLy8gUmVndWxhciBleHByZXNzaW9uIGFuZCByZXBsYWNlbWVudCBzdHJpbmcgdG8gZXNjYXBlIE4zIHN0cmluZ3MuXG4vLyBOb3RlIGhvdyB3ZSBjYXRjaCBpbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2VzIHNlcGFyYXRlbHkgKHRoZXkgd2lsbCB0cmlnZ2VyIGFuIGVycm9yKS5cbnZhciBlc2NhcGVTZXF1ZW5jZSA9IC9cXFxcdShbYS1mQS1GMC05XXs0fSl8XFxcXFUoW2EtZkEtRjAtOV17OH0pfFxcXFxbdVVdfFxcXFwoLikvZztcbnZhciBlc2NhcGVSZXBsYWNlbWVudHMgPSB7XG4gICdcXFxcJzogJ1xcXFwnLCBcIidcIjogXCInXCIsICdcIic6ICdcIicsXG4gICduJzogJ1xcbicsICdyJzogJ1xccicsICd0JzogJ1xcdCcsICdmJzogJ1xcZicsICdiJzogJ1xcYicsXG4gICdfJzogJ18nLCAnfic6ICd+JywgJy4nOiAnLicsICctJzogJy0nLCAnISc6ICchJywgJyQnOiAnJCcsICcmJzogJyYnLFxuICAnKCc6ICcoJywgJyknOiAnKScsICcqJzogJyonLCAnKyc6ICcrJywgJywnOiAnLCcsICc7JzogJzsnLCAnPSc6ICc9JyxcbiAgJy8nOiAnLycsICc/JzogJz8nLCAnIyc6ICcjJywgJ0AnOiAnQCcsICclJzogJyUnLFxufTtcbnZhciBpbGxlZ2FsSXJpQ2hhcnMgPSAvW1xceDAwLVxceDIwPD5cXFxcXCJcXHtcXH1cXHxcXF5cXGBdLztcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zTGV4ZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNMZXhlcikpXG4gICAgcmV0dXJuIG5ldyBOM0xleGVyKG9wdGlvbnMpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBJbiBsaW5lIG1vZGUgKE4tVHJpcGxlcyBvciBOLVF1YWRzKSwgb25seSBzaW1wbGUgZmVhdHVyZXMgbWF5IGJlIHBhcnNlZFxuICBpZiAob3B0aW9ucy5saW5lTW9kZSkge1xuICAgIC8vIERvbid0IHRva2VuaXplIHNwZWNpYWwgbGl0ZXJhbHNcbiAgICB0aGlzLl90cmlwbGVRdW90ZWRTdHJpbmcgPSB0aGlzLl9udW1iZXIgPSB0aGlzLl9ib29sZWFuID0gLyQwXi87XG4gICAgLy8gU3dhcCB0aGUgdG9rZW5pemUgbWV0aG9kIGZvciBhIHJlc3RyaWN0ZWQgdmVyc2lvblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl90b2tlbml6ZSA9IHRoaXMudG9rZW5pemU7XG4gICAgdGhpcy50b2tlbml6ZSA9IGZ1bmN0aW9uIChpbnB1dCwgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3Rva2VuaXplKGlucHV0LCBmdW5jdGlvbiAoZXJyb3IsIHRva2VuKSB7XG4gICAgICAgIGlmICghZXJyb3IgJiYgL14oPzpJUkl8cHJlZml4ZWR8bGl0ZXJhbHxsYW5nY29kZXx0eXBlfFxcLnxlb2YpJC8udGVzdCh0b2tlbi50eXBlKSlcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvciwgdG9rZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3IgfHwgc2VsZi5fc3ludGF4RXJyb3IodG9rZW4udHlwZSwgY2FsbGJhY2sgPSBudWxsKSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIC8vIEVuYWJsZSBOMyBmdW5jdGlvbmFsaXR5IGJ5IGRlZmF1bHRcbiAgdGhpcy5fbjNNb2RlID0gb3B0aW9ucy5uMyAhPT0gZmFsc2U7XG4gIC8vIERpc2FibGUgY29tbWVudCB0b2tlbnMgYnkgZGVmYXVsdFxuICB0aGlzLl9jb21tZW50cyA9ICEhb3B0aW9ucy5jb21tZW50cztcbn1cblxuTjNMZXhlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgLy8gSXQncyBzbGlnaHRseSBmYXN0ZXIgdG8gaGF2ZSB0aGVzZSBhcyBwcm9wZXJ0aWVzIHRoYW4gYXMgaW4tc2NvcGUgdmFyaWFibGVzXG5cbiAgX2lyaTogL148KCg/OlteIDw+e31cXFxcXXxcXFxcW3VVXSkrKT5bIFxcdF0qLywgLy8gSVJJIHdpdGggZXNjYXBlIHNlcXVlbmNlczsgbmVlZHMgc2FuaXR5IGNoZWNrIGFmdGVyIHVuZXNjYXBpbmdcbiAgX3VuZXNjYXBlZElyaTogL148KFteXFx4MDAtXFx4MjA8PlxcXFxcIlxce1xcfVxcfFxcXlxcYF0qKT5bIFxcdF0qLywgLy8gSVJJIHdpdGhvdXQgZXNjYXBlIHNlcXVlbmNlczsgbm8gdW5lc2NhcGluZ1xuICBfdW5lc2NhcGVkU3RyaW5nOiAvXlwiW15cIlxcXFxdK1wiKD89W15cIlxcXFxdKS8sIC8vIG5vbi1lbXB0eSBzdHJpbmcgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzXG4gIF9zaW5nbGVRdW90ZWRTdHJpbmc6IC9eXCJbXlwiXFxcXF0qKD86XFxcXC5bXlwiXFxcXF0qKSpcIig/PVteXCJcXFxcXSl8XidbXidcXFxcXSooPzpcXFxcLlteJ1xcXFxdKikqJyg/PVteJ1xcXFxdKS8sXG4gIF90cmlwbGVRdW90ZWRTdHJpbmc6IC9eXCJcIihcIlteXCJcXFxcXSooPzooPzpcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXSopKlwiKVwiXCJ8XicnKCdbXidcXFxcXSooPzooPzpcXFxcLnwnKD8hJycpKVteJ1xcXFxdKikqJyknJy8sXG4gIF9sYW5nY29kZTogL15AKFthLXpdKyg/Oi1bYS16MC05XSspKikoPz1bXmEtejAtOVxcLV0pL2ksXG4gIF9wcmVmaXg6IC9eKCg/OltBLVphLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopPzooPz1bI1xcczxdKS8sXG4gIF9wcmVmaXhlZDogL14oKD86W0EtWmEtelxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmZmXFx1MDM3MC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl0pKD86XFwuP1tcXC0wLTlBLVpfYS16XFx4YjdcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjAzZlxcdTIwNDBcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl0pKik/OigoPzooPzpbMC06QS1aX2EtelxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmZmXFx1MDM3MC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl18JVswLTlhLWZBLUZdezJ9fFxcXFxbISMtXFwvOz0/XFwtQF9+XSkoPzooPzpbXFwuXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKig/OltcXC0wLTpBLVpfYS16XFx4YjdcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjAzZlxcdTIwNDBcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl18JVswLTlhLWZBLUZdezJ9fFxcXFxbISMtXFwvOz0/XFwtQF9+XSkpPyk/KSg/OlsgXFx0XSt8KD89XFwuP1ssOyFcXF5cXHMjKClcXFtcXF1cXHtcXH1cIic8XSkpLyxcbiAgX3ZhcmlhYmxlOiAvXlxcPyg/Oig/OltBLVpfYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpbXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopKD89Wy4sOyFcXF5cXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfYmxhbms6IC9eXzooKD86WzAtOUEtWl9hLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopKD86WyBcXHRdK3woPz1cXC4/Wyw7OlxccyMoKVxcW1xcXVxce1xcfVwiJzxdKSkvLFxuICBfbnVtYmVyOiAvXltcXC0rXT8oPzpcXGQrXFwuP1xcZCooW2VFXSg/OltcXC1cXCtdKT9cXGQrKXxcXGQqXFwuP1xcZCspKD89Wy4sOzpcXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfYm9vbGVhbjogL14oPzp0cnVlfGZhbHNlKSg/PVsuLDtcXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfa2V5d29yZDogL15AW2Etel0rKD89W1xccyM8XSkvaSxcbiAgX3NwYXJxbEtleXdvcmQ6IC9eKD86UFJFRklYfEJBU0V8R1JBUEgpKD89W1xccyM8XSkvaSxcbiAgX3Nob3J0UHJlZGljYXRlczogL15hKD89XFxzK3w8KS8sXG4gIF9uZXdsaW5lOiAvXlsgXFx0XSooPzojW15cXG5cXHJdKik/KD86XFxyXFxufFxcbnxcXHIpWyBcXHRdKi8sXG4gIF9jb21tZW50OiAvIyhbXlxcblxccl0qKS8sXG4gIF93aGl0ZXNwYWNlOiAvXlsgXFx0XSsvLFxuICBfZW5kT2ZGaWxlOiAvXig/OiNbXlxcblxccl0qKT8kLyxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF90b2tlbml6ZVRvRW5kYCB0b2tlbml6ZXMgYXMgZm9yIGFzIHBvc3NpYmxlLCBlbWl0dGluZyB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgX3Rva2VuaXplVG9FbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgaW5wdXRGaW5pc2hlZCkge1xuICAgIC8vIENvbnRpbnVlIHBhcnNpbmcgYXMgZmFyIGFzIHBvc3NpYmxlOyB0aGUgbG9vcCB3aWxsIHJldHVybiBldmVudHVhbGx5XG4gICAgdmFyIGlucHV0ID0gdGhpcy5faW5wdXQsIG91dHB1dENvbW1lbnRzID0gdGhpcy5fY29tbWVudHM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIENvdW50IGFuZCBza2lwIHdoaXRlc3BhY2UgbGluZXNcbiAgICAgIHZhciB3aGl0ZVNwYWNlTWF0Y2gsIGNvbW1lbnQ7XG4gICAgICB3aGlsZSAod2hpdGVTcGFjZU1hdGNoID0gdGhpcy5fbmV3bGluZS5leGVjKGlucHV0KSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGNvbW1lbnRcbiAgICAgICAgaWYgKG91dHB1dENvbW1lbnRzICYmIChjb21tZW50ID0gdGhpcy5fY29tbWVudC5leGVjKHdoaXRlU3BhY2VNYXRjaFswXSkpKVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2NvbW1lbnQnLCB2YWx1ZTogY29tbWVudFsxXSwgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5wdXRcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHIod2hpdGVTcGFjZU1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fbGluZSsrO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlIG9uIGN1cnJlbnQgbGluZVxuICAgICAgaWYgKHdoaXRlU3BhY2VNYXRjaCA9IHRoaXMuX3doaXRlc3BhY2UuZXhlYyhpbnB1dCkpXG4gICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKHdoaXRlU3BhY2VNYXRjaFswXS5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7XG5cbiAgICAgIC8vIFN0b3AgZm9yIG5vdyBpZiB3ZSdyZSBhdCB0aGUgZW5kXG4gICAgICBpZiAodGhpcy5fZW5kT2ZGaWxlLnRlc3QoaW5wdXQpKSB7XG4gICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBmaW5pc2hlZCwgZW1pdCBFT0ZcbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQpIHtcbiAgICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGZpbmFsIGNvbW1lbnRcbiAgICAgICAgICBpZiAob3V0cHV0Q29tbWVudHMgJiYgKGNvbW1lbnQgPSB0aGlzLl9jb21tZW50LmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2NvbW1lbnQnLCB2YWx1ZTogY29tbWVudFsxXSwgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgICBjYWxsYmFjayhpbnB1dCA9IG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2VvZicsIHZhbHVlOiAnJywgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWMgdG9rZW4gdHlwZXMgYmFzZWQgb24gdGhlIGZpcnN0IGNoYXJhY3RlclxuICAgICAgdmFyIGxpbmUgPSB0aGlzLl9saW5lLCB0eXBlID0gJycsIHZhbHVlID0gJycsIHByZWZpeCA9ICcnLFxuICAgICAgICAgIGZpcnN0Q2hhciA9IGlucHV0WzBdLCBtYXRjaCA9IG51bGwsIG1hdGNoTGVuZ3RoID0gMCwgdW5lc2NhcGVkLCBpbmNvbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICdeJzpcbiAgICAgICAgLy8gV2UgbmVlZCBhdCBsZWFzdCAzIHRva2VucyBsb29rYWhlYWQgdG8gZGlzdGluZ3Vpc2ggXl48SVJJPiBhbmQgXl5wcmU6Zml4ZWRcbiAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHR5cGVcbiAgICAgICAgZWxzZSBpZiAoaW5wdXRbMV0gPT09ICdeJykge1xuICAgICAgICAgIHRoaXMuX3ByZXZUb2tlblR5cGUgPSAnXl4nO1xuICAgICAgICAgIC8vIE1vdmUgdG8gdHlwZSBJUkkgb3IgcHJlZml4ZWQgbmFtZVxuICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKDIpO1xuICAgICAgICAgIGlmIChpbnB1dFswXSAhPT0gJzwnKSB7XG4gICAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHR5cGUsIGl0IG11c3QgYmUgYSBwYXRoIGV4cHJlc3Npb25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuX24zTW9kZSkge1xuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSAxO1xuICAgICAgICAgICAgdHlwZSA9ICdeJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGluIGNhc2UgdGhlIHR5cGUgaXMgYW4gSVJJXG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBmdWxsIElSSSB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fdW5lc2NhcGVkSXJpLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBmdWxsIElSSSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9pcmkuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCB8fCBpbGxlZ2FsSXJpQ2hhcnMudGVzdCh1bmVzY2FwZWQpKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSB1bmVzY2FwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBiYWNrd2FyZHMgaW1wbGljYXRpb24gYXJyb3dcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbjNNb2RlICYmIGlucHV0Lmxlbmd0aCA+IDEgJiYgaW5wdXRbMV0gPT09ICc9JylcbiAgICAgICAgICB0eXBlID0gJ2ludmVyc2UnLCBtYXRjaExlbmd0aCA9IDIsIHZhbHVlID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjaW1wbGllcyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdfJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBibGFuayBub2RlLiBTaW5jZSBpdCBjYW4gY29udGFpbiAoYnV0IG5vdCBlbmQgd2l0aCkgYSBkb3QsXG4gICAgICAgIC8vIHdlIGFsd2F5cyBuZWVkIGEgbm9uLWRvdCBjaGFyYWN0ZXIgYmVmb3JlIGRlY2lkaW5nIGl0IGlzIGEgcHJlZml4ZWQgbmFtZS5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB0cnkgaW5zZXJ0aW5nIGEgc3BhY2UgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuXG4gICAgICAgIGlmICgobWF0Y2ggPSB0aGlzLl9ibGFuay5leGVjKGlucHV0KSkgfHxcbiAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fYmxhbmsuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAnYmxhbmsnLCBwcmVmaXggPSAnXycsIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdcIic6XG4gICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIG5vbi1lbXB0eSBkb3VibGUtcXVvdGVkIGxpdGVyYWwgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3VuZXNjYXBlZFN0cmluZy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhbnkgb3RoZXIgbGl0ZXJhbCB3cmFwcGVkIGluIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlc1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHRoaXMuX3NpbmdsZVF1b3RlZFN0cmluZy5leGVjKGlucHV0KSkge1xuICAgICAgICAgIHVuZXNjYXBlZCA9IHRoaXMuX3VuZXNjYXBlKG1hdGNoWzBdKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbGl0ZXJhbCB3cmFwcGVkIGluIHRocmVlIHBhaXJzIG9mIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdGhpcy5fdHJpcGxlUXVvdGVkU3RyaW5nLmV4ZWMoaW5wdXQpKSB7XG4gICAgICAgICAgdW5lc2NhcGVkID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl07XG4gICAgICAgICAgLy8gQ291bnQgdGhlIG5ld2xpbmVzIGFuZCBhZHZhbmNlIGxpbmUgY291bnRlclxuICAgICAgICAgIHRoaXMuX2xpbmUgKz0gdW5lc2NhcGVkLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdW5lc2NhcGVkID0gdGhpcy5fdW5lc2NhcGUodW5lc2NhcGVkKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICc/JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSB2YXJpYWJsZVxuICAgICAgICBpZiAodGhpcy5fbjNNb2RlICYmIChtYXRjaCA9IHRoaXMuX3ZhcmlhYmxlLmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICB0eXBlID0gJ3ZhcicsIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdAJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBsYW5ndWFnZSBjb2RlXG4gICAgICAgIGlmICh0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnbGl0ZXJhbCcgJiYgKG1hdGNoID0gdGhpcy5fbGFuZ2NvZGUuZXhlYyhpbnB1dCkpKVxuICAgICAgICAgIHR5cGUgPSAnbGFuZ2NvZGUnLCB2YWx1ZSA9IG1hdGNoWzFdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGtleXdvcmRcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9rZXl3b3JkLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSBtYXRjaFswXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJy4nOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRvdCBhcyBwdW5jdHVhdGlvblxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAxID8gaW5wdXRGaW5pc2hlZCA6IChpbnB1dFsxXSA8ICcwJyB8fCBpbnB1dFsxXSA+ICc5JykpIHtcbiAgICAgICAgICB0eXBlID0gJy4nO1xuICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gbnVtZXJpY2FsIGNhc2UgKGNvdWxkIGJlIGEgZGVjaW1hbCBkb3QpXG5cbiAgICAgIGNhc2UgJzAnOlxuICAgICAgY2FzZSAnMSc6XG4gICAgICBjYXNlICcyJzpcbiAgICAgIGNhc2UgJzMnOlxuICAgICAgY2FzZSAnNCc6XG4gICAgICBjYXNlICc1JzpcbiAgICAgIGNhc2UgJzYnOlxuICAgICAgY2FzZSAnNyc6XG4gICAgICBjYXNlICc4JzpcbiAgICAgIGNhc2UgJzknOlxuICAgICAgY2FzZSAnKyc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBudW1iZXJcbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fbnVtYmVyLmV4ZWMoaW5wdXQpKSB7XG4gICAgICAgICAgdHlwZSA9ICdsaXRlcmFsJztcbiAgICAgICAgICB2YWx1ZSA9ICdcIicgKyBtYXRjaFswXSArICdcIl5eaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjJyArXG4gICAgICAgICAgICAgICAgICAobWF0Y2hbMV0gPyAnZG91YmxlJyA6ICgvXlsrXFwtXT9cXGQrJC8udGVzdChtYXRjaFswXSkgPyAnaW50ZWdlcicgOiAnZGVjaW1hbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQic6XG4gICAgICBjYXNlICdiJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnUCc6XG4gICAgICBjYXNlICdHJzpcbiAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIFNQQVJRTC1zdHlsZSBrZXl3b3JkXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3NwYXJxbEtleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZic6XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgYm9vbGVhblxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl9ib29sZWFuLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gJ1wiJyArIG1hdGNoWzBdICsgJ1wiXl5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYW4gYWJicmV2aWF0ZWQgcHJlZGljYXRlXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3Nob3J0UHJlZGljYXRlcy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2FiYnJldmlhdGlvbicsIHZhbHVlID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYW4gaW1wbGljYXRpb24gYXJyb3cgb3IgZXF1YWxzIHNpZ25cbiAgICAgICAgaWYgKHRoaXMuX24zTW9kZSAmJiBpbnB1dC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHlwZSA9ICdhYmJyZXZpYXRpb24nO1xuICAgICAgICAgIGlmIChpbnB1dFsxXSAhPT0gJz4nKVxuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSAxLCB2YWx1ZSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNzYW1lQXMnO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMiwgdmFsdWUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL2xvZyNpbXBsaWVzJztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnISc6XG4gICAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLCc6XG4gICAgICBjYXNlICc7JzpcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXSc6XG4gICAgICBjYXNlICcoJzpcbiAgICAgIGNhc2UgJyknOlxuICAgICAgY2FzZSAneyc6XG4gICAgICBjYXNlICd9JzpcbiAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgcHVuY3R1YXRpb25cbiAgICAgICAgbWF0Y2hMZW5ndGggPSAxO1xuICAgICAgICB0eXBlID0gZmlyc3RDaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5jb25jbHVzaXZlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZSBmaXJzdCBjaGFyYWN0ZXJzIGRvIG5vdCBhbGxvdyBhbiBpbW1lZGlhdGUgZGVjaXNpb24sIHNvIGluc3BlY3QgbW9yZVxuICAgICAgaWYgKGluY29uY2x1c2l2ZSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeFxuICAgICAgICBpZiAoKHRoaXMuX3ByZXZUb2tlblR5cGUgPT09ICdAcHJlZml4JyB8fCB0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnUFJFRklYJykgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHRoaXMuX3ByZWZpeC5leGVjKGlucHV0KSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXgnLCB2YWx1ZSA9IG1hdGNoWzFdIHx8ICcnO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeGVkIG5hbWUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAncHJlZml4ZWQnLCBwcmVmaXggPSBtYXRjaFsxXSB8fCAnJywgdmFsdWUgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHlwZSB0b2tlbiBpcyBzcGVjaWFsOiBpdCBjYW4gb25seSBiZSBlbWl0dGVkIGFmdGVyIGFuIElSSSBvciBwcmVmaXhlZCBuYW1lIGlzIHJlYWRcbiAgICAgIGlmICh0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnXl4nKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwcmVmaXhlZCc6IHR5cGUgPSAndHlwZSc7ICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdJUkknOiAgICAgIHR5cGUgPSAndHlwZUlSSSc7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgIHR5cGUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaGF0IGlmIG5vdGhpbmcgb2YgdGhlIGFib3ZlIHdhcyBmb3VuZD9cbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyBXZSBjb3VsZCBiZSBpbiBzdHJlYW1pbmcgbW9kZSwgYW5kIHRoZW4gd2UganVzdCB3YWl0IGZvciBtb3JlIGlucHV0IHRvIGFycml2ZS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhIHN5bnRheCBlcnJvciBoYXMgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxuICAgICAgICAvLyBPbmUgZXhjZXB0aW9uOiBlcnJvciBvbiBhbiB1bmFjY291bnRlZCBsaW5lYnJlYWsgKD0gbm90IGluc2lkZSBhIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbCkuXG4gICAgICAgIGlmIChpbnB1dEZpbmlzaGVkIHx8ICghL14nJyd8XlwiXCJcIi8udGVzdChpbnB1dCkgJiYgL1xcbnxcXHIvLnRlc3QoaW5wdXQpKSlcbiAgICAgICAgICByZXR1cm4gcmVwb3J0U3ludGF4RXJyb3IodGhpcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCB0aGUgcGFyc2VkIHRva2VuXG4gICAgICBjYWxsYmFjayhudWxsLCB7IGxpbmU6IGxpbmUsIHR5cGU6IHR5cGUsIHZhbHVlOiB2YWx1ZSwgcHJlZml4OiBwcmVmaXggfSk7XG4gICAgICB0aGlzLl9wcmV2VG9rZW5UeXBlID0gdHlwZTtcblxuICAgICAgLy8gQWR2YW5jZSB0byBuZXh0IHBhcnQgdG8gdG9rZW5pemVcbiAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKG1hdGNoTGVuZ3RoIHx8IG1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBTaWduYWxzIHRoZSBzeW50YXggZXJyb3IgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgICBmdW5jdGlvbiByZXBvcnRTeW50YXhFcnJvcihzZWxmKSB7IGNhbGxiYWNrKHNlbGYuX3N5bnRheEVycm9yKC9eXFxTKi8uZXhlYyhpbnB1dClbMF0pKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3VuZXNjYXBlYCByZXBsYWNlcyBOMyBlc2NhcGUgY29kZXMgYnkgdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzXG4gIF91bmVzY2FwZTogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGl0ZW0ucmVwbGFjZShlc2NhcGVTZXF1ZW5jZSwgZnVuY3Rpb24gKHNlcXVlbmNlLCB1bmljb2RlNCwgdW5pY29kZTgsIGVzY2FwZWRDaGFyKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZTtcbiAgICAgICAgaWYgKHVuaWNvZGU0KSB7XG4gICAgICAgICAgY2hhckNvZGUgPSBwYXJzZUludCh1bmljb2RlNCwgMTYpO1xuICAgICAgICAgIGlmIChpc05hTihjaGFyQ29kZSkpIHRocm93IG5ldyBFcnJvcigpOyAvLyBjYW4gbmV2ZXIgaGFwcGVuIChyZWdleCksIGJ1dCBoZWxwcyBwZXJmb3JtYW5jZVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaWNvZGU4KSB7XG4gICAgICAgICAgY2hhckNvZGUgPSBwYXJzZUludCh1bmljb2RlOCwgMTYpO1xuICAgICAgICAgIGlmIChpc05hTihjaGFyQ29kZSkpIHRocm93IG5ldyBFcnJvcigpOyAvLyBjYW4gbmV2ZXIgaGFwcGVuIChyZWdleCksIGJ1dCBoZWxwcyBwZXJmb3JtYW5jZVxuICAgICAgICAgIGlmIChjaGFyQ29kZSA8PSAweEZGRkYpIHJldHVybiBmcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoMHhEODAwICsgKChjaGFyQ29kZSAtPSAweDEwMDAwKSAvIDB4NDAwKSwgMHhEQzAwICsgKGNoYXJDb2RlICYgMHgzRkYpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlc2NhcGVSZXBsYWNlbWVudHNbZXNjYXBlZENoYXJdO1xuICAgICAgICAgIGlmICghcmVwbGFjZW1lbnQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgcmV0dXJuIG51bGw7IH1cbiAgfSxcblxuICAvLyAjIyMgYF9zeW50YXhFcnJvcmAgY3JlYXRlcyBhIHN5bnRheCBlcnJvciBmb3IgdGhlIGdpdmVuIGlzc3VlXG4gIF9zeW50YXhFcnJvcjogZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgXCInICsgaXNzdWUgKyAnXCIgb24gbGluZSAnICsgdGhpcy5fbGluZSArICcuJyk7XG4gIH0sXG5cblxuICAvLyAjIyBQdWJsaWMgbWV0aG9kc1xuXG4gIC8vICMjIyBgdG9rZW5pemVgIHN0YXJ0cyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYW4gTjMgZG9jdW1lbnQgaW50byBhbiBhcnJheSBvZiB0b2tlbnMuXG4gIC8vIFRoZSBpbnB1dCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBzdHJlYW0uXG4gIHRva2VuaXplOiBmdW5jdGlvbiAoaW5wdXQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2xpbmUgPSAxO1xuXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgc3RyaW5nLCBjb250aW51b3VzbHkgZW1pdCB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2sgdW50aWwgdGhlIGVuZFxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgLy8gSWYgYSBjYWxsYmFjayB3YXMgcGFzc2VkLCBhc3luY2hyb25vdXNseSBjYWxsIGl0XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBpbW1lZGlhdGVseShmdW5jdGlvbiAoKSB7IHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpOyB9KTtcbiAgICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBwYXNzZWQsIHRva2VuaXplIHN5bmNocm9ub3VzbHkgYW5kIHJldHVyblxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSBbXSwgZXJyb3I7XG4gICAgICAgIHRoaXMuX3Rva2VuaXplVG9FbmQoZnVuY3Rpb24gKGUsIHQpIHsgZSA/IChlcnJvciA9IGUpIDogdG9rZW5zLnB1c2godCk7IH0sIHRydWUpO1xuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHRoZSBpbnB1dCBtdXN0IGJlIGEgc3RyZWFtXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dCA9ICcnO1xuICAgICAgaWYgKHR5cGVvZiBpbnB1dC5zZXRFbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgaW5wdXQuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgIC8vIEFkZHMgdGhlIGRhdGEgY2h1bmsgdG8gdGhlIGJ1ZmZlciBhbmQgcGFyc2VzIGFzIGZhciBhcyBwb3NzaWJsZVxuICAgICAgaW5wdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoc2VsZi5faW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLl9pbnB1dCArPSBkYXRhO1xuICAgICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQYXJzZXMgdW50aWwgdGhlIGVuZFxuICAgICAgaW5wdXQub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYuX2lucHV0ICE9PSBudWxsKVxuICAgICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM0xleGVyO1xuIiwiLy8gKipOM1BhcnNlcioqIHBhcnNlcyBOMyBkb2N1bWVudHMuXG52YXIgTjNMZXhlciA9IHJlcXVpcmUoJy4vTjNMZXhlcicpO1xuXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfTklMICAgID0gUkRGX1BSRUZJWCArICduaWwnLFxuICAgIFJERl9GSVJTVCAgPSBSREZfUFJFRklYICsgJ2ZpcnN0JyxcbiAgICBSREZfUkVTVCAgID0gUkRGX1BSRUZJWCArICdyZXN0JztcblxudmFyIFFVQU5USUZJRVJTX0dSQVBIID0gJ3VybjpuMzpxdWFudGlmaWVycyc7XG5cbnZhciBhYnNvbHV0ZUlSSSA9IC9eW2Etel1bYS16MC05Ky4tXSo6L2ksXG4gICAgc2NoZW1lQXV0aG9yaXR5ID0gL14oPzooW2Etel1bYS16MC05Ky4tXSo6KSk/KD86XFwvXFwvW15cXC9dKik/L2ksXG4gICAgZG90U2VnbWVudHMgPSAvKD86XnxcXC8pXFwuXFwuPyg/OiR8W1xcLyM/XSkvO1xuXG4vLyBUaGUgbmV4dCBJRCBmb3IgbmV3IGJsYW5rIG5vZGVzXG52YXIgYmxhbmtOb2RlUHJlZml4ID0gMCwgYmxhbmtOb2RlQ291bnQgPSAwO1xuXG4vLyAjIyBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gTjNQYXJzZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNQYXJzZXIpKVxuICAgIHJldHVybiBuZXcgTjNQYXJzZXIob3B0aW9ucyk7XG4gIHRoaXMuX2NvbnRleHRTdGFjayA9IFtdO1xuICB0aGlzLl9ncmFwaCA9IG51bGw7XG5cbiAgLy8gU2V0IHRoZSBkb2N1bWVudCBJUklcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMuX3NldEJhc2Uob3B0aW9ucy5kb2N1bWVudElSSSk7XG5cbiAgLy8gU2V0IHN1cHBvcnRlZCBmZWF0dXJlcyBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdFxuICB2YXIgZm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3N0cmluZycpID9cbiAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0Lm1hdGNoKC9cXHcqJC8pWzBdLnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICAgIGlzVHVydGxlID0gZm9ybWF0ID09PSAndHVydGxlJywgaXNUcmlHID0gZm9ybWF0ID09PSAndHJpZycsXG4gICAgICBpc05UcmlwbGVzID0gL3RyaXBsZS8udGVzdChmb3JtYXQpLCBpc05RdWFkcyA9IC9xdWFkLy50ZXN0KGZvcm1hdCksXG4gICAgICBpc04zID0gdGhpcy5fbjNNb2RlID0gL24zLy50ZXN0KGZvcm1hdCksXG4gICAgICBpc0xpbmVNb2RlID0gaXNOVHJpcGxlcyB8fCBpc05RdWFkcztcbiAgaWYgKCEodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocyA9ICEoaXNUdXJ0bGUgfHwgaXNOMykpKVxuICAgIHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGggPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICB0aGlzLl9zdXBwb3J0c1F1YWRzID0gIShpc1R1cnRsZSB8fCBpc1RyaUcgfHwgaXNOVHJpcGxlcyB8fCBpc04zKTtcbiAgLy8gRGlzYWJsZSByZWxhdGl2ZSBJUklzIGluIE4tVHJpcGxlcyBvciBOLVF1YWRzIG1vZGVcbiAgaWYgKGlzTGluZU1vZGUpIHtcbiAgICB0aGlzLl9iYXNlID0gJyc7XG4gICAgdGhpcy5fcmVzb2x2ZUlSSSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgdGhpcy5fZXJyb3IoJ0Rpc2FsbG93ZWQgcmVsYXRpdmUgSVJJJywgdG9rZW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrID0gbm9vcCwgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgfTtcbiAgfVxuICB0aGlzLl9ibGFua05vZGVQcmVmaXggPSB0eXBlb2Ygb3B0aW9ucy5ibGFua05vZGVQcmVmaXggIT09ICdzdHJpbmcnID8gJycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfOicgKyBvcHRpb25zLmJsYW5rTm9kZVByZWZpeC5yZXBsYWNlKC9eXzovLCAnJyk7XG4gIHRoaXMuX2xleGVyID0gb3B0aW9ucy5sZXhlciB8fCBuZXcgTjNMZXhlcih7IGxpbmVNb2RlOiBpc0xpbmVNb2RlLCBuMzogaXNOMyB9KTtcbiAgLy8gRGlzYWJsZSBleHBsaWNpdCBxdWFudGlmaWVycyBieSBkZWZhdWx0XG4gIHRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMgPSAhIW9wdGlvbnMuZXhwbGljaXRRdWFudGlmaWVycztcbn1cblxuLy8gIyMgUHJpdmF0ZSBjbGFzcyBtZXRob2RzXG5cbi8vICMjIyBgX3Jlc2V0QmxhbmtOb2RlSWRzYCByZXN0YXJ0cyBibGFuayBub2RlIGlkZW50aWZpY2F0aW9uXG5OM1BhcnNlci5fcmVzZXRCbGFua05vZGVJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGJsYW5rTm9kZVByZWZpeCA9IGJsYW5rTm9kZUNvdW50ID0gMDtcbn07XG5cbk4zUGFyc2VyLnByb3RvdHlwZSA9IHtcbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfc2V0QmFzZWAgc2V0cyB0aGUgYmFzZSBJUkkgdG8gcmVzb2x2ZSByZWxhdGl2ZSBJUklzXG4gIF9zZXRCYXNlOiBmdW5jdGlvbiAoYmFzZUlSSSkge1xuICAgIGlmICghYmFzZUlSSSlcbiAgICAgIHRoaXMuX2Jhc2UgPSBudWxsO1xuICAgIGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIGZyYWdtZW50IGlmIHByZXNlbnRcbiAgICAgIHZhciBmcmFnbWVudFBvcyA9IGJhc2VJUkkuaW5kZXhPZignIycpO1xuICAgICAgaWYgKGZyYWdtZW50UG9zID49IDApXG4gICAgICAgIGJhc2VJUkkgPSBiYXNlSVJJLnN1YnN0cigwLCBmcmFnbWVudFBvcyk7XG4gICAgICAvLyBTZXQgYmFzZSBJUkkgYW5kIGl0cyBjb21wb25lbnRzXG4gICAgICB0aGlzLl9iYXNlID0gYmFzZUlSSTtcbiAgICAgIHRoaXMuX2Jhc2VQYXRoICAgPSBiYXNlSVJJLmluZGV4T2YoJy8nKSA8IDAgPyBiYXNlSVJJIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlSVJJLnJlcGxhY2UoL1teXFwvP10qKD86XFw/LiopPyQvLCAnJyk7XG4gICAgICBiYXNlSVJJID0gYmFzZUlSSS5tYXRjaChzY2hlbWVBdXRob3JpdHkpO1xuICAgICAgdGhpcy5fYmFzZVJvb3QgICA9IGJhc2VJUklbMF07XG4gICAgICB0aGlzLl9iYXNlU2NoZW1lID0gYmFzZUlSSVsxXTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfc2F2ZUNvbnRleHRgIHN0b3JlcyB0aGUgY3VycmVudCBwYXJzaW5nIGNvbnRleHRcbiAgLy8gd2hlbiBlbnRlcmluZyBhIG5ldyBzY29wZSAobGlzdCwgYmxhbmsgbm9kZSwgZm9ybXVsYSlcbiAgX3NhdmVDb250ZXh0OiBmdW5jdGlvbiAodHlwZSwgZ3JhcGgsIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIG4zTW9kZSA9IHRoaXMuX24zTW9kZTtcbiAgICB0aGlzLl9jb250ZXh0U3RhY2sucHVzaCh7XG4gICAgICBzdWJqZWN0OiBzdWJqZWN0LCBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QsXG4gICAgICBncmFwaDogZ3JhcGgsIHR5cGU6IHR5cGUsXG4gICAgICBpbnZlcnNlOiBuM01vZGUgPyB0aGlzLl9pbnZlcnNlUHJlZGljYXRlIDogZmFsc2UsXG4gICAgICBibGFua1ByZWZpeDogbjNNb2RlID8gdGhpcy5fcHJlZml4ZXMuXyA6ICcnLFxuICAgICAgcXVhbnRpZmllZDogbjNNb2RlID8gdGhpcy5fcXVhbnRpZmllZCA6IG51bGwsXG4gICAgfSk7XG4gICAgLy8gVGhlIHNldHRpbmdzIGJlbG93IG9ubHkgYXBwbHkgdG8gTjMgc3RyZWFtc1xuICAgIGlmIChuM01vZGUpIHtcbiAgICAgIC8vIEV2ZXJ5IG5ldyBzY29wZSByZXNldHMgdGhlIHByZWRpY2F0ZSBkaXJlY3Rpb25cbiAgICAgIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICAgIC8vIEluIE4zLCBibGFuayBub2RlcyBhcmUgc2NvcGVkIHRvIGEgZm9ybXVsYVxuICAgICAgLy8gKHVzaW5nIGEgZG90IGFzIHNlcGFyYXRvciwgYXMgYSBibGFuayBub2RlIGxhYmVsIGNhbm5vdCBzdGFydCB3aXRoIGl0KVxuICAgICAgdGhpcy5fcHJlZml4ZXMuXyA9IHRoaXMuX2dyYXBoICsgJy4nO1xuICAgICAgLy8gUXVhbnRpZmllcnMgYXJlIHNjb3BlZCB0byBhIGZvcm11bGFcbiAgICAgIHRoaXMuX3F1YW50aWZpZWQgPSBPYmplY3QuY3JlYXRlKHRoaXMuX3F1YW50aWZpZWQpO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZXN0b3JlQ29udGV4dGAgcmVzdG9yZXMgdGhlIHBhcmVudCBjb250ZXh0XG4gIC8vIHdoZW4gbGVhdmluZyBhIHNjb3BlIChsaXN0LCBibGFuayBub2RlLCBmb3JtdWxhKVxuICBfcmVzdG9yZUNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2NvbnRleHRTdGFjay5wb3AoKSwgbjNNb2RlID0gdGhpcy5fbjNNb2RlO1xuICAgIHRoaXMuX3N1YmplY3QgICA9IGNvbnRleHQuc3ViamVjdDtcbiAgICB0aGlzLl9wcmVkaWNhdGUgPSBjb250ZXh0LnByZWRpY2F0ZTtcbiAgICB0aGlzLl9vYmplY3QgICAgPSBjb250ZXh0Lm9iamVjdDtcbiAgICB0aGlzLl9ncmFwaCAgICAgPSBjb250ZXh0LmdyYXBoO1xuICAgIC8vIFRoZSBzZXR0aW5ncyBiZWxvdyBvbmx5IGFwcGx5IHRvIE4zIHN0cmVhbXNcbiAgICBpZiAobjNNb2RlKSB7XG4gICAgICB0aGlzLl9pbnZlcnNlUHJlZGljYXRlID0gY29udGV4dC5pbnZlcnNlO1xuICAgICAgdGhpcy5fcHJlZml4ZXMuXyA9IGNvbnRleHQuYmxhbmtQcmVmaXg7XG4gICAgICB0aGlzLl9xdWFudGlmaWVkID0gY29udGV4dC5xdWFudGlmaWVkO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkSW5Ub3BDb250ZXh0YCByZWFkcyBhIHRva2VuIHdoZW4gaW4gdGhlIHRvcCBjb250ZXh0XG4gIF9yZWFkSW5Ub3BDb250ZXh0OiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBJZiBhbiBFT0YgdG9rZW4gYXJyaXZlcyBpbiB0aGUgdG9wIGNvbnRleHQsIHNpZ25hbCB0aGF0IHdlJ3JlIGRvbmVcbiAgICBjYXNlICdlb2YnOlxuICAgICAgaWYgKHRoaXMuX2dyYXBoICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuY2xvc2VkIGdyYXBoJywgdG9rZW4pO1xuICAgICAgZGVsZXRlIHRoaXMuX3ByZWZpeGVzLl87XG4gICAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2sobnVsbCwgbnVsbCwgdGhpcy5fcHJlZml4ZXMpO1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgcHJlZml4IGRlY2xhcmF0aW9uXG4gICAgY2FzZSAnUFJFRklYJzpcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gdHJ1ZTtcbiAgICBjYXNlICdAcHJlZml4JzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4O1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgYmFzZSBkZWNsYXJhdGlvblxuICAgIGNhc2UgJ0JBU0UnOlxuICAgICAgdGhpcy5fc3BhcnFsU3R5bGUgPSB0cnVlO1xuICAgIGNhc2UgJ0BiYXNlJzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmFzZUlSSTtcbiAgICAvLyBJdCBjb3VsZCBiZSBhIGdyYXBoXG4gICAgY2FzZSAneyc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocykge1xuICAgICAgICB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgICAgfVxuICAgIGNhc2UgJ0dSQVBIJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c05hbWVkR3JhcGhzKVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhMYWJlbDtcbiAgICAvLyBPdGhlcndpc2UsIHRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBzdWJqZWN0XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdCh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRFbnRpdHlgIHJlYWRzIGFuIElSSSwgcHJlZml4ZWQgbmFtZSwgYmxhbmsgbm9kZSwgb3IgdmFyaWFibGVcbiAgX3JlYWRFbnRpdHk6IGZ1bmN0aW9uICh0b2tlbiwgcXVhbnRpZmllcikge1xuICAgIHZhciB2YWx1ZTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBSZWFkIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgSVJJXG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICd0eXBlSVJJJzpcbiAgICAgIHZhbHVlID0gKHRoaXMuX2Jhc2UgPT09IG51bGwgfHwgYWJzb2x1dGVJUkkudGVzdCh0b2tlbi52YWx1ZSkpID9cbiAgICAgICAgICAgICAgdG9rZW4udmFsdWUgOiB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFJlYWQgYSBibGFuayBub2RlIG9yIHByZWZpeGVkIG5hbWVcbiAgICBjYXNlICd0eXBlJzpcbiAgICBjYXNlICdibGFuayc6XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgdmFsdWUgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFJlYWQgYSB2YXJpYWJsZVxuICAgIGNhc2UgJ3Zhcic6XG4gICAgICByZXR1cm4gdG9rZW4udmFsdWU7XG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIG5vdCBhbiBlbnRpdHlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBlbnRpdHkgYnV0IGdvdCAnICsgdG9rZW4udHlwZSwgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBJbiBOMyBtb2RlLCByZXBsYWNlIHRoZSBlbnRpdHkgaWYgaXQgaXMgcXVhbnRpZmllZFxuICAgIGlmICghcXVhbnRpZmllciAmJiB0aGlzLl9uM01vZGUgJiYgKHZhbHVlIGluIHRoaXMuX3F1YW50aWZpZWQpKVxuICAgICAgdmFsdWUgPSB0aGlzLl9xdWFudGlmaWVkW3ZhbHVlXTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFN1YmplY3RgIHJlYWRzIGEgdHJpcGxlJ3Mgc3ViamVjdFxuICBfcmVhZFN1YmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFydCBhIG5ldyB0cmlwbGUgd2l0aCBhIG5ldyBibGFuayBub2RlIGFzIHN1YmplY3RcbiAgICAgIHRoaXMuX3NhdmVDb250ZXh0KCdibGFuaycsIHRoaXMuX2dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKywgbnVsbCwgbnVsbCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgY2FzZSAnKCc6XG4gICAgICAvLyBTdGFydCBhIG5ldyBsaXN0XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnbGlzdCcsIHRoaXMuX2dyYXBoLCBSREZfTklMLCBudWxsLCBudWxsKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICd7JzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGZvcm11bGFcbiAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnZm9ybXVsYScsIHRoaXMuX2dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JhcGggPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyssIG51bGwsIG51bGwpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgIGNhc2UgJ30nOlxuICAgICAgIC8vIE5vIHN1YmplY3Q7IHRoZSBncmFwaCBpbiB3aGljaCB3ZSBhcmUgcmVhZGluZyBpcyBjbG9zZWQgaW5zdGVhZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnQGZvclNvbWUnOlxuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL3JlaWZ5I2ZvclNvbWUnO1xuICAgICAgdGhpcy5fcXVhbnRpZmllZFByZWZpeCA9ICdfOmInO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICBjYXNlICdAZm9yQWxsJzpcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgdGhpcy5fcHJlZGljYXRlID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9yZWlmeSNmb3JBbGwnO1xuICAgICAgdGhpcy5fcXVhbnRpZmllZFByZWZpeCA9ICc/Yi0nO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUmVhZCB0aGUgc3ViamVjdCBlbnRpdHlcbiAgICAgIGlmICgodGhpcy5fc3ViamVjdCA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgICAvLyBJbiBOMyBtb2RlLCB0aGUgc3ViamVjdCBtaWdodCBiZSBhIHBhdGhcbiAgICAgIGlmICh0aGlzLl9uM01vZGUpXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQYXRoUmVhZGVyKHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBwcmVkaWNhdGUsXG4gICAgLy8gb3IsIGlmIHRoZSBzdWJqZWN0IHdhcyBhY3R1YWxseSBhIGdyYXBoIElSSSwgYSBuYW1lZCBncmFwaFxuICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVkaWNhdGVgIHJlYWRzIGEgdHJpcGxlJ3MgcHJlZGljYXRlXG4gIF9yZWFkUHJlZGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnaW52ZXJzZSc6XG4gICAgICB0aGlzLl9pbnZlcnNlUHJlZGljYXRlID0gdHJ1ZTtcbiAgICBjYXNlICdhYmJyZXZpYXRpb24nOlxuICAgICAgdGhpcy5fcHJlZGljYXRlID0gdG9rZW4udmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcuJzpcbiAgICBjYXNlICddJzpcbiAgICBjYXNlICd9JzpcbiAgICAgIC8vIEV4cGVjdGVkIHByZWRpY2F0ZSBkaWRuJ3QgY29tZSwgbXVzdCBoYXZlIGJlZW4gdHJhaWxpbmcgc2VtaWNvbG9uXG4gICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHR5cGUsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICddJyA/IHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKSA6IHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnOyc6XG4gICAgICAvLyBFeHRyYSBzZW1pY29sb25zIGNhbiBiZSBzYWZlbHkgaWdub3JlZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgaWYgKCF0aGlzLl9uM01vZGUpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRGlzYWxsb3dlZCBibGFuayBub2RlIGFzIHByZWRpY2F0ZScsIHRva2VuKTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKCh0aGlzLl9wcmVkaWNhdGUgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKSkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBtdXN0IGJlIGFuIG9iamVjdFxuICAgIHJldHVybiB0aGlzLl9yZWFkT2JqZWN0O1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRPYmplY3RgIHJlYWRzIGEgdHJpcGxlJ3Mgb2JqZWN0XG4gIF9yZWFkT2JqZWN0OiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdsaXRlcmFsJzpcbiAgICAgIHRoaXMuX29iamVjdCA9IHRva2VuLnZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWREYXRhVHlwZU9yTGFuZztcbiAgICBjYXNlICdbJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IHRyaXBsZSB3aXRoIGEgbmV3IGJsYW5rIG5vZGUgYXMgc3ViamVjdFxuICAgICAgdGhpcy5fc2F2ZUNvbnRleHQoJ2JsYW5rJywgdGhpcy5fZ3JhcGgsIHRoaXMuX3N1YmplY3QsIHRoaXMuX3ByZWRpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyspO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVIZWFkO1xuICAgIGNhc2UgJygnOlxuICAgICAgLy8gU3RhcnQgYSBuZXcgbGlzdFxuICAgICAgdGhpcy5fc2F2ZUNvbnRleHQoJ2xpc3QnLCB0aGlzLl9ncmFwaCwgdGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCBSREZfTklMKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICd7JzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGZvcm11bGFcbiAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnZm9ybXVsYScsIHRoaXMuX2dyYXBoLCB0aGlzLl9zdWJqZWN0LCB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncmFwaCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKyk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3Q7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFJlYWQgdGhlIG9iamVjdCBlbnRpdHlcbiAgICAgIGlmICgodGhpcy5fb2JqZWN0ID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbikpID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIEluIE4zIG1vZGUsIHRoZSBvYmplY3QgbWlnaHQgYmUgYSBwYXRoXG4gICAgICBpZiAodGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UGF0aFJlYWRlcih0aGlzLl9nZXRDb250ZXh0RW5kUmVhZGVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGhgIHJlYWRzIGEgdHJpcGxlJ3MgcHJlZGljYXRlLCBvciBhIG5hbWVkIGdyYXBoXG4gIF9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4udHlwZSA9PT0gJ3snID8gdGhpcy5fcmVhZEdyYXBoKHRva2VuKSA6IHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRHcmFwaGAgcmVhZHMgYSBncmFwaFxuICBfcmVhZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3snKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBncmFwaCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgLy8gVGhlIFwic3ViamVjdFwiIHdlIHJlYWQgaXMgYWN0dWFsbHkgdGhlIEdSQVBIJ3MgbGFiZWxcbiAgICB0aGlzLl9ncmFwaCA9IHRoaXMuX3N1YmplY3QsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlSGVhZGAgcmVhZHMgdGhlIGhlYWQgb2YgYSBibGFuayBub2RlXG4gIF9yZWFkQmxhbmtOb2RlSGVhZDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICddJykge1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZVRhaWwodG9rZW4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFByZWRpY2F0ZSh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRCbGFua05vZGVUYWlsYCByZWFkcyB0aGUgZW5kIG9mIGEgYmxhbmsgbm9kZVxuICBfcmVhZEJsYW5rTm9kZVRhaWw6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlICE9PSAnXScpXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uKHRva2VuKTtcblxuICAgIC8vIFN0b3JlIGJsYW5rIG5vZGUgdHJpcGxlXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcblxuICAgIC8vIFJlc3RvcmUgdGhlIHBhcmVudCBjb250ZXh0IGNvbnRhaW5pbmcgdGhpcyBibGFuayBub2RlXG4gICAgdmFyIGVtcHR5ID0gdGhpcy5fcHJlZGljYXRlID09PSBudWxsO1xuICAgIHRoaXMuX3Jlc3RvcmVDb250ZXh0KCk7XG4gICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIHRoZSBzdWJqZWN0LCBjb250aW51ZSByZWFkaW5nIHRoZSBwcmVkaWNhdGVcbiAgICBpZiAodGhpcy5fb2JqZWN0ID09PSBudWxsKVxuICAgICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIGVtcHR5LCBpdCBjb3VsZCBiZSBhIG5hbWVkIGdyYXBoIGxhYmVsXG4gICAgICByZXR1cm4gZW1wdHkgPyB0aGlzLl9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoIDogdGhpcy5fcmVhZFByZWRpY2F0ZUFmdGVyQmxhbms7XG4gICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIHRoZSBvYmplY3QsIHJlc3RvcmUgcHJldmlvdXMgY29udGV4dCBhbmQgcmVhZCBwdW5jdHVhdGlvblxuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDb250ZXh0RW5kUmVhZGVyKCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWRpY2F0ZUFmdGVyQmxhbmtgIHJlYWRzIGEgcHJlZGljYXRlIGFmdGVyIGFuIGFub255bW91cyBibGFuayBub2RlXG4gIF9yZWFkUHJlZGljYXRlQWZ0ZXJCbGFuazogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgLy8gSWYgYSBkb3QgZm9sbG93cyBhIGJsYW5rIG5vZGUgaW4gdG9wIGNvbnRleHQsIHRoZXJlIGlzIG5vIHByZWRpY2F0ZVxuICAgIGlmICh0b2tlbi50eXBlID09PSAnLicgJiYgIXRoaXMuX2NvbnRleHRTdGFjay5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsOyAvLyBjYW5jZWwgdGhlIGN1cnJlbnQgdHJpcGxlXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFB1bmN0dWF0aW9uKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRMaXN0SXRlbWAgcmVhZHMgaXRlbXMgZnJvbSBhIGxpc3RcbiAgX3JlYWRMaXN0SXRlbTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGl0ZW0gPSBudWxsLCAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaXRlbSBvZiB0aGUgbGlzdFxuICAgICAgICBsaXN0ID0gbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3QgaXRzZWxmXG4gICAgICAgIHByZXZMaXN0ID0gdGhpcy5fc3ViamVjdCwgICAgICAgICAvLyBUaGUgcHJldmlvdXMgbGlzdCB0aGF0IGNvbnRhaW5zIHRoaXMgbGlzdFxuICAgICAgICBzdGFjayA9IHRoaXMuX2NvbnRleHRTdGFjaywgICAgICAgLy8gVGhlIHN0YWNrIG9mIHBhcmVudCBjb250ZXh0c1xuICAgICAgICBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSwgLy8gVGhlIHBhcmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3RcbiAgICAgICAgbmV4dCA9IHRoaXMuX3JlYWRMaXN0SXRlbSwgICAgICAgIC8vIFRoZSBuZXh0IGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICAgICAgaXRlbUNvbXBsZXRlID0gdHJ1ZTsgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIGl0ZW0gaGFzIGJlZW4gcmVhZCBmdWxseVxuXG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFjayB0aGUgY3VycmVudCBsaXN0IHRyaXBsZSBhbmQgc3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBibGFuayBub2RlIGFzIHN1YmplY3RcbiAgICAgIHRoaXMuX3NhdmVDb250ZXh0KCdibGFuaycsIHRoaXMuX2dyYXBoLCBsaXN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgUkRGX0ZJUlNULCB0aGlzLl9zdWJqZWN0ID0gaXRlbSA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKyk7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YWNrIHRoZSBjdXJyZW50IGxpc3QgdHJpcGxlIGFuZCBzdGFydCBhIG5ldyBsaXN0XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnbGlzdCcsIHRoaXMuX2dyYXBoLCBsaXN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgUkRGX0ZJUlNULCBSREZfTklMKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnKSc6XG4gICAgICAvLyBDbG9zaW5nIHRoZSBsaXN0OyByZXN0b3JlIHRoZSBwYXJlbnQgY29udGV4dFxuICAgICAgdGhpcy5fcmVzdG9yZUNvbnRleHQoKTtcbiAgICAgIC8vIElmIHRoaXMgbGlzdCBpcyBjb250YWluZWQgd2l0aGluIGEgcGFyZW50IGxpc3QsIHJldHVybiB0aGUgbWVtYmVyc2hpcCB0cmlwbGUgaGVyZS5cbiAgICAgIC8vIFRoaXMgd2lsbCBiZSBgPHBhcmVudCBsaXN0IGVsZW1lbnQ+IHJkZjpmaXJzdCA8dGhpcyBsaXN0Pi5gLlxuICAgICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gMCAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXS50eXBlID09PSAnbGlzdCcpXG4gICAgICAgIHRoaXMuX3RyaXBsZSh0aGlzLl9zdWJqZWN0LCB0aGlzLl9wcmVkaWNhdGUsIHRoaXMuX29iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgICAgLy8gV2FzIHRoaXMgbGlzdCB0aGUgcGFyZW50J3Mgc3ViamVjdD9cbiAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgdGhlIHByZWRpY2F0ZVxuICAgICAgICBuZXh0ID0gdGhpcy5fcmVhZFByZWRpY2F0ZTtcbiAgICAgICAgLy8gTm8gbGlzdCB0YWlsIGlmIHRoaXMgd2FzIGFuIGVtcHR5IGxpc3RcbiAgICAgICAgaWYgKHRoaXMuX3N1YmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBUaGUgbGlzdCB3YXMgaW4gdGhlIHBhcmVudCBjb250ZXh0J3Mgb2JqZWN0XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV4dCA9IHRoaXMuX2dldENvbnRleHRFbmRSZWFkZXIoKTtcbiAgICAgICAgLy8gTm8gbGlzdCB0YWlsIGlmIHRoaXMgd2FzIGFuIGVtcHR5IGxpc3RcbiAgICAgICAgaWYgKHRoaXMuX29iamVjdCA9PT0gUkRGX05JTClcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH1cbiAgICAgIC8vIENsb3NlIHRoZSBsaXN0IGJ5IG1ha2luZyB0aGUgaGVhZCBuaWxcbiAgICAgIGxpc3QgPSBSREZfTklMO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGl0ZXJhbCc6XG4gICAgICBpdGVtID0gdG9rZW4udmFsdWU7XG4gICAgICBpdGVtQ29tcGxldGUgPSBmYWxzZTsgLy8gQ2FuIHN0aWxsIGhhdmUgYSBkYXRhdHlwZSBvciBsYW5ndWFnZVxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRMaXN0SXRlbURhdGFUeXBlT3JMYW5nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICgoaXRlbSA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgIC8vIENyZWF0ZSBhIG5ldyBibGFuayBub2RlIGlmIG5vIGl0ZW0gaGVhZCB3YXMgYXNzaWduZWQgeWV0XG4gICAgaWYgKGxpc3QgPT09IG51bGwpXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbGlzdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcblxuICAgIC8vIElzIHRoaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Q/XG4gICAgaWYgKHByZXZMaXN0ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGxpc3QgaXMgZWl0aGVyIHRoZSBzdWJqZWN0IG9yIHRoZSBvYmplY3Qgb2YgaXRzIHBhcmVudFxuICAgICAgaWYgKHBhcmVudC5wcmVkaWNhdGUgPT09IG51bGwpXG4gICAgICAgIHBhcmVudC5zdWJqZWN0ID0gbGlzdDtcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyZW50Lm9iamVjdCA9IGxpc3Q7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gQ29udGludWUgdGhlIHByZXZpb3VzIGxpc3Qgd2l0aCB0aGUgY3VycmVudCBsaXN0XG4gICAgICB0aGlzLl90cmlwbGUocHJldkxpc3QsIFJERl9SRVNULCBsaXN0LCB0aGlzLl9ncmFwaCk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgaXRlbSdzIHZhbHVlXG4gICAgaWYgKGl0ZW0gIT09IG51bGwpIHtcbiAgICAgIC8vIEluIE4zIG1vZGUsIHRoZSBpdGVtIG1pZ2h0IGJlIGEgcGF0aFxuICAgICAgaWYgKHRoaXMuX24zTW9kZSAmJiAodG9rZW4udHlwZSA9PT0gJ0lSSScgfHwgdG9rZW4udHlwZSA9PT0gJ3ByZWZpeGVkJykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRleHQgdG8gYWRkIHRoZSBpdGVtJ3MgcGF0aFxuICAgICAgICB0aGlzLl9zYXZlQ29udGV4dCgnaXRlbScsIHRoaXMuX2dyYXBoLCBsaXN0LCBSREZfRklSU1QsIGl0ZW0pO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gaXRlbSwgdGhpcy5fcHJlZGljYXRlID0gbnVsbDtcbiAgICAgICAgLy8gX3JlYWRQYXRoIHdpbGwgcmVzdG9yZSB0aGUgY29udGV4dCBhbmQgb3V0cHV0IHRoZSBpdGVtXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQYXRoUmVhZGVyKHRoaXMuX3JlYWRMaXN0SXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBPdXRwdXQgdGhlIGl0ZW0gaWYgaXQgaXMgY29tcGxldGVcbiAgICAgIGlmIChpdGVtQ29tcGxldGUpXG4gICAgICAgIHRoaXMuX3RyaXBsZShsaXN0LCBSREZfRklSU1QsIGl0ZW0sIHRoaXMuX2dyYXBoKTtcbiAgICAgIC8vIE90aGVyd2lzZSwgc2F2ZSBpdCBmb3IgY29tcGxldGlvblxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl9vYmplY3QgPSBpdGVtO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGF0YVR5cGVPckxhbmdgIHJlYWRzIGFuIF9vcHRpb25hbF8gZGF0YSB0eXBlIG9yIGxhbmd1YWdlXG4gIF9yZWFkRGF0YVR5cGVPckxhbmc6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZUxpdGVyYWwodG9rZW4sIGZhbHNlKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTGlzdEl0ZW1EYXRhVHlwZU9yTGFuZ2AgcmVhZHMgYW4gX29wdGlvbmFsXyBkYXRhIHR5cGUgb3IgbGFuZ3VhZ2UgaW4gYSBsaXN0XG4gIF9yZWFkTGlzdEl0ZW1EYXRhVHlwZU9yTGFuZzogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBsZXRlTGl0ZXJhbCh0b2tlbiwgdHJ1ZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfY29tcGxldGVMaXRlcmFsYCBjb21wbGV0ZXMgdGhlIG9iamVjdCB3aXRoIGEgZGF0YSB0eXBlIG9yIGxhbmd1YWdlXG4gIF9jb21wbGV0ZUxpdGVyYWw6IGZ1bmN0aW9uICh0b2tlbiwgbGlzdEl0ZW0pIHtcbiAgICB2YXIgc3VmZml4ID0gZmFsc2U7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gQWRkIGEgXCJeXnR5cGVcIiBzdWZmaXggZm9yIHR5cGVzIChJUklzIGFuZCBibGFuayBub2RlcylcbiAgICBjYXNlICd0eXBlJzpcbiAgICBjYXNlICd0eXBlSVJJJzpcbiAgICAgIHN1ZmZpeCA9IHRydWU7XG4gICAgICB0aGlzLl9vYmplY3QgKz0gJ15eJyArIHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQWRkIGFuIFwiQGxhbmdcIiBzdWZmaXggZm9yIGxhbmd1YWdlIHRhZ3NcbiAgICBjYXNlICdsYW5nY29kZSc6XG4gICAgICBzdWZmaXggPSB0cnVlO1xuICAgICAgdGhpcy5fb2JqZWN0ICs9ICdAJyArIHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBsaXRlcmFsIHdhcyBwYXJ0IG9mIGEgbGlzdCwgd3JpdGUgdGhlIGl0ZW1cbiAgICAvLyAod2UgY291bGQgYWxzbyBjaGVjayB0aGUgY29udGV4dCBzdGFjaywgYnV0IHBhc3NpbmcgaW4gYSBmbGFnIGlzIGZhc3RlcilcbiAgICBpZiAobGlzdEl0ZW0pXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcbiAgICAvLyBDb250aW51ZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBpbnB1dFxuICAgIGlmIChzdWZmaXgpXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRDYWxsYmFjayh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRGb3JtdWxhVGFpbGAgcmVhZHMgdGhlIGVuZCBvZiBhIGZvcm11bGFcbiAgX3JlYWRGb3JtdWxhVGFpbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICd9JylcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHVuY3R1YXRpb24odG9rZW4pO1xuXG4gICAgLy8gU3RvcmUgdGhlIGxhc3QgdHJpcGxlIG9mIHRoZSBmb3JtdWxhXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcblxuICAgIC8vIFJlc3RvcmUgdGhlIHBhcmVudCBjb250ZXh0IGNvbnRhaW5pbmcgdGhpcyBmb3JtdWxhXG4gICAgdGhpcy5fcmVzdG9yZUNvbnRleHQoKTtcbiAgICAvLyBJZiB0aGUgZm9ybXVsYSB3YXMgdGhlIHN1YmplY3QsIGNvbnRpbnVlIHJlYWRpbmcgdGhlIHByZWRpY2F0ZS5cbiAgICAvLyBJZiB0aGUgZm9ybXVsYSB3YXMgdGhlIG9iamVjdCwgcmVhZCBwdW5jdHVhdGlvbi5cbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0ID09PSBudWxsID8gdGhpcy5fcmVhZFByZWRpY2F0ZSA6IHRoaXMuX2dldENvbnRleHRFbmRSZWFkZXIoKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHVuY3R1YXRpb25gIHJlYWRzIHB1bmN0dWF0aW9uIGJldHdlZW4gdHJpcGxlcyBvciB0cmlwbGUgcGFydHNcbiAgX3JlYWRQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQsIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCBncmFwaCA9IHRoaXMuX2dyYXBoLFxuICAgICAgICBpbnZlcnNlUHJlZGljYXRlID0gdGhpcy5faW52ZXJzZVByZWRpY2F0ZTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBBIGNsb3NpbmcgYnJhY2UgZW5kcyBhIGdyYXBoXG4gICAgY2FzZSAnfSc6XG4gICAgICBpZiAodGhpcy5fZ3JhcGggPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5leHBlY3RlZCBncmFwaCBjbG9zaW5nJywgdG9rZW4pO1xuICAgICAgaWYgKHRoaXMuX24zTW9kZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRGb3JtdWxhVGFpbCh0b2tlbik7XG4gICAgICB0aGlzLl9ncmFwaCA9IG51bGw7XG4gICAgLy8gQSBkb3QganVzdCBlbmRzIHRoZSBzdGF0ZW1lbnQsIHdpdGhvdXQgc2hhcmluZyBhbnl0aGluZyB3aXRoIHRoZSBuZXh0XG4gICAgY2FzZSAnLic6XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgIG5leHQgPSB0aGlzLl9jb250ZXh0U3RhY2subGVuZ3RoID8gdGhpcy5fcmVhZFN1YmplY3QgOiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICAgICAgaWYgKGludmVyc2VQcmVkaWNhdGUpIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFNlbWljb2xvbiBtZWFucyB0aGUgc3ViamVjdCBpcyBzaGFyZWQ7IHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFyZSBkaWZmZXJlbnRcbiAgICBjYXNlICc7JzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ29tbWEgbWVhbnMgYm90aCB0aGUgc3ViamVjdCBhbmQgcHJlZGljYXRlIGFyZSBzaGFyZWQ7IHRoZSBvYmplY3QgaXMgZGlmZmVyZW50XG4gICAgY2FzZSAnLCc6XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZE9iamVjdDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbiBlbnRpdHkgbWVhbnMgdGhpcyBpcyBhIHF1YWQgKG9ubHkgYWxsb3dlZCBpZiBub3QgYWxyZWFkeSBpbnNpZGUgYSBncmFwaClcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c1F1YWRzICYmIHRoaXMuX2dyYXBoID09PSBudWxsICYmIChncmFwaCA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHVuY3R1YXRpb24gdG8gZm9sbG93IFwiJyArIHRoaXMuX29iamVjdCArICdcIicsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gQSB0cmlwbGUgaGFzIGJlZW4gY29tcGxldGVkIG5vdywgc28gcmV0dXJuIGl0XG4gICAgaWYgKHN1YmplY3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9wcmVkaWNhdGUsIG9iamVjdCA9IHRoaXMuX29iamVjdDtcbiAgICAgIGlmICghaW52ZXJzZVByZWRpY2F0ZSlcbiAgICAgICAgdGhpcy5fdHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCAgZ3JhcGgpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl90cmlwbGUob2JqZWN0LCAgcHJlZGljYXRlLCBzdWJqZWN0LCBncmFwaCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gICAgLy8gIyMjIGBfcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBpbiBhIGJsYW5rIG5vZGVcbiAgX3JlYWRCbGFua05vZGVQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQ7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gU2VtaWNvbG9uIG1lYW5zIHRoZSBzdWJqZWN0IGlzIHNoYXJlZDsgcHJlZGljYXRlIGFuZCBvYmplY3QgYXJlIGRpZmZlcmVudFxuICAgIGNhc2UgJzsnOlxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgICBicmVhaztcbiAgICAvLyBDb21tYSBtZWFucyBib3RoIHRoZSBzdWJqZWN0IGFuZCBwcmVkaWNhdGUgYXJlIHNoYXJlZDsgdGhlIG9iamVjdCBpcyBkaWZmZXJlbnRcbiAgICBjYXNlICcsJzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkT2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHVuY3R1YXRpb24gdG8gZm9sbG93IFwiJyArIHRoaXMuX29iamVjdCArICdcIicsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gQSB0cmlwbGUgaGFzIGJlZW4gY29tcGxldGVkIG5vdywgc28gcmV0dXJuIGl0XG4gICAgdGhpcy5fdHJpcGxlKHRoaXMuX3N1YmplY3QsIHRoaXMuX3ByZWRpY2F0ZSwgdGhpcy5fb2JqZWN0LCB0aGlzLl9ncmFwaCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFF1YWRQdW5jdHVhdGlvbmAgcmVhZHMgcHVuY3R1YXRpb24gYWZ0ZXIgYSBxdWFkXG4gIF9yZWFkUXVhZFB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJy4nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBkb3QgdG8gZm9sbG93IHF1YWQnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeGAgcmVhZHMgdGhlIHByZWZpeCBvZiBhIHByZWZpeCBkZWNsYXJhdGlvblxuICBfcmVhZFByZWZpeDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdwcmVmaXgnKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwcmVmaXggdG8gZm9sbG93IEBwcmVmaXgnLCB0b2tlbik7XG4gICAgdGhpcy5fcHJlZml4ID0gdG9rZW4udmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVmaXhJUkk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeElSSWAgcmVhZHMgdGhlIElSSSBvZiBhIHByZWZpeCBkZWNsYXJhdGlvblxuICBfcmVhZFByZWZpeElSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IHByZWZpeCBcIicgKyB0aGlzLl9wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgIHZhciBwcmVmaXhJUkkgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKTtcbiAgICB0aGlzLl9wcmVmaXhlc1t0aGlzLl9wcmVmaXhdID0gcHJlZml4SVJJO1xuICAgIHRoaXMuX3ByZWZpeENhbGxiYWNrKHRoaXMuX3ByZWZpeCwgcHJlZml4SVJJKTtcbiAgICByZXR1cm4gdGhpcy5fcmVhZERlY2xhcmF0aW9uUHVuY3R1YXRpb247XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEJhc2VJUklgIHJlYWRzIHRoZSBJUkkgb2YgYSBiYXNlIGRlY2xhcmF0aW9uXG4gIF9yZWFkQmFzZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IGJhc2UgZGVjbGFyYXRpb24nLCB0b2tlbik7XG4gICAgdGhpcy5fc2V0QmFzZSh0aGlzLl9iYXNlID09PSBudWxsIHx8IGFic29sdXRlSVJJLnRlc3QodG9rZW4udmFsdWUpID9cbiAgICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlIDogdGhpcy5fcmVzb2x2ZUlSSSh0b2tlbikpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTmFtZWRHcmFwaExhYmVsYCByZWFkcyB0aGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaFxuICBfcmVhZE5hbWVkR3JhcGhMYWJlbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICdibGFuayc6XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0KHRva2VuKSwgdGhpcy5fcmVhZEdyYXBoO1xuICAgIGNhc2UgJ1snOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWROYW1lZEdyYXBoQmxhbmtMYWJlbDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTmFtZWRHcmFwaExhYmVsYCByZWFkcyBhIGJsYW5rIG5vZGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaFxuICBfcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ10nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbmAgcmVhZHMgdGhlIHB1bmN0dWF0aW9uIG9mIGEgZGVjbGFyYXRpb25cbiAgX3JlYWREZWNsYXJhdGlvblB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAvLyBTUEFSUUwtc3R5bGUgZGVjbGFyYXRpb25zIGRvbid0IGhhdmUgcHVuY3R1YXRpb25cbiAgICBpZiAodGhpcy5fc3BhcnFsU3R5bGUpIHtcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEluVG9wQ29udGV4dCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICcuJylcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgZGVjbGFyYXRpb24gdG8gZW5kIHdpdGggYSBkb3QnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gUmVhZHMgYSBsaXN0IG9mIHF1YW50aWZpZWQgc3ltYm9scyBmcm9tIGEgQGZvclNvbWUgb3IgQGZvckFsbCBzdGF0ZW1lbnRcbiAgX3JlYWRRdWFudGlmaWVyTGlzdDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGVudGl0eTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIGlmICgoZW50aXR5ID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbiwgdHJ1ZSkpICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHRva2VuLnR5cGUsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBleHBsaWNpdCBxdWFudGlmaWVycywgbWFwIGVudGl0aWVzIHRvIGEgcXVhbnRpZmllZCBlbnRpdHlcbiAgICBpZiAoIXRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMpXG4gICAgICB0aGlzLl9xdWFudGlmaWVkW2VudGl0eV0gPSB0aGlzLl9xdWFudGlmaWVkUHJlZml4ICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAvLyBXaXRoIGV4cGxpY2l0IHF1YW50aWZpZXJzLCBvdXRwdXQgdGhlIHJlaWZpZWQgcXVhbnRpZmllclxuICAgIGVsc2Uge1xuICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaXRlbSwgc3RhcnQgYSBuZXcgcXVhbnRpZmllciBsaXN0XG4gICAgICBpZiAodGhpcy5fc3ViamVjdCA9PT0gbnVsbClcbiAgICAgICAgdGhpcy5fdHJpcGxlKHRoaXMuX2dyYXBoIHx8ICcnLCB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLCBRVUFOVElGSUVSU19HUkFQSCk7XG4gICAgICAvLyBPdGhlcndpc2UsIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3RyaXBsZSh0aGlzLl9zdWJqZWN0LCBSREZfUkVTVCxcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyssIFFVQU5USUZJRVJTX0dSQVBIKTtcbiAgICAgIC8vIE91dHB1dCB0aGUgbGlzdCBpdGVtXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCBlbnRpdHksIFFVQU5USUZJRVJTX0dSQVBIKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyUHVuY3R1YXRpb247XG4gIH0sXG5cbiAgLy8gUmVhZHMgcHVuY3R1YXRpb24gZnJvbSBhIEBmb3JTb21lIG9yIEBmb3JBbGwgc3RhdGVtZW50XG4gIF9yZWFkUXVhbnRpZmllclB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAvLyBSZWFkIG1vcmUgcXVhbnRpZmllcnNcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJywnKVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICAvLyBFbmQgb2YgdGhlIHF1YW50aWZpZXIgbGlzdFxuICAgIGVsc2Uge1xuICAgICAgLy8gV2l0aCBleHBsaWNpdCBxdWFudGlmaWVycywgY2xvc2UgdGhlIHF1YW50aWZpZXIgbGlzdFxuICAgICAgaWYgKHRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMpIHtcbiAgICAgICAgdGhpcy5fdHJpcGxlKHRoaXMuX3N1YmplY3QsIFJERl9SRVNULCBSREZfTklMLCBRVUFOVElGSUVSU19HUkFQSCk7XG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gUmVhZCBhIGRvdFxuICAgICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRDYWxsYmFjayh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX2dldFBhdGhSZWFkZXJgIHJlYWRzIGEgcG90ZW50aWFsIHBhdGggYW5kIHRoZW4gcmVzdW1lcyB3aXRoIHRoZSBnaXZlbiBmdW5jdGlvblxuICBfZ2V0UGF0aFJlYWRlcjogZnVuY3Rpb24gKGFmdGVyUGF0aCkge1xuICAgIHRoaXMuX2FmdGVyUGF0aCA9IGFmdGVyUGF0aDtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFBhdGg7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFBhdGhgIHJlYWRzIGEgcG90ZW50aWFsIHBhdGhcbiAgX3JlYWRQYXRoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBGb3J3YXJkIHBhdGhcbiAgICBjYXNlICchJzogcmV0dXJuIHRoaXMuX3JlYWRGb3J3YXJkUGF0aDtcbiAgICAvLyBCYWNrd2FyZCBwYXRoXG4gICAgY2FzZSAnXic6IHJldHVybiB0aGlzLl9yZWFkQmFja3dhcmRQYXRoO1xuICAgIC8vIE5vdCBhIHBhdGg7IHJlc3VtZSByZWFkaW5nIHdoZXJlIHdlIGxlZnQgb2ZmXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBzdGFjayA9IHRoaXMuX2NvbnRleHRTdGFjaywgcGFyZW50ID0gc3RhY2subGVuZ3RoICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGEgbGlzdCBpdGVtLCB3ZSBzdGlsbCBuZWVkIHRvIG91dHB1dCBpdFxuICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gJ2l0ZW0nKSB7XG4gICAgICAgIC8vIFRoZSBsaXN0IGl0ZW0gaXMgdGhlIHJlbWFpbmluZyBzdWJlamN0IGFmdGVyIHJlYWRpbmcgdGhlIHBhdGhcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9zdWJqZWN0O1xuICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgY29udGV4dCBvZiB0aGUgbGlzdFxuICAgICAgICB0aGlzLl9yZXN0b3JlQ29udGV4dCgpO1xuICAgICAgICAvLyBPdXRwdXQgdGhlIGxpc3QgaXRlbVxuICAgICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCBpdGVtLCB0aGlzLl9ncmFwaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJQYXRoKHRva2VuKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEZvcndhcmRQYXRoYCByZWFkcyBhICchJyBwYXRoXG4gIF9yZWFkRm9yd2FyZFBhdGg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBpcyB0aGUgcHJlZGljYXRlXG4gICAgaWYgKChwcmVkaWNhdGUgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKSkgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybjtcbiAgICAvLyBJZiB3ZSB3ZXJlIHJlYWRpbmcgYSBzdWJqZWN0LCByZXBsYWNlIHRoZSBzdWJqZWN0IGJ5IHRoZSBwYXRoJ3Mgb2JqZWN0XG4gICAgaWYgKHRoaXMuX3ByZWRpY2F0ZSA9PT0gbnVsbClcbiAgICAgIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCB0aGlzLl9zdWJqZWN0ID0gb2JqZWN0O1xuICAgIC8vIElmIHdlIHdlcmUgcmVhZGluZyBhbiBvYmplY3QsIHJlcGxhY2UgdGhlIHN1YmplY3QgYnkgdGhlIHBhdGgncyBvYmplY3RcbiAgICBlbHNlXG4gICAgICBzdWJqZWN0ID0gdGhpcy5fb2JqZWN0LCAgdGhpcy5fb2JqZWN0ICA9IG9iamVjdDtcbiAgICAvLyBFbWl0IHRoZSBwYXRoJ3MgY3VycmVudCB0cmlwbGUgYW5kIHJlYWQgaXRzIG5leHQgc2VjdGlvblxuICAgIHRoaXMuX3RyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUGF0aDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmFja3dhcmRQYXRoYCByZWFkcyBhICdeJyBwYXRoXG4gIF9yZWFkQmFja3dhcmRQYXRoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKywgcHJlZGljYXRlLCBvYmplY3Q7XG4gICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgdGhlIHByZWRpY2F0ZVxuICAgIGlmICgocHJlZGljYXRlID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbikpID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm47XG4gICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGEgc3ViamVjdCwgcmVwbGFjZSB0aGUgc3ViamVjdCBieSB0aGUgcGF0aCdzIHN1YmplY3RcbiAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgb2JqZWN0ID0gdGhpcy5fc3ViamVjdCwgdGhpcy5fc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGFuIG9iamVjdCwgcmVwbGFjZSB0aGUgc3ViamVjdCBieSB0aGUgcGF0aCdzIHN1YmplY3RcbiAgICBlbHNlXG4gICAgICBvYmplY3QgPSB0aGlzLl9vYmplY3QsICB0aGlzLl9vYmplY3QgID0gc3ViamVjdDtcbiAgICAvLyBFbWl0IHRoZSBwYXRoJ3MgY3VycmVudCB0cmlwbGUgYW5kIHJlYWQgaXRzIG5leHQgc2VjdGlvblxuICAgIHRoaXMuX3RyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUGF0aDtcbiAgfSxcblxuICAvLyAjIyMgYF9nZXRDb250ZXh0RW5kUmVhZGVyYCBnZXRzIHRoZSBuZXh0IHJlYWRlciBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIGEgY29udGV4dFxuICBfZ2V0Q29udGV4dEVuZFJlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250ZXh0U3RhY2sgPSB0aGlzLl9jb250ZXh0U3RhY2s7XG4gICAgaWYgKCFjb250ZXh0U3RhY2subGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbjtcblxuICAgIHN3aXRjaCAoY29udGV4dFN0YWNrW2NvbnRleHRTdGFjay5sZW5ndGggLSAxXS50eXBlKSB7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsO1xuICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICdmb3JtdWxhJzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkRm9ybXVsYVRhaWw7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3RyaXBsZWAgZW1pdHMgYSB0cmlwbGUgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgX3RyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsXG4gICAgICB7IHN1YmplY3Q6IHN1YmplY3QsIHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCwgZ3JhcGg6IGdyYXBoIHx8ICcnIH0pO1xuICB9LFxuXG4gIC8vICMjIyBgX2Vycm9yYCBlbWl0cyBhbiBlcnJvciBtZXNzYWdlIHRocm91Z2ggdGhlIGNhbGxiYWNrXG4gIF9lcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sobmV3IEVycm9yKG1lc3NhZ2UgKyAnIG9uIGxpbmUgJyArIHRva2VuLmxpbmUgKyAnLicpKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZXNvbHZlSVJJYCByZXNvbHZlcyBhIHJlbGF0aXZlIElSSSB0b2tlbiBhZ2FpbnN0IHRoZSBiYXNlIHBhdGgsXG4gIC8vIGFzc3VtaW5nIHRoYXQgYSBiYXNlIHBhdGggaGFzIGJlZW4gc2V0IGFuZCB0aGF0IHRoZSBJUkkgaXMgaW5kZWVkIHJlbGF0aXZlXG4gIF9yZXNvbHZlSVJJOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgaXJpID0gdG9rZW4udmFsdWU7XG4gICAgc3dpdGNoIChpcmlbMF0pIHtcbiAgICAvLyBBbiBlbXB0eSByZWxhdGl2ZSBJUkkgaW5kaWNhdGVzIHRoZSBiYXNlIElSSVxuICAgIGNhc2UgdW5kZWZpbmVkOiByZXR1cm4gdGhpcy5fYmFzZTtcbiAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIGZyYWdtZW50IElSSXMgYWdhaW5zdCB0aGUgYmFzZSBJUklcbiAgICBjYXNlICcjJzogcmV0dXJuIHRoaXMuX2Jhc2UgKyBpcmk7XG4gICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBxdWVyeSBzdHJpbmcgSVJJcyBieSByZXBsYWNpbmcgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIGNhc2UgJz8nOiByZXR1cm4gdGhpcy5fYmFzZS5yZXBsYWNlKC8oPzpcXD8uKik/JC8sIGlyaSk7XG4gICAgLy8gUmVzb2x2ZSByb290LXJlbGF0aXZlIElSSXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGJhc2UgSVJJXG4gICAgY2FzZSAnLyc6XG4gICAgICAvLyBSZXNvbHZlIHNjaGVtZS1yZWxhdGl2ZSBJUklzIHRvIHRoZSBzY2hlbWVcbiAgICAgIHJldHVybiAoaXJpWzFdID09PSAnLycgPyB0aGlzLl9iYXNlU2NoZW1lIDogdGhpcy5fYmFzZVJvb3QpICsgdGhpcy5fcmVtb3ZlRG90U2VnbWVudHMoaXJpKTtcbiAgICAvLyBSZXNvbHZlIGFsbCBvdGhlciBJUklzIGF0IHRoZSBiYXNlIElSSSdzIHBhdGhcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX3JlbW92ZURvdFNlZ21lbnRzKHRoaXMuX2Jhc2VQYXRoICsgaXJpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRG90U2VnbWVudHNgIHJlc29sdmVzICcuLycgYW5kICcuLi8nIHBhdGggc2VnbWVudHMgaW4gYW4gSVJJIGFzIHBlciBSRkMzOTg2XG4gIF9yZW1vdmVEb3RTZWdtZW50czogZnVuY3Rpb24gKGlyaSkge1xuICAgIC8vIERvbid0IG1vZGlmeSB0aGUgSVJJIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGRvdCBzZWdtZW50c1xuICAgIGlmICghZG90U2VnbWVudHMudGVzdChpcmkpKVxuICAgICAgcmV0dXJuIGlyaTtcblxuICAgIC8vIFN0YXJ0IHdpdGggYW4gaW1hZ2luYXJ5IHNsYXNoIGJlZm9yZSB0aGUgSVJJIGluIG9yZGVyIHRvIHJlc29sdmUgdHJhaWxpbmcgJy4vJyBhbmQgJy4uLydcbiAgICB2YXIgcmVzdWx0ID0gJycsIGxlbmd0aCA9IGlyaS5sZW5ndGgsIGkgPSAtMSwgcGF0aFN0YXJ0ID0gLTEsIHNlZ21lbnRTdGFydCA9IDAsIG5leHQgPSAnLyc7XG5cbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAvLyBUaGUgcGF0aCBzdGFydHMgd2l0aCB0aGUgZmlyc3Qgc2xhc2ggYWZ0ZXIgdGhlIGF1dGhvcml0eVxuICAgICAgY2FzZSAnOic6XG4gICAgICAgIGlmIChwYXRoU3RhcnQgPCAwKSB7XG4gICAgICAgICAgLy8gU2tpcCB0d28gc2xhc2hlcyBiZWZvcmUgdGhlIGF1dGhvcml0eVxuICAgICAgICAgIGlmIChpcmlbKytpXSA9PT0gJy8nICYmIGlyaVsrK2ldID09PSAnLycpXG4gICAgICAgICAgICAvLyBTa2lwIHRvIHNsYXNoIGFmdGVyIHRoZSBhdXRob3JpdHlcbiAgICAgICAgICAgIHdoaWxlICgocGF0aFN0YXJ0ID0gaSArIDEpIDwgbGVuZ3RoICYmIGlyaVtwYXRoU3RhcnRdICE9PSAnLycpXG4gICAgICAgICAgICAgIGkgPSBwYXRoU3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBEb24ndCBtb2RpZnkgYSBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnRcbiAgICAgIGNhc2UgJz8nOlxuICAgICAgY2FzZSAnIyc6XG4gICAgICAgIGkgPSBsZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gSGFuZGxlICcvLicgb3IgJy8uLicgcGF0aCBzZWdtZW50c1xuICAgICAgY2FzZSAnLyc6XG4gICAgICAgIGlmIChpcmlbaSArIDFdID09PSAnLicpIHtcbiAgICAgICAgICBuZXh0ID0gaXJpWysraSArIDFdO1xuICAgICAgICAgIHN3aXRjaCAobmV4dCkge1xuICAgICAgICAgIC8vIFJlbW92ZSBhICcvLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgcmVzdWx0ICs9IGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpIC0gMSk7XG4gICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFJlbW92ZSBhIHRyYWlsaW5nICcvLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpKSArIGlyaS5zdWJzdHIoaSArIDEpO1xuICAgICAgICAgIC8vIFJlbW92ZSBhICcvLi4nIHNlZ21lbnRcbiAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgIG5leHQgPSBpcmlbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkIHx8IG5leHQgPT09ICcvJyB8fCBuZXh0ID09PSAnPycgfHwgbmV4dCA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCArPSBpcmkuc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSAtIDIpO1xuICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVtb3ZlIHRoZSBwYXJlbnQgcGF0aCBmcm9tIHJlc3VsdFxuICAgICAgICAgICAgICBpZiAoKHNlZ21lbnRTdGFydCA9IHJlc3VsdC5sYXN0SW5kZXhPZignLycpKSA+PSBwYXRoU3RhcnQpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCBzZWdtZW50U3RhcnQpO1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgYSB0cmFpbGluZyAnLy4uJyBzZWdtZW50XG4gICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnLycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICcvJyArIGlyaS5zdWJzdHIoaSArIDEpO1xuICAgICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQgPSBpcmlbKytpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCArIGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0KTtcbiAgfSxcblxuICAvLyAjIyBQdWJsaWMgbWV0aG9kc1xuXG4gIC8vICMjIyBgcGFyc2VgIHBhcnNlcyB0aGUgTjMgaW5wdXQgYW5kIGVtaXRzIGVhY2ggcGFyc2VkIHRyaXBsZSB0aHJvdWdoIHRoZSBjYWxsYmFja1xuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCB0cmlwbGVDYWxsYmFjaywgcHJlZml4Q2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gVGhlIHJlYWQgY2FsbGJhY2sgaXMgdGhlIG5leHQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIHRva2VuIGFycml2ZXMuXG4gICAgLy8gV2Ugc3RhcnQgcmVhZGluZyBpbiB0aGUgdG9wIGNvbnRleHQuXG4gICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fcmVhZEluVG9wQ29udGV4dDtcbiAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgIHRoaXMuX3ByZWZpeGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9wcmVmaXhlcy5fID0gdGhpcy5fYmxhbmtOb2RlUHJlZml4IHx8ICdfOmInICsgYmxhbmtOb2RlUHJlZml4KysgKyAnXyc7XG4gICAgdGhpcy5fcHJlZml4Q2FsbGJhY2sgPSBwcmVmaXhDYWxsYmFjayB8fCBub29wO1xuICAgIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWFudGlmaWVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIC8vIFBhcnNlIHN5bmNocm9ub3VzbHkgaWYgbm8gdHJpcGxlIGNhbGxiYWNrIGlzIGdpdmVuXG4gICAgaWYgKCF0cmlwbGVDYWxsYmFjaykge1xuICAgICAgdmFyIHRyaXBsZXMgPSBbXSwgZXJyb3I7XG4gICAgICB0aGlzLl9jYWxsYmFjayA9IGZ1bmN0aW9uIChlLCB0KSB7IGUgPyAoZXJyb3IgPSBlKSA6IHQgJiYgdHJpcGxlcy5wdXNoKHQpOyB9O1xuICAgICAgdGhpcy5fbGV4ZXIudG9rZW5pemUoaW5wdXQpLmV2ZXJ5KGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICByZXR1cm4gc2VsZi5fcmVhZENhbGxiYWNrID0gc2VsZi5fcmVhZENhbGxiYWNrKHRva2VuKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICAgIHJldHVybiB0cmlwbGVzO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGFzeW5jaHJvbm91c2x5IG90aGVyd2lzZSwgZXhlY3V0aW5nIHRoZSByZWFkIGNhbGxiYWNrIHdoZW4gYSB0b2tlbiBhcnJpdmVzXG4gICAgdGhpcy5fY2FsbGJhY2sgPSB0cmlwbGVDYWxsYmFjaztcbiAgICB0aGlzLl9sZXhlci50b2tlbml6ZShpbnB1dCwgZnVuY3Rpb24gKGVycm9yLCB0b2tlbikge1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxuICAgICAgICBzZWxmLl9jYWxsYmFjayhlcnJvciksIHNlbGYuX2NhbGxiYWNrID0gbm9vcDtcbiAgICAgIGVsc2UgaWYgKHNlbGYuX3JlYWRDYWxsYmFjaylcbiAgICAgICAgc2VsZi5fcmVhZENhbGxiYWNrID0gc2VsZi5fcmVhZENhbGxiYWNrKHRva2VuKTtcbiAgICB9KTtcbiAgfSxcbn07XG5cbi8vIFRoZSBlbXB0eSBmdW5jdGlvblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNQYXJzZXI7XG4iLCIvLyAqKk4zU3RvcmUqKiBvYmplY3RzIHN0b3JlIE4zIHRyaXBsZXMgYnkgZ3JhcGggaW4gbWVtb3J5LlxuXG52YXIgZXhwYW5kUHJlZml4ZWROYW1lID0gcmVxdWlyZSgnLi9OM1V0aWwnKS5leHBhbmRQcmVmaXhlZE5hbWU7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0b3JlKHRyaXBsZXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RvcmUpKVxuICAgIHJldHVybiBuZXcgTjNTdG9yZSh0cmlwbGVzLCBvcHRpb25zKTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHRyaXBsZXMgaXMgaW5pdGlhbGx5IHplcm9cbiAgdGhpcy5fc2l6ZSA9IDA7XG4gIC8vIGBfZ3JhcGhzYCBjb250YWlucyBzdWJqZWN0LCBwcmVkaWNhdGUsIGFuZCBvYmplY3QgaW5kZXhlcyBwZXIgZ3JhcGhcbiAgdGhpcy5fZ3JhcGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gYF9pZHNgIG1hcHMgZW50aXRpZXMgc3VjaCBhcyBgaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS9uYW1lYCB0byBudW1iZXJzLFxuICAvLyBzYXZpbmcgbWVtb3J5IGJ5IHVzaW5nIG9ubHkgbnVtYmVycyBhcyBrZXlzIGluIGBfZ3JhcGhzYFxuICB0aGlzLl9pZCA9IDA7XG4gIHRoaXMuX2lkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2lkc1snPjwnXSA9IDA7IC8vIGR1bW15IGVudHJ5LCBzbyB0aGUgZmlyc3QgYWN0dWFsIGtleSBpcyBub24temVyb1xuICB0aGlzLl9lbnRpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IC8vIGludmVyc2Ugb2YgYF9pZHNgXG4gIC8vIGBfYmxhbmtOb2RlSW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBhdXRvbWF0aWNhbGx5IG5hbWVkIGJsYW5rIG5vZGVcbiAgdGhpcy5fYmxhbmtOb2RlSW5kZXggPSAwO1xuXG4gIC8vIFNoaWZ0IHBhcmFtZXRlcnMgaWYgYHRyaXBsZXNgIGlzIG5vdCBnaXZlblxuICBpZiAoIW9wdGlvbnMgJiYgdHJpcGxlcyAmJiAhdHJpcGxlc1swXSlcbiAgICBvcHRpb25zID0gdHJpcGxlcywgdHJpcGxlcyA9IG51bGw7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIEFkZCB0cmlwbGVzIGFuZCBwcmVmaXhlcyBpZiBwYXNzZWRcbiAgdGhpcy5fcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAob3B0aW9ucy5wcmVmaXhlcylcbiAgICB0aGlzLmFkZFByZWZpeGVzKG9wdGlvbnMucHJlZml4ZXMpO1xuICBpZiAodHJpcGxlcylcbiAgICB0aGlzLmFkZFRyaXBsZXModHJpcGxlcyk7XG59XG5cbk4zU3RvcmUucHJvdG90eXBlID0ge1xuICAvLyAjIyBQdWJsaWMgcHJvcGVydGllc1xuXG4gIC8vICMjIyBgc2l6ZWAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyaXBsZXMgaW4gdGhlIHN0b3JlXG4gIGdldCBzaXplKCkge1xuICAgIC8vIFJldHVybiB0aGUgdHJpcGxlIGNvdW50IGlmIGlmIHdhcyBjYWNoZWRcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX3NpemU7XG4gICAgaWYgKHNpemUgIT09IG51bGwpXG4gICAgICByZXR1cm4gc2l6ZTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRyaXBsZXMgYnkgY291bnRpbmcgdG8gdGhlIGRlZXBlc3QgbGV2ZWxcbiAgICBzaXplID0gMDtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5fZ3JhcGhzLCBzdWJqZWN0cywgc3ViamVjdDtcbiAgICBmb3IgKHZhciBncmFwaEtleSBpbiBncmFwaHMpXG4gICAgICBmb3IgKHZhciBzdWJqZWN0S2V5IGluIChzdWJqZWN0cyA9IGdyYXBoc1tncmFwaEtleV0uc3ViamVjdHMpKVxuICAgICAgICBmb3IgKHZhciBwcmVkaWNhdGVLZXkgaW4gKHN1YmplY3QgPSBzdWJqZWN0c1tzdWJqZWN0S2V5XSkpXG4gICAgICAgICAgc2l6ZSArPSBPYmplY3Qua2V5cyhzdWJqZWN0W3ByZWRpY2F0ZUtleV0pLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZSA9IHNpemU7XG4gIH0sXG5cbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfYWRkVG9JbmRleGAgYWRkcyBhIHRyaXBsZSB0byBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFJldHVybnMgaWYgdGhlIGluZGV4IGhhcyBjaGFuZ2VkLCBpZiB0aGUgZW50cnkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LlxuICBfYWRkVG9JbmRleDogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwga2V5Mikge1xuICAgIC8vIENyZWF0ZSBsYXllcnMgYXMgbmVjZXNzYXJ5XG4gICAgdmFyIGluZGV4MSA9IGluZGV4MFtrZXkwXSB8fCAoaW5kZXgwW2tleTBdID0ge30pO1xuICAgIHZhciBpbmRleDIgPSBpbmRleDFba2V5MV0gfHwgKGluZGV4MVtrZXkxXSA9IHt9KTtcbiAgICAvLyBTZXR0aW5nIHRoZSBrZXkgdG8gX2FueV8gdmFsdWUgc2lnbmFscyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRyaXBsZVxuICAgIHZhciBleGlzdGVkID0ga2V5MiBpbiBpbmRleDI7XG4gICAgaWYgKCFleGlzdGVkKVxuICAgICAgaW5kZXgyW2tleTJdID0gbnVsbDtcbiAgICByZXR1cm4gIWV4aXN0ZWQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRnJvbUluZGV4YCByZW1vdmVzIGEgdHJpcGxlIGZyb20gYSB0aHJlZS1sYXllcmVkIGluZGV4XG4gIF9yZW1vdmVGcm9tSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHRyaXBsZSBmcm9tIHRoZSBpbmRleFxuICAgIHZhciBpbmRleDEgPSBpbmRleDBba2V5MF0sIGluZGV4MiA9IGluZGV4MVtrZXkxXSwga2V5O1xuICAgIGRlbGV0ZSBpbmRleDJba2V5Ml07XG5cbiAgICAvLyBSZW1vdmUgaW50ZXJtZWRpYXJ5IGluZGV4IGxheWVycyBpZiB0aGV5IGFyZSBlbXB0eVxuICAgIGZvciAoa2V5IGluIGluZGV4MikgcmV0dXJuO1xuICAgIGRlbGV0ZSBpbmRleDFba2V5MV07XG4gICAgZm9yIChrZXkgaW4gaW5kZXgxKSByZXR1cm47XG4gICAgZGVsZXRlIGluZGV4MFtrZXkwXTtcbiAgfSxcblxuICAvLyAjIyMgYF9maW5kSW5JbmRleGAgZmluZHMgYSBzZXQgb2YgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIHVuZGVmaW5lZCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgLy8gYG5hbWUwYCwgYG5hbWUxYCwgYW5kIGBuYW1lMmAgYXJlIHRoZSBuYW1lcyBvZiB0aGUga2V5cyBhdCBlYWNoIGxldmVsLFxuICAvLyB1c2VkIHdoZW4gcmVjb25zdHJ1Y3RpbmcgdGhlIHJlc3VsdGluZyB0cmlwbGVcbiAgLy8gKGZvciBpbnN0YW5jZTogX3N1YmplY3RfLCBfcHJlZGljYXRlXywgYW5kIF9vYmplY3RfKS5cbiAgLy8gRmluYWxseSwgYGdyYXBoYCB3aWxsIGJlIHRoZSBncmFwaCBvZiB0aGUgY3JlYXRlZCB0cmlwbGVzLlxuICAvLyBJZiBgY2FsbGJhY2tgIGlzIGdpdmVuLCBlYWNoIHJlc3VsdCBpcyBwYXNzZWQgdGhyb3VnaCBpdFxuICAvLyBhbmQgaXRlcmF0aW9uIGhhbHRzIHdoZW4gaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFueSB0cmlwbGUuXG4gIC8vIElmIGluc3RlYWQgYGFycmF5YCBpcyBnaXZlbiwgZWFjaCByZXN1bHQgaXMgYWRkZWQgdG8gdGhlIGFycmF5LlxuICBfZmluZEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIsIG5hbWUwLCBuYW1lMSwgbmFtZTIsIGdyYXBoLCBjYWxsYmFjaywgYXJyYXkpIHtcbiAgICB2YXIgdG1wLCBpbmRleDEsIGluZGV4MiwgdmFyQ291bnQgPSAha2V5MCArICFrZXkxICsgIWtleTIsXG4gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcywga2V5cyBvciByZXZlcnNlIGluZGV4IGFyZSBmYXN0ZXJcbiAgICAgICAgZW50aXR5S2V5cyA9IHZhckNvdW50ID4gMSA/IE9iamVjdC5rZXlzKHRoaXMuX2lkcykgOiB0aGlzLl9lbnRpdGllcztcblxuICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDAuXG4gICAgaWYgKGtleTApICh0bXAgPSBpbmRleDAsIGluZGV4MCA9IHt9KVtrZXkwXSA9IHRtcFtrZXkwXTtcbiAgICBmb3IgKHZhciB2YWx1ZTAgaW4gaW5kZXgwKSB7XG4gICAgICB2YXIgZW50aXR5MCA9IGVudGl0eUtleXNbdmFsdWUwXTtcblxuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDEuXG4gICAgICAgIGlmIChrZXkxKSAodG1wID0gaW5kZXgxLCBpbmRleDEgPSB7fSlba2V5MV0gPSB0bXBba2V5MV07XG4gICAgICAgIGZvciAodmFyIHZhbHVlMSBpbiBpbmRleDEpIHtcbiAgICAgICAgICB2YXIgZW50aXR5MSA9IGVudGl0eUtleXNbdmFsdWUxXTtcblxuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCB1c2Ugb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMiwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGtleTIgPyAoa2V5MiBpbiBpbmRleDIgPyBba2V5Ml0gOiBbXSkgOiBPYmplY3Qua2V5cyhpbmRleDIpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRyaXBsZXMgZm9yIGFsbCBpdGVtcyBmb3VuZCBpbiBpbmRleCAyLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IHZhbHVlcy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0geyBzdWJqZWN0OiAnJywgcHJlZGljYXRlOiAnJywgb2JqZWN0OiAnJywgZ3JhcGg6IGdyYXBoIH07XG4gICAgICAgICAgICAgIHJlc3VsdFtuYW1lMF0gPSBlbnRpdHkwO1xuICAgICAgICAgICAgICByZXN1bHRbbmFtZTFdID0gZW50aXR5MTtcbiAgICAgICAgICAgICAgcmVzdWx0W25hbWUyXSA9IGVudGl0eUtleXNbdmFsdWVzW2xdXTtcbiAgICAgICAgICAgICAgaWYgKGFycmF5KVxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2socmVzdWx0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuXG4gIC8vICMjIyBgX2xvb3BgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwga2V5cyBvZiBpbmRleCAwXG4gIF9sb29wOiBmdW5jdGlvbiAoaW5kZXgwLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGtleTAgaW4gaW5kZXgwKVxuICAgICAgY2FsbGJhY2soa2V5MCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfbG9vcEJ5S2V5MGAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBrZXlzIG9mIGEgY2VydGFpbiBlbnRyeSBpbiBpbmRleCAwXG4gIF9sb29wQnlLZXkwOiBmdW5jdGlvbiAoaW5kZXgwLCBrZXkwLCBjYWxsYmFjaykge1xuICAgIHZhciBpbmRleDEsIGtleTE7XG4gICAgaWYgKGluZGV4MSA9IGluZGV4MFtrZXkwXSkge1xuICAgICAgZm9yIChrZXkxIGluIGluZGV4MSlcbiAgICAgICAgY2FsbGJhY2soa2V5MSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX2xvb3BCeUtleTFgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBnaXZlbiBrZXlzIG9mIGFsbCBlbnRyaWVzIGluIGluZGV4IDBcbiAgX2xvb3BCeUtleTE6IGZ1bmN0aW9uIChpbmRleDAsIGtleTEsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGtleTAsIGluZGV4MTtcbiAgICBmb3IgKGtleTAgaW4gaW5kZXgwKSB7XG4gICAgICBpbmRleDEgPSBpbmRleDBba2V5MF07XG4gICAgICBpZiAoaW5kZXgxW2tleTFdKVxuICAgICAgICBjYWxsYmFjayhrZXkwKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfbG9vcEJ5MktleXNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBnaXZlbiBrZXlzIG9mIGNlcnRhaW4gZW50cmllcyBpbiBpbmRleCAyXG4gIF9sb29wQnkyS2V5czogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW5kZXgxLCBpbmRleDIsIGtleTI7XG4gICAgaWYgKChpbmRleDEgPSBpbmRleDBba2V5MF0pICYmIChpbmRleDIgPSBpbmRleDFba2V5MV0pKSB7XG4gICAgICBmb3IgKGtleTIgaW4gaW5kZXgyKVxuICAgICAgICBjYWxsYmFjayhrZXkyKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfY291bnRJbkluZGV4YCBjb3VudHMgbWF0Y2hpbmcgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIHVuZGVmaW5lZCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgX2NvdW50SW5JbmRleDogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwga2V5Mikge1xuICAgIHZhciBjb3VudCA9IDAsIHRtcCwgaW5kZXgxLCBpbmRleDI7XG5cbiAgICAvLyBJZiBhIGtleSBpcyBzcGVjaWZpZWQsIGNvdW50IG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDBcbiAgICBpZiAoa2V5MCkgKHRtcCA9IGluZGV4MCwgaW5kZXgwID0ge30pW2tleTBdID0gdG1wW2tleTBdO1xuICAgIGZvciAodmFyIHZhbHVlMCBpbiBpbmRleDApIHtcbiAgICAgIGlmIChpbmRleDEgPSBpbmRleDBbdmFsdWUwXSkge1xuICAgICAgICAvLyBJZiBhIGtleSBpcyBzcGVjaWZpZWQsIGNvdW50IG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDFcbiAgICAgICAgaWYgKGtleTEpICh0bXAgPSBpbmRleDEsIGluZGV4MSA9IHt9KVtrZXkxXSA9IHRtcFtrZXkxXTtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUxIGluIGluZGV4MSkge1xuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCB0aGUgdHJpcGxlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgaWYgKGtleTIpIChrZXkyIGluIGluZGV4MikgJiYgY291bnQrKztcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY291bnQgYWxsIHRyaXBsZXNcbiAgICAgICAgICAgIGVsc2UgY291bnQgKz0gT2JqZWN0LmtleXMoaW5kZXgyKS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfSxcblxuICAvLyAjIyMgYF9nZXRHcmFwaHNgIHJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gZ3JhcGgsXG4gIC8vIG9yIGFsbCBncmFwaHMgaWYgdGhlIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICBfZ2V0R3JhcGhzOiBmdW5jdGlvbiAoZ3JhcGgpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGdyYXBoKSlcbiAgICAgIHJldHVybiB0aGlzLl9ncmFwaHM7XG4gICAgdmFyIGdyYXBocyA9IHt9O1xuICAgIGdyYXBoc1tncmFwaF0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdO1xuICAgIHJldHVybiBncmFwaHM7XG4gIH0sXG5cbiAgLy8gIyMjIGBfdW5pcXVlRW50aXRpZXNgIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gZW50aXR5IElEXG4gIC8vIGFuZCBwYXNzZXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5IHRvIGNhbGxiYWNrIGlmIGl0IGhhc24ndCBvY2N1cnJlZCBiZWZvcmUuXG4gIF91bmlxdWVFbnRpdGllczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVuaXF1ZUlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKCEoaWQgaW4gdW5pcXVlSWRzKSkge1xuICAgICAgICB1bmlxdWVJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgY2FsbGJhY2soZW50aXRpZXNbaWRdKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgYSBuZXcgTjMgdHJpcGxlIHRvIHRoZSBzdG9yZS5cbiAgLy8gUmV0dXJucyBpZiB0aGUgdHJpcGxlIGluZGV4IGhhcyBjaGFuZ2VkLCBpZiB0aGUgdHJpcGxlIGRpZCBub3QgYWxyZWFkeSBleGlzdC5cbiAgYWRkVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuXG4gICAgLy8gRmluZCB0aGUgZ3JhcGggdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyaXBsZVxuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG4gICAgdmFyIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF07XG4gICAgLy8gQ3JlYXRlIHRoZSBncmFwaCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGlmICghZ3JhcGhJdGVtKSB7XG4gICAgICBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdID0geyBzdWJqZWN0czoge30sIHByZWRpY2F0ZXM6IHt9LCBvYmplY3RzOiB7fSB9O1xuICAgICAgLy8gRnJlZXppbmcgYSBncmFwaCBoZWxwcyBzdWJzZXF1ZW50IGBhZGRgIHBlcmZvcm1hbmNlLFxuICAgICAgLy8gYW5kIHByb3BlcnRpZXMgd2lsbCBuZXZlciBiZSBtb2RpZmllZCBhbnl3YXlcbiAgICAgIE9iamVjdC5mcmVlemUoZ3JhcGhJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBlbnRpdGllcyBjYW4gb2Z0ZW4gYmUgbG9uZyBJUklzLCB3ZSBhdm9pZCBzdG9yaW5nIHRoZW0gaW4gZXZlcnkgaW5kZXguXG4gICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSBhIHNlcGFyYXRlIGluZGV4IHRoYXQgbWFwcyBlbnRpdGllcyB0byBudW1iZXJzLFxuICAgIC8vIHdoaWNoIGFyZSB0aGVuIHVzZWQgYXMga2V5cyBpbiB0aGUgb3RoZXIgaW5kZXhlcy5cbiAgICB2YXIgaWRzID0gdGhpcy5faWRzO1xuICAgIHZhciBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzO1xuICAgIHN1YmplY3QgICA9IGlkc1tzdWJqZWN0XSAgIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBzdWJqZWN0XSAgID0gdGhpcy5faWQpO1xuICAgIHByZWRpY2F0ZSA9IGlkc1twcmVkaWNhdGVdIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBwcmVkaWNhdGVdID0gdGhpcy5faWQpO1xuICAgIG9iamVjdCAgICA9IGlkc1tvYmplY3RdICAgIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBvYmplY3RdICAgID0gdGhpcy5faWQpO1xuXG4gICAgdmFyIGNoYW5nZWQgPSB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5zdWJqZWN0cywgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5wcmVkaWNhdGVzLCBwcmVkaWNhdGUsIG9iamVjdCwgICAgc3ViamVjdCk7XG4gICAgdGhpcy5fYWRkVG9JbmRleChncmFwaEl0ZW0ub2JqZWN0cywgICAgb2JqZWN0LCAgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSk7XG5cbiAgICAvLyBUaGUgY2FjaGVkIHRyaXBsZSBjb3VudCBpcyBub3cgaW52YWxpZFxuICAgIHRoaXMuX3NpemUgPSBudWxsO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkVHJpcGxlc2AgYWRkcyBtdWx0aXBsZSBOMyB0cmlwbGVzIHRvIHRoZSBzdG9yZVxuICBhZGRUcmlwbGVzOiBmdW5jdGlvbiAodHJpcGxlcykge1xuICAgIGZvciAodmFyIGkgPSB0cmlwbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgdGhpcy5hZGRUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhgIGFkZHMgc3VwcG9ydCBmb3IgcXVlcnlpbmcgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4XG4gIGFkZFByZWZpeDogZnVuY3Rpb24gKHByZWZpeCwgaXJpKSB7XG4gICAgdGhpcy5fcHJlZml4ZXNbcHJlZml4XSA9IGlyaTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGVzYCBhZGRzIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIHdpdGggdGhlIGdpdmVuIHByZWZpeGVzXG4gIGFkZFByZWZpeGVzOiBmdW5jdGlvbiAocHJlZml4ZXMpIHtcbiAgICBmb3IgKHZhciBwcmVmaXggaW4gcHJlZml4ZXMpXG4gICAgICB0aGlzLmFkZFByZWZpeChwcmVmaXgsIHByZWZpeGVzW3ByZWZpeF0pO1xuICB9LFxuXG4gIC8vICMjIyBgcmVtb3ZlVHJpcGxlYCByZW1vdmVzIGFuIE4zIHRyaXBsZSBmcm9tIHRoZSBzdG9yZSBpZiBpdCBleGlzdHNcbiAgcmVtb3ZlVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG5cbiAgICAvLyBGaW5kIGludGVybmFsIGlkZW50aWZpZXJzIGZvciBhbGwgY29tcG9uZW50c1xuICAgIC8vIGFuZCB2ZXJpZnkgdGhlIHRyaXBsZSBleGlzdHMuXG4gICAgdmFyIGdyYXBoSXRlbSwgaWRzID0gdGhpcy5faWRzLCBncmFwaHMgPSB0aGlzLl9ncmFwaHMsIHN1YmplY3RzLCBwcmVkaWNhdGVzO1xuICAgIGlmICghKHN1YmplY3QgICAgPSBpZHNbc3ViamVjdF0pIHx8ICEocHJlZGljYXRlID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgICEob2JqZWN0ICAgICA9IGlkc1tvYmplY3RdKSAgfHwgIShncmFwaEl0ZW0gPSBncmFwaHNbZ3JhcGhdKSAgfHxcbiAgICAgICAgIShzdWJqZWN0cyAgID0gZ3JhcGhJdGVtLnN1YmplY3RzW3N1YmplY3RdKSB8fFxuICAgICAgICAhKHByZWRpY2F0ZXMgPSBzdWJqZWN0c1twcmVkaWNhdGVdKSB8fFxuICAgICAgICAhKG9iamVjdCBpbiBwcmVkaWNhdGVzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBpdCBmcm9tIGFsbCBpbmRleGVzXG4gICAgdGhpcy5fcmVtb3ZlRnJvbUluZGV4KGdyYXBoSXRlbS5zdWJqZWN0cywgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLnByZWRpY2F0ZXMsIHByZWRpY2F0ZSwgb2JqZWN0LCAgICBzdWJqZWN0KTtcbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsICAgIG9iamVjdCwgICAgc3ViamVjdCwgICBwcmVkaWNhdGUpO1xuICAgIGlmICh0aGlzLl9zaXplICE9PSBudWxsKSB0aGlzLl9zaXplLS07XG5cbiAgICAvLyBSZW1vdmUgdGhlIGdyYXBoIGlmIGl0IGlzIGVtcHR5XG4gICAgZm9yIChzdWJqZWN0IGluIGdyYXBoSXRlbS5zdWJqZWN0cykgcmV0dXJuIHRydWU7XG4gICAgZGVsZXRlIGdyYXBoc1tncmFwaF07XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLy8gIyMjIGByZW1vdmVUcmlwbGVzYCByZW1vdmVzIG11bHRpcGxlIE4zIHRyaXBsZXMgZnJvbSB0aGUgc3RvcmVcbiAgcmVtb3ZlVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gdHJpcGxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHRoaXMucmVtb3ZlVHJpcGxlKHRyaXBsZXNbaV0pO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0VHJpcGxlc2AgcmV0dXJucyBhbiBhcnJheSBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybiwgZXhwYW5kaW5nIHByZWZpeGVzIGFzIG5lY2Vzc2FyeS5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRUcmlwbGVzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJpcGxlc0J5SVJJKFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHN1YmplY3QsICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKGdyYXBoLCAgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGdldFRyaXBsZXNCeUlSSWAgcmV0dXJucyBhbiBhcnJheSBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRUcmlwbGVzQnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcXVhZHMgPSBbXSwgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCxcbiAgICAgICAgaWRzID0gdGhpcy5faWRzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBvYmplY3RJZDtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgaWYgKGlzU3RyaW5nKHN1YmplY3QpICAgJiYgIShzdWJqZWN0SWQgICA9IGlkc1tzdWJqZWN0XSkgICB8fFxuICAgICAgICBpc1N0cmluZyhwcmVkaWNhdGUpICYmICEocHJlZGljYXRlSWQgPSBpZHNbcHJlZGljYXRlXSkgfHxcbiAgICAgICAgaXNTdHJpbmcob2JqZWN0KSAgICAmJiAhKG9iamVjdElkICAgID0gaWRzW29iamVjdF0pKVxuICAgICAgcmV0dXJuIHF1YWRzO1xuXG4gICAgZm9yICh2YXIgZ3JhcGhJZCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhJZF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIHRoZSBvcHRpbWFsIGluZGV4LCBiYXNlZCBvbiB3aGF0IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgICBpZiAoc3ViamVjdElkKSB7XG4gICAgICAgICAgaWYgKG9iamVjdElkKVxuICAgICAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgICB0aGlzLl9maW5kSW5JbmRleChjb250ZW50Lm9iamVjdHMsIG9iamVjdElkLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoSWQsIG51bGwsIHF1YWRzKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHN1YmplY3QgYW5kIHBvc3NpYmx5IHByZWRpY2F0ZSBhcmUgZ2l2ZW4sIHRoZSBzdWJqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByZWRpY2F0ZUlkKVxuICAgICAgICAgIC8vIElmIG9ubHkgcHJlZGljYXRlIGFuZCBwb3NzaWJseSBvYmplY3QgYXJlIGdpdmVuLCB0aGUgcHJlZGljYXRlIGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICB0aGlzLl9maW5kSW5JbmRleChjb250ZW50LnByZWRpY2F0ZXMsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgdGhpcy5fZmluZEluSW5kZXgoY29udGVudC5vYmplY3RzLCBvYmplY3RJZCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JywgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm90aGluZyBpcyBnaXZlbiwgaXRlcmF0ZSBzdWJqZWN0cyBhbmQgcHJlZGljYXRlcyBmaXJzdFxuICAgICAgICAgIHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoSWQsIG51bGwsIHF1YWRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1YWRzO1xuICB9LFxuXG4gIC8vICMjIyBgY291bnRUcmlwbGVzYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4sIGV4cGFuZGluZyBwcmVmaXhlcyBhcyBuZWNlc3NhcnkuXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgY291bnRUcmlwbGVzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuY291bnRUcmlwbGVzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgY291bnRUcmlwbGVzQnlJUklgIHJldHVybnMgdGhlIG51bWJlciBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBjb3VudFRyaXBsZXNCeUlSSTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBjb3VudCA9IDAsIGdyYXBocyA9IHRoaXMuX2dldEdyYXBocyhncmFwaCksIGNvbnRlbnQsXG4gICAgICAgIGlkcyA9IHRoaXMuX2lkcywgc3ViamVjdElkLCBwcmVkaWNhdGVJZCwgb2JqZWN0SWQ7XG5cbiAgICAvLyBUcmFuc2xhdGUgSVJJcyB0byBpbnRlcm5hbCBpbmRleCBrZXlzLlxuICAgIGlmIChpc1N0cmluZyhzdWJqZWN0KSAgICYmICEoc3ViamVjdElkICAgPSBpZHNbc3ViamVjdF0pICAgfHxcbiAgICAgICAgaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgIGlzU3RyaW5nKG9iamVjdCkgICAgJiYgIShvYmplY3RJZCAgICA9IGlkc1tvYmplY3RdKSlcbiAgICAgIHJldHVybiAwO1xuXG4gICAgZm9yICh2YXIgZ3JhcGhJZCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhJZF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIHRoZSBvcHRpbWFsIGluZGV4LCBiYXNlZCBvbiB3aGF0IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgICBpZiAoc3ViamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QpXG4gICAgICAgICAgICAvLyBJZiBzdWJqZWN0IGFuZCBvYmplY3QgYXJlIGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50Lm9iamVjdHMsIG9iamVjdElkLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHN1YmplY3QgYW5kIHBvc3NpYmx5IHByZWRpY2F0ZSBhcmUgZ2l2ZW4sIHRoZSBzdWJqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgYW5kIHBvc3NpYmx5IG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBwcmVkaWNhdGUgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50LnByZWRpY2F0ZXMsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCwgc3ViamVjdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBwb3NzaWJseSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgY291bnQgKz0gdGhpcy5fY291bnRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfSxcblxuICAvLyAjIyMgYGZvckVhY2hgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgdHJpcGxlcy5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBmb3JFYWNoOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHRoaXMuZm9yRWFjaEJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yRWFjaEJ5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHRyaXBsZXMuXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yRWFjaEJ5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHRoaXMuc29tZUJ5SVJJKGZ1bmN0aW9uIChxdWFkKSB7XG4gICAgICBjYWxsYmFjayhxdWFkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xuICB9LFxuXG4gIC8vICMjIyBgZXZlcnlgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgdHJpcGxlcyxcbiAgLy8gYW5kIHJldHVybnMgYHRydWVgIGlmIGl0IHJldHVybnMgdHJ1dGh5IGZvciBhbGwgdGhlbS5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBldmVyeTogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5ldmVyeUJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZXZlcnlCeUlSSWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCB0cmlwbGVzLFxuICAvLyBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFsbCB0aGVtLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGV2ZXJ5QnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHNvbWUgPSBmYWxzZTtcbiAgICB2YXIgZXZlcnkgPSAhdGhpcy5zb21lQnlJUkkoZnVuY3Rpb24gKHF1YWQpIHtcbiAgICAgIHNvbWUgPSB0cnVlO1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhxdWFkKTtcbiAgICB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xuICAgIHJldHVybiBzb21lICYmIGV2ZXJ5O1xuICB9LFxuXG4gIC8vICMjIyBgc29tZWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCB0cmlwbGVzLFxuICAvLyBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFueSBvZiB0aGVtLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIHNvbWU6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuc29tZUJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgc29tZUJ5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHRyaXBsZXMsXG4gIC8vIGFuZCByZXR1cm5zIGB0cnVlYCBpZiBpdCByZXR1cm5zIHRydXRoeSBmb3IgYW55IG9mIHRoZW0uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgc29tZUJ5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBncmFwaHMgPSB0aGlzLl9nZXRHcmFwaHMoZ3JhcGgpLCBjb250ZW50LFxuICAgICAgICBpZHMgPSB0aGlzLl9pZHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG9iamVjdElkO1xuXG4gICAgLy8gVHJhbnNsYXRlIElSSXMgdG8gaW50ZXJuYWwgaW5kZXgga2V5cy5cbiAgICBpZiAoaXNTdHJpbmcoc3ViamVjdCkgICAmJiAhKHN1YmplY3RJZCAgID0gaWRzW3N1YmplY3RdKSAgIHx8XG4gICAgICAgIGlzU3RyaW5nKHByZWRpY2F0ZSkgJiYgIShwcmVkaWNhdGVJZCA9IGlkc1twcmVkaWNhdGVdKSB8fFxuICAgICAgICBpc1N0cmluZyhvYmplY3QpICAgICYmICEob2JqZWN0SWQgICAgPSBpZHNbb2JqZWN0XSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBncmFwaElkIGluIGdyYXBocykge1xuICAgICAgLy8gT25seSBpZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW5zIHRyaXBsZXMsIHRoZXJlIGNhbiBiZSByZXN1bHRcbiAgICAgIGlmIChjb250ZW50ID0gZ3JhcGhzW2dyYXBoSWRdKSB7XG4gICAgICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICAgICAgaWYgKHN1YmplY3RJZCkge1xuICAgICAgICAgIGlmIChvYmplY3RJZCkge1xuICAgICAgICAgIC8vIElmIHN1YmplY3QgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBvYmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoSWQsIGNhbGxiYWNrLCBudWxsKSlcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBhbmQgcG9zc2libHkgcHJlZGljYXRlIGFyZSBnaXZlbiwgdGhlIHN1YmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoSWQsIGNhbGxiYWNrLCBudWxsKSlcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlSWQpIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIG9iamVjdElkLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGhJZCwgY2FsbGJhY2ssIG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0SWQpIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnLCAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCBncmFwaElkLCBjYWxsYmFjaywgbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIC8vIElmIG5vdGhpbmcgaXMgZ2l2ZW4sIGl0ZXJhdGUgc3ViamVjdHMgYW5kIHByZWRpY2F0ZXMgZmlyc3RcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGhJZCwgY2FsbGJhY2ssIG51bGwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0U3ViamVjdHNgIHJldHVybnMgYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0U3ViamVjdHM6IGZ1bmN0aW9uIChwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJqZWN0c0J5SVJJKFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKGdyYXBoLCAgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGdldFN1YmplY3RzQnlJUklgIHJldHVybnMgYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0U3ViamVjdHNCeUlSSTogZnVuY3Rpb24gKHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdGhpcy5mb3JTdWJqZWN0c0J5SVJJKGZ1bmN0aW9uIChzKSB7IHJlc3VsdHMucHVzaChzKTsgfSwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSxcblxuICAvLyAjIyMgYGZvclN1YmplY3RzYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yU3ViamVjdHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JTdWJqZWN0c0J5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yU3ViamVjdHNCeUlSSWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBzdWJqZWN0cyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvclN1YmplY3RzQnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIGlkcyA9IHRoaXMuX2lkcywgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCwgcHJlZGljYXRlSWQsIG9iamVjdElkO1xuICAgIGNhbGxiYWNrID0gdGhpcy5fdW5pcXVlRW50aXRpZXMoY2FsbGJhY2spO1xuXG4gICAgLy8gVHJhbnNsYXRlIElSSXMgdG8gaW50ZXJuYWwgaW5kZXgga2V5cy5cbiAgICBpZiAoaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgIGlzU3RyaW5nKG9iamVjdCkgICAgJiYgIShvYmplY3RJZCAgICA9IGlkc1tvYmplY3RdKSlcbiAgICAgIHJldHVybjtcblxuICAgIGZvciAoZ3JhcGggaW4gZ3JhcGhzKSB7XG4gICAgICAvLyBPbmx5IGlmIHRoZSBzcGVjaWZpZWQgZ3JhcGggY29udGFpbnMgdHJpcGxlcywgdGhlcmUgY2FuIGJlIHJlc3VsdHNcbiAgICAgIGlmIChjb250ZW50ID0gZ3JhcGhzW2dyYXBoXSkge1xuICAgICAgICAvLyBDaG9vc2Ugb3B0aW1hbCBpbmRleCBiYXNlZCBvbiB3aGljaCBmaWVsZHMgYXJlIHdpbGRjYXJkc1xuICAgICAgICBpZiAocHJlZGljYXRlSWQpIHtcbiAgICAgICAgICBpZiAob2JqZWN0SWQpXG4gICAgICAgICAgICAvLyBJZiBwcmVkaWNhdGUgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBQT1MgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeTJLZXlzKGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIG9iamVjdElkLCBjYWxsYmFjayk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgaXMgZ2l2ZW4sIHRoZSBTUE8gaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTEoY29udGVudC5zdWJqZWN0cywgcHJlZGljYXRlSWQsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIE9TUCBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTAoY29udGVudC5vYmplY3RzLCBvYmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm8gcGFyYW1zIGdpdmVuLCBpdGVyYXRlIGFsbCB0aGUgc3ViamVjdHNcbiAgICAgICAgICB0aGlzLl9sb29wKGNvbnRlbnQuc3ViamVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRQcmVkaWNhdGVzYCByZXR1cm5zIGFsbCBwcmVkaWNhdGVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0UHJlZGljYXRlczogZnVuY3Rpb24gKHN1YmplY3QsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5nZXRQcmVkaWNhdGVzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0UHJlZGljYXRlc0J5SVJJYCByZXR1cm5zIGFsbCBwcmVkaWNhdGVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0UHJlZGljYXRlc0J5SVJJOiBmdW5jdGlvbiAoc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdGhpcy5mb3JQcmVkaWNhdGVzQnlJUkkoZnVuY3Rpb24gKHApIHsgcmVzdWx0cy5wdXNoKHApOyB9LCBzdWJqZWN0LCBvYmplY3QsIGdyYXBoKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSxcblxuICAvLyAjIyMgYGZvclByZWRpY2F0ZXNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgcHJlZGljYXRlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvclByZWRpY2F0ZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHRoaXMuZm9yUHJlZGljYXRlc0J5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yUHJlZGljYXRlc0J5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHByZWRpY2F0ZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBmb3JQcmVkaWNhdGVzQnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBpZHMgPSB0aGlzLl9pZHMsIGdyYXBocyA9IHRoaXMuX2dldEdyYXBocyhncmFwaCksIGNvbnRlbnQsIHN1YmplY3RJZCwgb2JqZWN0SWQ7XG4gICAgY2FsbGJhY2sgPSB0aGlzLl91bmlxdWVFbnRpdGllcyhjYWxsYmFjayk7XG5cbiAgICAvLyBUcmFuc2xhdGUgSVJJcyB0byBpbnRlcm5hbCBpbmRleCBrZXlzLlxuICAgIGlmIChpc1N0cmluZyhzdWJqZWN0KSAmJiAhKHN1YmplY3RJZCA9IGlkc1tzdWJqZWN0XSkgfHxcbiAgICAgICAgaXNTdHJpbmcob2JqZWN0KSAgJiYgIShvYmplY3RJZCAgPSBpZHNbb2JqZWN0XSkpXG4gICAgICByZXR1cm47XG5cbiAgICBmb3IgKGdyYXBoIGluIGdyYXBocykge1xuICAgICAgLy8gT25seSBpZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW5zIHRyaXBsZXMsIHRoZXJlIGNhbiBiZSByZXN1bHRzXG4gICAgICBpZiAoY29udGVudCA9IGdyYXBoc1tncmFwaF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIG9wdGltYWwgaW5kZXggYmFzZWQgb24gd2hpY2ggZmllbGRzIGFyZSB3aWxkY2FyZHNcbiAgICAgICAgaWYgKHN1YmplY3RJZCkge1xuICAgICAgICAgIGlmIChvYmplY3RJZClcbiAgICAgICAgICAgIC8vIElmIHN1YmplY3QgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBPU1AgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeTJLZXlzKGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBpcyBnaXZlbiwgdGhlIFNQTyBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgICAgdGhpcy5fbG9vcEJ5S2V5MChjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIFBPUyBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTEoY29udGVudC5wcmVkaWNhdGVzLCBvYmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm8gcGFyYW1zIGdpdmVuLCBpdGVyYXRlIGFsbCB0aGUgcHJlZGljYXRlcy5cbiAgICAgICAgICB0aGlzLl9sb29wKGNvbnRlbnQucHJlZGljYXRlcywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYGdldE9iamVjdHNgIHJldHVybnMgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRPYmplY3RzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHJldHVybiB0aGlzLmdldE9iamVjdHNCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRPYmplY3RzQnlJUklgIHJldHVybnMgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRPYmplY3RzQnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB0aGlzLmZvck9iamVjdHNCeUlSSShmdW5jdGlvbiAobykgeyByZXN1bHRzLnB1c2gobyk7IH0sIHN1YmplY3QsIHByZWRpY2F0ZSwgZ3JhcGgpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yT2JqZWN0c2AgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yT2JqZWN0czogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JPYmplY3RzQnlJUkkoXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmb3JPYmplY3RzQnlJUklgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvck9iamVjdHNCeUlSSTogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIGlkcyA9IHRoaXMuX2lkcywgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCwgc3ViamVjdElkLCBwcmVkaWNhdGVJZDtcbiAgICBjYWxsYmFjayA9IHRoaXMuX3VuaXF1ZUVudGl0aWVzKGNhbGxiYWNrKTtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgaWYgKGlzU3RyaW5nKHN1YmplY3QpICAgJiYgIShzdWJqZWN0SWQgICA9IGlkc1tzdWJqZWN0XSkgfHxcbiAgICAgICAgaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pKVxuICAgICAgcmV0dXJuO1xuXG4gICAgZm9yIChncmFwaCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhdKSB7XG4gICAgICAgIC8vIENob29zZSBvcHRpbWFsIGluZGV4IGJhc2VkIG9uIHdoaWNoIGZpZWxkcyBhcmUgd2lsZGNhcmRzXG4gICAgICAgIGlmIChzdWJqZWN0SWQpIHtcbiAgICAgICAgICBpZiAocHJlZGljYXRlSWQpXG4gICAgICAgICAgICAvLyBJZiBzdWJqZWN0IGFuZCBwcmVkaWNhdGUgYXJlIGdpdmVuLCB0aGUgU1BPIGluZGV4IGlzIGJlc3QuXG4gICAgICAgICAgICB0aGlzLl9sb29wQnkyS2V5cyhjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBjYWxsYmFjayk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgLy8gSWYgb25seSBzdWJqZWN0IGlzIGdpdmVuLCB0aGUgT1NQIGluZGV4IGlzIGJlc3QuXG4gICAgICAgICAgICB0aGlzLl9sb29wQnlLZXkxKGNvbnRlbnQub2JqZWN0cywgc3ViamVjdElkLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlSWQpXG4gICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgaXMgZ2l2ZW4sIHRoZSBQT1MgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICB0aGlzLl9sb29wQnlLZXkwKGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIGNhbGxiYWNrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIC8vIElmIG5vIHBhcmFtcyBnaXZlbiwgaXRlcmF0ZSBhbGwgdGhlIG9iamVjdHMuXG4gICAgICAgICAgdGhpcy5fbG9vcChjb250ZW50Lm9iamVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRHcmFwaHNgIHJldHVybnMgYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGdldEdyYXBoczogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R3JhcGhzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0R3JhcGhzQnlJUklgIHJldHVybnMgYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGdldEdyYXBoc0J5SVJJOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHRoaXMuZm9yR3JhcGhzQnlJUkkoZnVuY3Rpb24gKGcpIHsgcmVzdWx0cy5wdXNoKGcpOyB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgLy8gIyMjIGBmb3JHcmFwaHNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgZ3JhcGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yR3JhcGhzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JHcmFwaHNCeUlSSShcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHN1YmplY3QsICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGZvckdyYXBoc0J5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvckdyYXBoc0J5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgZm9yICh2YXIgZ3JhcGggaW4gdGhpcy5fZ3JhcGhzKSB7XG4gICAgICB0aGlzLnNvbWVCeUlSSShmdW5jdGlvbiAocXVhZCkge1xuICAgICAgICBjYWxsYmFjayhxdWFkLmdyYXBoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEhhbHQgaXRlcmF0aW9uIG9mIHNvbWUoKVxuICAgICAgfSwgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBjcmVhdGVCbGFua05vZGVgIGNyZWF0ZXMgYSBuZXcgYmxhbmsgbm9kZSwgcmV0dXJuaW5nIGl0cyBuYW1lXG4gIGNyZWF0ZUJsYW5rTm9kZTogZnVuY3Rpb24gKHN1Z2dlc3RlZE5hbWUpIHtcbiAgICB2YXIgbmFtZSwgaW5kZXg7XG4gICAgLy8gR2VuZXJhdGUgYSBuYW1lIGJhc2VkIG9uIHRoZSBzdWdnZXN0ZWQgbmFtZVxuICAgIGlmIChzdWdnZXN0ZWROYW1lKSB7XG4gICAgICBuYW1lID0gc3VnZ2VzdGVkTmFtZSA9ICdfOicgKyBzdWdnZXN0ZWROYW1lLCBpbmRleCA9IDE7XG4gICAgICB3aGlsZSAodGhpcy5faWRzW25hbWVdKVxuICAgICAgICBuYW1lID0gc3VnZ2VzdGVkTmFtZSArIGluZGV4Kys7XG4gICAgfVxuICAgIC8vIEdlbmVyYXRlIGEgZ2VuZXJpYyBibGFuayBub2RlIG5hbWVcbiAgICBlbHNlIHtcbiAgICAgIGRvIHsgbmFtZSA9ICdfOmInICsgdGhpcy5fYmxhbmtOb2RlSW5kZXgrKzsgfVxuICAgICAgd2hpbGUgKHRoaXMuX2lkc1tuYW1lXSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgYmxhbmsgbm9kZSB0byB0aGUgZW50aXRpZXMsIGF2b2lkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9pZHNbbmFtZV0gPSArK3RoaXMuX2lkO1xuICAgIHRoaXMuX2VudGl0aWVzW3RoaXMuX2lkXSA9IG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0sXG59O1xuXG4vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nXG5mdW5jdGlvbiBpc1N0cmluZyhzKSB7XG4gIHJldHVybiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgfHwgcyBpbnN0YW5jZW9mIFN0cmluZztcbn1cblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0b3JlO1xuIiwiLy8gKipOM1N0cmVhbVBhcnNlcioqIHBhcnNlcyBhbiBOMyBzdHJlYW0gaW50byBhIHRyaXBsZSBzdHJlYW0uXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtLFxuICAgIHV0aWwgPSByZXF1aXJlKCd1dGlsJyksXG4gICAgTjNQYXJzZXIgPSByZXF1aXJlKCcuL04zUGFyc2VyLmpzJyk7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0cmVhbVBhcnNlcihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOM1N0cmVhbVBhcnNlcikpXG4gICAgcmV0dXJuIG5ldyBOM1N0cmVhbVBhcnNlcihvcHRpb25zKTtcblxuICAvLyBJbml0aWFsaXplIFRyYW5zZm9ybSBiYXNlIGNsYXNzXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIHsgZGVjb2RlU3RyaW5nczogdHJ1ZSB9KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlID0gdHJ1ZTtcblxuICAvLyBTZXQgdXAgcGFyc2VyXG4gIHZhciBzZWxmID0gdGhpcywgcGFyc2VyID0gbmV3IE4zUGFyc2VyKG9wdGlvbnMpLCBvbkRhdGEsIG9uRW5kO1xuICBwYXJzZXIucGFyc2UoXG4gICAgLy8gUGFzcyBkdW1teSBzdHJlYW0gdG8gb2J0YWluIGBkYXRhYCBhbmQgYGVuZGAgY2FsbGJhY2tzXG4gICAgeyBvbjogZnVuY3Rpb24gKGV2ZW50LCBjYikgeyBldmVudCA9PT0gJ2RhdGEnID8gKG9uRGF0YSA9IGNiKSA6IChvbkVuZCA9IGNiKTsgfSB9LFxuICAgIC8vIEhhbmRsZSB0cmlwbGVzIGJ5IHB1c2hpbmcgdGhlbSBkb3duIHRoZSBwaXBlbGluZVxuICAgIGZ1bmN0aW9uIChlcnJvciwgdCkgeyBlcnJvciAmJiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpIHx8IHQgJiYgc2VsZi5wdXNoKHQpOyB9LFxuICAgIC8vIEVtaXQgcHJlZml4ZXMgdGhyb3VnaCB0aGUgYHByZWZpeGAgZXZlbnRcbiAgICBmdW5jdGlvbiAocHJlZml4LCB1cmkpIHsgc2VsZi5lbWl0KCdwcmVmaXgnLCBwcmVmaXgsIHVyaSk7IH0pO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyB0aHJvdWdoIHBhcnNlciBjYWxsYmFja3NcbiAgdGhpcy5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkgeyBvbkRhdGEoY2h1bmspOyBkb25lKCk7IH07XG4gIHRoaXMuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHsgb25FbmQoKTsgZG9uZSgpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVBhcnNlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0cmVhbVBhcnNlcjtcbiIsIi8vICoqTjNTdHJlYW1Xcml0ZXIqKiBzZXJpYWxpemVzIGEgdHJpcGxlIHN0cmVhbSBpbnRvIGFuIE4zIHN0cmVhbS5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm0sXG4gICAgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSxcbiAgICBOM1dyaXRlciA9IHJlcXVpcmUoJy4vTjNXcml0ZXIuanMnKTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RyZWFtV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpO1xuXG4gIC8vIEluaXRpYWxpemUgVHJhbnNmb3JtIGJhc2UgY2xhc3NcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLm9iamVjdE1vZGUgPSB0cnVlO1xuXG4gIC8vIFNldCB1cCB3cml0ZXIgd2l0aCBhIGR1bW15IHN0cmVhbSBvYmplY3RcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd3JpdGVyID0gbmV3IE4zV3JpdGVyKHtcbiAgICB3cml0ZTogZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHsgc2VsZi5wdXNoKGNodW5rKTsgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTsgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaykgeyBzZWxmLnB1c2gobnVsbCk7IGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7IH0sXG4gIH0sIG9wdGlvbnMpO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyBvbiB0b3Agb2Ygd3JpdGVyXG4gIHRoaXMuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uICh0cmlwbGUsIGVuY29kaW5nLCBkb25lKSB7IHdyaXRlci5hZGRUcmlwbGUodHJpcGxlLCBkb25lKTsgfTtcbiAgdGhpcy5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkgeyB3cml0ZXIuZW5kKGRvbmUpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVdyaXRlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0cmVhbVdyaXRlcjtcbiIsIi8vICoqTjNVdGlsKiogcHJvdmlkZXMgTjMgdXRpbGl0eSBmdW5jdGlvbnMuXG5cbnZhciBYc2QgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjJztcbnZhciBYc2RTdHJpbmcgID0gWHNkICsgJ3N0cmluZyc7XG52YXIgWHNkSW50ZWdlciA9IFhzZCArICdpbnRlZ2VyJztcbnZhciBYc2REb3VibGUgPSBYc2QgKyAnZG91YmxlJztcbnZhciBYc2RCb29sZWFuID0gWHNkICsgJ2Jvb2xlYW4nO1xudmFyIFJkZkxhbmdTdHJpbmcgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnO1xuXG52YXIgTjNVdGlsID0ge1xuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYW4gSVJJIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzSVJJOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2UgaWYgKGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHtcbiAgICAgIHZhciBmaXJzdENoYXIgPSBlbnRpdHlbMF07XG4gICAgICByZXR1cm4gZmlyc3RDaGFyICE9PSAnXCInICYmIGZpcnN0Q2hhciAhPT0gJ18nO1xuICAgIH1cbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzTGl0ZXJhbDogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50aXR5ID09PSAnc3RyaW5nJyAmJiBlbnRpdHlbMF0gPT09ICdcIic7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgYmxhbmsgbm9kZSBpbiB0aGUgTjMgbGlicmFyeVxuICBpc0JsYW5rOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRpdHkgPT09ICdzdHJpbmcnICYmIGVudGl0eS5zdWJzdHIoMCwgMikgPT09ICdfOic7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5IHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgZ3JhcGhcbiAgaXNEZWZhdWx0R3JhcGg6IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICByZXR1cm4gIWVudGl0eTtcbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiB0cmlwbGUgaXMgaW4gdGhlIGRlZmF1bHQgZ3JhcGhcbiAgaW5EZWZhdWx0R3JhcGg6IGZ1bmN0aW9uICh0cmlwbGUpIHtcbiAgICByZXR1cm4gIXRyaXBsZS5ncmFwaDtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxWYWx1ZTogZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICB2YXIgbWF0Y2ggPSAvXlwiKFteXSopXCIvLmV4ZWMobGl0ZXJhbCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgIHRocm93IG5ldyBFcnJvcihsaXRlcmFsICsgJyBpcyBub3QgYSBsaXRlcmFsJyk7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9LFxuXG4gIC8vIEdldHMgdGhlIHR5cGUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxUeXBlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpcXF5cXF4oW15cIl0rKXwoQClbXkBcIl0rKT8kLy5leGVjKGxpdGVyYWwpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobGl0ZXJhbCArICcgaXMgbm90IGEgbGl0ZXJhbCcpO1xuICAgIHJldHVybiBtYXRjaFsxXSB8fCAobWF0Y2hbMl0gPyBSZGZMYW5nU3RyaW5nIDogWHNkU3RyaW5nKTtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBsYW5ndWFnZSBvZiBhIGxpdGVyYWwgaW4gdGhlIE4zIGxpYnJhcnlcbiAgZ2V0TGl0ZXJhbExhbmd1YWdlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpAKFteQFwiXSspfFxcXlxcXlteXCJdKyk/JC8uZXhlYyhsaXRlcmFsKTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxpdGVyYWwgKyAnIGlzIG5vdCBhIGxpdGVyYWwnKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgcHJlZml4ZWQgbmFtZVxuICBpc1ByZWZpeGVkTmFtZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50aXR5ID09PSAnc3RyaW5nJyAmJiAvXlteOlxcL1wiJ10qOlteOlxcL1wiJ10rJC8udGVzdChlbnRpdHkpO1xuICB9LFxuXG4gIC8vIEV4cGFuZHMgdGhlIHByZWZpeGVkIG5hbWUgdG8gYSBmdWxsIElSSSAoYWxzbyB3aGVuIGl0IG9jY3VycyBhcyBhIGxpdGVyYWwncyB0eXBlKVxuICBleHBhbmRQcmVmaXhlZE5hbWU6IGZ1bmN0aW9uIChwcmVmaXhlZE5hbWUsIHByZWZpeGVzKSB7XG4gICAgdmFyIG1hdGNoID0gLyg/Ol58XCJcXF5cXF4pKFteOlxcLyNcIidcXF5fXSopOlteXFwvXSokLy5leGVjKHByZWZpeGVkTmFtZSksIHByZWZpeCwgYmFzZSwgaW5kZXg7XG4gICAgaWYgKG1hdGNoKVxuICAgICAgcHJlZml4ID0gbWF0Y2hbMV0sIGJhc2UgPSBwcmVmaXhlc1twcmVmaXhdLCBpbmRleCA9IG1hdGNoLmluZGV4O1xuICAgIGlmIChiYXNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gcHJlZml4ZWROYW1lO1xuXG4gICAgLy8gVGhlIG1hdGNoIGluZGV4IGlzIG5vbi16ZXJvIHdoZW4gZXhwYW5kaW5nIGEgbGl0ZXJhbCdzIHR5cGVcbiAgICByZXR1cm4gaW5kZXggPT09IDAgPyBiYXNlICsgcHJlZml4ZWROYW1lLnN1YnN0cihwcmVmaXgubGVuZ3RoICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgOiBwcmVmaXhlZE5hbWUuc3Vic3RyKDAsIGluZGV4ICsgMykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBwcmVmaXhlZE5hbWUuc3Vic3RyKGluZGV4ICsgcHJlZml4Lmxlbmd0aCArIDQpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYW4gSVJJIGluIE4zLmpzIHJlcHJlc2VudGF0aW9uXG4gIGNyZWF0ZUlSSTogZnVuY3Rpb24gKGlyaSkge1xuICAgIHJldHVybiBpcmkgJiYgaXJpWzBdID09PSAnXCInID8gTjNVdGlsLmdldExpdGVyYWxWYWx1ZShpcmkpIDogaXJpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYSBsaXRlcmFsIGluIE4zLmpzIHJlcHJlc2VudGF0aW9uXG4gIGNyZWF0ZUxpdGVyYWw6IGZ1bmN0aW9uICh2YWx1ZSwgbW9kaWZpZXIpIHtcbiAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIG1vZGlmaWVyID0gWHNkQm9vbGVhbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNGaW5pdGUodmFsdWUpKVxuICAgICAgICAgIG1vZGlmaWVyID0gdmFsdWUgJSAxID09PSAwID8gWHNkSW50ZWdlciA6IFhzZERvdWJsZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbW9kaWZpZXIgPSBYc2REb3VibGU7XG4gICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4gMCA/ICdJTkYnIDogJy1JTkYnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnXCInICsgdmFsdWUgK1xuICAgICAgICAgICAoL15bYS16XSsoLVthLXowLTldKykqJC9pLnRlc3QobW9kaWZpZXIpID8gJ1wiQCcgICsgbW9kaWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1wiXl4nICsgbW9kaWZpZXIpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByZXBlbmRzIHRoZSBnaXZlbiBJUkkgdG8gYSBsb2NhbCBuYW1lXG4gIHByZWZpeDogZnVuY3Rpb24gKGlyaSkge1xuICAgIHJldHVybiBOM1V0aWwucHJlZml4ZXMoeyAnJzogaXJpIH0pKCcnKTtcbiAgfSxcblxuICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgcmVnaXN0ZXJpbmcgYW5kIGV4cGFuZGluZyBwcmVmaXhlc1xuICBwcmVmaXhlczogZnVuY3Rpb24gKGRlZmF1bHRQcmVmaXhlcykge1xuICAgIC8vIEFkZCBhbGwgb2YgdGhlIGRlZmF1bHQgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAodmFyIHByZWZpeCBpbiBkZWZhdWx0UHJlZml4ZXMpXG4gICAgICBwcm9jZXNzUHJlZml4KHByZWZpeCwgZGVmYXVsdFByZWZpeGVzW3ByZWZpeF0pO1xuXG4gICAgLy8gUmVnaXN0ZXJzIGEgbmV3IHByZWZpeCAoaWYgYW4gSVJJIHdhcyBzcGVjaWZpZWQpXG4gICAgLy8gb3IgcmV0cmlldmVzIGEgZnVuY3Rpb24gdGhhdCBleHBhbmRzIGFuIGV4aXN0aW5nIHByZWZpeCAoaWYgbm8gSVJJIHdhcyBzcGVjaWZpZWQpXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1ByZWZpeChwcmVmaXgsIGlyaSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHByZWZpeCBpZiBhbiBJUkkgaXMgc3BlY2lmaWVkIG9yIHRoZSBwcmVmaXggZG9lc24ndCBleGlzdFxuICAgICAgaWYgKGlyaSB8fCAhKHByZWZpeCBpbiBwcmVmaXhlcykpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaXJpID0gaXJpIHx8ICcnO1xuICAgICAgICAvLyBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGV4cGFuZHMgdGhlIHByZWZpeFxuICAgICAgICBwcmVmaXhlc1twcmVmaXhdID0gZnVuY3Rpb24gKGxvY2FsTmFtZSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZVtsb2NhbE5hbWVdIHx8IChjYWNoZVtsb2NhbE5hbWVdID0gaXJpICsgbG9jYWxOYW1lKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmVmaXhlc1twcmVmaXhdO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc1ByZWZpeDtcbiAgfSxcbn07XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNVdGlsO1xuIiwiLy8gKipOM1dyaXRlcioqIHdyaXRlcyBOMyBkb2N1bWVudHMuXG5cbi8vIE1hdGNoZXMgYSBsaXRlcmFsIGFzIHJlcHJlc2VudGVkIGluIG1lbW9yeSBieSB0aGUgTjMgbGlicmFyeVxudmFyIE4zTGl0ZXJhbE1hdGNoZXIgPSAvXlwiKFteXSopXCIoPzpcXF5cXF4oLispfEAoW1xcLWEtel0rKSk/JC9pO1xuXG4vLyByZGY6dHlwZSBwcmVkaWNhdGUgKGZvciAnYScgYWJicmV2aWF0aW9uKVxudmFyIFJERl9QUkVGSVggPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycsXG4gICAgUkRGX1RZUEUgICA9IFJERl9QUkVGSVggKyAndHlwZSc7XG5cbi8vIENoYXJhY3RlcnMgaW4gbGl0ZXJhbHMgdGhhdCByZXF1aXJlIGVzY2FwaW5nXG52YXIgZXNjYXBlICAgID0gL1tcIlxcXFxcXHRcXG5cXHJcXGJcXGZcXHUwMDAwLVxcdTAwMTlcXHVkODAwLVxcdWRiZmZdLyxcbiAgICBlc2NhcGVBbGwgPSAvW1wiXFxcXFxcdFxcblxcclxcYlxcZlxcdTAwMDAtXFx1MDAxOV18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXS9nLFxuICAgIGVzY2FwZVJlcGxhY2VtZW50cyA9IHtcbiAgICAgICdcXFxcJzogJ1xcXFxcXFxcJywgJ1wiJzogJ1xcXFxcIicsICdcXHQnOiAnXFxcXHQnLFxuICAgICAgJ1xcbic6ICdcXFxcbicsICdcXHInOiAnXFxcXHInLCAnXFxiJzogJ1xcXFxiJywgJ1xcZic6ICdcXFxcZicsXG4gICAgfTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zV3JpdGVyKG91dHB1dFN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNXcml0ZXIpKVxuICAgIHJldHVybiBuZXcgTjNXcml0ZXIob3V0cHV0U3RyZWFtLCBvcHRpb25zKTtcblxuICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhIHN0cmVhbVxuICBpZiAob3V0cHV0U3RyZWFtICYmIHR5cGVvZiBvdXRwdXRTdHJlYW0ud3JpdGUgIT09ICdmdW5jdGlvbicpXG4gICAgb3B0aW9ucyA9IG91dHB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtID0gbnVsbDtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gSWYgbm8gb3V0cHV0IHN0cmVhbSBnaXZlbiwgc2VuZCB0aGUgb3V0cHV0IGFzIHN0cmluZyB0aHJvdWdoIHRoZSBlbmQgY2FsbGJhY2tcbiAgaWYgKCFvdXRwdXRTdHJlYW0pIHtcbiAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtID0ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHsgb3V0cHV0ICs9IGNodW5rOyBkb25lICYmIGRvbmUoKTsgfSxcbiAgICAgIGVuZDogICBmdW5jdGlvbiAoZG9uZSkgeyBkb25lICYmIGRvbmUobnVsbCwgb3V0cHV0KTsgfSxcbiAgICB9O1xuICAgIHRoaXMuX2VuZFN0cmVhbSA9IHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtO1xuICAgIHRoaXMuX2VuZFN0cmVhbSA9IG9wdGlvbnMuZW5kID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRpb25zLmVuZDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgd3JpdGVyLCBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdFxuICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgaWYgKCEoL3RyaXBsZXxxdWFkL2kpLnRlc3Qob3B0aW9ucy5mb3JtYXQpKSB7XG4gICAgdGhpcy5fZ3JhcGggPSAnJztcbiAgICB0aGlzLl9wcmVmaXhJUklzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBvcHRpb25zLnByZWZpeGVzICYmIHRoaXMuYWRkUHJlZml4ZXMob3B0aW9ucy5wcmVmaXhlcyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5fd3JpdGVUcmlwbGUgPSB0aGlzLl93cml0ZVRyaXBsZUxpbmU7XG4gIH1cbn1cblxuTjNXcml0ZXIucHJvdG90eXBlID0ge1xuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF93cml0ZWAgd3JpdGVzIHRoZSBhcmd1bWVudCB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBfd3JpdGU6IGZ1bmN0aW9uIChzdHJpbmcsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtLndyaXRlKHN0cmluZywgJ3V0ZjgnLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgICAvLyAjIyMgYF93cml0ZVRyaXBsZWAgd3JpdGVzIHRoZSB0cmlwbGUgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgX3dyaXRlVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoLCBkb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdyaXRlIHRoZSBncmFwaCdzIGxhYmVsIGlmIGl0IGhhcyBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy5fZ3JhcGggIT09IGdyYXBoKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwcmV2aW91cyBncmFwaCBhbmQgc3RhcnQgdGhlIG5ldyBvbmVcbiAgICAgICAgdGhpcy5fd3JpdGUoKHRoaXMuX3N1YmplY3QgPT09IG51bGwgPyAnJyA6ICh0aGlzLl9ncmFwaCA/ICdcXG59XFxuJyA6ICcuXFxuJykpICtcbiAgICAgICAgICAgICAgICAgICAgKGdyYXBoID8gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoZ3JhcGgpICsgJyB7XFxuJyA6ICcnKSk7XG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgICAvLyBEb24ndCB0cmVhdCBpZGVudGljYWwgYmxhbmsgbm9kZXMgYXMgcmVwZWF0aW5nIGdyYXBoc1xuICAgICAgICB0aGlzLl9ncmFwaCA9IGdyYXBoWzBdICE9PSAnWycgPyBncmFwaCA6ICddJztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHJlcGVhdCB0aGUgc3ViamVjdCBpZiBpdCdzIHRoZSBzYW1lXG4gICAgICBpZiAodGhpcy5fc3ViamVjdCA9PT0gc3ViamVjdCkge1xuICAgICAgICAvLyBEb24ndCByZXBlYXQgdGhlIHByZWRpY2F0ZSBpZiBpdCdzIHRoZSBzYW1lXG4gICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGUgPT09IHByZWRpY2F0ZSlcbiAgICAgICAgICB0aGlzLl93cml0ZSgnLCAnICsgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgICAgICAvLyBTYW1lIHN1YmplY3QsIGRpZmZlcmVudCBwcmVkaWNhdGVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX3dyaXRlKCc7XFxuICAgICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVByZWRpY2F0ZSh0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVPYmplY3Qob2JqZWN0KSwgZG9uZSk7XG4gICAgICB9XG4gICAgICAvLyBEaWZmZXJlbnQgc3ViamVjdDsgd3JpdGUgdGhlIHdob2xlIHRyaXBsZVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl93cml0ZSgodGhpcy5fc3ViamVjdCA9PT0gbnVsbCA/ICcnIDogJy5cXG4nKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVN1YmplY3QodGhpcy5fc3ViamVjdCA9IHN1YmplY3QpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlUHJlZGljYXRlKHRoaXMuX3ByZWRpY2F0ZSA9IHByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVPYmplY3Qob2JqZWN0KSwgZG9uZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBkb25lICYmIGRvbmUoZXJyb3IpOyB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfd3JpdGVUcmlwbGVMaW5lYCB3cml0ZXMgdGhlIHRyaXBsZSBvciBxdWFkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFzIGEgc2luZ2xlIGxpbmVcbiAgX3dyaXRlVHJpcGxlTGluZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIC8vIERvbid0IHVzZSBwcmVmaXhlc1xuICAgIGRlbGV0ZSB0aGlzLl9wcmVmaXhNYXRjaDtcbiAgICAvLyBXcml0ZSB0aGUgdHJpcGxlXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3dyaXRlKHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHN1YmplY3QpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCkgK1xuICAgICAgICAgICAgICAgICAgKGdyYXBoID8gJyAnICsgdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoZ3JhcGgpICsgJy5cXG4nIDogJy5cXG4nKSwgZG9uZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBkb25lICYmIGRvbmUoZXJyb3IpOyB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlSXJpT3JCbGFua05vZGVgIHJlcHJlc2VudHMgYW4gSVJJIG9yIGJsYW5rIG5vZGVcbiAgX2VuY29kZUlyaU9yQmxhbmtOb2RlOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgLy8gQSBibGFuayBub2RlIG9yIGxpc3QgaXMgcmVwcmVzZW50ZWQgYXMtaXNcbiAgICB2YXIgZmlyc3RDaGFyID0gZW50aXR5WzBdO1xuICAgIGlmIChmaXJzdENoYXIgPT09ICdbJyB8fCBmaXJzdENoYXIgPT09ICcoJyB8fCBmaXJzdENoYXIgPT09ICdfJyAmJiBlbnRpdHlbMV0gPT09ICc6JylcbiAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgIGlmIChlc2NhcGUudGVzdChlbnRpdHkpKVxuICAgICAgZW50aXR5ID0gZW50aXR5LnJlcGxhY2UoZXNjYXBlQWxsLCBjaGFyYWN0ZXJSZXBsYWNlcik7XG4gICAgLy8gVHJ5IHRvIHJlcHJlc2VudCB0aGUgSVJJIGFzIHByZWZpeGVkIG5hbWVcbiAgICB2YXIgcHJlZml4TWF0Y2ggPSB0aGlzLl9wcmVmaXhSZWdleC5leGVjKGVudGl0eSk7XG4gICAgcmV0dXJuICFwcmVmaXhNYXRjaCA/ICc8JyArIGVudGl0eSArICc+JyA6XG4gICAgICAgICAgICghcHJlZml4TWF0Y2hbMV0gPyBlbnRpdHkgOiB0aGlzLl9wcmVmaXhJUklzW3ByZWZpeE1hdGNoWzFdXSArIHByZWZpeE1hdGNoWzJdKTtcbiAgfSxcblxuICAvLyAjIyMgYF9lbmNvZGVMaXRlcmFsYCByZXByZXNlbnRzIGEgbGl0ZXJhbFxuICBfZW5jb2RlTGl0ZXJhbDogZnVuY3Rpb24gKHZhbHVlLCB0eXBlLCBsYW5ndWFnZSkge1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZXNjYXBlLnRlc3QodmFsdWUpKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKGVzY2FwZUFsbCwgY2hhcmFjdGVyUmVwbGFjZXIpO1xuICAgIC8vIFdyaXRlIHRoZSBsaXRlcmFsLCBwb3NzaWJseSB3aXRoIHR5cGUgb3IgbGFuZ3VhZ2VcbiAgICBpZiAobGFuZ3VhZ2UpXG4gICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiQCcgKyBsYW5ndWFnZTtcbiAgICBlbHNlIGlmICh0eXBlKVxuICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIl5eJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHR5cGUpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZVN1YmplY3RgIHJlcHJlc2VudHMgYSBzdWJqZWN0XG4gIF9lbmNvZGVTdWJqZWN0OiBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgIGlmIChzdWJqZWN0WzBdID09PSAnXCInKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGxpdGVyYWwgYXMgc3ViamVjdCBpcyBub3QgYWxsb3dlZDogJyArIHN1YmplY3QpO1xuICAgIC8vIERvbid0IHRyZWF0IGlkZW50aWNhbCBibGFuayBub2RlcyBhcyByZXBlYXRpbmcgc3ViamVjdHNcbiAgICBpZiAoc3ViamVjdFswXSA9PT0gJ1snKVxuICAgICAgdGhpcy5fc3ViamVjdCA9ICddJztcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoc3ViamVjdCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlUHJlZGljYXRlYCByZXByZXNlbnRzIGEgcHJlZGljYXRlXG4gIF9lbmNvZGVQcmVkaWNhdGU6IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcbiAgICBpZiAocHJlZGljYXRlWzBdID09PSAnXCInKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGxpdGVyYWwgYXMgcHJlZGljYXRlIGlzIG5vdCBhbGxvd2VkOiAnICsgcHJlZGljYXRlKTtcbiAgICByZXR1cm4gcHJlZGljYXRlID09PSBSREZfVFlQRSA/ICdhJyA6IHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHByZWRpY2F0ZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlT2JqZWN0YCByZXByZXNlbnRzIGFuIG9iamVjdFxuICBfZW5jb2RlT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgLy8gUmVwcmVzZW50IGFuIElSSSBvciBibGFuayBub2RlXG4gICAgaWYgKG9iamVjdFswXSAhPT0gJ1wiJylcbiAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShvYmplY3QpO1xuICAgIC8vIFJlcHJlc2VudCBhIGxpdGVyYWxcbiAgICB2YXIgbWF0Y2ggPSBOM0xpdGVyYWxNYXRjaGVyLmV4ZWMob2JqZWN0KTtcbiAgICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGl0ZXJhbDogJyArIG9iamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUxpdGVyYWwobWF0Y2hbMV0sIG1hdGNoWzJdLCBtYXRjaFszXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfYmxvY2tlZFdyaXRlYCByZXBsYWNlcyBgX3dyaXRlYCBhZnRlciB0aGUgd3JpdGVyIGhhcyBiZWVuIGNsb3NlZFxuICBfYmxvY2tlZFdyaXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgd3JpdGUgYmVjYXVzZSB0aGUgd3JpdGVyIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFRyaXBsZWAgYWRkcyB0aGUgdHJpcGxlIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFRyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIC8vIFRoZSB0cmlwbGUgd2FzIGdpdmVuIGFzIGEgdHJpcGxlIG9iamVjdCwgc28gc2hpZnQgcGFyYW1ldGVyc1xuICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuX3dyaXRlVHJpcGxlKHN1YmplY3Quc3ViamVjdCwgc3ViamVjdC5wcmVkaWNhdGUsIHN1YmplY3Qub2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5ncmFwaCB8fCAnJywgcHJlZGljYXRlKTtcbiAgICAvLyBUaGUgb3B0aW9uYWwgYGdyYXBoYCBwYXJhbWV0ZXIgd2FzIG5vdCBwcm92aWRlZFxuICAgIGVsc2UgaWYgKHR5cGVvZiBncmFwaCAhPT0gJ3N0cmluZycpXG4gICAgICB0aGlzLl93cml0ZVRyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgJycsIGdyYXBoKTtcbiAgICAvLyBUaGUgYGdyYXBoYCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkXG4gICAgZWxzZVxuICAgICAgdGhpcy5fd3JpdGVUcmlwbGUoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoLCBkb25lKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFRyaXBsZXNgIGFkZHMgdGhlIHRyaXBsZXMgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgYWRkVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaXBsZXMubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLmFkZFRyaXBsZSh0cmlwbGVzW2ldKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGAgYWRkcyB0aGUgcHJlZml4IHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFByZWZpeDogZnVuY3Rpb24gKHByZWZpeCwgaXJpLCBkb25lKSB7XG4gICAgdmFyIHByZWZpeGVzID0ge307XG4gICAgcHJlZml4ZXNbcHJlZml4XSA9IGlyaTtcbiAgICB0aGlzLmFkZFByZWZpeGVzKHByZWZpeGVzLCBkb25lKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGVzYCBhZGRzIHRoZSBwcmVmaXhlcyB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRQcmVmaXhlczogZnVuY3Rpb24gKHByZWZpeGVzLCBkb25lKSB7XG4gICAgLy8gQWRkIGFsbCB1c2VmdWwgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4SVJJcyA9IHRoaXMuX3ByZWZpeElSSXMsIGhhc1ByZWZpeGVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcHJlZml4IGluIHByZWZpeGVzKSB7XG4gICAgICAvLyBWZXJpZnkgd2hldGhlciB0aGUgcHJlZml4IGNhbiBiZSB1c2VkIGFuZCBkb2VzIG5vdCBleGlzdCB5ZXRcbiAgICAgIHZhciBpcmkgPSBwcmVmaXhlc1twcmVmaXhdO1xuICAgICAgaWYgKC9bI1xcL10kLy50ZXN0KGlyaSkgJiYgcHJlZml4SVJJc1tpcmldICE9PSAocHJlZml4ICs9ICc6JykpIHtcbiAgICAgICAgaGFzUHJlZml4ZXMgPSB0cnVlO1xuICAgICAgICBwcmVmaXhJUklzW2lyaV0gPSBwcmVmaXg7XG4gICAgICAgIC8vIEZpbmlzaCBhIHBvc3NpYmxlIHBlbmRpbmcgdHJpcGxlXG4gICAgICAgIGlmICh0aGlzLl9zdWJqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fd3JpdGUodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpO1xuICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsLCB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIHByZWZpeFxuICAgICAgICB0aGlzLl93cml0ZSgnQHByZWZpeCAnICsgcHJlZml4ICsgJyA8JyArIGlyaSArICc+LlxcbicpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZWNyZWF0ZSB0aGUgcHJlZml4IG1hdGNoZXJcbiAgICBpZiAoaGFzUHJlZml4ZXMpIHtcbiAgICAgIHZhciBJUklsaXN0ID0gJycsIHByZWZpeExpc3QgPSAnJztcbiAgICAgIGZvciAodmFyIHByZWZpeElSSSBpbiBwcmVmaXhJUklzKSB7XG4gICAgICAgIElSSWxpc3QgKz0gSVJJbGlzdCA/ICd8JyArIHByZWZpeElSSSA6IHByZWZpeElSSTtcbiAgICAgICAgcHJlZml4TGlzdCArPSAocHJlZml4TGlzdCA/ICd8JyA6ICcnKSArIHByZWZpeElSSXNbcHJlZml4SVJJXTtcbiAgICAgIH1cbiAgICAgIElSSWxpc3QgPSBJUklsaXN0LnJlcGxhY2UoL1tcXF1cXC9cXChcXClcXCpcXCtcXD9cXC5cXFxcXFwkXS9nLCAnXFxcXCQmJyk7XG4gICAgICB0aGlzLl9wcmVmaXhSZWdleCA9IG5ldyBSZWdFeHAoJ14oPzonICsgcHJlZml4TGlzdCArICcpW15cXC9dKiR8JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ14oJyArIElSSWxpc3QgKyAnKShbYS16QS1aXVtcXFxcLV9hLXpBLVowLTldKikkJyk7XG4gICAgfVxuICAgIC8vIEVuZCBhIHByZWZpeCBibG9jayB3aXRoIGEgbmV3bGluZVxuICAgIHRoaXMuX3dyaXRlKGhhc1ByZWZpeGVzID8gJ1xcbicgOiAnJywgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBibGFua2AgY3JlYXRlcyBhIGJsYW5rIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudFxuICBibGFuazogZnVuY3Rpb24gKHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJlZGljYXRlLCBjaGlsZCwgbGVuZ3RoO1xuICAgIC8vIEVtcHR5IGJsYW5rIG5vZGVcbiAgICBpZiAocHJlZGljYXRlID09PSB1bmRlZmluZWQpXG4gICAgICBjaGlsZHJlbiA9IFtdO1xuICAgIC8vIEJsYW5rIG5vZGUgcGFzc2VkIGFzIGJsYW5rKFwicHJlZGljYXRlXCIsIFwib2JqZWN0XCIpXG4gICAgZWxzZSBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICBjaGlsZHJlbiA9IFt7IHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCB9XTtcbiAgICAvLyBCbGFuayBub2RlIHBhc3NlZCBhcyBibGFuayh7IHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCB9KVxuICAgIGVsc2UgaWYgKCEoJ2xlbmd0aCcgaW4gcHJlZGljYXRlKSlcbiAgICAgIGNoaWxkcmVuID0gW3ByZWRpY2F0ZV07XG5cbiAgICBzd2l0Y2ggKGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIEdlbmVyYXRlIGFuIGVtcHR5IGJsYW5rIG5vZGVcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJ1tdJztcbiAgICAvLyBHZW5lcmF0ZSBhIG5vbi1uZXN0ZWQgb25lLXRyaXBsZSBibGFuayBub2RlXG4gICAgY2FzZSAxOlxuICAgICAgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZC5vYmplY3RbMF0gIT09ICdbJylcbiAgICAgICAgcmV0dXJuICdbICcgKyB0aGlzLl9lbmNvZGVQcmVkaWNhdGUoY2hpbGQucHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KGNoaWxkLm9iamVjdCkgKyAnIF0nO1xuICAgIC8vIEdlbmVyYXRlIGEgbXVsdGktdHJpcGxlIG9yIG5lc3RlZCBibGFuayBub2RlXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBjb250ZW50cyA9ICdbJztcbiAgICAgIC8vIFdyaXRlIGFsbCB0cmlwbGVzIGluIG9yZGVyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIC8vIFdyaXRlIG9ubHkgdGhlIG9iamVjdCBpcyB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91c1xuICAgICAgICBpZiAoY2hpbGQucHJlZGljYXRlID09PSBwcmVkaWNhdGUpXG4gICAgICAgICAgY29udGVudHMgKz0gJywgJyArIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpO1xuICAgICAgICAvLyBPdGhlcndpc2UsIHdyaXRlIHRoZSBwcmVkaWNhdGUgYW5kIHRoZSBvYmplY3RcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGVudHMgKz0gKGkgPyAnO1xcbiAgJyA6ICdcXG4gICcpICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVQcmVkaWNhdGUoY2hpbGQucHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KGNoaWxkLm9iamVjdCk7XG4gICAgICAgICAgcHJlZGljYXRlID0gY2hpbGQucHJlZGljYXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudHMgKyAnXFxuXSc7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgbGlzdGAgY3JlYXRlcyBhIGxpc3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50XG4gIGxpc3Q6IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIHZhciBsZW5ndGggPSBlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggfHwgMCwgY29udGVudHMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgICAgY29udGVudHNbaV0gPSB0aGlzLl9lbmNvZGVPYmplY3QoZWxlbWVudHNbaV0pO1xuICAgIHJldHVybiAnKCcgKyBjb250ZW50cy5qb2luKCcgJykgKyAnKSc7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcHJlZml4UmVnZXhgIG1hdGNoZXMgYSBwcmVmaXhlZCBuYW1lIG9yIElSSSB0aGF0IGJlZ2lucyB3aXRoIG9uZSBvZiB0aGUgYWRkZWQgcHJlZml4ZXNcbiAgX3ByZWZpeFJlZ2V4OiAvJDBeLyxcblxuICAvLyAjIyMgYGVuZGAgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGVuZDogZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAvLyBGaW5pc2ggYSBwb3NzaWJsZSBwZW5kaW5nIHRyaXBsZVxuICAgIGlmICh0aGlzLl9zdWJqZWN0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl93cml0ZSh0aGlzLl9ncmFwaCA/ICdcXG59XFxuJyA6ICcuXFxuJyk7XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gRGlzYWxsb3cgZnVydGhlciB3cml0aW5nXG4gICAgdGhpcy5fd3JpdGUgPSB0aGlzLl9ibG9ja2VkV3JpdGU7XG5cbiAgICAvLyBUcnkgdG8gZW5kIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgZW5zdXJpbmcgZG9uZSBpcyBjYWxsZWQgZXhhY3RseSBvbmUgdGltZVxuICAgIHZhciBzaW5nbGVEb25lID0gZG9uZSAmJiBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkgeyBzaW5nbGVEb25lID0gbnVsbCwgZG9uZShlcnJvciwgcmVzdWx0KTsgfTtcbiAgICBpZiAodGhpcy5fZW5kU3RyZWFtKSB7XG4gICAgICB0cnkgeyByZXR1cm4gdGhpcy5fb3V0cHV0U3RyZWFtLmVuZChzaW5nbGVEb25lKTsgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7IC8qIGVycm9yIGNsb3Npbmcgc3RyZWFtICovIH1cbiAgICB9XG4gICAgc2luZ2xlRG9uZSAmJiBzaW5nbGVEb25lKCk7XG4gIH0sXG59O1xuXG4vLyBSZXBsYWNlcyBhIGNoYXJhY3RlciBieSBpdHMgZXNjYXBlZCB2ZXJzaW9uXG5mdW5jdGlvbiBjaGFyYWN0ZXJSZXBsYWNlcihjaGFyYWN0ZXIpIHtcbiAgLy8gUmVwbGFjZSBhIHNpbmdsZSBjaGFyYWN0ZXIgYnkgaXRzIGVzY2FwZWQgdmVyc2lvblxuICB2YXIgcmVzdWx0ID0gZXNjYXBlUmVwbGFjZW1lbnRzW2NoYXJhY3Rlcl07XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFJlcGxhY2UgYSBzaW5nbGUgY2hhcmFjdGVyIHdpdGggaXRzIDQtYml0IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlXG4gICAgaWYgKGNoYXJhY3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJlc3VsdCA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgIHJlc3VsdCA9ICdcXFxcdTAwMDAnLnN1YnN0cigwLCA2IC0gcmVzdWx0Lmxlbmd0aCkgKyByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFJlcGxhY2UgYSBzdXJyb2dhdGUgcGFpciB3aXRoIGl0cyA4LWJpdCB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZVxuICAgIGVsc2Uge1xuICAgICAgcmVzdWx0ID0gKChjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMCArXG4gICAgICAgICAgICAgICAgIGNoYXJhY3Rlci5jaGFyQ29kZUF0KDEpICsgMHgyNDAwKS50b1N0cmluZygxNik7XG4gICAgICByZXN1bHQgPSAnXFxcXFUwMDAwMDAwMCcuc3Vic3RyKDAsIDEwIC0gcmVzdWx0Lmxlbmd0aCkgKyByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNXcml0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtZXJhYmxlLmNhbGwoeyB0b1N0cmluZzogbnVsbCB9LCAndG9TdHJpbmcnKTtcbnZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xudmFyIGRvbnRFbnVtcyA9IFtcblx0J3RvU3RyaW5nJyxcblx0J3RvTG9jYWxlU3RyaW5nJyxcblx0J3ZhbHVlT2YnLFxuXHQnaGFzT3duUHJvcGVydHknLFxuXHQnaXNQcm90b3R5cGVPZicsXG5cdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdCdjb25zdHJ1Y3Rvcidcbl07XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuXHR2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG5cdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xufTtcbnZhciBleGNsdWRlZEtleXMgPSB7XG5cdCRjb25zb2xlOiB0cnVlLFxuXHQkZXh0ZXJuYWw6IHRydWUsXG5cdCRmcmFtZTogdHJ1ZSxcblx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0JGZyYW1lczogdHJ1ZSxcblx0JGlubmVySGVpZ2h0OiB0cnVlLFxuXHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0JG91dGVySGVpZ2h0OiB0cnVlLFxuXHQkb3V0ZXJXaWR0aDogdHJ1ZSxcblx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHQkcGFnZVlPZmZzZXQ6IHRydWUsXG5cdCRwYXJlbnQ6IHRydWUsXG5cdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHQkc2Nyb2xsVG9wOiB0cnVlLFxuXHQkc2Nyb2xsWDogdHJ1ZSxcblx0JHNjcm9sbFk6IHRydWUsXG5cdCRzZWxmOiB0cnVlLFxuXHQkd2Via2l0SW5kZXhlZERCOiB0cnVlLFxuXHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdCR3aW5kb3c6IHRydWVcbn07XG52YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIGhhcy5jYWxsKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn0oKSk7XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1Zykge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0dmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuXHR2YXIgaXNGdW5jdGlvbiA9IHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdHZhciB0aGVLZXlzID0gW107XG5cblx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuXHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhqKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG5cdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGhhc0RvbnRFbnVtQnVnKSB7XG5cdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcblx0XHRcdGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bXNba10gPT09ICdjb25zdHJ1Y3RvcicpICYmIGhhcy5jYWxsKG9iamVjdCwgZG9udEVudW1zW2tdKSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoZUtleXM7XG59O1xuXG5rZXlzU2hpbS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG5cdGlmIChPYmplY3Qua2V5cykge1xuXHRcdHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIFNhZmFyaSA1LjAgYnVnXG5cdFx0XHRyZXR1cm4gKE9iamVjdC5rZXlzKGFyZ3VtZW50cykgfHwgJycpLmxlbmd0aCA9PT0gMjtcblx0XHR9KDEsIDIpKTtcblx0XHRpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcblx0XHRcdHZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblx0XHRcdE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHRcdFx0aWYgKGlzQXJncyhvYmplY3QpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCIvKipcbiogcHJldHR5LWRhdGEgLSBub2RlanMgcGx1Z2luIHRvIHByZXR0eS1wcmludCBvciBtaW5pZnkgZGF0YSBpbiBYTUwsIEpTT04gYW5kIENTUyBmb3JtYXRzLlxuKiAgXG4qIFZlcnNpb24gLSAwLjQwLjBcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxuKiB2a2lyeXVraGluIEAgZ21haWwuY29tXG4qIGh0dHA6Ly93d3cuZXNsaW5zdHJ1Y3Rvci5uZXQvcHJldHR5LWRhdGEvXG4qIFxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcbiogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbFxuKlxuKlx0cGQueG1sKGRhdGEgKSAtIHByZXR0eSBwcmludCBYTUw7XG4qXHRwZC5qc29uKGRhdGEpIC0gcHJldHR5IHByaW50IEpTT047XG4qXHRwZC5jc3MoZGF0YSApIC0gcHJldHR5IHByaW50IENTUztcbipcdHBkLnNxbChkYXRhKSAgLSBwcmV0dHkgcHJpbnQgU1FMO1xuKlxuKlx0cGQueG1sbWluKGRhdGEgWywgcHJlc2VydmVDb21tZW50c10gKSAtIG1pbmlmeSBYTUw7IFxuKlx0cGQuanNvbm1pbihkYXRhKSAgICAgICAgICAgICAgICAgICAgICAtIG1pbmlmeSBKU09OOyBcbipcdHBkLmNzc21pbihkYXRhIFssIHByZXNlcnZlQ29tbWVudHNdICkgLSBtaW5pZnkgQ1NTOyBcbipcdHBkLnNxbG1pbihkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgLSBtaW5pZnkgU1FMOyBcbipcbiogUEFSQU1FVEVSUzpcbipcbipcdEBkYXRhICBcdFx0XHQtIFN0cmluZzsgWE1MLCBKU09OLCBDU1Mgb3IgU1FMIHRleHQgdG8gYmVhdXRpZnk7XG4qIFx0QHByZXNlcnZlQ29tbWVudHNcdC0gQm9vbCAob3B0aW9uYWwsIHVzZWQgaW4gbWlueG1sIGFuZCBtaW5jc3Mgb25seSk7IFxuKlx0XHRcdFx0ICBTZXQgdGhpcyBmbGFnIHRvIHRydWUgdG8gcHJldmVudCByZW1vdmluZyBjb21tZW50cyBmcm9tIEB0ZXh0OyBcbipcdEBSZXR1cm4gXHRcdC0gU3RyaW5nO1xuKlx0XG4qIFVTQUdFOlxuKlx0XG4qXHR2YXIgcGQgID0gcmVxdWlyZSgncHJldHR5LWRhdGEnKS5wZDtcbipcbipcdHZhciB4bWxfcHAgICA9IHBkLnhtbCh4bWxfdGV4dCk7XG4qXHR2YXIgeG1sX21pbiAgPSBwZC54bWxtaW4oeG1sX3RleHQgWyx0cnVlXSk7XG4qXHR2YXIganNvbl9wcCAgPSBwZC5qc29uKGpzb25fdGV4dCk7XG4qXHR2YXIganNvbl9taW4gPSBwZC5qc29ubWluKGpzb25fdGV4dCk7XG4qXHR2YXIgY3NzX3BwICAgPSBwZC5jc3MoY3NzX3RleHQpO1xuKlx0dmFyIGNzc19taW4gID0gcGQuY3NzbWluKGNzc190ZXh0IFssIHRydWVdKTtcbipcdHZhciBzcWxfcHAgICA9IHBkLnNxbChzcWxfdGV4dCk7XG4qXHR2YXIgc3FsX21pbiAgPSBwZC5zcWxtaW4oc3FsX3RleHQpO1xuKlxuKiBURVNUOlxuKlx0Y29tcC1uYW1lOnByZXR0eS1kYXRhJCBub2RlIC4vdGVzdC90ZXN0X3htbFxuKlx0Y29tcC1uYW1lOnByZXR0eS1kYXRhJCBub2RlIC4vdGVzdC90ZXN0X2pzb25cbipcdGNvbXAtbmFtZTpwcmV0dHktZGF0YSQgbm9kZSAuL3Rlc3QvdGVzdF9jc3NcbipcdGNvbXAtbmFtZTpwcmV0dHktZGF0YSQgbm9kZSAuL3Rlc3QvdGVzdF9zcWxcbiovXG5cblxuZnVuY3Rpb24gcHAoKSB7XG5cdHRoaXMuc2hpZnQgPSBbJ1xcbiddOyAvLyBhcnJheSBvZiBzaGlmdHNcblx0dGhpcy5zdGVwID0gJyAgJywgLy8gMiBzcGFjZXNcblx0XHRtYXhkZWVwID0gMTAwLCAvLyBuZXN0aW5nIGxldmVsXG5cdFx0aXggPSAwO1xuXG5cdC8vIGluaXRpYWxpemUgYXJyYXkgd2l0aCBzaGlmdHMgLy9cblx0Zm9yKGl4PTA7aXg8bWF4ZGVlcDtpeCsrKXtcblx0XHR0aGlzLnNoaWZ0LnB1c2godGhpcy5zaGlmdFtpeF0rdGhpcy5zdGVwKTsgXG5cdH1cblxufTtcdFxuXHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFhNTCBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcblx0XHRcdFx0IC5yZXBsYWNlKC88L2csXCJ+Ojp+PFwiKVxuXHRcdFx0XHQgLnJlcGxhY2UoL3htbG5zXFw6L2csXCJ+Ojp+eG1sbnM6XCIpXG5cdFx0XHRcdCAucmVwbGFjZSgveG1sbnNcXD0vZyxcIn46On54bWxucz1cIilcblx0XHRcdFx0IC5zcGxpdCgnfjo6ficpLFxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcblx0XHRpbkNvbW1lbnQgPSBmYWxzZSxcblx0XHRkZWVwID0gMCxcblx0XHRzdHIgPSAnJyxcblx0XHRpeCA9IDA7XG5cblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXHRcdFx0Ly8gc3RhcnQgY29tbWVudCBvciA8IVtDREFUQVsuLi5dXT4gb3IgPCFET0NUWVBFIC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88IS8pID4gLTEpIHsgXG5cdFx0XHRcdHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XTtcblx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTsgXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cblx0XHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC8hRE9DVFlQRS8pID4gLTEgKSB7IFxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlOyBcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8gZW5kIGNvbW1lbnQgIG9yIDwhW0NEQVRBWy4uLl1dPiAvL1xuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IGFyW2l4XTtcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7IFxuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8gPGVsbT48L2VsbT4gLy9cblx0XHRcdGlmKCAvXjxcXHcvLmV4ZWMoYXJbaXgtMV0pICYmIC9ePFxcL1xcdy8uZXhlYyhhcltpeF0pICYmXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHsgXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0IC8vIDxlbG0+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xuXHRcdFx0XHRzdHIgPSAhaW5Db21tZW50ID8gc3RyICs9IHRoaXMuc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xuXHRcdFx0fSBlbHNlIFxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPiAtMSkge1xuXHRcdFx0XHRzdHIgPSAhaW5Db21tZW50ID8gc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdIDogc3RyICs9IGFyW2l4XTtcblx0XHRcdH0gZWxzZSBcblx0XHRcdC8vIDwvZWxtPiAvL1xuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPFxcLy8pID4gLTEpIHsgXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gdGhpcy5zaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHQvLyA8ZWxtLz4gLy9cblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goL1xcLz4vKSA+IC0xICkgeyBcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHQvLyA8PyB4bWwgLi4uID8+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8geG1sbnMgLy9cblx0XHRcdGlmKCBhcltpeF0uc2VhcmNoKC94bWxuc1xcOi8pID4gLTEgIHx8IGFyW2l4XS5zZWFyY2goL3htbG5zXFw9LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fSBcblx0XHRcdFxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHN0ciArPSBhcltpeF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRyZXR1cm4gIChzdHJbMF0gPT0gJ1xcbicpID8gc3RyLnNsaWNlKDEpIDogc3RyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBKU09OIHNlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5wcC5wcm90b3R5cGUuanNvbiA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKHRleHQpLCBudWxsLCB0aGlzLnN0ZXApO1xuXHR9XG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRleHQsIG51bGwsIHRoaXMuc3RlcCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTUyBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLmNzcyA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHsvZyxcInt+Ojp+XCIpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFw7L2csXCI7fjo6flwiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFwvXFwqL2csXCJ+Ojp+LypcIilcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXG5cdFx0XHRcdC5yZXBsYWNlKC9+Ojp+XFxzezAsfX46On4vZyxcIn46On5cIilcblx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxuXHRcdGRlZXAgPSAwLFxuXHRcdHN0ciA9ICcnLFxuXHRcdGl4ID0gMDtcblx0XHRcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXG5cdFx0XHRpZiggL1xcey8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcCsrXSthcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbLS1kZWVwXSthcltpeF07XG5cdFx0XHR9IGVsc2Vcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUUwgc2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XG4gIHJldHVybiAgcGFyZW50aGVzaXNMZXZlbCAtIChzdHIucmVwbGFjZSgvXFwoL2csJycpLmxlbmd0aCAtIHN0ci5yZXBsYWNlKC9cXCkvZywnJykubGVuZ3RoIClcbn1cblxuZnVuY3Rpb24gc3BsaXRfc3FsKHN0ciwgdGFiKSB7XG5cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIilcblxuICAgICAgICAucmVwbGFjZSgvIEFORCAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIkFORCBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBCRVRXRUVOIC9pZyxcIn46On5cIit0YWIrXCJCRVRXRUVOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gRUxTRSAvaWcsXCJ+Ojp+XCIrdGFiK1wiRUxTRSBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBFTkQgL2lnLFwifjo6flwiK3RhYitcIkVORCBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEdST1VQXFxzezEsfUJZL2lnLFwifjo6fkdST1VQIEJZIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEhBVklORyAvaWcsXCJ+Ojp+SEFWSU5HIFwiKVxuICAgICAgICAvLy5yZXBsYWNlKC8gSU4gL2lnLFwifjo6flwiK3RhYitcIklOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIElOIC9pZyxcIiBJTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBKT0lOIC9pZyxcIn46On5KT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIElOTkVSfjo6fnsxLH1KT0lOIC9pZyxcIn46On5JTk5FUiBKT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIExFRlR+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fkxFRlQgSk9JTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gT1IgL2lnLFwifjo6flwiK3RhYit0YWIrXCJPUiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPUkRFUlxcc3sxLH1CWS9pZyxcIn46On5PUkRFUiBCWSBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxuICAgICAgICAucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcKVxcc3swLH1TRUxFQ1QgL2lnLFwiKX46On5TRUxFQ1QgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gVEhFTiAvaWcsXCIgVEhFTn46On5cIit0YWIrXCJcIilcbiAgICAgICAgLnJlcGxhY2UoLyBVTklPTiAvaWcsXCJ+Ojp+VU5JT05+Ojp+XCIpXG4gICAgICAgIC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxuICAgICAgICAucmVwbGFjZSgvIFdIRU4gL2lnLFwifjo6flwiK3RhYitcIldIRU4gXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gV0hFUkUgL2lnLFwifjo6fldIRVJFIFwiKVxuICAgICAgICAucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXG4gICAgICAgIC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXG4gICAgICAgIC8vLnJlcGxhY2UoL1xcLC9pZyxcIix+Ojp+XCIrdGFiK3RhYitcIlwiKVxuICAgICAgICAucmVwbGFjZSgvIEFMTCAvaWcsXCIgQUxMIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEFTIC9pZyxcIiBBUyBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIikgXG4gICAgICAgIC5yZXBsYWNlKC8gREVTQyAvaWcsXCIgREVTQyBcIikgXG4gICAgICAgIC5yZXBsYWNlKC8gRElTVElOQ1QgL2lnLFwiIERJU1RJTkNUIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEVYSVNUUyAvaWcsXCIgRVhJU1RTIFwiKVxuICAgICAgICAucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxuICAgICAgICAucmVwbGFjZSgvIE5VTEwgL2lnLFwiIE5VTEwgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gTElLRSAvaWcsXCIgTElLRSBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxuICAgICAgICAucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcbiAgICAgICAgLnNwbGl0KCd+Ojp+Jyk7XG59XG5cbnBwLnByb3RvdHlwZS5zcWwgPSBmdW5jdGlvbih0ZXh0KSB7XG5cbiAgICB2YXIgYXJfYnlfcXVvdGUgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ346On4nKSxcbiAgICAgICAgbGVuID0gYXJfYnlfcXVvdGUubGVuZ3RoLFxuICAgICAgICBhciA9IFtdLFxuICAgICAgICBkZWVwID0gMCxcbiAgICAgICAgdGFiID0gdGhpcy5zdGVwLC8vK3RoaXMuc3RlcCxcbiAgICAgICAgaW5Db21tZW50ID0gdHJ1ZSxcbiAgICAgICAgaW5RdW90ZSA9IGZhbHNlLFxuICAgICAgICBwYXJlbnRoZXNpc0xldmVsID0gMCxcbiAgICAgICAgc3RyID0gJycsXG4gICAgICAgIGl4ID0gMDtcblxuICAgIGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XG5cbiAgICAgICAgaWYoaXglMikge1xuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoYXJfYnlfcXVvdGVbaXhdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxlbiA9IGFyLmxlbmd0aDtcbiAgICBmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXG4gICAgICAgIHBhcmVudGhlc2lzTGV2ZWwgPSBpc1N1YnF1ZXJ5KGFyW2l4XSwgcGFyZW50aGVzaXNMZXZlbCk7XG5cbiAgICAgICAgaWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHsgXG4gICAgICAgICAgICBhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxuICAgICAgICB9IFxuXG4gICAgICAgIGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7IFxuICAgICAgICAgICAgZGVlcCsrO1xuICAgICAgICAgICAgc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuICAgICAgICB9IGVsc2UgXG4gICAgICAgIGlmKCAvXFwnLy5leGVjKGFyW2l4XSkgKSAgeyBcbiAgICAgICAgICAgIGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XG4gICAgICAgICAgICAgICAgZGVlcC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IGFyW2l4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlICB7IFxuICAgICAgICAgICAgc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuICAgICAgICAgICAgaWYocGFyZW50aGVzaXNMZXZlbDwxICYmIGRlZXApIHtcbiAgICAgICAgICAgICAgICBkZWVwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL15cXG57MSx9LywnJykucmVwbGFjZSgvXFxuezEsfS9nLFwiXFxuXCIpO1xuICAgIHJldHVybiBzdHI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pbiBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLnhtbG1pbiA9IGZ1bmN0aW9uKHRleHQsIHByZXNlcnZlQ29tbWVudHMpIHtcblxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcblx0XHRcdFx0ICAgOiB0ZXh0LnJlcGxhY2UoL1xcPCFbIFxcclxcblxcdF0qKC0tKFteXFwtXXxbXFxyXFxuXXwtW15cXC1dKSotLVsgXFxyXFxuXFx0XSopXFw+L2csXCJcIik7XG5cdHJldHVybiAgc3RyLnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIik7IFxufVxuXG5wcC5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHQgIFxuICAgIHJldHVybiAgdGV4dC5yZXBsYWNlKC9cXHN7MCx9XFx7XFxzezAsfS9nLFwie1wiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHN7MCx9XFxbJC9nLFwiW1wiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtcXHN7MCx9L2csXCJbXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLzpcXHN7MCx9XFxbL2csJzpbJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezAsfVxcfVxcc3swLH0vZyxcIn1cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezAsfVxcXVxcc3swLH0vZyxcIl1cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcIlxcc3swLH1cXCwvZywnXCIsJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwsXFxzezAsfVxcXCIvZywnLFwiJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcIlxcc3swLH06L2csJ1wiOicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLzpcXHN7MCx9XFxcIi9nLCc6XCInKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC86XFxzezAsfVxcWy9nLCc6WycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLFxcc3swLH1cXFsvZywnLFsnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCxcXHN7Mix9L2csJywgJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxdXFxzezAsfSxcXHN7MCx9XFxbL2csJ10sWycpOyAgIFxufVxuXG5wcC5wcm90b3R5cGUuY3NzbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xuXHRcblx0dmFyIHN0ciA9IHByZXNlcnZlQ29tbWVudHMgPyB0ZXh0XG5cdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXHtcXHN7MSx9L2csXCJ7XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXH1cXHN7MSx9L2csXCJ9XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXC9cXCpcXHN7MSx9L2csXCIvKlwiKVxuXHRcdFx0ICAucmVwbGFjZSgvXFwqXFwvXFxzezEsfS9nLFwiKi9cIik7XG59XHRcblxucHAucHJvdG90eXBlLnNxbG1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpLnJlcGxhY2UoL1xcc3sxLH1cXCgvLFwiKFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwpLyxcIilcIik7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydHMucGQ9IG5ldyBwcDtcdFxuXG5cblxuXG5cblxuXG5cblxuXG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbmV4dFRpY2s7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3MubmV4dFRpY2s7XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgQmxhbmtOb2RlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhCbGFua05vZGUsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBCbGFua05vZGUoaWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmxhbmtOb2RlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChCbGFua05vZGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihCbGFua05vZGUpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gQmxhbmtOb2RlLnRlcm1UeXBlO1xuICAgIF90aGlzLmlkID0gQmxhbmtOb2RlLm5leHRJZCsrO1xuICAgIF90aGlzLnZhbHVlID0gaWQgfHwgX3RoaXMuaWQudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmxhbmtOb2RlLCBbe1xuICAgIGtleTogJ2NvbXBhcmVUZXJtJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGFyZVRlcm0ob3RoZXIpIHtcbiAgICAgIGlmICh0aGlzLmNsYXNzT3JkZXIgPCBvdGhlci5jbGFzc09yZGVyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsYXNzT3JkZXIgPiBvdGhlci5jbGFzc09yZGVyKSB7XG4gICAgICAgIHJldHVybiArMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlkIDwgb3RoZXIuaWQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaWQgPiBvdGhlci5pZCkge1xuICAgICAgICByZXR1cm4gKzE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb3B5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weShmb3JtdWxhKSB7XG4gICAgICAvLyBkZXBlbmRzIG9uIHRoZSBmb3JtdWxhXG4gICAgICB2YXIgYm5vZGVOZXcgPSBuZXcgQmxhbmtOb2RlKCk7XG4gICAgICBmb3JtdWxhLmNvcHlUbyh0aGlzLCBibm9kZU5ldyk7XG4gICAgICByZXR1cm4gYm5vZGVOZXc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHJldHVybiAnXzonICsgdGhpcy52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIEJsYW5rTm9kZS5OVEFub255bW91c05vZGVQcmVmaXggKyB0aGlzLmlkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCbGFua05vZGU7XG59KE5vZGUpO1xuXG5CbGFua05vZGUubmV4dElkID0gMDtcbkJsYW5rTm9kZS50ZXJtVHlwZSA9ICdCbGFua05vZGUnO1xuQmxhbmtOb2RlLk5UQW5vbnltb3VzTm9kZVByZWZpeCA9ICdfOm4nO1xuQmxhbmtOb2RlLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnQmxhbmtOb2RlJ107XG5CbGFua05vZGUucHJvdG90eXBlLmlzQmxhbmsgPSAxO1xuQmxhbmtOb2RlLnByb3RvdHlwZS5pc1ZhciA9IDE7XG5cbm1vZHVsZS5leHBvcnRzID0gQmxhbmtOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzT3JkZXIgPSB7XG4gICdMaXRlcmFsJzogMSxcbiAgJ0NvbGxlY3Rpb24nOiAzLFxuICAnR3JhcGgnOiA0LFxuICAnTmFtZWROb2RlJzogNSxcbiAgJ0JsYW5rTm9kZSc6IDYsXG4gICdWYXJpYWJsZSc6IDdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2xhc3NPcmRlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEJsYW5rTm9kZSA9IHJlcXVpcmUoJy4vYmxhbmstbm9kZScpO1xudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoQ29sbGVjdGlvbiwgX05vZGUpO1xuXG4gIGZ1bmN0aW9uIENvbGxlY3Rpb24oaW5pdGlhbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsZWN0aW9uKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDb2xsZWN0aW9uLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ29sbGVjdGlvbikpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBDb2xsZWN0aW9uLnRlcm1UeXBlO1xuICAgIF90aGlzLmlkID0gQmxhbmtOb2RlLm5leHRJZCsrO1xuICAgIF90aGlzLmVsZW1lbnRzID0gW107XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgaWYgKGluaXRpYWwgJiYgaW5pdGlhbC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuZWxlbWVudHMucHVzaChOb2RlLmZyb21WYWx1ZShlbGVtZW50KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbGxlY3Rpb24sIFt7XG4gICAga2V5OiAnYXBwZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY2xvc2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzaGlmdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuc2hpZnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIGVsZW1lbnRzQ29weSA9IHRoaXMuZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlYSkge1xuICAgICAgICBlYS5zdWJzdGl0dXRlKGJpbmRpbmdzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGVsZW1lbnRzQ29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9OVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvTlQoKSB7XG4gICAgICByZXR1cm4gQmxhbmtOb2RlLk5UQW5vbnltb3VzTm9kZVByZWZpeCArIHRoaXMuaWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiAnKCcgKyB0aGlzLmVsZW1lbnRzLmpvaW4oJyAnKSArICcpJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bnNoaWZ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy51bnNoaWZ0KGVsZW1lbnQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2xsZWN0aW9uO1xufShOb2RlKTtcblxuQ29sbGVjdGlvbi50ZXJtVHlwZSA9ICdDb2xsZWN0aW9uJztcbkNvbGxlY3Rpb24ucHJvdG90eXBlLmNsYXNzT3JkZXIgPSBDbGFzc09yZGVyWydDb2xsZWN0aW9uJ107XG5Db2xsZWN0aW9uLnByb3RvdHlwZS5jb21wYXJlVGVybSA9IEJsYW5rTm9kZS5wcm90b3R5cGUuY29tcGFyZVRlcm07XG5Db2xsZWN0aW9uLnByb3RvdHlwZS5pc1ZhciA9IDA7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGVjdGlvbjsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzLmNvbnZlcnRUb0pzb24gPSBjb252ZXJ0VG9Kc29uO1xubW9kdWxlLmV4cG9ydHMuY29udmVydFRvTlF1YWRzID0gY29udmVydFRvTlF1YWRzO1xuXG52YXIgYXN5bmNMaWIgPSByZXF1aXJlKCdhc3luYycpOyAvLyBAQCBHb2FsOiByZW1vdmUgdGhpcyBkZXBlbmRlbmN5XG52YXIganNvbmxkID0gcmVxdWlyZSgnanNvbmxkJyk7XG52YXIgTjMgPSByZXF1aXJlKCduMycpOyAvLyBAQCBHb2FsOiByZW1vdmUgdGhpcyBkZXBlbmRlbmN5XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0pzb24objNTdHJpbmcsIGpzb25DYWxsYmFjaykge1xuICB2YXIganNvblN0cmluZztcbiAgdmFyIG4zUGFyc2VyID0gTjMuUGFyc2VyKCk7XG4gIHZhciBuM1dyaXRlciA9IE4zLldyaXRlcih7XG4gICAgZm9ybWF0OiAnTi1RdWFkcydcbiAgfSk7XG4gIGFzeW5jTGliLndhdGVyZmFsbChbZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgbjNQYXJzZXIucGFyc2UobjNTdHJpbmcsIGNhbGxiYWNrKTtcbiAgfSwgZnVuY3Rpb24gKHRyaXBsZSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgIGlmICh0cmlwbGUgIT09IG51bGwpIHtcbiAgICAgIG4zV3JpdGVyLmFkZFRyaXBsZSh0cmlwbGUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuM1dyaXRlci5lbmQoY2FsbGJhY2spO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJlc3VsdCwgY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAganNvbmxkLmZyb21SREYocmVzdWx0LCB7XG4gICAgICAgIGZvcm1hdDogJ2FwcGxpY2F0aW9uL25xdWFkcydcbiAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAoanNvbiwgY2FsbGJhY2spIHtcbiAgICBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gICAganNvbkNhbGxiYWNrKG51bGwsIGpzb25TdHJpbmcpO1xuICB9XSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAganNvbkNhbGxiYWNrKGVyciwganNvblN0cmluZyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VG9OUXVhZHMobjNTdHJpbmcsIG5xdWFkQ2FsbGJhY2spIHtcbiAgdmFyIG5xdWFkU3RyaW5nO1xuICB2YXIgbjNQYXJzZXIgPSBOMy5QYXJzZXIoKTtcbiAgdmFyIG4zV3JpdGVyID0gTjMuV3JpdGVyKHtcbiAgICBmb3JtYXQ6ICdOLVF1YWRzJ1xuICB9KTtcbiAgYXN5bmNMaWIud2F0ZXJmYWxsKFtmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBuM1BhcnNlci5wYXJzZShuM1N0cmluZywgY2FsbGJhY2spO1xuICB9LCBmdW5jdGlvbiAodHJpcGxlLCBwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRyaXBsZSAhPT0gbnVsbCkge1xuICAgICAgbjNXcml0ZXIuYWRkVHJpcGxlKHRyaXBsZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG4zV3JpdGVyLmVuZChjYWxsYmFjayk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAocmVzdWx0LCBjYWxsYmFjaykge1xuICAgIG5xdWFkU3RyaW5nID0gcmVzdWx0O1xuICAgIG5xdWFkQ2FsbGJhY2sobnVsbCwgbnF1YWRTdHJpbmcpO1xuICB9XSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgbnF1YWRDYWxsYmFjayhlcnIsIG5xdWFkU3RyaW5nKTtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2luZGV4ZWRGb3JtdWxhID0gcmVxdWlyZSgnLi9pbmRleGVkLWZvcm11bGEnKTtcblxudmFyIF9pbmRleGVkRm9ybXVsYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmRleGVkRm9ybXVsYSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBCbGFua05vZGUgPSByZXF1aXJlKCcuL2JsYW5rLW5vZGUnKTtcbnZhciBDb2xsZWN0aW9uID0gcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyk7XG52YXIgRGVmYXVsdEdyYXBoID0gcmVxdWlyZSgnLi9kZWZhdWx0LWdyYXBoJyk7XG52YXIgRmV0Y2hlciA9IHJlcXVpcmUoJy4vZmV0Y2hlcicpO1xuXG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgVmFyaWFibGUgPSByZXF1aXJlKCcuL3ZhcmlhYmxlJyk7XG5cbmZ1bmN0aW9uIGJsYW5rTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IEJsYW5rTm9kZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBjb2xsZWN0aW9uKGVsZW1lbnRzKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbihlbGVtZW50cyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0R3JhcGgoKSB7XG4gIHJldHVybiBuZXcgRGVmYXVsdEdyYXBoKCk7XG59XG5mdW5jdGlvbiBmZXRjaGVyKHN0b3JlLCB0aW1lb3V0LCBhc3luYykge1xuICByZXR1cm4gbmV3IEZldGNoZXIoc3RvcmUsIHRpbWVvdXQsIGFzeW5jKTtcbn1cbmZ1bmN0aW9uIGdyYXBoKCkge1xuICByZXR1cm4gbmV3IF9pbmRleGVkRm9ybXVsYTIuZGVmYXVsdCgpO1xufVxuZnVuY3Rpb24gbGl0KHZhbCwgbGFuZywgZHQpIHtcbiAgcmV0dXJuIG5ldyBMaXRlcmFsKCcnICsgdmFsLCBsYW5nLCBkdCk7XG59XG5mdW5jdGlvbiBsaXRlcmFsKHZhbHVlLCBsYW5ndWFnZU9yRGF0YXR5cGUpIHtcbiAgaWYgKHR5cGVvZiBsYW5ndWFnZU9yRGF0YXR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGxhbmd1YWdlT3JEYXRhdHlwZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwodmFsdWUsIGxhbmd1YWdlT3JEYXRhdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSwgbnVsbCwgbmFtZWROb2RlKGxhbmd1YWdlT3JEYXRhdHlwZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IExpdGVyYWwodmFsdWUsIG51bGwsIGxhbmd1YWdlT3JEYXRhdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5hbWVkTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWVkTm9kZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBxdWFkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICBncmFwaCA9IGdyYXBoIHx8IG5ldyBEZWZhdWx0R3JhcGgoKTtcbiAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbn1cbmZ1bmN0aW9uIHN0KHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICByZXR1cm4gbmV3IFN0YXRlbWVudChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xufVxuZnVuY3Rpb24gdHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gIHJldHVybiBxdWFkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KTtcbn1cbmZ1bmN0aW9uIHZhcmlhYmxlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBWYXJpYWJsZShuYW1lKTtcbn1cblxuLy8gcmRmanMgc3BlYyBmYWN0b3J5IG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzLmJsYW5rTm9kZSA9IGJsYW5rTm9kZTtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHRHcmFwaCA9IGRlZmF1bHRHcmFwaDtcbm1vZHVsZS5leHBvcnRzLmdyYXBoID0gZ3JhcGg7XG5tb2R1bGUuZXhwb3J0cy5saXRlcmFsID0gbGl0ZXJhbDtcbm1vZHVsZS5leHBvcnRzLm5hbWVkTm9kZSA9IG5hbWVkTm9kZTtcbm1vZHVsZS5leHBvcnRzLnF1YWQgPSBxdWFkO1xubW9kdWxlLmV4cG9ydHMudHJpcGxlID0gdHJpcGxlO1xubW9kdWxlLmV4cG9ydHMudmFyaWFibGUgPSB2YXJpYWJsZTtcblxuLy8gcmRmbGliIG9ubHlcbm1vZHVsZS5leHBvcnRzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xubW9kdWxlLmV4cG9ydHMuZmV0Y2hlciA9IGZldGNoZXI7XG5tb2R1bGUuZXhwb3J0cy5saXQgPSBsaXQ7XG5tb2R1bGUuZXhwb3J0cy5zdCA9IHN0OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgRGVmYXVsdEdyYXBoID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhEZWZhdWx0R3JhcGgsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBEZWZhdWx0R3JhcGgoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmF1bHRHcmFwaCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRGVmYXVsdEdyYXBoLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRGVmYXVsdEdyYXBoKSkuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy50ZXJtVHlwZSA9ICdEZWZhdWx0R3JhcGgnO1xuICAgIF90aGlzLnZhbHVlID0gJyc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERlZmF1bHRHcmFwaCwgW3tcbiAgICBrZXk6ICd0b0Nhbm9uaWNhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvQ2Fub25pY2FsKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERlZmF1bHRHcmFwaDtcbn0oTm9kZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGVmYXVsdEdyYXBoOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG4vKipcbiAqIFNpbmdsZXRvbiBzdWJjbGFzcyBvZiBhbiBlbXB0eSBDb2xsZWN0aW9uLlxuICovXG5cbnZhciBFbXB0eSA9IGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoRW1wdHksIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBFbXB0eSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1wdHkpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEVtcHR5Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRW1wdHkpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gRW1wdHkudGVybVR5cGU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEVtcHR5LCBbe1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJygpJztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1wdHk7XG59KE5vZGUpO1xuXG5FbXB0eS50ZXJtVHlwZSA9ICdlbXB0eSc7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1wdHk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbi8qIGdsb2JhbCAkU29saWRUZXN0RW52aXJvbm1lbnQgKi9cbi8qKlxuICpcbiAqIFByb2plY3Q6IHJkZmxpYi5qc1xuICpcbiAqIEZpbGU6IGZldGNoZXIuanNcbiAqXG4gKiBEZXNjcmlwdGlvbjogY29udGFpbnMgZnVuY3Rpb25zIGZvciByZXF1ZXN0aW5nL2ZldGNoaW5nL3JldHJhY3RpbmdcbiAqICBUaGlzIGltcGxlbWVudHMgcXVpdGUgYSBsb3Qgb2YgdGhlIHdlYiBhcmNoaXRlY3R1cmUuXG4gKiBBIGZldGNoZXIgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBrbm93bGVkZ2UgYmFzZSBncmFwaCwgaW50byB3aGljaFxuICogaXQgbG9hZHMgc3R1ZmYgYW5kIGludG8gd2hpY2ggaXQgd3JpdGVzIGl0cyBtZXRhZGF0YVxuICogQEAgVGhlIG1ldGFkYXRhIHNob3VsZCBiZSBvcHRpb25hbGx5IGEgc2VwYXJhdGUgZ3JhcGhcbiAqXG4gKiAtIGltcGxlbWVudHMgc2VtYW50aWNzIG9mIEhUVFAgaGVhZGVycywgSW50ZXJuZXQgQ29udGVudCBUeXBlc1xuICogLSBzZWxlY3RzIHBhcnNlcnMgZm9yIHJkZi94bWwsIG4zLCByZGZhLCBncmRkbFxuICpcbiAqIERlcGVuZGVuY2llczpcbiAqXG4gKiBuZWVkczogdXRpbC5qcyB1cmkuanMgdGVybS5qcyByZGZwYXJzZXIuanMgcmRmYS5qcyBuM3BhcnNlci5qc1xuICogICAgICBpZGVudGl0eS5qcyBzcGFycWwuanMganNvbnBhcnNlci5qc1xuICpcbiAqIEluZGVwZW5kZW50IG9mIGpRdWVyeVxuICovXG5cbi8qKlxuICogVGhpbmdzIHRvIHRlc3Q6IGNhbGxiYWNrcyBvbiByZXF1ZXN0LCByZWZyZXNoLCByZXRyYWN0XG4gKiAgIGxvYWRpbmcgZnJvbSBIVFRQLCBIVFRQUywgRlRQLCBGSUxFLCBvdGhlcnM/XG4gKiBUbyBkbzpcbiAqIEZpcmluZyB1cCBhIG1haWwgY2xpZW50IGZvciBtaWQ6ICAobWVzc2FnZTopIFVSTHNcbiAqL1xudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG52YXIgTjNQYXJzZXIgPSByZXF1aXJlKCcuL24zcGFyc2VyJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTmFtZXNwYWNlID0gcmVxdWlyZSgnLi9uYW1lc3BhY2UnKTtcbnZhciByZGZQYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBwYXJzZVJERmFET00gPSByZXF1aXJlKCcuL3JkZmFwYXJzZXInKS5wYXJzZVJERmFET007XG52YXIgUkRGUGFyc2VyID0gcmVxdWlyZSgnLi9yZGZ4bWxwYXJzZXInKTtcbnZhciBVcmkgPSByZXF1aXJlKCcuL3VyaScpO1xudmFyIFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBzZXJpYWxpemUgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZScpO1xuXG52YXIgUGFyc2FibGUgPSB7XG4gICd0ZXh0L24zJzogdHJ1ZSxcbiAgJ3RleHQvdHVydGxlJzogdHJ1ZSxcbiAgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOiB0cnVlLFxuICAnYXBwbGljYXRpb24veGh0bWwreG1sJzogdHJ1ZSxcbiAgJ3RleHQvaHRtbCc6IHRydWUsXG4gICdhcHBsaWNhdGlvbi9sZCtqc29uJzogdHJ1ZVxufTtcblxudmFyIEZldGNoZXIgPSBmdW5jdGlvbiBGZXRjaGVyKHN0b3JlLCB0aW1lb3V0LCBhc3luYykge1xuICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gIHRoaXMudGhpc1VSSSA9ICdodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvMjAwNS9hamFyL2FqYXcvcmRmL3NvdXJjZXMuanMnICsgJyNTb3VyY2VGZXRjaGVyJzsgLy8gLS0gS2VubnlcbiAgdGhpcy50aW1lb3V0ID0gdGltZW91dCB8fCAzMDAwMDtcbiAgdGhpcy5hc3luYyA9IGFzeW5jICE9IG51bGwgPyBhc3luYyA6IHRydWU7XG4gIHRoaXMuYXBwTm9kZSA9IHRoaXMuc3RvcmUuYm5vZGUoKTsgLy8gRGVub3RpbmcgdGhpcyBzZXNzaW9uXG4gIHRoaXMuc3RvcmUuZmV0Y2hlciA9IHRoaXM7IC8vIEJpLWxpbmtlZFxuICB0aGlzLnJlcXVlc3RlZCA9IHt9O1xuICAvLyB0aGlzLnJlcXVlc3RlZFt1cmldIHN0YXRlczpcbiAgLy8gICB1bmRlZmluZWQgICAgIG5vIHJlY29yZCBvZiB3ZWIgYWNjZXNzIG9yIHJlY29yZHMgcmVzZXRcbiAgLy8gICB0cnVlICAgICAgICAgIGhhcyBiZWVuIHJlcXVlc3RlZCwgWEhSIGluIHByb2dyZXNzXG4gIC8vICAgJ2RvbmUnICAgICAgICByZWNlaXZlZCwgT2tcbiAgLy8gICA0MDMgICAgICAgICAgIEhUVFAgc3RhdHVzIHVuYXV0aG9yaXplZFxuICAvLyAgIDQwNCAgICAgICAgICAgUmVzc291cmNlIGRvZXMgbm90IGV4aXN0LiBDYW4gYmUgY3JlYXRlZCBldGMuXG4gIC8vICAgJ3JlZGlyZWN0ZWQnICBJbiBhdHRlbXB0IHRvIGNvdW50ZXIgQ09SUyBwcm9ibGVtcyByZXRyaWVkLlxuICAvLyAgIG90aGVyIHN0cmluZ3MgbWVhbiB2YXJpb3VzIG90aGVyIGVycm9zLCBzdWNoIGFzIHBhcnNlIGVycnJvcy5cbiAgLy9cbiAgdGhpcy5yZWRpcmVjdGVkVG8gPSB7fTsgLy8gV2VobiAncmVkaXJlY2VkJ1xuICB0aGlzLmZldGNoQ2FsbGJhY2tzID0ge307IC8vIGZldGNoQ2FsbGJhY2tzW3VyaV0ucHVzaChjYWxsYmFjaylcblxuICB0aGlzLm5vbmV4aXN0YW50ID0ge307IC8vIGtlZXAgdHJhY2sgb2YgZXhwbGljdCA0MDRzIC0+IHdlIGNhbiBvdmVyd3JpdGUgZXRjXG4gIHRoaXMubG9va2VkVXAgPSB7fTtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB0aGlzLm1lZGlhdHlwZXMgPSB7fTtcbiAgdmFyIHNmID0gdGhpcztcbiAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgdmFyIG5zID0ge307IC8vIENvbnZlbmllbmNlIG5hbWVzcGFjZXMgbmVlZGVkIGluIHRoaXMgbW9kdWxlOlxuICAvLyBUaGVzZSBhcmUgZGVsaWJlcnRlbHkgbm90IGV4cG9ydGVkIGFzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZFxuICAvLyBtYWtlIGl0cyBvd24gbGlzdCBhbmQgbm90IHJlbHkgb24gdGhlIHByZWZpeGVzIHVzZWQgaGVyZSxcbiAgLy8gYW5kIG5vdCBiZSB0ZW1wdGVkIHRvIGFkZCB0byB0aGVtLCBhbmQgdGhlbSBjbGFzaCB3aXRoIHRob3NlIG9mIGFub3RoZXJcbiAgLy8gYXBwbGljYXRpb24uXG4gIG5zLmxpbmsgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjJyk7XG4gIG5zLmh0dHAgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2h0dHAjJyk7XG4gIG5zLmh0dHBoID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9odHRwaCMnKTtcbiAgbnMucmRmID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyk7XG4gIG5zLnJkZnMgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSMnKTtcbiAgbnMuZGMgPSBOYW1lc3BhY2UoJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJyk7XG5cbiAgc2YubWVkaWF0eXBlc1snaW1hZ2UvKiddID0ge1xuICAgICdxJzogMC45XG4gIH07XG5cbiAgc2YubWVkaWF0eXBlc1snKi8qJ10gPSB7IC8vIE11c3QgYWxsb3cgYWNjZXNzIHRvIHJhbmRvbSBjb250ZW50XG4gICAgJ3EnOiAwLjFcbiAgfTtcblxuICBGZXRjaGVyLmNyb3NzU2l0ZVByb3h5ID0gZnVuY3Rpb24gKHVyaSkge1xuICAgIGlmIChGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUucmVwbGFjZSgne3VyaX0nLCBlbmNvZGVVUklDb21wb25lbnQodXJpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIEZldGNoZXIuUkRGWE1MSGFuZGxlciA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIHRoaXMuZG9tID0gYXJnc1swXTtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgLy8gc2YuYWRkU3RhdHVzKHhoci5yZXEsICdwYXJzaW5nIHNvb24gYXMgUkRGL1hNTC4uLicpXG4gICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB0aGlzLmRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIHZhciByb290ID0gdGhpcy5kb20uZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBpZiAocm9vdC5ub2RlTmFtZSA9PT0gJ3BhcnNlcmVycm9yJykge1xuICAgICAgICAgIC8vIEBAIE1vemlsbGEgb25seSBTZWUgaXNzdWUvaXNzdWUxMTBcbiAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCAnQmFkbHkgZm9ybWVkIFhNTCBpbiAnICsgeGhyLnJlc291cmNlLnVyaSk7IC8vIGhhdmUgdG8gZmFpbCB0aGUgcmVxdWVzdFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkbHkgZm9ybWVkIFhNTCBpbiAnICsgeGhyLnJlc291cmNlLnVyaSk7IC8vIEBAIEFkZCBkZXRhaWxzXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBSREZQYXJzZXIoa2IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlci5wYXJzZSh0aGlzLmRvbSwgeGhyLm9yaWdpbmFsLnVyaSwgeGhyLm9yaWdpbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnU3ludGF4IGVycm9yIHBhcnNpbmcgUkRGL1hNTCEgJyArIGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdTeW50YXggZXJyb3IgcGFyc2luZyBSREYvWE1MISAnICsgZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF4aHIub3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICBrYi5hZGQoeGhyLm9yaWdpbmFsLCBucy5yZGYoJ3R5cGUnKSwgbnMubGluaygnUkRGRG9jdW1lbnQnKSwgc2YuYXBwTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2IoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgRmV0Y2hlci5SREZYTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnUkRGWE1MSGFuZGxlcic7XG4gIH07XG4gIEZldGNoZXIuUkRGWE1MSGFuZGxlci5yZWdpc3RlciA9IGZ1bmN0aW9uIChzZikge1xuICAgIHNmLm1lZGlhdHlwZXNbJ2FwcGxpY2F0aW9uL3JkZit4bWwnXSA9IHtcbiAgICAgICdxJzogMC45XG4gICAgfTtcbiAgfTtcbiAgRmV0Y2hlci5SREZYTUxIYW5kbGVyLnBhdHRlcm4gPSBuZXcgUmVnRXhwKCdhcHBsaWNhdGlvbi9yZGZcXFxcK3htbCcpO1xuXG4gIC8vIFRoaXMgd291bGQgbXVjaCBiZXR0ZXIgdXNlIG9uLWJvYXJkIFhTTFQgZW5naW5lLiBAQFxuICAvKiAgZGVwcm9jYXRlZCAyMDE2LTAyLTE3ICB0aW1ibFxuICBGZXRjaGVyLmRvR1JEREwgPSBmdW5jdGlvbihrYiwgZG9jLCB4c2x0dXJpLCB4bWx1cmkpIHtcbiAgICAgIHNmLnJlcXVlc3RVUkkoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvJyArICdvbmxpbmVfeHNsdC94c2x0PycgKyAneHNsZmlsZT0nICsgZXNjYXBlKHhzbHR1cmkpICsgJyZ4bWxmaWxlPScgKyBlc2NhcGUoeG1sdXJpKSwgZG9jKVxuICB9XG4gICovXG4gIEZldGNoZXIuWEhUTUxIYW5kbGVyID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICBpZiAoYXJncykge1xuICAgICAgdGhpcy5kb20gPSBhcmdzWzBdO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICB2YXIgcmVsYXRpb24sIHJldmVyc2U7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICB0aGlzLmRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtiID0gc2Yuc3RvcmU7XG5cbiAgICAgICAgLy8gZGM6dGl0bGVcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RpdGxlJyk7XG4gICAgICAgIGlmICh0aXRsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwgbnMuZGMoJ3RpdGxlJyksIGtiLmxpdGVyYWwodGl0bGVbMF0udGV4dENvbnRlbnQpLCB4aHIucmVzb3VyY2UpO1xuICAgICAgICAgIC8vIGxvZy5pbmZvKFwiSW5mZXJyaW5nIHRpdGxlIG9mIFwiICsgeGhyLnJlc291cmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGluayByZWxcbiAgICAgICAgdmFyIGxpbmtzID0gdGhpcy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcbiAgICAgICAgZm9yICh2YXIgeCA9IGxpbmtzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICAgICAgLy8gQEAgcmV2XG4gICAgICAgICAgcmVsYXRpb24gPSBsaW5rc1t4XS5nZXRBdHRyaWJ1dGUoJ3JlbCcpO1xuICAgICAgICAgIHJldmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICByZWxhdGlvbiA9IGxpbmtzW3hdLmdldEF0dHJpYnV0ZSgncmV2Jyk7XG4gICAgICAgICAgICByZXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICBzZi5saW5rRGF0YSh4aHIsIHJlbGF0aW9uLCBsaW5rc1t4XS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSwgeGhyLnJlc291cmNlLCByZXZlcnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEYXRhIElzbGFuZHNcblxuICAgICAgICB2YXIgc2NyaXB0cyA9IHRoaXMuZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICAgICAgICBpZiAoUGFyc2FibGVbY29udGVudFR5cGVdKSB7XG4gICAgICAgICAgICByZGZQYXJzZShzY3JpcHRzW2ldLnRleHRDb250ZW50LCBrYiwgeGhyLm9yaWdpbmFsLnVyaSwgY29udGVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwgbnMucmRmKCd0eXBlJyksIG5zLmxpbmsoJ1dlYlBhZ2UnKSwgc2YuYXBwTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXhoci5vcHRpb25zLm5vUkRGYSAmJiBwYXJzZVJERmFET00pIHtcbiAgICAgICAgICAvLyBlbmFibGUgYnkgZGVmYXVsdFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZVJERmFET00odGhpcy5kb20sIGtiLCB4aHIub3JpZ2luYWwudXJpKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gJ0Vycm9yIHRyeWluZyB0byBwYXJzZSAnICsgeGhyLnJlc291cmNlICsgJyBhcyBSREZhOlxcbicgKyBlICsgJzpcXG4nICsgZS5zdGFjaztcbiAgICAgICAgICAgIC8vIGR1bXAobXNnK1wiXFxuXCIpXG4gICAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYigpOyAvLyBGaXJlIGRvbmUgY2FsbGJhY2tzXG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gIEZldGNoZXIuWEhUTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnWEhUTUxIYW5kbGVyJztcbiAgfTtcbiAgRmV0Y2hlci5YSFRNTEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSA9IHt9O1xuICB9O1xuICBGZXRjaGVyLlhIVE1MSGFuZGxlci5wYXR0ZXJuID0gbmV3IFJlZ0V4cCgnYXBwbGljYXRpb24veGh0bWwnKTtcblxuICBGZXRjaGVyLlhNTEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgLy8gWE1MIFNlbWFudGljcyBkZWZpbmVkIGJ5IHJvb3QgZWxlbWVudCBuYW1lc3BhY2VcbiAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgcm9vdCBlbGVtZW50XG4gICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAvLyBpcyB0aGlzIG5vZGUgYW4gZWxlbWVudD9cbiAgICAgICAgICBpZiAoZG9tLmNoaWxkTm9kZXNbY10ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBmaXJzdCBlbGVtZW50LCBpdCdzIHRoZSByb290XG4gICAgICAgICAgICB2YXIgbnMgPSBkb20uY2hpbGROb2Rlc1tjXS5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgICAgIC8vIElzIGl0IFJERi9YTUw/XG4gICAgICAgICAgICBpZiAobnMgJiYgbnMgPT09IG5zWydyZGYnXSkge1xuICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYTUwgcm9vdCBlbGVtZW50IGluIHRoZSBSREYgbmFtZXNwYWNlLCBzbyBhc3N1bWUgUkRGL1hNTC4nKTtcbiAgICAgICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignUkRGWE1MSGFuZGxlcicsIHhociwgY2IsIFtkb21dKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaXQgaXNuJ3QgUkRGL1hNTCBvciB3ZSBjYW4ndCB0ZWxsXG4gICAgICAgICAgICAvLyBBcmUgdGhlcmUgYW55IEdSRERMIHRyYW5zZm9ybXMgZm9yIHRoaXMgbmFtZXNwYWNlP1xuICAgICAgICAgICAgLy8gQEAgYXNzdW1lcyBucyBkb2N1bWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgdmFyIHhmb3JtcyA9IGtiLmVhY2goa2Iuc3ltKG5zKSwga2Iuc3ltKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMy9nL2RhdGEtdmlldyNuYW1lc3BhY2VUcmFuc2Zvcm1hdGlvblwiKSlcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeGZvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHhmb3JtID0geGZvcm1zW2ldXG4gICAgICAgICAgICAgICAgLy8gbG9nLmluZm8oeGhyLnJlc291cmNlLnVyaSArIFwiIG5hbWVzcGFjZSBcIiArIG5zICsgXCIgaGFzIEdSRERMIG5zIHRyYW5zZm9ybVwiICsgeGZvcm0udXJpKVxuICAgICAgICAgICAgICAgICBGZXRjaGVyLmRvR1JEREwoa2IsIHhoci5yZXNvdXJjZSwgeGZvcm0udXJpLCB4aHIucmVzb3VyY2UudXJpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9yIGl0IGNvdWxkIGJlIFhIVE1MP1xuICAgICAgICAvLyBNYXliZSBpdCBoYXMgYW4gWEhUTUwgRE9DVFlQRT9cbiAgICAgICAgaWYgKGRvbS5kb2N0eXBlKSB7XG4gICAgICAgICAgLy8gbG9nLmluZm8oXCJXZSBmb3VuZCBhIERPQ1RZUEUgaW4gXCIgKyB4aHIucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKGRvbS5kb2N0eXBlLm5hbWUgPT09ICdodG1sJyAmJiBkb20uZG9jdHlwZS5wdWJsaWNJZC5tYXRjaCgvXi1cXC9cXC9XM0NcXC9cXC9EVEQgWEhUTUwvKSAmJiBkb20uZG9jdHlwZS5zeXN0ZW1JZC5tYXRjaCgvaHR0cDpcXC9cXC93d3cudzMub3JnXFwvVFJcXC94aHRtbC8pKSB7XG4gICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYSFRNTCBET0NUWVBFLiBTd2l0Y2hpbmcgdG8gWEhUTUwgSGFuZGxlci5cXG4nKTtcbiAgICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hIVE1MSGFuZGxlcicsIHhociwgY2IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9yIHdoYXQgYWJvdXQgYW4gWEhUTUwgbmFtZXNwYWNlP1xuICAgICAgICB2YXIgaHRtbCA9IGRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdO1xuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgIHZhciB4bWxucyA9IGh0bWwuZ2V0QXR0cmlidXRlKCd4bWxucycpO1xuICAgICAgICAgIGlmICh4bWxucyAmJiB4bWxucy5tYXRjaCgvXmh0dHA6XFwvXFwvd3d3LnczLm9yZ1xcLzE5OTlcXC94aHRtbC8pKSB7XG4gICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBhIGRlZmF1bHQgbmFtZXNwYWNlIGZvciAnICsgJ1hIVE1MLiBTd2l0Y2hpbmcgdG8gWEhUTUxIYW5kbGVyLlxcbicpO1xuICAgICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignWEhUTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgY2hlY2sgdGhlIG5hbWVzcGFjZSBkb2N1bWVudCAoY2FjaGUgaXQhKSBhbmRcbiAgICAgICAgLy8gbG9vayBmb3IgYSBHUkRETCB0cmFuc2Zvcm1cbiAgICAgICAgLy8gQEAgIEdldCBuYW1lc3BhY2UgZG9jdW1lbnQgPG4+LCBwYXJzZSBpdCwgbG9vayBmb3IgIDxuPiBncmRkbDpuYW1lc3BhY2VUcmFuc2Zvcm0gP3lcbiAgICAgICAgLy8gQXBwbHkgP3kgdG8gICBkb21cbiAgICAgICAgLy8gV2UgZ2l2ZSB1cC4gV2hhdCBkaWFsZWN0IGlzIHRoaXM/XG4gICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdVbnN1cHBvcnRlZCBkaWFsZWN0IG9mIFhNTDogbm90IFJERiBvciBYSFRNTCBuYW1lc3BhY2UsIGV0Yy5cXG4nICsgeGhyLnJlc3BvbnNlVGV4dC5zbGljZSgwLCA4MCkpO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIEZldGNoZXIuWE1MSGFuZGxlci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ1hNTEhhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLlhNTEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3htbCddID0ge1xuICAgICAgJ3EnOiAwLjVcbiAgICB9O1xuICAgIHNmLm1lZGlhdHlwZXNbJ2FwcGxpY2F0aW9uL3htbCddID0ge1xuICAgICAgJ3EnOiAwLjVcbiAgICB9O1xuICB9O1xuICBGZXRjaGVyLlhNTEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJyh0ZXh0fGFwcGxpY2F0aW9uKS8oLiopeG1sJyk7XG5cbiAgRmV0Y2hlci5IVE1MSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICB2YXIgcnQgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICAvLyBXZSBvbmx5IGhhbmRsZSBYSFRNTCBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBYTUxcbiAgICAgICAgLy8gbG9nLmluZm8oXCJTbmlmZmluZyBIVE1MIFwiICsgeGhyLnJlc291cmNlICsgXCIgZm9yIFhIVE1MLlwiKVxuXG4gICAgICAgIGlmIChydC5tYXRjaCgvXFxzKjxcXD94bWxcXHMrdmVyc2lvblxccyo9W148Pl0rXFw/Pi8pKSB7XG4gICAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsIFwiSGFzIGFuIFhNTCBkZWNsYXJhdGlvbi4gV2UnbGwgYXNzdW1lIFwiICsgXCJpdCdzIFhIVE1MIGFzIHRoZSBjb250ZW50LXR5cGUgd2FzIHRleHQvaHRtbC5cXG5cIik7XG4gICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignWEhUTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRE9DVFlQRVxuICAgICAgICAvLyBUaGVyZSBpcyBwcm9iYWJseSBhIHNtYXJ0ZXIgd2F5IHRvIGRvIHRoaXNcbiAgICAgICAgaWYgKHJ0Lm1hdGNoKC8uKjwhRE9DVFlQRVxccytodG1sW148XSstXFwvXFwvVzNDXFwvXFwvRFREIFhIVE1MW148XStodHRwOlxcL1xcL3d3dy53My5vcmdcXC9UUlxcL3hodG1sW148XSs+LykpIHtcbiAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYSFRNTCBET0NUWVBFLiBTd2l0Y2hpbmcgdG8gWEhUTUxIYW5kbGVyLlxcbicpO1xuICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hIVE1MSGFuZGxlcicsIHhociwgY2IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHhtbG5zXG4gICAgICAgIGlmIChydC5tYXRjaCgvW14oPGh0bWwpXSo8aHRtbFxccytbXjxdKnhtbG5zPVsnXCJdaHR0cDpcXC9cXC93d3cudzMub3JnXFwvMTk5OVxcL3hodG1sW1wiJ11bXjxdKj4vKSkge1xuICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnSGFzIGRlZmF1bHQgbmFtZXNwYWNlIGZvciBYSFRNTCwgc28gc3dpdGNoaW5nIHRvIFhIVE1MSGFuZGxlci5cXG4nKTtcbiAgICAgICAgICBzZi5zd2l0Y2hIYW5kbGVyKCdYSFRNTEhhbmRsZXInLCB4aHIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkYzp0aXRsZVx0ICAgICAgICAgICAgICAgICAgICAgICAvL25vIG5lZWQgdG8gZXNjYXBlICcvJyBoZXJlXG4gICAgICAgIHZhciB0aXRsZU1hdGNoID0gbmV3IFJlZ0V4cCgnPHRpdGxlPihbXFxcXHNcXFxcU10rPyk8L3RpdGxlPicsICdpbScpLmV4ZWMocnQpO1xuICAgICAgICBpZiAodGl0bGVNYXRjaCkge1xuICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLmRjKCd0aXRsZScpLCBrYi5saXRlcmFsKHRpdGxlTWF0Y2hbMV0pLCB4aHIucmVzb3VyY2UpOyAvLyB0aGluayBhYm91dCB4bWw6bGFuZyBsYXRlclxuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLnJkZigndHlwZScpLCBucy5saW5rKCdXZWJQYWdlJyksIHNmLmFwcE5vZGUpO1xuICAgICAgICAgIGNiKCk7IC8vIGRvbmVGZXRjaCwgbm90IGZhaWxlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ25vbi1YTUwgSFRNTCBkb2N1bWVudCwgbm90IHBhcnNlZCBmb3IgZGF0YS4nKTtcbiAgICAgICAgc2YuZG9uZUZldGNoKHhocik7XG4gICAgICAgIC8vIHNmLmZhaWxGZXRjaCh4aHIsIFwiU29ycnksIGNhbid0IHlldCBwYXJzZSBub24tWE1MIEhUTUxcIilcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICBGZXRjaGVyLkhUTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnSFRNTEhhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLkhUTUxIYW5kbGVyLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHNmKSB7XG4gICAgc2YubWVkaWF0eXBlc1sndGV4dC9odG1sJ10gPSB7XG4gICAgICAncSc6IDAuOVxuICAgIH07XG4gIH07XG4gIEZldGNoZXIuSFRNTEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJ3RleHQvaHRtbCcpO1xuXG4gIEZldGNoZXIuVGV4dEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgLy8gV2Ugb25seSBzcGVhayBkaWFsZWN0cyBvZiBYTUwgcmlnaHQgbm93LiBJcyB0aGlzIFhNTD9cbiAgICAgICAgdmFyIHJ0ID0geGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICAvLyBMb29rIGZvciBhbiBYTUwgZGVjbGFyYXRpb25cbiAgICAgICAgaWYgKHJ0Lm1hdGNoKC9cXHMqPFxcP3htbFxccyt2ZXJzaW9uXFxzKj1bXjw+XStcXD8+LykpIHtcbiAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyBcIiBoYXMgYW4gWE1MIGRlY2xhcmF0aW9uLiBXZSdsbCBhc3N1bWUgXCIgKyBcIml0J3MgWE1MIGJ1dCBpdHMgY29udGVudC10eXBlIHdhc24ndCBYTUwuXFxuXCIpO1xuICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hNTEhhbmRsZXInLCB4aHIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29rIGZvciBhbiBYTUwgZGVjbGFyYXRpb25cbiAgICAgICAgaWYgKHJ0LnNsaWNlKDAsIDUwMCkubWF0Y2goL3htbG5zOi8pKSB7XG4gICAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsIFwiTWF5IGhhdmUgYW4gWE1MIG5hbWVzcGFjZS4gV2UnbGwgYXNzdW1lIFwiICsgXCJpdCdzIFhNTCBidXQgaXRzIGNvbnRlbnQtdHlwZSB3YXNuJ3QgWE1MLlxcblwiKTtcbiAgICAgICAgICBzZi5zd2l0Y2hIYW5kbGVyKCdYTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZ2l2ZSB1cCBmaW5kaW5nIHNlbWFudGljcyAtIHRoaXMgaXMgbm90IGFuIGVycm9yLCBqdXN0IG5vIGRhdGFcbiAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsICdQbGFpbiB0ZXh0IGRvY3VtZW50LCBubyBrbm93biBSREYgc2VtYW50aWNzLicpO1xuICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgc2YuZmFpbEZldGNoKHhociwgXCJ1bnBhcnNlYWJsZSAtIHRleHQvcGxhaW4gbm90IHZpc2libHkgWE1MXCIpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIGR1bXAoeGhyLnJlc291cmNlICsgXCIgdW5wYXJzZWFibGUgLSB0ZXh0L3BsYWluIG5vdCB2aXNpYmx5IFhNTCwgc3RhcnRzOlxcblwiICsgcnQuc2xpY2UoMCwgNTAwKStcIlxcblwiKVxuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIEZldGNoZXIuVGV4dEhhbmRsZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdUZXh0SGFuZGxlcic7XG4gIH07XG4gIEZldGNoZXIuVGV4dEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3BsYWluJ10gPSB7XG4gICAgICAncSc6IDAuNVxuICAgIH07XG4gIH07XG4gIEZldGNoZXIuVGV4dEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJ3RleHQvcGxhaW4nKTtcblxuICBGZXRjaGVyLk4zSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAvLyBQYXJzZSB0aGUgdGV4dCBvZiB0aGlzIG5vbi1YTUwgZmlsZVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCd3ZWIuanM6IFBhcnNpbmcgYXMgTjMgJyArIHhoci5yZXNvdXJjZS51cmkgKyAnIGJhc2U6ICcgKyB4aHIub3JpZ2luYWwudXJpKSAvLyBAQEBAIGNvbW1lbnQgbWUgb3V0XG4gICAgICAgIC8vIHNmLmFkZFN0YXR1cyh4aHIucmVxLCBcIk4zIG5vdCBwYXJzZWQgeWV0Li4uXCIpXG4gICAgICAgIHZhciBwID0gTjNQYXJzZXIoa2IsIGtiLCB4aHIub3JpZ2luYWwudXJpLCB4aHIub3JpZ2luYWwudXJpLCBudWxsLCBudWxsLCAnJywgbnVsbCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgIHAubG9hZEJ1Zih4aHIucmVzcG9uc2VUZXh0KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHAubG9hZEJ1Zih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhciBtc2cgPSAnRXJyb3IgdHJ5aW5nIHRvIHBhcnNlICcgKyB4aHIucmVzb3VyY2UgKyAnIGFzIE5vdGF0aW9uMzpcXG4nICsgZSArICc6XFxuJyArIGUuc3RhY2s7XG4gICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnTjMgcGFyc2VkOiAnICsgcC5zdGF0ZW1lbnRDb3VudCArICcgdHJpcGxlcyBpbiAnICsgcC5saW5lcyArICcgbGluZXMuJyk7XG4gICAgICAgIHNmLnN0b3JlLmFkZCh4aHIub3JpZ2luYWwsIG5zLnJkZigndHlwZScpLCBucy5saW5rKCdSREZEb2N1bWVudCcpLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgLy8gdmFyIGFyZ3MgPSBbeGhyLm9yaWdpbmFsLnVyaV0gLy8gT3RoZXIgYXJncyBuZWVkZWQgZXZlcj9cbiAgICAgICAgc2YuZG9uZUZldGNoKHhocik7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgRmV0Y2hlci5OM0hhbmRsZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdOM0hhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLk4zSGFuZGxlci5yZWdpc3RlciA9IGZ1bmN0aW9uIChzZikge1xuICAgIHNmLm1lZGlhdHlwZXNbJ3RleHQvbjMnXSA9IHtcbiAgICAgICdxJzogJzEuMCdcbiAgICB9OyAvLyBhcyBwZXIgMjAwOCBzcGVjXG4gICAgLypcbiAgICBzZi5tZWRpYXR5cGVzWydhcHBsaWNhdGlvbi94LXR1cnRsZSddID0ge1xuICAgICAgJ3EnOiAxLjBcbiAgICB9IC8vIHByZSAyMDA4XG4gICAgKi9cbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3R1cnRsZSddID0ge1xuICAgICAgJ3EnOiAxLjBcbiAgICB9OyAvLyBwb3N0IDIwMDhcbiAgfTtcbiAgRmV0Y2hlci5OM0hhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJyhhcHBsaWNhdGlvbnx0ZXh0KS8oeC0pPyhyZGZcXFxcKyk/KG4zfHR1cnRsZSknKTtcblxuICBVdGlsLmNhbGxiYWNraWZ5KHRoaXMsIFsncmVxdWVzdCcsICdyZWN2JywgJ2hlYWRlcnMnLCAnbG9hZCcsICdmYWlsJywgJ3JlZnJlc2gnLCAncmV0cmFjdCcsICdkb25lJ10pO1xuXG4gIHRoaXMuYWRkSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgc2YuaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICBoYW5kbGVyLnJlZ2lzdGVyKHNmKTtcbiAgfTtcblxuICB0aGlzLnN3aXRjaEhhbmRsZXIgPSBmdW5jdGlvbiAobmFtZSwgeGhyLCBjYiwgYXJncykge1xuICAgIHZhciBIYW5kbGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgnJyArIHRoaXMuaGFuZGxlcnNbaV0gPT09IG5hbWUpIHtcbiAgICAgICAgSGFuZGxlciA9IHRoaXMuaGFuZGxlcnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghSGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWIuanM6IHN3aXRjaEhhbmRsZXI6IG5hbWU9JyArIG5hbWUgKyAnICwgdGhpcy5oYW5kbGVycyA9JyArIHRoaXMuaGFuZGxlcnMgKyAnXFxuJyArICdzd2l0Y2hIYW5kbGVyOiBzd2l0Y2hpbmcgdG8gJyArIEhhbmRsZXIgKyAnOyBzZj0nICsgc2YgKyAnOyB0eXBlb2YgRmV0Y2hlcj0nICsgKHR5cGVvZiBGZXRjaGVyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihGZXRjaGVyKSkgKyAnO1xcblxcdCBGZXRjaGVyLkhUTUxIYW5kbGVyPScgKyBGZXRjaGVyLkhUTUxIYW5kbGVyICsgJ1xcbicgKyAnXFxuXFx0c2YuaGFuZGxlcnM9JyArIHNmLmhhbmRsZXJzICsgJ1xcbicpO1xuICAgIH1cbiAgICBuZXcgSGFuZGxlcihhcmdzKS5oYW5kbGVyRmFjdG9yeSh4aHIpO1xuICAgIHhoci5oYW5kbGUoY2IpO1xuICB9O1xuXG4gIHRoaXMuYWRkU3RhdHVzID0gZnVuY3Rpb24gKHJlcSwgc3RhdHVzKSB7XG4gICAgLy8gPERlYnVnIGFib3V0PVwicGFyc2VQZXJmb3JtYW5jZVwiPlxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHN0YXR1cyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnLicgKyBub3cuZ2V0TWlsbGlzZWNvbmRzKCkgKyAnXSAnICsgc3RhdHVzO1xuICAgIC8vIDwvRGVidWc+XG4gICAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgICB2YXIgcyA9IGtiLnRoZShyZXEsIG5zLmxpbmsoJ3N0YXR1cycpKTtcbiAgICBpZiAocyAmJiBzLmFwcGVuZCkge1xuICAgICAgcy5hcHBlbmQoa2IubGl0ZXJhbChzdGF0dXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oJ3dlYi5qczogTm8gbGlzdCB0byBhZGQgdG86ICcgKyBzICsgJywnICsgc3RhdHVzKTsgLy8gQEBAXG4gICAgfVxuICB9O1xuXG4gIC8vIFJlY29yZCBlcnJvcnMgaW4gdGhlIHN5c3RlbSBvbiBmYWlsdXJlXG4gIC8vIFJldHVybnMgeGhyIHNvIGNhbiBqdXN0IGRvIHJldHVybiB0aGlzLmZhaWxmZXRjaCguLi4pXG4gIHRoaXMuZmFpbEZldGNoID0gZnVuY3Rpb24gKHhociwgc3RhdHVzKSB7XG4gICAgdGhpcy5hZGRTdGF0dXMoeGhyLnJlcSwgc3RhdHVzKTtcbiAgICBpZiAoIXhoci5vcHRpb25zLm5vTWV0YSkge1xuICAgICAga2IuYWRkKHhoci5vcmlnaW5hbCwgbnMubGluaygnZXJyb3InKSwgc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKCF4aHIucmVzb3VyY2Uuc2FtZVRlcm0oeGhyLm9yaWdpbmFsKSkge1xuICAgICAgY29uc29sZS5sb2coJ0BAIFJlY29yZGluZyBmYWlsdXJlIG9yaWdpbmFsICcgKyB4aHIub3JpZ2luYWwgKyAnKCBhcyAnICsgeGhyLnJlc291cmNlICsgJykgOiAnICsgeGhyLnN0YXR1cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdAQCBSZWNvcmRpbmcgZmFpbHVyZSBmb3IgJyArIHhoci5vcmlnaW5hbCArICc6ICcgKyB4aHIuc3RhdHVzKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0ZWRbVXJpLmRvY3BhcnQoeGhyLm9yaWdpbmFsLnVyaSldID0geGhyLnN0YXR1czsgLy8gY2hhbmdlZCAyMDE1IHdhcyBmYWxzZVxuICAgIHdoaWxlICh0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldICYmIHRoaXMuZmV0Y2hDYWxsYmFja3NbeGhyLm9yaWdpbmFsLnVyaV0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldLnNoaWZ0KCkoZmFsc2UsICdGZXRjaCBvZiA8JyArIHhoci5vcmlnaW5hbC51cmkgKyAnPiBmYWlsZWQ6ICcgKyBzdGF0dXMsIHhocik7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrcygnZmFpbCcsIFt4aHIub3JpZ2luYWwudXJpLCBzdGF0dXNdKTtcbiAgICB4aHIuYWJvcnQoKTtcbiAgICByZXR1cm4geGhyO1xuICB9O1xuXG4gIC8vIGluIHRoZSB3aHkgcGFydCBvZiB0aGUgcXVhZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEhUTUwgYW5kIEhUVFAgaGVhZGVyXG4gIC8vIFJldmVyc2UgaXMgc2V0IGlpZiB0aGUgbGluayB3YXMgcmV2PSBhcyBvcHBvc2VkIHRvIHJlbD1cbiAgdGhpcy5saW5rRGF0YSA9IGZ1bmN0aW9uICh4aHIsIHJlbCwgdXJpLCB3aHksIHJldmVyc2UpIHtcbiAgICBpZiAoIXVyaSkgcmV0dXJuO1xuICAgIHZhciBwcmVkaWNhdGU7XG4gICAgLy8gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3Bvd2Rlci1kci8jaHR0cGxpbmsgZm9yIGRlc2NyaWJlZGJ5IDIwMDgtMTItMTBcbiAgICB2YXIgb2JqID0ga2Iuc3ltKFVyaS5qb2luKHVyaSwgeGhyLm9yaWdpbmFsLnVyaSkpO1xuICAgIGlmIChyZWwgPT09ICdhbHRlcm5hdGUnIHx8IHJlbCA9PT0gJ3NlZUFsc28nIHx8IHJlbCA9PT0gJ21ldGEnIHx8IHJlbCA9PT0gJ2Rlc2NyaWJlZGJ5Jykge1xuICAgICAgaWYgKG9iai51cmkgPT09IHhoci5vcmlnaW5hbC51cmkpIHJldHVybjtcbiAgICAgIHByZWRpY2F0ZSA9IG5zLnJkZnMoJ3NlZUFsc28nKTtcbiAgICB9IGVsc2UgaWYgKHJlbCA9PT0gJ3R5cGUnKSB7XG4gICAgICBwcmVkaWNhdGUgPSBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9saW5rLXJlbGF0aW9ucy9saW5rLXJlbGF0aW9ucy54bWxcbiAgICAgIC8vIEFsYXMgbm90IHlldCBpbiBSREYgeWV0IGZvciBlYWNoIHByZWRpY2F0ZVxuICAgICAgLy8vIGVuY29kZSBzcGFjZSBpbiBlLmcuIHJlbD1cInNob3J0Y3V0IGljb25cIlxuICAgICAgcHJlZGljYXRlID0ga2Iuc3ltKFVyaS5qb2luKGVuY29kZVVSSUNvbXBvbmVudChyZWwpLCAnaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9saW5rLXJlbGF0aW9ucy8nKSk7XG4gICAgfVxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICBrYi5hZGQob2JqLCBwcmVkaWNhdGUsIHhoci5vcmlnaW5hbCwgd2h5KTtcbiAgICB9IGVsc2Uge1xuICAgICAga2IuYWRkKHhoci5vcmlnaW5hbCwgcHJlZGljYXRlLCBvYmosIHdoeSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGFyc2VMaW5rSGVhZGVyID0gZnVuY3Rpb24gKHhociwgdGhpc1JlcSkge1xuICAgIHZhciBsaW5rO1xuICAgIHRyeSB7XG4gICAgICBsaW5rID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdsaW5rJyk7IC8vIE1heSBjcmFzaCBmcm9tIENPUlMgZXJyb3JcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGlmIChsaW5rKSB7XG4gICAgICB2YXIgbGlua2V4cCA9IC88W14+XSo+XFxzKihcXHMqO1xccypbXlxcKFxcKTw+QCw7OlwiXFwvXFxbXFxdXFw/PXt9IFxcdF0rPSgoW15cXChcXCk8PkAsOzpcIlxcL1xcW1xcXVxcPz17fSBcXHRdKyl8KFwiW15cIl0qXCIpKSkqKCx8JCkvZztcbiAgICAgIHZhciBwYXJhbWV4cCA9IC9bXlxcKFxcKTw+QCw7OlwiXFwvXFxbXFxdXFw/PXt9IFxcdF0rPSgoW15cXChcXCk8PkAsOzpcIlxcL1xcW1xcXVxcPz17fSBcXHRdKyl8KFwiW15cIl0qXCIpKS9nO1xuXG4gICAgICB2YXIgbWF0Y2hlcyA9IGxpbmsubWF0Y2gobGlua2V4cCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gbWF0Y2hlc1tpXS5zcGxpdCgnPicpO1xuICAgICAgICB2YXIgaHJlZiA9IHNwbGl0WzBdLnN1YnN0cmluZygxKTtcbiAgICAgICAgdmFyIHBzID0gc3BsaXRbMV07XG4gICAgICAgIHZhciBzID0gcHMubWF0Y2gocGFyYW1leHApO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgcCA9IHNbal07XG4gICAgICAgICAgdmFyIHBhcmFtc3BsaXQgPSBwLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgLy8gdmFyIG5hbWUgPSBwYXJhbXNwbGl0WzBdXG4gICAgICAgICAgdmFyIHJlbCA9IHBhcmFtc3BsaXRbMV0ucmVwbGFjZSgvW1wiJ10vZywgJycpOyAvLyAnXCJcbiAgICAgICAgICB0aGlzLmxpbmtEYXRhKHhociwgcmVsLCBocmVmLCB0aGlzUmVxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmRvbmVGZXRjaCA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICB0aGlzLmFkZFN0YXR1cyh4aHIucmVxLCAnRG9uZS4nKTtcbiAgICB0aGlzLnJlcXVlc3RlZFt4aHIub3JpZ2luYWwudXJpXSA9ICdkb25lJzsgLy8gS2VubnlcbiAgICB3aGlsZSAodGhpcy5mZXRjaENhbGxiYWNrc1t4aHIub3JpZ2luYWwudXJpXSAmJiB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldLmxlbmd0aCkge1xuICAgICAgdGhpcy5mZXRjaENhbGxiYWNrc1t4aHIub3JpZ2luYWwudXJpXS5zaGlmdCgpKHRydWUsIHVuZGVmaW5lZCwgeGhyKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hDYWxsYmFja3NbeGhyLm9yaWdpbmFsLnVyaV07XG4gICAgdGhpcy5maXJlQ2FsbGJhY2tzKCdkb25lJywgW3hoci5vcmlnaW5hbC51cmldKTtcbiAgfTtcbiAgdmFyIGhhbmRsZXJMaXN0ID0gW0ZldGNoZXIuUkRGWE1MSGFuZGxlciwgRmV0Y2hlci5YSFRNTEhhbmRsZXIsIEZldGNoZXIuWE1MSGFuZGxlciwgRmV0Y2hlci5IVE1MSGFuZGxlciwgRmV0Y2hlci5UZXh0SGFuZGxlciwgRmV0Y2hlci5OM0hhbmRsZXJdO1xuICBoYW5kbGVyTGlzdC5tYXAodGhpcy5hZGRIYW5kbGVyKTtcblxuICAvKiogTm90ZSB0d28gbm9kZXMgYXJlIG5vdyBzbXVzaGVkXG4gICAqKlxuICAgKiogSWYgb25seSBvbmUgd2FzIGZsYWdnZWQgYXMgbG9va2VkIHVwLCB0aGVuXG4gICAqKiB0aGUgbmV3IG5vZGUgaXMgbG9va2VkIHVwIGFnYWluLCB3aGljaFxuICAgKiogd2lsbCBtYWtlIHN1cmUgYWxsIHRoZSBVUklzIGFyZSBkZXJlZmVyZW5jZWRcbiAgICovXG4gIHRoaXMubm93S25vd25BcyA9IGZ1bmN0aW9uICh3YXMsIG5vdykge1xuICAgIGlmICh0aGlzLmxvb2tlZFVwW3dhcy51cmldKSB7XG4gICAgICBpZiAoIXRoaXMubG9va2VkVXBbbm93LnVyaV0pIHRoaXMubG9va1VwVGhpbmcobm93LCB3YXMpOyAvLyAgQEBAQCAgVHJhbnNmZXIgdXNlckNhbGxiYWNrXG4gICAgfSBlbHNlIGlmICh0aGlzLmxvb2tlZFVwW25vdy51cmldKSB7XG4gICAgICBpZiAoIXRoaXMubG9va2VkVXBbd2FzLnVyaV0pIHRoaXMubG9va1VwVGhpbmcod2FzLCBub3cpO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm5zIHByb21pc2Ugb2YgWEhSXG4gIC8vXG4gIC8vICBXcml0ZXMgYmFjayB0byB0aGUgd2ViIHdoYXQgd2UgaGF2ZSBpbiB0aGUgc3RvcmUgZm9yIHRoaXMgdXJpXG4gIHRoaXMucHV0QmFjayA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTsgLy8gQWNjZXB0IG9iamVjdCBvciBzdHJpbmdcbiAgICB2YXIgZG9jID0gbmV3IE5hbWVkTm9kZSh1cmkpLmRvYygpOyAvLyBzdHJpcCBvZmYgI1xuICAgIG9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZShkb2MsIHRoaXMuc3RvcmUsIGRvYy51cmksIG9wdGlvbnMuY29udGVudFR5cGUgfHwgJ3RleHQvdHVydGxlJyk7XG4gICAgcmV0dXJuIHRoaXMud2ViT3BlcmF0aW9uKCdQVVQnLCB1cmksIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgcHJvbWlzZSBvZiBYSFJcbiAgLy9cbiAgdGhpcy53ZWJPcGVyYXRpb24gPSBmdW5jdGlvbiAobWV0aG9kLCB1cmkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTtcbiAgICB1cmkgPSB0aGlzLnByb3h5SWZOZWNlc3NhcnkodXJpKTtcbiAgICB2YXIgZmV0Y2hlciA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgICB4aHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB4aHIub3JpZ2luYWwgPSBmZXRjaGVyLnN0b3JlLnN5bSh1cmkpO1xuICAgICAgaWYgKCFvcHRpb25zLm5vTWV0YSAmJiB0eXBlb2YgdGFidWxhdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmZXRjaGVyLnNhdmVSZXF1ZXN0TWV0YWRhdGEoeGhyLCBmZXRjaGVyLnN0b3JlLCB1cmkpO1xuICAgICAgfVxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgLy8gTk90ZSBhIDQwNCBjYW4gYmUgbm90IGFmYWlsdXJlXG4gICAgICAgICAgdmFyIG9rID0gIXhoci5zdGF0dXMgfHwgeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMDtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMubm9NZXRhICYmIHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmZXRjaGVyLnNhdmVSZXNwb25zZU1ldGFkYXRhKHhociwgZmV0Y2hlci5zdG9yZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgdHJ1ZSk7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgb3B0aW9ucy5jb250ZW50VHlwZSB8fCAndGV4dC90dXJ0bGUnKTtcbiAgICAgIHhoci5zZW5kKG9wdGlvbnMuZGF0YSA/IG9wdGlvbnMuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy53ZWJDb3B5ID0gZnVuY3Rpb24gKGhlcmUsIHRoZXJlLCBjb250ZW50X3R5cGUpIHtcbiAgICB2YXIgZmV0Y2hlciA9IHRoaXM7XG4gICAgaGVyZSA9IGhlcmUudXJpIHx8IGhlcmU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZldGNoZXIud2ViT3BlcmF0aW9uKCdHRVQnLCBoZXJlKS50aGVuKGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgZmV0Y2hlci53ZWJPcGVyYXRpb24oJ1BVVCcsIC8vIEBAQCBjaGFuZ2UgdG8gYmluYXJ5IGZyb20gdGV4dFxuICAgICAgICB0aGVyZSwgeyBkYXRhOiB4aHIucmVzcG9uc2VUZXh0LCBjb250ZW50VHlwZTogY29udGVudF90eXBlIH0pLnRoZW4oZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgIHJlc29sdmUoeGhyKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTG9va3MgdXAgc29tZXRoaW5nLlxuICAvL1xuICAvLyBMb29rcyB1cCBhbGwgdGhlIFVSSXMgYSB0aGluZ3MgaGFzLlxuICAvL1xuICAvLyBQYXJhbWV0ZXJzOlxuICAvL1xuICAvLyAgdGVybTogICAgICAgY2Fub25pY2FsIHRlcm0gZm9yIHRoZSB0aGluZyB3aG9zZSBVUkkgaXMgdG8gYmUgZGVyZWZlcmVuY2VkXG4gIC8vICBydGVybTogICAgICB0aGUgcmVzb3VyY2Ugd2hpY2ggcmVmZXJlZCB0byB0aGlzIChmb3IgdHJhY2tpbmcgYmFkIGxpbmtzKVxuICAvLyAgb3B0aW9uczogICAgKG9sZDogZm9yY2UgcGFyYWVtdGVyKSBvciBkaWN0aW9uYXJ5IG9mIG9wdGlvbnM6XG4gIC8vICAgICAgZm9yY2U6ICAgICAgTG9hZCB0aGUgZGF0YSBldmVuIGlmIGxvYWRlZCBiZWZvcmVcbiAgLy8gIG9uZURvbmU6ICAgaXMgY2FsbGVkIGFzIGNhbGxiYWNrKG9rLCBlcnJvcmJvZHksIHhocikgZm9yIGVhY2ggb25lXG4gIC8vICBhbGxEb25lOiAgIGlzIGNhbGxlZCBhcyBjYWxsYmFjayhvaywgZXJyb3Jib2R5KSBmb3IgYWxsIG9mIHRoZW1cbiAgLy8gUmV0dXJucyAgICAgIHRoZSBudW1iZXIgb2YgVVJJcyBmZXRjaGVkXG4gIC8vXG4gIHRoaXMubG9va1VwVGhpbmcgPSBmdW5jdGlvbiAodGVybSwgcnRlcm0sIG9wdGlvbnMsIG9uZURvbmUsIGFsbERvbmUpIHtcbiAgICB2YXIgdXJpcyA9IGtiLnVyaXModGVybSk7IC8vIEdldCBhbGwgVVJJc1xuICAgIHZhciBzdWNjZXNzID0gdHJ1ZTtcbiAgICB2YXIgZXJyb3JzID0gJyc7XG4gICAgdmFyIG91dHN0YW5kaW5nID0ge307XG4gICAgdmFyIGZvcmNlO1xuICAgIGlmIChvcHRpb25zID09PSBmYWxzZSB8fCBvcHRpb25zID09PSB0cnVlKSB7XG4gICAgICAvLyBPbGQgc2lnbmF0dXJlXG4gICAgICBmb3JjZSA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0geyBmb3JjZTogZm9yY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9O1xuICAgICAgZm9yY2UgPSAhIW9wdGlvbnMuZm9yY2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB1cmlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1ID0gdXJpc1tpXTtcbiAgICAgICAgb3V0c3RhbmRpbmdbdV0gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvb2tlZFVwW3VdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNmID0gdGhpcztcblxuICAgICAgICB2YXIgcmVxdWVzdE9uZSA9IGZ1bmN0aW9uIHJlcXVlc3RPbmUodTEpIHtcbiAgICAgICAgICBzZi5yZXF1ZXN0VVJJKFVyaS5kb2NwYXJ0KHUxKSwgcnRlcm0sIG9wdGlvbnMsIGZ1bmN0aW9uIChvaywgYm9keSwgeGhyKSB7XG4gICAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICAgaWYgKG9uZURvbmUpIG9uZURvbmUodHJ1ZSwgdTEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9uZURvbmUpIG9uZURvbmUoZmFsc2UsIGJvZHkpO1xuICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGVycm9ycyArPSBib2R5ICsgJ1xcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3V0c3RhbmRpbmdbdV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3V0c3RhbmRpbmcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbERvbmUpIHtcbiAgICAgICAgICAgICAgYWxsRG9uZShzdWNjZXNzLCBlcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0T25lKHUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJpcy5sZW5ndGg7XG4gIH07XG5cbiAgLyogUHJvbWlzZS1iYXNlZCBsb2FkIGZ1bmN0aW9uXG4gICoqXG4gICoqIE5hbWVkTm9kZSAtPiBQcm9taXNlIG9mIHhoclxuICAqKiB1cmkgc3RyaW5nIC0+IFByb21pc2Ugb2YgeGhyXG4gICoqIEFycmF5IG9mIHRoZSBhYm92ZSAtPiBQcm9taXNlIG9mIGFycmF5IG9mIHhoclxuICAqKlxuICAqKiBAQCB0b2RvOiBJZiBwMSBpcyBhcnJheSB0aGVuIHNlcXVlbmNlIG9yIHBhcmFsbGVsIGZldGNoIG9mIGFsbFxuICAqL1xuICB0aGlzLmxvYWQgPSBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgdmFyIGZldGNoZXIgPSB0aGlzO1xuICAgIGlmICh1cmkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdmFyIHBzID0gdXJpLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hlci5sb2FkKHgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHMpO1xuICAgIH1cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTsgLy8gTmFtZWROb2RlIG9yIFVSSSBzdHJpbmdcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZmV0Y2hlci5ub3dPcldoZW5GZXRjaGVkKHVyaSwgb3B0aW9ucywgZnVuY3Rpb24gKG9rLCBtZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyogIEFzayBmb3IgYSBkb2MgdG8gYmUgbG9hZGVkIGlmIG5lY2Vzc2FyeSB0aGVuIGNhbGwgYmFja1xuICAqKlxuICAqKiBDaGFuZ2VkIDIwMTMtMDgtMjA6ICBBZGRlZCAob2ssIGVycm9ybWVzc2FnZSkgcGFyYW1zIHRvIGNhbGxiYWNrXG4gICoqXG4gICoqIENhbGxpbmcgbWV0aG9kczpcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHVzZXJDYWxsYmFjaylcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIG9wdGlvbnMsIHVzZXJDYWxsYmFjaylcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHJlZmVycmluZ1Rlcm0sIHVzZXJDYWxsYmFjaywgb3B0aW9ucykgIDwtLSBvbGRcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHJlZmVycmluZ1Rlcm0sIHVzZXJDYWxsYmFjaykgPC0tIG9sZFxuICAqKlxuICAqKiAgT3B0aW9ucyBpbmNsdWRlOlxuICAqKiAgIHJlZmVycmluZ1Rlcm0gICAgVGhlIGRvY3VlbW50IGluIHdoaWNoIHRoaXMgbGluayB3YXMgZm91bmQuXG4gICoqICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHZhbHVhYmxlIHdoZW4gZmluZGluZyB0aGUgc291cmNlIG9mIGJhZCBVUklzXG4gICoqICAgZm9yY2UgICAgICAgICAgICBib29sZWFuLiAgTmV2ZXIgbWluZCB3aGV0aGVyIHlvdSBoYXZlIHRyaWVkIGJlZm9yZSxcbiAgKiogICAgICAgICAgICAgICAgICAgIGxvYWQgdGhpcyBmcm9tIHNjcmF0Y2guXG4gICoqICAgZm9yY2VDb250ZW50VHlwZSBPdmVycmlkZSB0aGUgaW5jb21pbmcgaGVhZGVyIHRvIGZvcmNlIHRoZSBkYXRhIHRvIGJlXG4gICoqICAgICAgICAgICAgICAgICAgICB0cmVhZWQgYXMgdGhpcyBjb250ZW50LXR5cGUuXG4gICoqL1xuICB0aGlzLm5vd09yV2hlbkZldGNoZWQgPSBmdW5jdGlvbiAodXJpLCBwMiwgdXNlckNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgdXJpID0gdXJpLnVyaSB8fCB1cmk7IC8vIGFsbG93IHN5bWJvbCBvYmplY3Qgb3Igc3RyaW5nIHRvIGJlIHBhc3NlZFxuICAgIGlmICh0eXBlb2YgcDIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIHVzZXJDYWxsYmFjayA9IHAyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHAyID09PSAndW5kZWZpbmVkJykgey8vIG9yaWdpbmFsIGNhbGxpbmcgc2lnbmF0dXJlXG4gICAgICAvLyByZWZlcmluZ1Rlcm0gPSB1bmRlZmluZWRcbiAgICB9IGVsc2UgaWYgKHAyIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7XG4gICAgICAvLyByZWZlcmluZ1Rlcm0gPSBwMlxuICAgICAgb3B0aW9ucyA9IHsgcmVmZXJpbmdUZXJtOiBwMiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gcDI7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VVJJKHVyaSwgcDIsIG9wdGlvbnMgfHwge30sIHVzZXJDYWxsYmFjayk7XG4gIH07XG5cbiAgdGhpcy5nZXQgPSB0aGlzLm5vd09yV2hlbkZldGNoZWQ7XG5cbiAgLy8gTG9vayB1cCByZXNwb25zZSBoZWFkZXJcbiAgLy9cbiAgLy8gUmV0dXJuczogYSBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm91bmQgaW4gYSBzdG9yZWQgSFRUUCByZXNwb25zZVxuICAvLyAgICAgIG9yIFtdIGlmIHJlc3BvbnNlIHdhcyBmb3VuZCBidXQgbm8gaGVhZGVyIGZvdW5kXG4gIC8vICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vIHJlc3BvbnNlIGlzIGF2YWlsYWJsZS5cbiAgLy9cbiAgdGhpcy5nZXRIZWFkZXIgPSBmdW5jdGlvbiAoZG9jLCBoZWFkZXIpIHtcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIHZhciByZXF1ZXN0cyA9IGtiLmVhY2godW5kZWZpbmVkLCBucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwgZG9jLnVyaSk7XG4gICAgZm9yICh2YXIgciA9IDA7IHIgPCByZXF1ZXN0cy5sZW5ndGg7IHIrKykge1xuICAgICAgdmFyIHJlcXVlc3QgPSByZXF1ZXN0c1tyXTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0ga2IuYW55KHJlcXVlc3QsIG5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdHMgPSBrYi5lYWNoKHJlc3BvbnNlLCBucy5odHRwaChoZWFkZXIudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiB2LnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIHRoaXMucHJveHlJZk5lY2Vzc2FyeSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICBpZiAodHlwZW9mIHRhYnVsYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFidWxhdG9yLmlzRXh0ZW5zaW9uKSByZXR1cm4gdXJpOyAvLyBFeHRlbnN0aW9uIGRvZXMgbm90IG5lZWQgcHJveHlcblxuICAgIGlmICh0eXBlb2YgJFNvbGlkVGVzdEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAkU29saWRUZXN0RW52aXJvbm1lbnQubG9jYWxTaXRlTWFwKSB7XG4gICAgICAvLyBuZXN0ZWQgZGljdGlvbmFyaWVzIG9mIFVSSSBwYXJ0cyBmcm9tIG9yaWdpbiBkb3duXG4gICAgICB2YXIgaG9zdHBhdGggPSB1cmkuc3BsaXQoJy8nKS5zbGljZSgyKTsgLy8gdGhlIGJpdCBhZnRlciB0aGUgLy9cbiAgICAgIHZhciBsb29rdXAgPSBmdW5jdGlvbiBsb29rdXAocGFydHMsIGluZGV4KSB7XG4gICAgICAgIHZhciB6ID0gaW5kZXhbcGFydHMuc2hpZnQoKV07XG4gICAgICAgIGlmICgheikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgeiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4geiArIHBhcnRzLmpvaW4oJy8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxvb2t1cChwYXJ0cywgeik7XG4gICAgICB9O1xuICAgICAgdmFyIHkgPSBsb29rdXAoaG9zdHBhdGgsICRTb2xpZFRlc3RFbnZpcm9ubWVudC5sb2NhbFNpdGVNYXApO1xuICAgICAgaWYgKHkpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGJyb3dzZXIgZG9lcyAyMDE0IG9uIGFzIGh0dHBzIGJyb3dzZXIgc2NyaXB0IG5vdCB0cnVzdGVkXG4gICAgLy8gSWYgdGhlIHdlYiBhcHAgb3JpZ2luIGlzIGh0dHBzOiB0aGVuIHRoZSBtaXhlZCBjb250ZW50IHJ1bGVzXG4gICAgLy8gcHJldmVudCBpdCBsb2FkaW5nIGluc2VjdXJlIGh0dHA6IHN0dWZmIHNvIHdlIG5lZWQgcHJveHkuXG4gICAgaWYgKEZldGNoZXIuY3Jvc3NTaXRlUHJveHlUZW1wbGF0ZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmxvY2F0aW9uICYmICgnJyArIGRvY3VtZW50LmxvY2F0aW9uKS5zbGljZSgwLCA2KSA9PT0gJ2h0dHBzOicgJiYgLy8gb3JpZ2luIGlzIHNlY3VyZVxuICAgIHVyaS5zbGljZSgwLCA1KSA9PT0gJ2h0dHA6Jykge1xuICAgICAgLy8gcmVxdWVzdGVkIGRhdGEgaXMgbm90XG4gICAgICByZXR1cm4gRmV0Y2hlci5jcm9zc1NpdGVQcm94eVRlbXBsYXRlLnJlcGxhY2UoJ3t1cml9JywgZW5jb2RlVVJJQ29tcG9uZW50KHVyaSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpO1xuICB9O1xuXG4gIHRoaXMuc2F2ZVJlcXVlc3RNZXRhZGF0YSA9IGZ1bmN0aW9uICh4aHIsIGtiLCBkb2N1cmkpIHtcbiAgICB2YXIgcmVxdWVzdCA9IGtiLmJub2RlKCk7XG4gICAgeGhyLnJlc291cmNlID0ga2Iuc3ltKGRvY3VyaSk7XG5cbiAgICB4aHIucmVxID0gcmVxdWVzdDtcbiAgICBpZiAoIXhoci5vcHRpb25zLm5vTWV0YSkge1xuICAgICAgLy8gU3RvcmUgbm8gdHJpcGxlcyBidXQgZG8gbWluZCB0aGUgYm5vZGUgZm9yIHJlcVxuICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB2YXIgdGltZU5vdyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnXSAnO1xuICAgICAga2IuYWRkKHJlcXVlc3QsIG5zLnJkZnMoJ2xhYmVsJyksIGtiLmxpdGVyYWwodGltZU5vdyArICcgUmVxdWVzdCBmb3IgJyArIGRvY3VyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICBrYi5hZGQocmVxdWVzdCwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwoZG9jdXJpKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgIGlmICh4aHIub3JpZ2luYWwgJiYgeGhyLm9yaWdpbmFsLnVyaSAhPT0gZG9jdXJpKSB7XG4gICAgICAgIGtiLmFkZChyZXF1ZXN0LCBucy5saW5rKCdvcmdpbmFsVVJJJyksIGtiLmxpdGVyYWwoeGhyLm9yaWdpbmFsLnVyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICB9XG4gICAgICBrYi5hZGQocmVxdWVzdCwgbnMubGluaygnc3RhdHVzJyksIGtiLmNvbGxlY3Rpb24oKSwgdGhpcy5hcHBOb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgdGhpcy5zYXZlUmVzcG9uc2VNZXRhZGF0YSA9IGZ1bmN0aW9uICh4aHIsIGtiKSB7XG4gICAgdmFyIHJlc3BvbnNlID0ga2IuYm5vZGUoKTtcblxuICAgIGlmICh4aHIucmVxKSBrYi5hZGQoeGhyLnJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cCgnc3RhdHVzJyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1cyksIHJlc3BvbnNlKTtcbiAgICBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlKTtcblxuICAgIHhoci5oZWFkZXJzID0ge307XG4gICAgaWYgKFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2h0dHAnIHx8IFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2h0dHBzJykge1xuICAgICAgeGhyLmhlYWRlcnMgPSBVdGlsLmdldEhUVFBIZWFkZXJzKHhocik7XG4gICAgICBmb3IgKHZhciBoIGluIHhoci5oZWFkZXJzKSB7XG4gICAgICAgIC8vIHRyaW0gYmVsb3cgZm9yIFNhZmFyaSAtIGFkZHMgYSBDUiFcbiAgICAgICAgdmFyIHZhbHVlID0geGhyLmhlYWRlcnNbaF0udHJpbSgpO1xuICAgICAgICB2YXIgaDIgPSBoLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cGgoaDIpLCB2YWx1ZSwgcmVzcG9uc2UpO1xuICAgICAgICBpZiAoaDIgPT09ICdjb250ZW50LXR5cGUnKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBSREYgdHlwZVxuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLnJkZigndHlwZScpLCBVdGlsLm1lZGlhVHlwZUNsYXNzKHZhbHVlKSwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfTtcblxuICAvKiogUmVxdWVzdHMgYSBkb2N1bWVudCBVUkkgYW5kIGFycmFuZ2VzIHRvIGxvYWQgdGhlIGRvY3VtZW50LlxuICAgKiogUGFyYW1ldGVyczpcbiAgICoqXHQgICAgdGVybTogIHRlcm0gZm9yIHRoZSB0aGluZyB3aG9zZSBVUkkgaXMgdG8gYmUgZGVyZWZlcmVuY2VkXG4gICAqKiAgICAgIHJ0ZXJtOiAgdGhlIHJlc291cmNlIHdoaWNoIHJlZmVyZWQgdG8gdGhpcyAoZm9yIHRyYWNraW5nIGJhZCBsaW5rcylcbiAgICoqICAgICAgb3B0aW9uczpcbiAgICoqICAgICAgICAgICAgICBmb3JjZTogIExvYWQgdGhlIGRhdGEgZXZlbiBpZiBsb2FkZWQgYmVmb3JlXG4gICAqKiAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAgIGZsYWcgZm9yIFhIUi9DT1JTIGV0Y1xuICAgKiogICAgICB1c2VyQ2FsbGJhY2s6ICBDYWxsZWQgd2l0aCAodHJ1ZSkgb3IgKGZhbHNlLCBlcnJvcmJvZHksIHtzdGF0dXM6IDQwMH0pIGFmdGVyIGxvYWQgaXMgZG9uZSBvciBmYWlsZWRcbiAgICoqIFJldHVybiB2YWx1ZTpcbiAgICoqXHQgICAgVGhlIHhociBvYmplY3QgZm9yIHRoZSBIVFRQIGFjY2Vzc1xuICAgKiogICAgICBudWxsIGlmIHRoZSBwcm90b2NvbCBpcyBub3QgYSBsb29rLXVwIHByb3RvY29sLFxuICAgKiogICAgICAgICAgICAgIG9yIFVSSSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgKi9cbiAgdGhpcy5yZXF1ZXN0VVJJID0gZnVuY3Rpb24gKGRvY3VyaSwgcnRlcm0sIG9wdGlvbnMsIHVzZXJDYWxsYmFjaykge1xuICAgIC8vIHNvdXJjZXNfcmVxdWVzdF9uZXdcbiAgICAvLyBWYXJpb3VzIGNhbGxpbmcgY29udmVudGlvbnNcbiAgICBkb2N1cmkgPSBkb2N1cmkudXJpIHx8IGRvY3VyaTsgLy8gTmFtZWROb2RlIG9yIHN0cmluZ1xuICAgIGRvY3VyaSA9IGRvY3VyaS5zcGxpdCgnIycpWzBdO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBvcHRpb25zID0geyAnZm9yY2UnOiBvcHRpb25zIH07IC8vIE9scyBkaWduYXR1cmVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGZvcmNlID0gISFvcHRpb25zLmZvcmNlO1xuICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGJhc2VVUkkgPSBvcHRpb25zLmJhc2VVUkkgfHwgZG9jdXJpOyAvLyBQcmVzZXZlIHRob3VnaCBwcm94eWluZyBldGNcbiAgICBvcHRpb25zLnVzZXJDYWxsYmFjayA9IHVzZXJDYWxsYmFjaztcblxuICAgIHZhciBwY29sID0gVXJpLnByb3RvY29sKGRvY3VyaSk7XG4gICAgaWYgKHBjb2wgPT09ICd0ZWwnIHx8IHBjb2wgPT09ICdtYWlsdG8nIHx8IHBjb2wgPT09ICd1cm4nKSB7XG4gICAgICAvLyBcIk5vIGxvb2stdXAgb3BlcmF0aW9uIG9uIHRoZXNlLCBidXQgdGhleSBhcmUgbm90IGVycm9ycz9cIlxuICAgICAgY29uc29sZS5sb2coJ1Vuc3VwcG9ydGVkIHByb3RvY29sIGluOiAnICsgZG9jdXJpKTtcbiAgICAgIHJldHVybiB1c2VyQ2FsbGJhY2soZmFsc2UsICdVbnN1cHBvcnRlZCBwcm90b2NvbCcsIHsgJ3N0YXR1cyc6IDkwMCB9KSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBkb2N0ZXJtID0ga2Iuc3ltKGRvY3VyaSk7XG5cbiAgICB2YXIgc3RhID0gdGhpcy5nZXRTdGF0ZShkb2N1cmkpO1xuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGlmIChzdGEgPT09ICdmZXRjaGVkJykge1xuICAgICAgICByZXR1cm4gdXNlckNhbGxiYWNrID8gdXNlckNhbGxiYWNrKHRydWUpIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YSA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJDYWxsYmFjayA/IHVzZXJDYWxsYmFjayhmYWxzZSwgJ1ByZXZpb3VzbHkgZmFpbGVkLiAnICsgdGhpcy5yZXF1ZXN0ZWRbZG9jdXJpXSwgeyAnc3RhdHVzJzogdGhpcy5yZXF1ZXN0ZWRbZG9jdXJpXSB9KSA6IHVuZGVmaW5lZDsgLy8gQW4geGhyIHN0YW5kaW5cbiAgICAgIH1cbiAgICAgIC8vIGlmIChzdGEgPT09ICdyZXF1ZXN0ZWQnKSByZXR1cm4gdXNlckNhbGxiYWNrPyB1c2VyQ2FsbGJhY2soZmFsc2UsIFwiU29ycnkgYWxyZWFkeSByZXF1ZXN0ZWQgLSBwZW5kaW5nIGFscmVhZHkuXCIsIHsnc3RhdHVzJzogOTk5IH0pIDogdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm5vbmV4aXN0YW50W2RvY3VyaV07XG4gICAgfVxuICAgIC8vIEBAIFNob3VsZCBhbGxvdyBjb25jdXJyZW50IHJlcXVlc3RzXG5cbiAgICAvLyBJZiBpdCBpcyAnZmFpbGVkJywgdGhlbiBzaG91bGtkIHdlIHRyeSBhZ2Fpbj8gIEkgdGhpbmsgc28gc28gYW4gb2xkIGVycm9yIGRvZW5zJ3QgZ2V0IHN0dWNrXG4gICAgLy8gaWYgKHN0YSA9PT0gJ3VucmVxdWVzdGVkJylcblxuICAgIHRoaXMuZmlyZUNhbGxiYWNrcygncmVxdWVzdCcsIGFyZ3MpOyAvLyBLZW5ueTogZmlyZSAncmVxdWVzdCcgY2FsbGJhY2tzIGhlcmVcbiAgICAvLyBkdW1wKCBcIndlYi5qczogUmVxdWVzdGluZyB1cmk6IFwiICsgZG9jdXJpICsgXCJcXG5cIiApXG5cbiAgICBpZiAodXNlckNhbGxiYWNrKSB7XG4gICAgICBpZiAoIXRoaXMuZmV0Y2hDYWxsYmFja3NbZG9jdXJpXSkge1xuICAgICAgICB0aGlzLmZldGNoQ2FsbGJhY2tzW2RvY3VyaV0gPSBbdXNlckNhbGxiYWNrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmV0Y2hDYWxsYmFja3NbZG9jdXJpXS5wdXNoKHVzZXJDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkW2RvY3VyaV0gPT09IHRydWUpIHtcbiAgICAgIHJldHVybjsgLy8gRG9uJ3QgYXNrIGFnYWluIC0gd2FpdCBmb3IgZXhpc3RpbmcgY2FsbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcXVlc3RlZFtkb2N1cmldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMubm9NZXRhICYmIHJ0ZXJtICYmIHJ0ZXJtLnVyaSkge1xuICAgICAga2IuYWRkKGRvY3Rlcm0udXJpLCBucy5saW5rKCdyZXF1ZXN0ZWRCeScpLCBydGVybS51cmksIHRoaXMuYXBwTm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIHhociA9IFV0aWwuWE1MSFRUUEZhY3RvcnkoKTtcbiAgICB2YXIgcmVxID0geGhyLnJlcSA9IGtiLmJub2RlKCk7XG4gICAgeGhyLm9yaWdpbmFsID0ga2Iuc3ltKGJhc2VVUkkpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdYSFIgb3JpZ2luYWw6ICcgKyB4aHIub3JpZ2luYWwpXG4gICAgeGhyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm07IC8vIFRoaXMgbWlnaHQgYmUgcHJveGlmaWVkXG4gICAgdmFyIHNmID0gdGhpcztcblxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciB0aW1lTm93ID0gJ1snICsgbm93LmdldEhvdXJzKCkgKyAnOicgKyBub3cuZ2V0TWludXRlcygpICsgJzonICsgbm93LmdldFNlY29uZHMoKSArICddICc7XG4gICAgaWYgKCFvcHRpb25zLm5vTWV0YSkge1xuICAgICAga2IuYWRkKHJlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgZG9jdXJpKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgIGtiLmFkZChyZXEsIG5zLmxpbmsoJ3JlcXVlc3RlZFVSSScpLCBrYi5saXRlcmFsKGRvY3VyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICBrYi5hZGQocmVxLCBucy5saW5rKCdzdGF0dXMnKSwga2IuY29sbGVjdGlvbigpLCB0aGlzLmFwcE5vZGUpO1xuICAgIH1cblxuICAgIHZhciBjaGVja0NyZWRlbnRpYWxzUmV0cnkgPSBmdW5jdGlvbiBjaGVja0NyZWRlbnRpYWxzUmV0cnkoKSB7XG4gICAgICBpZiAoIXhoci53aXRoQ3JlZGVudGlhbHMpIHJldHVybiBmYWxzZTsgLy8gbm90IGRlYWx0IHdpdGhcblxuICAgICAgaWYgKHhoci5yZXRyaWVkV2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgeGhyLnJldHJpZWRXaXRoQ3JlZGVudGlhbHMgPSB0cnVlOyAvLyBwcm90ZWN0IGFnYWluc3QgY2FsbGVkIHR3aWNlXG4gICAgICBjb25zb2xlLmxvZygnd2ViOiBSZXRyeWluZyB3aXRoIG5vIGNyZWRlbnRpYWxzIGZvciAnICsgeGhyLnJlc291cmNlKTtcbiAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgZGVsZXRlIHNmLnJlcXVlc3RlZFtkb2N1cmldOyAvLyBmb3JnZXQgdGhlIG9yaWdpbmFsIHJlcXVlc3QgaGFwcGVuZWRcbiAgICAgIHZhciBuZXdvcHQgPSB7fTtcbiAgICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgICAgIC8vIHRyYW5zZmVyIGJhc2VVUkkgZXRjXG4gICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgICAgICBuZXdvcHRbb3B0XSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV3b3B0LndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsICdBYm9ydDogV2lsbCByZXRyeSB3aXRoIGNyZWRlbnRpYWxzIFNVUFBSRVNTRUQgdG8gc2VlIGlmIHRoYXQgaGVscHMnKTtcbiAgICAgIHNmLnJlcXVlc3RVUkkoZG9jdXJpLCBydGVybSwgbmV3b3B0LCB4aHIudXNlckNhbGxiYWNrKTsgLy8gdXNlckNhbGxiYWNrIGFscmVhZHkgcmVnaXN0ZXJlZCAod2l0aCB3aGVyZT8pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIG9uZXJyb3JGYWN0b3J5ID0gZnVuY3Rpb24gb25lcnJvckZhY3RvcnkoeGhyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHhoci5vbkVycm9yV2FzQ2FsbGVkID0gdHJ1ZTsgLy8gZGVidWdnaW5nIGFuZCBtYXkgbmVlZCBpdFxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE1hc2h1cCBzaXR1YXRpb24sIG5vdCBub2RlIGV0Y1xuICAgICAgICAgIGlmIChGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUgJiYgZG9jdW1lbnQubG9jYXRpb24gJiYgIXhoci5wcm94eVVzZWQpIHtcbiAgICAgICAgICAgIHZhciBob3N0cGFydCA9IFVyaS5ob3N0cGFydDtcbiAgICAgICAgICAgIHZhciBoZXJlID0gJycgKyBkb2N1bWVudC5sb2NhdGlvbjtcbiAgICAgICAgICAgIHZhciB1cmkgPSB4aHIucmVzb3VyY2UudXJpO1xuICAgICAgICAgICAgaWYgKGhvc3RwYXJ0KGhlcmUpICYmIGhvc3RwYXJ0KHVyaSkgJiYgaG9zdHBhcnQoaGVyZSkgIT09IGhvc3RwYXJ0KHVyaSkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY3Jvc3Mtc2l0ZVxuICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gNDAxIHx8IHhoci5zdGF0dXMgPT09IDQwMyB8fCB4aHIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2VGYWN0b3J5KHhocikoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJVCBJUyBBIFBBSU4gVEhBVCBOTyBQUk9QRVIgRVJST1IgUkVQT1JUSU5HXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3JlZGVudGlhbHNSZXRyeSh4aHIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBjcmVkZW50aWFscyBmbGFnIHNldCwgcmV0cnkgd2l0aG91dCxcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQgd2Fzbid0LCBvciB3ZSBhbHJlYWR5IHRyaWVkIHRoYXRcbiAgICAgICAgICAgICAgICB2YXIgbmV3VVJJID0gRmV0Y2hlci5jcm9zc1NpdGVQcm94eSh1cmkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3ZWI6IERpcmVjdCBmYWlsZWQgc28gdHJ5aW5nIHByb3h5ICcgKyBuZXdVUkkpO1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQkxPQ0tFRCAtPiBDcm9zcy1zaXRlIFByb3h5IHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgIHZhciBvbGRyZXEgPSB4aHIucmVxO1xuICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkVG8nKSwga2Iuc3ltKG5ld1VSSSksIG9sZHJlcSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIHhoci5hYm9ydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyhvbGRyZXEsICdyZWRpcmVjdGVkIHRvIG5ldyByZXF1ZXN0Jyk7IC8vIHdoeVxuICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gY2FsbGVkIGZyb20geGhyLm9uZXJyb3IgKHNvIHJlbW92ZWQpXG4gICAgICAgICAgICAgICAgLy8gc2YuZmlyZUNhbGxiYWNrcygnZG9uZScsIGFyZ3MpIC8vIEFyZSB0aGVzZSBhcmdzIHJpZ2h0PyBAQEAgICBOb3QgZG9uZSB5ZXQhIGRvbmUgbWVhbnMgc3VjY2Vzc1xuICAgICAgICAgICAgICAgIHNmLnJlcXVlc3RlZFt4aHIucmVzb3VyY2UudXJpXSA9ICdyZWRpcmVjdGVkJztcbiAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmICghc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSkge1xuICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID09PSBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldLmNvbmNhdChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSk7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucywgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKHhocjIpIHtcbiAgICAgICAgICAgICAgICAgIHhocjIucHJveHlVc2VkID0gdHJ1ZTsgLy8gb25seSB0cnkgdGhlIHByb3h5IG9uY2VcbiAgICAgICAgICAgICAgICAgIHhocjIub3JpZ2luYWwgPSB4aHIub3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUHJveHlpbmcgYnV0IG9yaWdpbmFsIHN0aWxsICcgKyB4aHIyLm9yaWdpbmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHhocjIgJiYgeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGtiLmFkZCh4aHIucmVxLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgeGhyMi5yZXEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyLkNPUlNfc3RhdHVzID0gOTk5O1xuICAgICAgICAgICAgLy8geGhyLnN0YXR1cyA9IDk5OSAgICAgZm9yYmlkZGVuIC0gcmVhZC1vbmx5XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIG1hc2h1XG4gICAgICB9OyAvLyBmdW5jdGlvbiBvZiBldmVudFxuICAgIH07IC8vIG9uZXJyb3JGYWN0b3J5XG5cbiAgICAvLyBTZXQgdXAgY2FsbGJhY2tzXG4gICAgdmFyIG9ucmVhZHlzdGF0ZWNoYW5nZUZhY3RvcnkgPSBmdW5jdGlvbiBvbnJlYWR5c3RhdGVjaGFuZ2VGYWN0b3J5KHhocikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhhbmRsZVJlc3BvbnNlID0gZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UoKSB7XG4gICAgICAgICAgaWYgKHhoci5oYW5kbGVSZXNwb25zZURvbmUpIHJldHVybjtcbiAgICAgICAgICB4aHIuaGFuZGxlUmVzcG9uc2VEb25lID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgaGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgdmFyIHRoaXNSZXEgPSB4aHIucmVxOyAvLyBNaWdodCBoYXZlIGNoYW5nZXMgYnkgcmVkaXJlY3RcbiAgICAgICAgICBzZi5maXJlQ2FsbGJhY2tzKCdyZWN2JywgYXJncyk7XG4gICAgICAgICAgdmFyIGtiID0gc2Yuc3RvcmU7XG4gICAgICAgICAgc2Yuc2F2ZVJlc3BvbnNlTWV0YWRhdGEoeGhyLCBrYik7XG4gICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygnaGVhZGVycycsIFt7IHVyaTogZG9jdXJpLCBoZWFkZXJzOiB4aHIuaGVhZGVycyB9XSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmb3IgbWFza2VkIGVycm9ycy5cbiAgICAgICAgICAvLyBGb3IgXCJzZWN1cml0eSByZWFzb25zXCIgdGhlYm9yYXNlciBoaWRlcyBlcnJvcnMgc3VjaCBhcyBDT1JTIGVycm9ycyBmcm9tXG4gICAgICAgICAgLy8gdGhlIGNhbGxpbmcgY29kZSAoMjAxNSkuIG9uZXJvcigpIHVzZWQgdG8gYmUgY2FsbGVkIGJ1dCBpcyBub3Qgbm93LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNYXNrZWQgZXJyb3IgLSBzdGF0dXMgMCBmb3IgJyArIHhoci5yZXNvdXJjZS51cmkpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQ3JlZGVudGlhbHNSZXRyeSh4aHIpKSB7XG4gICAgICAgICAgICAgIC8vIHJldHJ5IGlzIGNvdWxkIGJlIGNyZWRlbnRpYWxzIGZsYWcgQ09SUyBpc3N1ZVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHIuQ09SU19zdGF0dXMgPSA5MDA7IC8vIHVua25vd24gbWFza2VkIGVycm9yXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgICAgLy8gRm9yIGV4dHJhIGRpZ25vc3RpY3MsIGtlZXAgdGhlIHJlcGx5XG4gICAgICAgICAgICAvLyAgQEBAIDQwMSBzaG91bGQgY2F1c2UgIGEgcmV0cnkgd2l0aCBjcmVkZW50aWFsIHNvblxuICAgICAgICAgICAgLy8gQEBAIGNhY2hlIHRoZSBjcmVkZW50aWFscyBmbGFnIGJ5IGhvc3QgPz8/P1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgICBrYi5mZXRjaGVyLm5vbmV4aXN0YW50W3hoci5yZXNvdXJjZS51cmldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgIHZhciByZXNwb25zZTIgPSBrYi5ibm9kZSgpO1xuICAgICAgICAgICAgICBrYi5hZGQocmVzcG9uc2UyLCBucy5odHRwKCdjb250ZW50JyksIGtiLmxpdGVyYWwoeGhyLnJlc3BvbnNlVGV4dCksIHJlc3BvbnNlMik7XG4gICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCkge1xuICAgICAgICAgICAgICAgIGtiLmFkZChyZXNwb25zZTIsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlMik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZHVtcChcIkhUVFAgPj0gNDAwIHJlc3BvbnNlVGV4dDpcXG5cIit4aHIucmVzcG9uc2VUZXh0K1wiXFxuXCIpOyAvLyBAQEBAXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCAnSFRUUCBlcnJvciBmb3IgJyArIHhoci5yZXNvdXJjZSArICc6ICcgKyB4aHIuc3RhdHVzICsgJyAnICsgeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsb2MgPSB4aHIuaGVhZGVyc1snY29udGVudC1sb2NhdGlvbiddO1xuXG4gICAgICAgICAgLy8gZGVkdWNlIHNvbWUgdGhpbmdzIGZyb20gdGhlIEhUVFAgdHJhbnNhY3Rpb25cbiAgICAgICAgICB2YXIgYWRkVHlwZSA9IGZ1bmN0aW9uIGFkZFR5cGUoY2xhKSB7XG4gICAgICAgICAgICAvLyBhZGQgdHlwZSB0byBhbGwgcmVkaXJlY3RlZCByZXNvdXJjZXMgdG9vXG4gICAgICAgICAgICB2YXIgcHJldiA9IHRoaXNSZXE7XG4gICAgICAgICAgICBpZiAobG9jKSB7XG4gICAgICAgICAgICAgIHZhciBkb2NVUkkgPSBrYi5hbnkocHJldiwgbnMubGluaygncmVxdWVzdGVkVVJJJykpO1xuICAgICAgICAgICAgICBpZiAoZG9jVVJJICE9PSBsb2MpIHtcbiAgICAgICAgICAgICAgICBrYi5hZGQoa2Iuc3ltKGxvYyksIG5zLnJkZigndHlwZScpLCBjbGEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgIHZhciBkb2MgPSBrYi5hbnkocHJldiwgbnMubGluaygncmVxdWVzdGVkVVJJJykpO1xuICAgICAgICAgICAgICBpZiAoZG9jICYmIGRvYy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGtiLmFkZChrYi5zeW0oZG9jLnZhbHVlKSwgbnMucmRmKCd0eXBlJyksIGNsYSwgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgIH0gLy8gY29udmVydCBMaXRlcmFsXG4gICAgICAgICAgICAgIHByZXYgPSBrYi5hbnkodW5kZWZpbmVkLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgcHJldik7XG4gICAgICAgICAgICAgIGlmICghcHJldikgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShwcmV2LCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVzcG9uc2UnKSk7XG4gICAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGJyZWFrO1xuICAgICAgICAgICAgICB2YXIgcmVkaXJlY3Rpb24gPSBrYi5hbnkocmVzcG9uc2UsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvaHR0cCNzdGF0dXMnKSk7XG4gICAgICAgICAgICAgIGlmICghcmVkaXJlY3Rpb24pIGJyZWFrO1xuICAgICAgICAgICAgICBpZiAocmVkaXJlY3Rpb24gIT09ICczMDEnICYmIHJlZGlyZWN0aW9uICE9PSAnMzAyJykgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbWluaW1hbCBzZXQgdG8gYWxsb3cgdGhlIHVzZSBvZiBkYW1hZ2VkIHNlcnZlcnMgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgdmFyIGV4dGVuc2lvblRvQ29udGVudFR5cGUgPSB7XG4gICAgICAgICAgICAncmRmJzogJ2FwcGxpY2F0aW9uL3JkZit4bWwnLCAnb3dsJzogJ2FwcGxpY2F0aW9uL3JkZit4bWwnLFxuICAgICAgICAgICAgJ24zJzogJ3RleHQvbjMnLCAndHRsJzogJ3RleHQvdHVydGxlJywgJ250JzogJ3RleHQvbjMnLCAnYWNsJzogJ3RleHQvbjMnLFxuICAgICAgICAgICAgJ2h0bWwnOiAndGV4dC9odG1sJyxcbiAgICAgICAgICAgICd4bWwnOiAndGV4dC94bWwnXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgZ3Vlc3M7XG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgYWRkVHlwZShucy5saW5rKCdEb2N1bWVudCcpKTtcbiAgICAgICAgICAgIHZhciBjdCA9IHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlQ29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgeGhyLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gb3B0aW9ucy5mb3JjZUNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjdCB8fCBjdC5pbmRleE9mKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSA+PSAwKSB7XG4gICAgICAgICAgICAgIGd1ZXNzID0gZXh0ZW5zaW9uVG9Db250ZW50VHlwZVt4aHIucmVzb3VyY2UudXJpLnNwbGl0KCcuJykucG9wKCldO1xuICAgICAgICAgICAgICBpZiAoZ3Vlc3MpIHtcbiAgICAgICAgICAgICAgICB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBndWVzcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0KSB7XG4gICAgICAgICAgICAgIGlmIChjdC5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMCB8fCBjdC5pbmRleE9mKCdhcHBsaWNhdGlvbi9wZGYnKSA9PT0gMCkgYWRkVHlwZShrYi5zeW0oJ2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy9JbWFnZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNsZWFyUHJldmlvdXNEYXRhKSB7XG4gICAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSBwYXJzZSBuZXcgZGF0YSBjbGVhciBvbGQgYnV0IG9ubHkgb24gMjAwXG4gICAgICAgICAgICAgIGtiLnJlbW92ZURvY3VtZW50KHhoci5yZXNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTsgY2hhcnNldD11dGYtOFxuXG4gICAgICAgICAgaWYgKFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2ZpbGUnIHx8IFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2Nocm9tZScpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlQ29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgeGhyLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gb3B0aW9ucy5mb3JjZUNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZ3Vlc3MgPSBleHRlbnNpb25Ub0NvbnRlbnRUeXBlW3hoci5yZXNvdXJjZS51cmkuc3BsaXQoJy4nKS5wb3AoKV07XG4gICAgICAgICAgICAgIGlmIChndWVzcykge1xuICAgICAgICAgICAgICAgIHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGd1ZXNzO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICd0ZXh0L3htbCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZCBnb3QgdGhlIHRoaW5nIGF0IHRoaXMgbG9jYXRpb24sIGFib3J0XG4gICAgICAgICAgaWYgKGxvYykge1xuICAgICAgICAgICAgdmFyIHVkb2MgPSBVcmkuam9pbih4aHIucmVzb3VyY2UudXJpLCBsb2MpO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiB1ZG9jICE9PSB4aHIucmVzb3VyY2UudXJpICYmIHNmLnJlcXVlc3RlZFt1ZG9jXSAmJiBzZi5yZXF1ZXN0ZWRbdWRvY10gPT09ICdkb25lJykge1xuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgZmV0Y2hlZCB0aGlzIGluIGZhY3QuXG4gICAgICAgICAgICAgIC8vIHNob3VsZCB3ZSBzbXVzaCB0b28/XG4gICAgICAgICAgICAgIC8vIGxvZy5pbmZvKFwiSFRUUCBoZWFkZXJzIGluZGljYXRlIHdlIGhhdmUgYWxyZWFkeVwiICsgXCIgcmV0cmlldmVkIFwiICsgeGhyLnJlc291cmNlICsgXCIgYXMgXCIgKyB1ZG9jICsgXCIuIEFib3J0aW5nLlwiKVxuICAgICAgICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTtcbiAgICAgICAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNmLnJlcXVlc3RlZFt1ZG9jXSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZi5oYW5kbGVycy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgaWYgKHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAmJiB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10ubWF0Y2goc2YuaGFuZGxlcnNbeF0ucGF0dGVybikpIHtcbiAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBzZi5oYW5kbGVyc1t4XSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZi5wYXJzZUxpbmtIZWFkZXIoeGhyLCB0aGlzUmVxKTtcblxuICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBoYW5kbGVyLmhhbmRsZXJGYWN0b3J5KHhocik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBhdm9pZCBzaWxlbnQgZXJyb3JzXG4gICAgICAgICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdFeGNlcHRpb24gaGFuZGxpbmcgY29udGVudC10eXBlICcgKyB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10gKyAnIHdhczogJyArIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTsgLy8gIE5vdCBhIHByb2JsZW0sIHdlIGp1c3QgZG9uJ3QgZXh0cmFjdCBkYXRhLlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIC8vIHNmLmZhaWxGZXRjaCh4aHIsIFwiVW5oYW5kbGVkIGNvbnRlbnQgdHlwZTogXCIgKyB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10rXG4gICAgICAgICAgICAvLyAgICAgICAgXCIsIHJlYWR5U3RhdGUgPSBcIit4aHIucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERPTkU6IDRcbiAgICAgICAgLy8gSEVBREVSU19SRUNFSVZFRDogMlxuICAgICAgICAvLyBMT0FESU5HOiAzXG4gICAgICAgIC8vIE9QRU5FRDogMVxuICAgICAgICAvLyBVTlNFTlQ6IDBcblxuICAgICAgICAvLyBsb2cuZGVidWcoXCJ3ZWIuanM6IFhIUiBcIiArIHhoci5yZXNvdXJjZS51cmkgKyAnIHJlYWR5U3RhdGU9Jyt4aHIucmVhZHlTdGF0ZSk7IC8vIEBAQEAgY29tbWVudCBtZSBvdXRcblxuICAgICAgICBzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdmFyIHVyaSA9IHhoci5yZXNvdXJjZS51cmk7XG4gICAgICAgICAgICB2YXIgbmV3VVJJO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3Jvc3NTaXRlUHJveHlUZW1wbGF0ZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgIC8vIEluIG1hc2h1cCBzaXR1YXRpb25cbiAgICAgICAgICAgICAgdmFyIGhvc3RwYXJ0ID0gVXJpLmhvc3RwYXJ0O1xuICAgICAgICAgICAgICB2YXIgaGVyZSA9ICcnICsgZG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgIGlmIChob3N0cGFydChoZXJlKSAmJiBob3N0cGFydCh1cmkpICYmIGhvc3RwYXJ0KGhlcmUpICE9PSBob3N0cGFydCh1cmkpKSB7XG4gICAgICAgICAgICAgICAgbmV3VVJJID0gdGhpcy5jcm9zc1NpdGVQcm94eVRlbXBsYXRlLnJlcGxhY2UoJ3t1cml9JywgZW5jb2RlVVJJQ29tcG9uZW50KHVyaSkpO1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQkxPQ0tFRCAtPiBDcm9zcy1zaXRlIFByb3h5IHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgIHZhciBvbGRyZXEgPSB4aHIucmVxO1xuICAgICAgICAgICAgICAgIGtiLmFkZChvbGRyZXEsIG5zLmh0dHAoJ3JlZGlyZWN0ZWRUbycpLCBrYi5zeW0obmV3VVJJKSwgb2xkcmVxKTtcblxuICAgICAgICAgICAgICAgIC8vIC8vLy8vLy8vLy8vLyBDaGFuZ2UgdGhlIHJlcXVlc3Qgbm9kZSB0byBhIG5ldyBvbmU6ICBAQEBAQEBAQEBAQEAgRHVwbGljYXRlP1xuICAgICAgICAgICAgICAgIHZhciBuZXdyZXEgPSB4aHIucmVxID0ga2IuYm5vZGUoKTsgLy8gTWFrZSBORVcgcmVxZXN0IGZvciBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkUmVxdWVzdCcpLCBuZXdyZXEsIHhoci5yZXEpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWVOb3cgPSAnWycgKyBub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkgKyAnOicgKyBub3cuZ2V0U2Vjb25kcygpICsgJ10gJztcbiAgICAgICAgICAgICAgICBrYi5hZGQobmV3cmVxLCBucy5yZGZzKCdsYWJlbCcpLCBrYi5saXRlcmFsKHRpbWVOb3cgKyAnIFJlcXVlc3QgZm9yICcgKyBuZXdVUkkpLCB0aGlzLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgIGtiLmFkZChuZXdyZXEsIG5zLmxpbmsoJ3N0YXR1cycpLCBrYi5jb2xsZWN0aW9uKCksIHRoaXMuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwobmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcblxuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmJub2RlKCk7XG4gICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIC8vIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cCgnc3RhdHVzJyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1cyksIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgIC8vIGlmICh4aHIuc3RhdHVzVGV4dCkga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXNUZXh0JyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1c1RleHQpLCByZXNwb25zZSlcblxuICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIHhoci5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB4aHIucmVkaXJlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMob2xkcmVxLCAncmVkaXJlY3RlZCBYSFInKTsgLy8gd2h5XG5cbiAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmICghc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSkge1xuICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID09PSBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldLmNvbmNhdChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSk7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygncmVkaXJlY3RlZCcsIGFyZ3MpOyAvLyBBcmUgdGhlc2UgYXJncyByaWdodD8gQEBAXG4gICAgICAgICAgICAgICAgc2YucmVxdWVzdGVkW3hoci5yZXNvdXJjZS51cmldID0gJ3JlZGlyZWN0ZWQnO1xuXG4gICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucyB8fCB7fSwgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKHhocjIgJiYgeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgIGtiLmFkZCh4aHIucmVxLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgeGhyMi5yZXEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2YuZmFpbEZldGNoKHhociwgJ0hUVFAgQmxvY2tlZC4gKFJlYWR5U3RhdGUgMCkgQ3Jvc3Mtc2l0ZSB2aW9sYXRpb24gZm9yIDwnICsgZG9jdXJpICsgJz4nKTtcblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgc3RhdGUgLS0gMyBtYXkgT1IgTUFZIE5PVCBiZSBjYWxsZWQsIHNlbG9uIGJyb3dzZXIuXG4gICAgICAgICAgICAvLyBoYW5kbGVSZXNwb25zZSgpOyAgIC8vIEluIGdlbmVyYWwgaXQgeW91IGNhbid0IGRvIGl0IHlldCBhcyB0aGUgaGVhZGVycyBhcmUgaW4gYnV0IG5vdCB0aGUgZGF0YVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgLy8gRmluYWwgc3RhdGUgZm9yIHRoaXMgWEhSIGJ1dCBtYXkgYmUgcmVkaXJlY3RlZFxuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgIC8vIE5vdyBoYW5kbGVcbiAgICAgICAgICAgIGlmICh4aHIuaGFuZGxlICYmIHhoci5yZXNwb25zZVRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBjYW4gYmUgdmFsaWRseSB6ZXJvIGxlbmd0aFxuICAgICAgICAgICAgICBpZiAoc2YucmVxdWVzdGVkW3hoci5yZXNvdXJjZS51cmldID09PSAncmVkaXJlY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZi5maXJlQ2FsbGJhY2tzKCdsb2FkJywgYXJncyk7XG4gICAgICAgICAgICAgIHhoci5oYW5kbGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNmLmRvbmVGZXRjaCh4aHIpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh4aHIucmVkaXJlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQWJvcnRlZCBhbmQgcmVkaXJlY3RlZCB0byBuZXcgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0ZldGNoIG92ZXIuIE5vIGRhdGEgaGFuZGxlZC4gQWJvcnRlZCA9ICcgKyB4aHIuYWJvcnRlZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gc2YuZmFpbEZldGNoKHhociwgXCJIVFRQIGZhaWxlZCB1bnVzdWFsbHkuIChubyBoYW5kbGVyIHNldCkgKHgtc2l0ZSB2aW9sYXRpb24/IG5vIG5ldD8pIGZvciA8XCIrXG4gICAgICAgICAgICAgIC8vICAgIGRvY3VyaStcIj5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIHN3aXRjaFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gTWFwIHRoZSBVUkkgdG8gYSBsb2NhbGhvc3QgcHJveHkgaWYgd2UgYXJlIHJ1bm5pbmcgb24gbG9jYWxob3N0XG4gICAgLy8gVGhpcyBpcyB1c2VkIGZvciB3b3JraW5nIG9mZmxpbmUsIGUuZy4gb24gcGxhbmVzLlxuICAgIC8vIElzIHRoZSBzY3JpcHQgaXN0ZWxmIGlzIHJ1bm5pbmcgaW4gbG9jYWxob3N0LCB0aGVuIGFjY2VzcyBhbGwgZGF0YSBpbiBhIGxvY2FsaG9zdCBtaXJyb3IuXG4gICAgLy8gRG8gbm90IHJlbW92ZSB3aXRob3V0IGNoZWNraW5nIHdpdGggVGltQkxcbiAgICB2YXIgdXJpMiA9IGRvY3VyaTtcbiAgICBpZiAodHlwZW9mIHRhYnVsYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFidWxhdG9yLnByZWZlcmVuY2VzLmdldCgnb2ZmbGluZU1vZGVVc2luZ0xvY2FsaG9zdCcpKSB7XG4gICAgICBpZiAodXJpMi5zbGljZSgwLCA3KSA9PT0gJ2h0dHA6Ly8nICYmIHVyaTIuc2xpY2UoNywgMTcpICE9PSAnbG9jYWxob3N0LycpIHtcbiAgICAgICAgdXJpMiA9ICdodHRwOi8vbG9jYWxob3N0LycgKyB1cmkyLnNsaWNlKDcpO1xuICAgICAgICBsb2cud2FybignTG9jYWxob3N0IGtsdWRnZSBmb3Igb2ZmbGluZSB1c2U6IGFjdHVhbGx5IGdldHRpbmcgPCcgKyB1cmkyICsgJz4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxvZy53YXJuKFwiTG9jYWxob3N0IGtsdWRnZSBOT1QgVVNFRCA8XCIgKyB1cmkyICsgXCI+XCIpXG4gICAgICB9XG4gICAgfSBlbHNlIHt9XG4gICAgICAvLyBsb2cud2FybihcIkxvY2FsaG9zdCBrbHVkZ2UgT0ZGIG9mZmxpbmUgdXNlOiBhY3R1YWxseSBnZXR0aW5nIDxcIiArIHVyaTIgKyBcIj5cIilcblxuICAgICAgLy8gMjAxNCBwcm9iZWxtOlxuICAgICAgLy8gWE1MSHR0cFJlcXVlc3QgY2Fubm90IGxvYWQgaHR0cDovL3d3dy53My5vcmcvUGVvcGxlL0Jlcm5lcnMtTGVlL2NhcmQuXG4gICAgICAvLyBBIHdpbGRjYXJkICcqJyBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicgaGVhZGVyIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGZsYWcgaXMgdHJ1ZS5cbiAgICAgIC8vIEAgTWFueSBvbnRvbG9neSBmaWxlcyB1bmRlciBodHRwOiBhbmQgbmVlZCBDT1JTIHdpbGRjYXJkIC0+IGNhbid0IGhhdmUgd2l0aENyZWRlbnRpYWxzXG5cbiAgICB2YXIgd2l0aENyZWRlbnRpYWxzID0gdXJpMi5zbGljZSgwLCA2KSA9PT0gJ2h0dHBzOic7IC8vIEBAIEtsdWRnZSAtLSBuZWVkIGZvciB3ZWJpZCB3aGljaCB0eXBpY2FsbHkgaXMgc2VydmVkIGZyb20gaHR0cHNcbiAgICBpZiAob3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuICAgIHZhciBhY3R1YWxQcm94eVVSSSA9IHRoaXMucHJveHlJZk5lY2Vzc2FyeSh1cmkyKTtcblxuICAgIC8vIFNldHVwIHRoZSByZXF1ZXN0XG4gICAgLy8gdmFyIHhoclxuICAgIC8vIHhociA9IFV0aWwuWE1MSFRUUEZhY3RvcnkoKVxuICAgIHhoci5vbmVycm9yID0gb25lcnJvckZhY3RvcnkoeGhyKTtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gb25yZWFkeXN0YXRlY2hhbmdlRmFjdG9yeSh4aHIpO1xuICAgIHhoci50aW1lb3V0ID0gc2YudGltZW91dDtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzO1xuICAgIHhoci5hY3R1YWxQcm94eVVSSSA9IGFjdHVhbFByb3h5VVJJO1xuXG4gICAgeGhyLnJlcSA9IHJlcTtcbiAgICB4aHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgeGhyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm07XG4gICAgeGhyLnJlcXVlc3RlZFVSSSA9IHVyaTI7XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2YuZmFpbEZldGNoKHhociwgJ3JlcXVlc3RUaW1lb3V0Jyk7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIGFjdHVhbFByb3h5VVJJLCB0aGlzLmFzeW5jKTtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZmFpbEZldGNoKHhociwgJ1hIUiBvcGVuIGZvciBHRVQgZmFpbGVkIGZvciA8JyArIHVyaTIgKyAnPjpcXG5cXHQnICsgZXIpO1xuICAgIH1cbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIC8vIG11c3QgaGFwcGVuIGFmdGVyIG9wZW5cbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHJlZGlyZWN0IGNhbGxiYWNrIGFuZCByZXF1ZXN0IGhlYWRlcnMgLS0gYWxhcyBGaXJlZm94IEV4dGVuc2lvbiBPbmx5XG4gICAgaWYgKHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbiAmJiB4aHIuY2hhbm5lbCAmJiAoVXJpLnByb3RvY29sKHhoci5yZXNvdXJjZS51cmkpID09PSAnaHR0cCcgfHwgVXJpLnByb3RvY29sKHhoci5yZXNvdXJjZS51cmkpID09PSAnaHR0cHMnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLmNoYW5uZWwubm90aWZpY2F0aW9uQ2FsbGJhY2tzID0ge1xuICAgICAgICAgIGdldEludGVyZmFjZTogZnVuY3Rpb24gZ2V0SW50ZXJmYWNlKGlpZCkge1xuICAgICAgICAgICAgaWYgKGlpZC5lcXVhbHMoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUNoYW5uZWxFdmVudFNpbmspKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb25DaGFubmVsUmVkaXJlY3Q6IGZ1bmN0aW9uIG9uQ2hhbm5lbFJlZGlyZWN0KG9sZEMsIG5ld0MsIGZsYWdzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgICAgdmFyIG5ld1VSSSA9IG5ld0MuVVJJLnNwZWM7XG4gICAgICAgICAgICAgICAgICB2YXIgb2xkcmVxID0geGhyLnJlcTtcbiAgICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnUmVkaXJlY3RlZDogJyArIHhoci5zdGF0dXMgKyAnIHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMuaHR0cCgncmVkaXJlY3RlZFRvJyksIGtiLnN5bShuZXdVUkkpLCB4aHIucmVxKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyAvLy8vLy8vLy8vLy8gQ2hhbmdlIHRoZSByZXF1ZXN0IG5vZGUgdG8gYSBuZXcgb25lOiAgQEBAQEBAQEBAQEBAIER1cGxpY2F0ZSBjb2RlP1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3cmVxID0geGhyLnJlcSA9IGtiLmJub2RlKCk7IC8vIE1ha2UgTkVXIHJlcWVzdCBmb3IgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtiLmFkZChvbGRyZXEsIG5zLmh0dHAoJ3JlZGlyZWN0ZWRSZXF1ZXN0JyksIG5ld3JlcSwgdGhpcy5hcHBOb2RlKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVOb3cgPSAnWycgKyBub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkgKyAnOicgKyBub3cuZ2V0U2Vjb25kcygpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgbmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygnc3RhdHVzJyksIGtiLmNvbGxlY3Rpb24oKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwobmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIC8vIGxvZy5pbmZvKCdAQCBzb3VyY2VzIG9uQ2hhbm5lbFJlZGlyZWN0JytcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBcIlJlZGlyZWN0ZWQ6IFwiK1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHhoci5zdGF0dXMgKyBcIiB0byA8XCIgKyBuZXdVUkkgKyBcIj5cIik7IC8vQEBcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0ga2IuYm5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8ga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdsb2NhdGlvbicpLCBuZXdVUkksIHJlc3BvbnNlKTsgTm90IG9uIHRoaXMgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1cycpLCBrYi5saXRlcmFsKHhoci5zdGF0dXMpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCkga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXNUZXh0JyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1c1RleHQpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAtIDAgIT09IDMwMykga2IuSFRUUFJlZGlyZWN0c1t4aHIucmVzb3VyY2UudXJpXSA9IG5ld1VSSTsgLy8gc2FtZSBkb2N1bWVudCBhc1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgLSAwID09PSAzMDEgJiYgcnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMzAxIE1vdmVkXG4gICAgICAgICAgICAgICAgICAgIHZhciBiYWREb2MgPSBVcmkuZG9jcGFydChydGVybS51cmkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyAnIGhhcyBtb3ZlZCB0byA8JyArIG5ld1VSSSArICc+Lic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydGVybSkge1xuICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAnIExpbmsgaW4gPCcgKyBiYWREb2MgKyAnID5zaG91bGQgYmUgY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgICAga2IuYWRkKGJhZERvYywga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3dhcm5pbmcnKSwgbXNnLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBkdW1wKG1zZytcIlxcblwiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICB4aHIuYWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNmLmZldGNoQ2FsbGJhY2tzW25ld1VSSV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9PT0gc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXS5jb25jYXQoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyhvbGRyZXEsICdyZWRpcmVjdGVkJyk7IC8vIHdoeVxuICAgICAgICAgICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygncmVkaXJlY3RlZCcsIGFyZ3MpOyAvLyBBcmUgdGhlc2UgYXJncyByaWdodD8gQEBAXG4gICAgICAgICAgICAgICAgICBzZi5yZXF1ZXN0ZWRbeGhyLnJlc291cmNlLnVyaV0gPSAncmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICAgIHZhciBoYXNoID0gbmV3VVJJLmluZGV4T2YoJyMnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNoID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF4aHIub3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBrYi5hZGQoeGhyLnJlc291cmNlLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjd2FybmluZycpLCAnV2FybmluZzogJyArIHhoci5yZXNvdXJjZSArICcgSFRUUCByZWRpcmVjdHMgdG8nICsgbmV3VVJJICsgJyB3aGljaCBzaG91bGQgbm90IGNvbnRhaW4gYSBcIiNcIiBzaWduJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3VVJJID0gbmV3VVJJLnNsaWNlKDAsIGhhc2gpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucywgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyMiAmJiB4aHIyLnJlcSAmJiAhb3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKHhoci5yZXEsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNyZWRpcmVjdGVkUmVxdWVzdCcpLCB4aHIyLnJlcSwgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBlbHNlIGR1bXAoXCJObyB4aHIucmVxIGF2YWlsYWJsZSBmb3IgcmVkaXJlY3QgZnJvbSBcIit4aHIucmVzb3VyY2UrXCIgdG8gXCIrbmV3VVJJK1wiXFxuXCIpXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9YUENPTV9JbnRlcmZhY2VfUmVmZXJlbmNlL25zSUNoYW5uZWxFdmVudFNpbmtcbiAgICAgICAgICAgICAgICBhc3luY09uQ2hhbm5lbFJlZGlyZWN0OiBmdW5jdGlvbiBhc3luY09uQ2hhbm5lbFJlZGlyZWN0KG9sZEMsIG5ld0MsIGZsYWdzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICB2YXIga2IgPSBzZi5zdG9yZTtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdVUkkgPSBuZXdDLlVSSS5zcGVjO1xuICAgICAgICAgICAgICAgICAgdmFyIG9sZHJlcSA9IHhoci5yZXE7XG4gICAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ1JlZGlyZWN0ZWQ6ICcgKyB4aHIuc3RhdHVzICsgJyB0byA8JyArIG5ld1VSSSArICc+Jyk7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkVG8nKSwga2Iuc3ltKG5ld1VSSSksIHhoci5yZXEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyAvLy8vLy8vLy8vLy8gQ2hhbmdlIHRoZSByZXF1ZXN0IG5vZGUgdG8gYSBuZXcgb25lOiAgQEBAQEBAQEBAQEBAIER1cGxpY2F0ZT9cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdyZXEgPSB4aHIucmVxID0ga2IuYm5vZGUoKTsgLy8gTWFrZSBORVcgcmVxZXN0IGZvciBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgIC8vIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm1cbiAgICAgICAgICAgICAgICAgIC8vIHhoci5yZXF1ZXN0ZWRVUkkgPSBhcmdzWzBdXG5cbiAgICAgICAgICAgICAgICAgIC8vIGtiLmFkZChrYi5zeW0obmV3VVJJKSwgbnMubGluayhcInJlcXVlc3RcIiksIHJlcSwgdGhpcy5hcHBOb2RlKVxuICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMuaHR0cCgncmVkaXJlY3RlZFJlcXVlc3QnKSwgbmV3cmVxLCB4aHIucmVxKTtcblxuICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdGltZU5vdyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgbmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGtiLmFkZChuZXdyZXEsIG5zLmxpbmsoJ3N0YXR1cycpLCBrYi5jb2xsZWN0aW9uKCksIHRoaXMuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQobmV3cmVxLCBucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwga2IubGl0ZXJhbChuZXdVUkkpLCB0aGlzLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgLy8gLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAgICAgICAvLyAvLyBsb2cuaW5mbygnQEAgc291cmNlcyBvbkNoYW5uZWxSZWRpcmVjdCcrXG4gICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIFwiUmVkaXJlY3RlZDogXCIrXG4gICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHhoci5zdGF0dXMgKyBcIiB0byA8XCIgKyBuZXdVUkkgKyBcIj5cIik7IC8vQEBcbiAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmJub2RlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ2xvY2F0aW9uJyksIG5ld1VSSSwgcmVzcG9uc2UpOyBOb3Qgb24gdGhpcyByZXNwb25zZVxuICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXMnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXNUZXh0KSBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgLSAwICE9PSAzMDMpIGtiLkhUVFBSZWRpcmVjdHNbeGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7IC8vIHNhbWUgZG9jdW1lbnQgYXNcbiAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzIC0gMCA9PT0gMzAxICYmIHJ0ZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDMwMSBNb3ZlZFxuICAgICAgICAgICAgICAgICAgICB2YXIgYmFkRG9jID0gVXJpLmRvY3BhcnQocnRlcm0udXJpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9ICdXYXJuaW5nOiAnICsgeGhyLnJlc291cmNlICsgJyBoYXMgbW92ZWQgdG8gPCcgKyBuZXdVUkkgKyAnPi4nO1xuICAgICAgICAgICAgICAgICAgICBpZiAocnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gJyBMaW5rIGluIDwnICsgYmFkRG9jICsgJyA+c2hvdWxkIGJlIGNoYW5nZWQnO1xuICAgICAgICAgICAgICAgICAgICAgIGtiLmFkZChiYWREb2MsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayN3YXJuaW5nJyksIG1zZywgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgeGhyLmFib3J0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IG5ld1VSSS5pbmRleE9mKCcjJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoaGFzaCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtc2cyID0gJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyAnIEhUVFAgcmVkaXJlY3RzIHRvJyArIG5ld1VSSSArICcgd2hpY2ggZG8gbm90IG5vcm1hbGx5IGNvbnRhaW4gYSBcIiNcIiBzaWduJztcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3dhcm5pbmcnKSwgbXNnMik7XG4gICAgICAgICAgICAgICAgICAgIG5ld1VSSSA9IG5ld1VSSS5zbGljZSgwLCBoYXNoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9IHNmLmZldGNoQ2FsbGJhY2tzW25ld1VSSV0uY29uY2F0KHNmLmZldGNoQ2FsbGJhY2tzW3hoci5yZXNvdXJjZS51cmldKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBzZi5yZXF1ZXN0ZWRbeGhyLnJlc291cmNlLnVyaV0gPSAncmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICAgIHZhciB4aHIyID0gc2YucmVxdWVzdFVSSShuZXdVUkksIHhoci5yZXNvdXJjZSwgeGhyLm9wdGlvbnMsIHhoci51c2VyQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgaWYgKHhocjIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGJlIG5vIFhIUiBpcyBvdGhlciBVUkkgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgeGhyMi5vcmlnaW5hbCA9IHhoci5vcmlnaW5hbDsgLy8gdXNlIHRoaXMgZm9yIGZpbmRpbmcgYmFzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBrYi5hZGQoeGhyLnJlcSwga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3JlZGlyZWN0ZWRSZXF1ZXN0JyksIHhocjIucmVxLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gZWxzZSBkdW1wKFwiTm8geGhyLnJlcSBhdmFpbGFibGUgZm9yIHJlZGlyZWN0IGZyb20gXCIreGhyLnJlc291cmNlK1wiIHRvIFwiK25ld1VSSStcIlxcblwiKVxuICAgICAgICAgICAgICAgIH0gLy8gYXN5bmNPbkNoYW5uZWxSZWRpcmVjdFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudHMucmVzdWx0cy5OU19OT0lOVEVSRkFDRTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHNmLmZhaWxGZXRjaCh4aHIsIFwiQEAgQ291bGRuJ3Qgc2V0IGNhbGxiYWNrIGZvciByZWRpcmVjdHM6IFwiICsgZXJyKTtcbiAgICAgIH0gLy8gdHJ5XG4gICAgfSAvLyBpZiBGaXJlZm94IGV4dGVuc2lvblxuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBhY2NlcHRzdHJpbmcgPSAnJztcbiAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5tZWRpYXR5cGVzKSB7XG4gICAgICAgIC8vIHZhciBhdHRyc3RyaW5nID0gJydcbiAgICAgICAgaWYgKGFjY2VwdHN0cmluZyAhPT0gJycpIHtcbiAgICAgICAgICBhY2NlcHRzdHJpbmcgKz0gJywgJztcbiAgICAgICAgfVxuICAgICAgICBhY2NlcHRzdHJpbmcgKz0gdHlwZTtcbiAgICAgICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLm1lZGlhdHlwZXNbdHlwZV0pIHtcbiAgICAgICAgICBhY2NlcHRzdHJpbmcgKz0gJzsnICsgYXR0ciArICc9JyArIHRoaXMubWVkaWF0eXBlc1t0eXBlXVthdHRyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsIGFjY2VwdHN0cmluZyk7XG4gICAgICB0aGlzLmFkZFN0YXR1cyh4aHIucmVxLCAnQWNjZXB0OiAnICsgYWNjZXB0c3RyaW5nKTtcblxuICAgICAgLy8gaWYgKHJlcXVlc3RlcikgeyB4aHIuc2V0UmVxdWVzdEhlYWRlcignUmVmZXJlcicscmVxdWVzdGVyKSB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzZXQgQWNjZXB0IGhlYWRlcjogXCIgKyBlcnIpO1xuICAgIH1cblxuICAgIC8vIEZpcmVcbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZhaWxGZXRjaCh4aHIsICdYSFIgc2VuZCBmYWlsZWQ6JyArIGVyKTtcbiAgICB9XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQgJiYgc2YuaXNQZW5kaW5nKHhoci5yZXNvdXJjZS51cmkpKSB7XG4gICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdyZXF1ZXN0VGltZW91dCcpO1xuICAgICAgfVxuICAgIH0sIHRoaXMudGltZW91dCk7XG4gICAgdGhpcy5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hUVFAgUmVxdWVzdCBzZW50LicpO1xuICAgIHJldHVybiB4aHI7XG4gIH07IC8vIHRoaXMucmVxdWVzdFVSSSgpXG5cbiAgdGhpcy5vYmplY3RSZWZyZXNoID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICB2YXIgdXJpcyA9IGtiLnVyaXModGVybSk7IC8vIEdldCBhbGwgVVJJc1xuICAgIGlmICh0eXBlb2YgdXJpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlZnJlc2godGhpcy5zdG9yZS5zeW0oVXJpLmRvY3BhcnQodXJpc1tpXSkpKTtcbiAgICAgICAgLy8gd2hhdCBhYm91dCBydGVybT9cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gZGVwcmVjYXRlZCAtLSB1c2UgSW5kZXhlZEZvcm11bGEucmVtb3ZlRG9jdW1lbnQoZG9jKVxuICB0aGlzLnVubG9hZCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgdGhpcy5zdG9yZS5yZW1vdmVNYW55KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRlcm0pO1xuICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RlZFt0ZXJtLnVyaV07IC8vIFNvIGl0IGNhbiBiZSBsb2FkZWQgYWdhaW5cbiAgfTtcblxuICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAodGVybSwgdXNlckNhbGxiYWNrKSB7XG4gICAgLy8gc291cmNlc19yZWZyZXNoXG4gICAgdGhpcy5maXJlQ2FsbGJhY2tzKCdyZWZyZXNoJywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnJlcXVlc3RVUkkodGVybS51cmksIHVuZGVmaW5lZCwgeyBmb3JjZTogdHJ1ZSwgY2xlYXJQcmV2aW91c0RhdGE6IHRydWUgfSwgdXNlckNhbGxiYWNrKTtcbiAgfTtcblxuICB0aGlzLnJldHJhY3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIC8vIHNvdXJjZXNfcmV0cmFjdFxuICAgIHRoaXMuc3RvcmUucmVtb3ZlTWFueSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0ZXJtKTtcbiAgICBpZiAodGVybS51cmkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RlZFtVcmkuZG9jcGFydCh0ZXJtLnVyaSldO1xuICAgIH1cbiAgICB0aGlzLmZpcmVDYWxsYmFja3MoJ3JldHJhY3QnLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHRoaXMuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoZG9jdXJpKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuICd1bnJlcXVlc3RlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJ3JlcXVlc3RlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAnZG9uZScpIHtcbiAgICAgIHJldHVybiAnZmV0Y2hlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAncmVkaXJlY3RlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0YXRlKHRoaXMucmVkaXJlY3RlZFRvW2RvY3VyaV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiBub24tMjAwIEhUVFAgZXJyb3Igc3RhdHVzXG4gICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgfVxuICB9O1xuXG4gIC8vIGRvaW5nIGFueVN0YXRlbWVudE1hdGNoaW5nIGlzIHdhc3RpbmcgdGltZVxuICB0aGlzLmlzUGVuZGluZyA9IGZ1bmN0aW9uIChkb2N1cmkpIHtcbiAgICAvLyBzb3VyY2VzX3BlbmRpbmdcbiAgICAvLyBpZiBpdCdzIG5vdCBwZW5kaW5nOiBmYWxzZSAtPiBmbGFpbGVkICdkb25lJyAtPiBkb25lICdyZWRpcmVjdGVkJyAtPiByZWRpcmVjdGVkXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdGVkW2RvY3VyaV0gPT09IHRydWU7XG4gIH07XG4gIC8vIHZhciB1cGRhdGVzVmlhID0gbmV3ICRyZGYuVXBkYXRlc1ZpYSh0aGlzKSAvLyBTdWJzY3JpYmUgdG8gaGVhZGVyc1xuICAvLyBAQEBAQEBAQCBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCBjYXVzZXMgYSB3ZWJzb2NrZXQgdG8gYmUgc2V0IHVwIGZvciBBTlkgZmV0Y2hcbiAgLy8gd2hldGhlciB3ZSB3YW50IHRvIHRyYWNrIGl0IG90IG5vdC4gaW5jbHVkaW5nIG9udG9sb2dpZXMgbG9hZWQgdGhvdWdoIHRoZSBYU1Nwcm94eVxufTsgLy8gRW5kIG9mIGZldGNoZXJcblxubW9kdWxlLmV4cG9ydHMgPSBGZXRjaGVyOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIgQ2xhc3NPcmRlciA9IHJlcXVpcmUoJy4vY2xhc3Mtb3JkZXInKTtcbnZhciBDb2xsZWN0aW9uID0gcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZScpO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgVmFyaWFibGUgPSByZXF1aXJlKCcuL3ZhcmlhYmxlJyk7XG5cbnZhciBGb3JtdWxhID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhGb3JtdWxhLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gRm9ybXVsYShzdGF0ZW1lbnRzLCBjb25zdHJhaW50cywgaW5pdEJpbmRpbmdzLCBvcHRpb25hbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtdWxhKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGb3JtdWxhLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybXVsYSkpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBGb3JtdWxhLnRlcm1UeXBlO1xuICAgIF90aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzIHx8IFtdO1xuICAgIF90aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHMgfHwgW107XG4gICAgX3RoaXMuaW5pdEJpbmRpbmdzID0gaW5pdEJpbmRpbmdzIHx8IFtdO1xuICAgIF90aGlzLm9wdGlvbmFsID0gb3B0aW9uYWwgfHwgW107XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvcm11bGEsIFt7XG4gICAga2V5OiAnYWRkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHMsIHAsIG8sIGcpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHMucHVzaChuZXcgU3RhdGVtZW50KHMsIHAsIG8sIGcpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhZGRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRTdGF0ZW1lbnQoc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHMucHVzaChzdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYm5vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibm9kZShpZCkge1xuICAgICAgcmV0dXJuIG5ldyBCbGFua05vZGUoaWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgdHlwZXMgaW4gdGhlIGxpc3Qgd2hpY2ggaGF2ZSBubyAqc3RvcmVkKiBzdWJ0eXBlc1xuICAgICAqIFRoZXNlIGFyZSBhIHNldCBvZiBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgYnkgdGhlbXNlbHZlcyBjb21wbGV0ZVxuICAgICAqIGluZm9ybWF0aW9uIC0tIHRoZSBvdGhlciBjbGFzc2VzIGFyZSByZWR1bmRhbnQgZm9yIHRob3NlIHdob1xuICAgICAqIGtub3cgdGhlIGNsYXNzIERBRy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnYm90dG9tVHlwZVVSSXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBib3R0b21UeXBlVVJJcyh0eXBlcykge1xuICAgICAgdmFyIGJvdHM7XG4gICAgICB2YXIgYm90dG9tO1xuICAgICAgdmFyIGVsdDtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGs7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHZhciBzdWJzO1xuICAgICAgdmFyIHY7XG4gICAgICBib3RzID0gW107XG4gICAgICBmb3IgKGsgaW4gdHlwZXMpIHtcbiAgICAgICAgaWYgKCF0eXBlcy5oYXNPd25Qcm9wZXJ0eShrKSkgY29udGludWU7XG4gICAgICAgIHYgPSB0eXBlc1trXTtcbiAgICAgICAgc3VicyA9IHRoaXMuZWFjaCh2b2lkIDAsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjc3ViQ2xhc3NPZicpLCB0aGlzLnN5bShrKSk7XG4gICAgICAgIGJvdHRvbSA9IHRydWU7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBmb3IgKGxlbiA9IHN1YnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBlbHQgPSBzdWJzW2ldO1xuICAgICAgICAgIHJlZiA9IGVsdC51cmk7XG4gICAgICAgICAgaWYgKHJlZiBpbiB0eXBlcykge1xuICAgICAgICAgICAgLy8gdGhlIHN1YmNsYXNzIGlzIG9uZSB3ZSBrbm93XG4gICAgICAgICAgICBib3R0b20gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYm90dG9tKSB7XG4gICAgICAgICAgYm90c1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBib3RzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbGxlY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xsZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZWFjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2gocywgcCwgbywgZykge1xuICAgICAgdmFyIGVsdCwgaSwgbCwgbSwgcTtcbiAgICAgIHZhciBsZW4sIGxlbjEsIGxlbjIsIGxlbjM7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgdmFyIHN0cyA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHMsIHAsIG8sIGcsIGZhbHNlKTtcbiAgICAgIGlmIChzID09IG51bGwpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgZWx0ID0gc3RzW2ldO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbHQuc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocCA9PSBudWxsKSB7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBzdHMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgICAgZWx0ID0gc3RzW2xdO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbHQucHJlZGljYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgZm9yIChtID0gMCwgbGVuMiA9IHN0cy5sZW5ndGg7IG0gPCBsZW4yOyBtKyspIHtcbiAgICAgICAgICBlbHQgPSBzdHNbbV07XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGVsdC5vYmplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGcgPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHEgPSAwLCBsZW4zID0gc3RzLmxlbmd0aDsgcSA8IGxlbjM7IHErKykge1xuICAgICAgICAgIGVsdCA9IHN0c1txXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goZWx0LndoeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5oYXNoU3RyaW5nKCkgPT09IG90aGVyLmhhc2hTdHJpbmcoKTtcbiAgICB9XG4gICAgLypcbiAgICBGb3IgdGhpc0NsYXNzIG9yIGFueSBzdWJjbGFzcywgYW55dGhpbmcgd2hpY2ggaGFzIGl0IGlzIGl0cyB0eXBlXG4gICAgb3IgaXMgdGhlIG9iamVjdCBvZiBzb21ldGhpbmcgd2hpY2ggaGFzIHRoZSB0eXBlIGFzIGl0cyByYW5nZSwgb3Igc3ViamVjdFxuICAgIG9mIHNvbWV0aGluZyB3aGljaCBoYXMgdGhlIHR5cGUgYXMgaXRzIGRvbWFpblxuICAgIFdlIGRvbid0IGJvdGhlciBkb2luZyBzdWJwcm9wZXJ0eSAoeWV0PylhcyBpdCBkb2Vzbid0IHNlZWVtIHRvIGJlIHVzZWQgbXVjaC5cbiAgICBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgbWVtYmVyXG4gICAgQHJldHVybnMgYSBoYXNoIG9mIFVSSXNcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRm9yIHRoaXNDbGFzcyBvciBhbnkgc3ViY2xhc3MsIGFueXRoaW5nIHdoaWNoIGhhcyBpdCBpcyBpdHMgdHlwZVxuICAgICAqIG9yIGlzIHRoZSBvYmplY3Qgb2Ygc29tZXRoaW5nIHdoaWNoIGhhcyB0aGUgdHlwZSBhcyBpdHMgcmFuZ2UsIG9yIHN1YmplY3RcbiAgICAgKiBvZiBzb21ldGhpbmcgd2hpY2ggaGFzIHRoZSB0eXBlIGFzIGl0cyBkb21haW5cbiAgICAgKiBXZSBkb24ndCBib3RoZXIgZG9pbmcgc3VicHJvcGVydHkgKHlldD8pYXMgaXQgZG9lc24ndCBzZWVlbSB0byBiZSB1c2VkXG4gICAgICogbXVjaC5cbiAgICAgKiBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgbWVtYmVyXG4gICAgICogQHJldHVybiBhIGhhc2ggb2YgVVJJc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmaW5kTWVtYmVyc05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZE1lbWJlcnNOVCh0aGlzQ2xhc3MpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGw7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIGxlbjE7XG4gICAgICB2YXIgbGVuMjtcbiAgICAgIHZhciBsZW4zO1xuICAgICAgdmFyIGxlbjQ7XG4gICAgICB2YXIgbTtcbiAgICAgIHZhciBtZW1iZXJzO1xuICAgICAgdmFyIHByZWQ7XG4gICAgICB2YXIgcTtcbiAgICAgIHZhciByZWY7XG4gICAgICB2YXIgcmVmMTtcbiAgICAgIHZhciByZWYyO1xuICAgICAgdmFyIHJlZjM7XG4gICAgICB2YXIgcmVmNDtcbiAgICAgIHZhciByZWY1O1xuICAgICAgdmFyIHNlZWRzO1xuICAgICAgdmFyIHN0O1xuICAgICAgdmFyIHQ7XG4gICAgICB2YXIgdTtcbiAgICAgIHNlZWRzID0ge307XG4gICAgICBzZWVkc1t0aGlzQ2xhc3MudG9OVCgpXSA9IHRydWU7XG4gICAgICBtZW1iZXJzID0ge307XG4gICAgICByZWYgPSB0aGlzLnRyYW5zaXRpdmVDbG9zdXJlKHNlZWRzLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSwgdHJ1ZSk7XG4gICAgICBmb3IgKHQgaW4gcmVmKSB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KHQpKSBjb250aW51ZTtcbiAgICAgICAgcmVmMSA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHZvaWQgMCwgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyksIHRoaXMuZnJvbU5UKHQpKTtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmMS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHN0ID0gcmVmMVtpXTtcbiAgICAgICAgICBtZW1iZXJzW3N0LnN1YmplY3QudG9OVCgpXSA9IHN0O1xuICAgICAgICB9XG4gICAgICAgIHJlZjIgPSB0aGlzLmVhY2godm9pZCAwLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI2RvbWFpbicpLCB0aGlzLmZyb21OVCh0KSk7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIHByZWQgPSByZWYyW2xdO1xuICAgICAgICAgIHJlZjMgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh2b2lkIDAsIHByZWQpO1xuICAgICAgICAgIGZvciAobSA9IDAsIGxlbjIgPSByZWYzLmxlbmd0aDsgbSA8IGxlbjI7IG0rKykge1xuICAgICAgICAgICAgc3QgPSByZWYzW21dO1xuICAgICAgICAgICAgbWVtYmVyc1tzdC5zdWJqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVmNCA9IHRoaXMuZWFjaCh2b2lkIDAsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjcmFuZ2UnKSwgdGhpcy5mcm9tTlQodCkpO1xuICAgICAgICBmb3IgKHEgPSAwLCBsZW4zID0gcmVmNC5sZW5ndGg7IHEgPCBsZW4zOyBxKyspIHtcbiAgICAgICAgICBwcmVkID0gcmVmNFtxXTtcbiAgICAgICAgICByZWY1ID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCBwcmVkKTtcbiAgICAgICAgICBmb3IgKHUgPSAwLCBsZW40ID0gcmVmNS5sZW5ndGg7IHUgPCBsZW40OyB1KyspIHtcbiAgICAgICAgICAgIHN0ID0gcmVmNVt1XTtcbiAgICAgICAgICAgIG1lbWJlcnNbc3Qub2JqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRNZW1iZXJVUklzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZE1lbWJlclVSSXMoc3ViamVjdCkge1xuICAgICAgcmV0dXJuIHRoaXMuTlR0b1VSSSh0aGlzLmZpbmRNZW1iZXJzTlQoc3ViamVjdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgc3VwZXJjbGFzc1xuICAgICAqIFJldHVybnMgYSBoYXNoIHRhYmxlIHdoZXJlIGtleSBpcyBOVCBvZiB0eXBlIGFuZCB2YWx1ZSBpcyBzdGF0ZW1lbnQgd2h5IHdlXG4gICAgICogdGhpbmsgc28uXG4gICAgICogRG9lcyBOT1QgcmV0dXJuIHRlcm1zLCByZXR1cm5zIFVSSSBzdHJpbmdzLlxuICAgICAqIFdlIHVzZSBOVCByZXByZXNlbnRhdGlvbnMgaW4gdGhpcyB2ZXJzaW9uIGJlY2F1c2UgdGhleSBoYW5kbGUgYmxhbmsgbm9kZXMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRTdWJDbGFzc2VzTlQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kU3ViQ2xhc3Nlc05UKHN1YmplY3QpIHtcbiAgICAgIHZhciB0eXBlcyA9IHt9O1xuICAgICAgdHlwZXNbc3ViamVjdC50b05UKCldID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpdmVDbG9zdXJlKHR5cGVzLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdGhlIENsYXNzZXMgb2Ygd2hpY2ggd2UgY2FuIFJERlMtaW5mZXIgdGhlIHN1YmplY3QgaXMgYSBzdWJjbGFzc1xuICAgICAqIFJldHVybnMgYSBoYXNoIHRhYmxlIHdoZXJlIGtleSBpcyBOVCBvZiB0eXBlIGFuZCB2YWx1ZSBpcyBzdGF0ZW1lbnQgd2h5IHdlXG4gICAgICogdGhpbmsgc28uXG4gICAgICogRG9lcyBOT1QgcmV0dXJuIHRlcm1zLCByZXR1cm5zIFVSSSBzdHJpbmdzLlxuICAgICAqIFdlIHVzZSBOVCByZXByZXNlbnRhdGlvbnMgaW4gdGhpcyB2ZXJzaW9uIGJlY2F1c2UgdGhleSBoYW5kbGUgYmxhbmsgbm9kZXMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRTdXBlckNsYXNzZXNOVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRTdXBlckNsYXNzZXNOVChzdWJqZWN0KSB7XG4gICAgICB2YXIgdHlwZXMgPSB7fTtcbiAgICAgIHR5cGVzW3N1YmplY3QudG9OVCgpXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2l0aXZlQ2xvc3VyZSh0eXBlcywgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNzdWJDbGFzc09mJyksIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB0aGUgQ2xhc3NlcyBvZiB3aGljaCB3ZSBjYW4gUkRGUy1pbmZlciB0aGUgc3ViamVjdCBpcyBhIG1lbWJlclxuICAgICAqIHRvZG86IFRoaXMgd2lsbCBsb29wIGlzIHRoZXJlIGlzIGEgY2xhc3Mgc3ViY2xhc3MgbG9vcCAoU3VibGFzcyBsb29wcyBhcmVcbiAgICAgKiBub3QgaWxsZWdhbClcbiAgICAgKiBSZXR1cm5zIGEgaGFzaCB0YWJsZSB3aGVyZSBrZXkgaXMgTlQgb2YgdHlwZSBhbmQgdmFsdWUgaXMgc3RhdGVtZW50IHdoeSB3ZVxuICAgICAqIHRoaW5rIHNvLlxuICAgICAqIERvZXMgTk9UIHJldHVybiB0ZXJtcywgcmV0dXJucyBVUkkgc3RyaW5ncy5cbiAgICAgKiBXZSB1c2UgTlQgcmVwcmVzZW50YXRpb25zIGluIHRoaXMgdmVyc2lvbiBiZWNhdXNlIHRoZXkgaGFuZGxlIGJsYW5rIG5vZGVzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmaW5kVHlwZXNOVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRUeXBlc05UKHN1YmplY3QpIHtcbiAgICAgIHZhciBkb21haW47XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBsO1xuICAgICAgdmFyIGxlbjtcbiAgICAgIHZhciBsZW4xO1xuICAgICAgdmFyIGxlbjI7XG4gICAgICB2YXIgbGVuMztcbiAgICAgIHZhciBtO1xuICAgICAgdmFyIHE7XG4gICAgICB2YXIgcmFuZ2U7XG4gICAgICB2YXIgcmRmdHlwZTtcbiAgICAgIHZhciByZWY7XG4gICAgICB2YXIgcmVmMTtcbiAgICAgIHZhciByZWYyO1xuICAgICAgdmFyIHJlZjM7XG4gICAgICB2YXIgc3Q7XG4gICAgICB2YXIgdHlwZXM7XG4gICAgICByZGZ0eXBlID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcbiAgICAgIHR5cGVzID0gW107XG4gICAgICByZWYgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyhzdWJqZWN0LCB2b2lkIDAsIHZvaWQgMCk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3QgPSByZWZbaV07XG4gICAgICAgIGlmIChzdC5wcmVkaWNhdGUudXJpID09PSByZGZ0eXBlKSB7XG4gICAgICAgICAgdHlwZXNbc3Qub2JqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWYxID0gdGhpcy5lYWNoKHN0LnByZWRpY2F0ZSwgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNkb21haW4nKSk7XG4gICAgICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgICAgICByYW5nZSA9IHJlZjFbbF07XG4gICAgICAgICAgICB0eXBlc1tyYW5nZS50b05UKCldID0gc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWYyID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCB2b2lkIDAsIHN1YmplY3QpO1xuICAgICAgZm9yIChtID0gMCwgbGVuMiA9IHJlZjIubGVuZ3RoOyBtIDwgbGVuMjsgbSsrKSB7XG4gICAgICAgIHN0ID0gcmVmMlttXTtcbiAgICAgICAgcmVmMyA9IHRoaXMuZWFjaChzdC5wcmVkaWNhdGUsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjcmFuZ2UnKSk7XG4gICAgICAgIGZvciAocSA9IDAsIGxlbjMgPSByZWYzLmxlbmd0aDsgcSA8IGxlbjM7IHErKykge1xuICAgICAgICAgIGRvbWFpbiA9IHJlZjNbcV07XG4gICAgICAgICAgdHlwZXNbZG9tYWluLnRvTlQoKV0gPSBzdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGl2ZUNsb3N1cmUodHlwZXMsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjc3ViQ2xhc3NPZicpLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZmluZFR5cGVVUklzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZFR5cGVVUklzKHN1YmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLk5UdG9VUkkodGhpcy5maW5kVHlwZXNOVChzdWJqZWN0KSk7XG4gICAgfVxuICAgIC8vIFRyYWNlIHRoZSBzdGF0ZW1lbnRzIHdoaWNoIGNvbm5lY3QgZGlyZWN0bHksIG9yIHRocm91Z2ggYm5vZGVzXG4gICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBzdGF0ZW1lbnRzXG4gICAgLy8gZG9jIHBhcmFtIG1heSBiZSBudWxsIHRvIHNlYXJjaCBhbGwgZG9jdW1lbnRzIGluIHN0b3JlXG5cbiAgfSwge1xuICAgIGtleTogJ2Nvbm5lY3RlZFN0YXRlbWVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25uZWN0ZWRTdGF0ZW1lbnRzKHN1YmplY3QsIGRvYywgZXhjbHVkZVByZWRpY2F0ZVVSSXMpIHtcbiAgICAgIGV4Y2x1ZGVQcmVkaWNhdGVVUklzID0gZXhjbHVkZVByZWRpY2F0ZVVSSXMgfHwgW107XG4gICAgICB2YXIgdG9kbyA9IFtzdWJqZWN0XTtcbiAgICAgIHZhciBkb25lID0gW107XG4gICAgICB2YXIgZG9uZUFyY3MgPSBbXTtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBmb2xsb3cgPSBmdW5jdGlvbiBmb2xsb3coeCkge1xuICAgICAgICB2YXIgcXVldWUgPSBmdW5jdGlvbiBxdWV1ZSh4KSB7XG4gICAgICAgICAgaWYgKHgudGVybVR5cGUgPT09ICdCbGFua05vZGUnICYmICFkb25lW3gudmFsdWVdKSB7XG4gICAgICAgICAgICBkb25lW3gudmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRvZG8ucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzdHMgPSBzZWxmLnN0YXRlbWVudHNNYXRjaGluZyhudWxsLCBudWxsLCB4LCBkb2MpLmNvbmNhdChzZWxmLnN0YXRlbWVudHNNYXRjaGluZyh4LCBudWxsLCBudWxsLCBkb2MpKTtcbiAgICAgICAgc3RzID0gc3RzLmZpbHRlcihmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICBpZiAoZXhjbHVkZVByZWRpY2F0ZVVSSXNbc3QucHJlZGljYXRlLnVyaV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB2YXIgaGFzaCA9IHN0LnRvTlQoKTtcbiAgICAgICAgICBpZiAoZG9uZUFyY3NbaGFzaF0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBkb25lQXJjc1toYXNoXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHMuZm9yRWFjaChmdW5jdGlvbiAoc3QsIGkpIHtcbiAgICAgICAgICBxdWV1ZShzdC5zdWJqZWN0KTtcbiAgICAgICAgICBxdWV1ZShzdC5vYmplY3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChzdHMpO1xuICAgICAgfTtcbiAgICAgIHdoaWxlICh0b2RvLmxlbmd0aCkge1xuICAgICAgICBmb2xsb3codG9kby5zaGlmdCgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKCcnICsgcmVzdWx0Lmxlbmd0aCArICcgc3RhdGVtZW50cyBhYm91dCAnICsgc3ViamVjdClcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZm9ybXVsYScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm11bGEoKSB7XG4gICAgICByZXR1cm4gbmV3IEZvcm11bGEoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBhbiBOVHJpcGxlcyBzdHJpbmcgZm9ybWF0IGludG8gYSBOb2RlLlxuICAgICAqIFRoZSBibm9kZSBiaXQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHByb2dyYW0tZXh0ZXJuYWwgdmFsdWVzOyBkZXNpZ25lZFxuICAgICAqIGZvciBpbnRlcm5hbCB3b3JrIHN1Y2ggYXMgc3RvcmluZyBhIGJub2RlIGlkIGluIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgICAqIFRoaXMgd2lsbCBvbmx5IHBhcnNlIHRoZSBzdHJpbmdzIGdlbmVyYXRlZCBieSB0aGUgdmFpb3VzIHRvTlQoKSBtZXRob2RzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmcm9tTlQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tTlQoc3RyKSB7XG4gICAgICB2YXIgZHQsIGssIGxhbmcsIHg7XG4gICAgICBzd2l0Y2ggKHN0clswXSkge1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zeW0oc3RyLnNsaWNlKDEsIC0xKSk7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICBsYW5nID0gdm9pZCAwO1xuICAgICAgICAgIGR0ID0gdm9pZCAwO1xuICAgICAgICAgIGsgPSBzdHIubGFzdEluZGV4T2YoJ1wiJyk7XG4gICAgICAgICAgaWYgKGsgPCBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgaWYgKHN0cltrICsgMV0gPT09ICdAJykge1xuICAgICAgICAgICAgICBsYW5nID0gc3RyLnNsaWNlKGsgKyAyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKGsgKyAxLCBrICsgMykgPT09ICdeXicpIHtcbiAgICAgICAgICAgICAgZHQgPSB0aGlzLmZyb21OVChzdHIuc2xpY2UoayArIDMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbnZlcnQgc3RyaW5nIGZyb20gTlQ6IFwiICsgc3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDEsIGspO1xuICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKTtcbiAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXRlcmFsKHN0ciwgbGFuZywgZHQpO1xuICAgICAgICBjYXNlICdfJzpcbiAgICAgICAgICB4ID0gbmV3IEJsYW5rTm9kZSgpO1xuICAgICAgICAgIHguaWQgPSBwYXJzZUludChzdHIuc2xpY2UoMyksIDEwKTtcbiAgICAgICAgICBCbGFua05vZGUubmV4dElkLS07XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGUoc3RyLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbnZlcnQgZnJvbSBOVDogXCIgKyBzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hvbGRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaG9sZHMocywgcCwgbywgZykge1xuICAgICAgdmFyIGk7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ob2xkcyhzW2ldKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ob2xkcyhzLnN1YmplY3QsIHMucHJlZGljYXRlLCBzLm9iamVjdCwgcy53aHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHMuc3RhdGVtZW50cykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhvbGRzKHMuc3RhdGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHN0ID0gdGhpcy5hbnlTdGF0ZW1lbnRNYXRjaGluZyhzLCBwLCBvLCBnKTtcbiAgICAgIHJldHVybiBzdCAhPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hvbGRzU3RhdGVtZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaG9sZHNTdGF0ZW1lbnQoc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmhvbGRzKHN0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCBzdC53aHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xpc3QnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0KHZhbHVlcykge1xuICAgICAgdmFyIGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbigpO1xuICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBjb2xsZWN0aW9uLmFwcGVuZCh2YWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdsaXRlcmFsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGl0ZXJhbCh2YWwsIGxhbmcsIGR0KSB7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwoJycgKyB2YWwsIGxhbmcsIGR0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJhbnNmb3JtIGEgY29sbGVjdGlvbiBvZiBOVHJpcGxlIFVSSXMgaW50byB0aGVpciBVUkkgc3RyaW5nc1xuICAgICAqIEBwYXJhbSB0IHNvbWUgaXRlcmFibGUgY29sbGV0aW9uIG9mIE5UcmlwbGUgVVJJIHN0cmluZ3NcbiAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgVVJJcyBhcyBzdHJpbmdzXG4gICAgICogdG9kbzogZXhwbGFpbiB3aHkgaXQgaXMgaW1wb3J0YW50IHRvIGdvIHRocm91Z2ggTlRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnTlR0b1VSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIE5UdG9VUkkodCkge1xuICAgICAgdmFyIGssIHY7XG4gICAgICB2YXIgdXJpcyA9IHt9O1xuICAgICAgZm9yIChrIGluIHQpIHtcbiAgICAgICAgaWYgKCF0Lmhhc093blByb3BlcnR5KGspKSBjb250aW51ZTtcbiAgICAgICAgdiA9IHRba107XG4gICAgICAgIGlmIChrWzBdID09PSAnPCcpIHtcbiAgICAgICAgICB1cmlzW2suc2xpY2UoMSwgLTEpXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NlcmlhbGl6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlcmlhbGl6ZShiYXNlLCBjb250ZW50VHlwZSwgcHJvdmVuYW5jZSkge1xuICAgICAgdmFyIGRvY3VtZW50U3RyaW5nO1xuICAgICAgdmFyIHN0cztcbiAgICAgIHZhciBzejtcbiAgICAgIHN6ID0gU2VyaWFsaXplcih0aGlzKTtcbiAgICAgIHN6LnN1Z2dlc3ROYW1lc3BhY2VzKHRoaXMubmFtZXNwYWNlcyk7XG4gICAgICBzei5zZXRCYXNlKGJhc2UpO1xuICAgICAgaWYgKHByb3ZlbmFuY2UpIHtcbiAgICAgICAgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgcHJvdmVuYW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHMgPSB0aGlzLnN0YXRlbWVudHM7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlICE9IG51bGwgPyBjb250ZW50VHlwZSA6ICd0ZXh0L24zJykge1xuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9yZGYreG1sJzpcbiAgICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb1hNTChzdHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0L24zJzpcbiAgICAgICAgY2FzZSAndGV4dC90dXJ0bGUnOlxuICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMoc3RzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlcmlhbGl6ZTogQ29udGVudC10eXBlICcgKyBjb250ZW50VHlwZSArICcgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2N1bWVudFN0cmluZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHN0YXRlbWVudHNDb3B5ID0gdGhpcy5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoZWEpIHtcbiAgICAgICAgcmV0dXJuIGVhLnN1YnN0aXR1dGUoYmluZGluZ3MpO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygnRm9ybXVsYSBzdWJzIHN0YXRtbnRzOicgKyBzdGF0ZW1lbnRzQ29weSk7XG4gICAgICB2YXIgeSA9IG5ldyBGb3JtdWxhKCk7XG4gICAgICB5LmFkZChzdGF0ZW1lbnRzQ29weSk7XG4gICAgICBjb25zb2xlLmxvZygnaW5kZXhlZC1mb3JtIHN1YnMgZm9ybXVsYTonICsgeSk7XG4gICAgICByZXR1cm4geTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzeW0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzeW0odXJpLCBuYW1lKSB7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZmVhdHVyZSAoa2Iuc3ltIHdpdGggMiBhcmdzKSBpcyByZW1vdmVkLiBEbyBub3QgYXNzdW1lIHByZWZpeCBtYXBwaW5ncy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHVyaSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndGhlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdGhlKHMsIHAsIG8sIGcpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hbnkocywgcCwgbywgZyk7XG4gICAgICBpZiAoeCA9PSBudWxsKSB7XG4gICAgICAgIGxvZy5lcnJvcignTm8gdmFsdWUgZm91bmQgZm9yIHRoZSgpIHsnICsgcyArICcgJyArIHAgKyAnICcgKyBvICsgJ30uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUkRGUyBJbmZlcmVuY2VcbiAgICAgKiBUaGVzZSBhcmUgaGFuZC13cml0dGVuIGltcGxlbWVudGF0aW9ucyBvZiBhIGJhY2t3YXJkLWNoYWluaW5nIHJlYXNvbmVyXG4gICAgICogb3ZlciB0aGUgUkRGUyBheGlvbXMuXG4gICAgICogQHBhcmFtIHNlZWRzIHtPYmplY3R9IGEgaGFzaCBvZiBOVHMgb2YgY2xhc3NlcyB0byBzdGFydCB3aXRoXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgcHJvcGVydHkgdG8gdHJhY2UgdGhvdWdoXG4gICAgICogQHBhcmFtIGludmVyc2UgdHJhY2UgaW52ZXJzZSBkaXJlY3Rpb25cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAndHJhbnNpdGl2ZUNsb3N1cmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2l0aXZlQ2xvc3VyZShzZWVkcywgcHJlZGljYXRlLCBpbnZlcnNlKSB7XG4gICAgICB2YXIgZWx0LCBpLCBsZW4sIHMsIHN1cHMsIHQ7XG4gICAgICB2YXIgYWdlbmRhID0ge307XG4gICAgICBPYmplY3QuYXNzaWduKGFnZW5kYSwgc2VlZHMpOyAvLyBtYWtlIGEgY29weVxuICAgICAgdmFyIGRvbmUgPSB7fTsgLy8gY2xhc3NlcyB3ZSBoYXZlIGxvb2tlZCB1cFxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIGFnZW5kYSkge1xuICAgICAgICAgICAgaWYgKCFhZ2VuZGEuaGFzT3duUHJvcGVydHkocCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgfVxuICAgICAgICB9KCk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgICAgICBzdXBzID0gaW52ZXJzZSA/IHRoaXMuZWFjaCh2b2lkIDAsIHByZWRpY2F0ZSwgdGhpcy5mcm9tTlQodCkpIDogdGhpcy5lYWNoKHRoaXMuZnJvbU5UKHQpLCBwcmVkaWNhdGUpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgZWx0ID0gc3Vwc1tpXTtcbiAgICAgICAgICBzID0gZWx0LnRvTlQoKTtcbiAgICAgICAgICBpZiAocyBpbiBkb25lKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMgaW4gYWdlbmRhKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbmRhW3NdID0gYWdlbmRhW3RdO1xuICAgICAgICB9XG4gICAgICAgIGRvbmVbdF0gPSBhZ2VuZGFbdF07XG4gICAgICAgIGRlbGV0ZSBhZ2VuZGFbdF07XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCB3aGljaCBoYXZlIG5vICpzdG9yZWQqIHN1cGVydHlwZXNcbiAgICAgKiBXZSBleGNsdWRlIHRoZSB1bml2ZXJzYWwgY2xhc3MsIG93bDpUaGluZ3MgYW5kIHJkZjpSZXNvdXJjZSwgYXMgaXQgaXNcbiAgICAgKiBpbmZvcm1hdGlvbi1mcmVlLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0b3BUeXBlVVJJcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvcFR5cGVVUklzKHR5cGVzKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBqO1xuICAgICAgdmFyIGs7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIG47XG4gICAgICB2YXIgcmVmO1xuICAgICAgdmFyIHRvcHM7XG4gICAgICB2YXIgdjtcbiAgICAgIHRvcHMgPSBbXTtcbiAgICAgIGZvciAoayBpbiB0eXBlcykge1xuICAgICAgICBpZiAoIXR5cGVzLmhhc093blByb3BlcnR5KGspKSBjb250aW51ZTtcbiAgICAgICAgdiA9IHR5cGVzW2tdO1xuICAgICAgICBuID0gMDtcbiAgICAgICAgcmVmID0gdGhpcy5lYWNoKHRoaXMuc3ltKGspLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSk7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGogPSByZWZbaV07XG4gICAgICAgICAgaWYgKGoudXJpICE9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI1Jlc291cmNlJykge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbikge1xuICAgICAgICAgIHRvcHNba10gPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9wc1snaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI1Jlc291cmNlJ10pIHtcbiAgICAgICAgZGVsZXRlIHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNSZXNvdXJjZSddO1xuICAgICAgfVxuICAgICAgaWYgKHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI1RoaW5nJ10pIHtcbiAgICAgICAgZGVsZXRlIHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI1RoaW5nJ107XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICd7JyArIHRoaXMuc3RhdGVtZW50cy5qb2luKCdcXG4nKSArICd9JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd3aGV0aGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2hldGhlcihzLCBwLCBvLCBnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcocywgcCwgbywgZywgZmFsc2UpLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9ybXVsYTtcbn0oTm9kZSk7XG5cbkZvcm11bGEudGVybVR5cGUgPSAnR3JhcGgnO1xuXG5Gb3JtdWxhLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnR3JhcGgnXTtcbkZvcm11bGEucHJvdG90eXBlLmlzVmFyID0gMDtcblxuRm9ybXVsYS5wcm90b3R5cGUubnMgPSByZXF1aXJlKCcuL25hbWVzcGFjZScpO1xuRm9ybXVsYS5wcm90b3R5cGUudmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gbmV3IFZhcmlhYmxlKG5hbWUpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGb3JtdWxhOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbmRleGVkRm9ybXVsYSA9IHJlcXVpcmUoJy4vaW5kZXhlZC1mb3JtdWxhJyk7XG5cbnZhciBfaW5kZXhlZEZvcm11bGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5kZXhlZEZvcm11bGEpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgJHJkZiA9IHtcbiAgQmxhbmtOb2RlOiByZXF1aXJlKCcuL2JsYW5rLW5vZGUnKSxcbiAgQ29sbGVjdGlvbjogcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyksXG4gIGNvbnZlcnQ6IHJlcXVpcmUoJy4vY29udmVydCcpLFxuICBEYXRhRmFjdG9yeTogcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKSxcbiAgRW1wdHk6IHJlcXVpcmUoJy4vZW1wdHknKSxcbiAgRmV0Y2hlcjogcmVxdWlyZSgnLi9mZXRjaGVyJyksXG4gIEZvcm11bGE6IHJlcXVpcmUoJy4vZm9ybXVsYScpLFxuICBJbmRleGVkRm9ybXVsYTogX2luZGV4ZWRGb3JtdWxhMi5kZWZhdWx0LFxuICBqc29uUGFyc2VyOiByZXF1aXJlKCcuL2pzb25wYXJzZXInKSxcbiAgTGl0ZXJhbDogcmVxdWlyZSgnLi9saXRlcmFsJyksXG4gIGxvZzogcmVxdWlyZSgnLi9sb2cnKSxcbiAgTjNQYXJzZXI6IHJlcXVpcmUoJy4vbjNwYXJzZXInKSxcbiAgTmFtZWROb2RlOiByZXF1aXJlKCcuL25hbWVkLW5vZGUnKSxcbiAgTmFtZXNwYWNlOiByZXF1aXJlKCcuL25hbWVzcGFjZScpLFxuICBOb2RlOiByZXF1aXJlKCcuL25vZGUnKSxcbiAgcGFyc2U6IHJlcXVpcmUoJy4vcGFyc2UnKSxcbiAgUXVlcnk6IHJlcXVpcmUoJy4vcXVlcnknKS5RdWVyeSxcbiAgcXVlcnlUb1NQQVJRTDogcmVxdWlyZSgnLi9xdWVyeS10by1zcGFycWwnKSxcbiAgUkRGYVByb2Nlc3NvcjogcmVxdWlyZSgnLi9yZGZhcGFyc2VyJyksXG4gIFJERlBhcnNlcjogcmVxdWlyZSgnLi9yZGZ4bWxwYXJzZXInKSxcbiAgc2VyaWFsaXplOiByZXF1aXJlKCcuL3NlcmlhbGl6ZScpLFxuICBTZXJpYWxpemVyOiByZXF1aXJlKCcuL3NlcmlhbGl6ZXInKSxcbiAgU1BBUlFMVG9RdWVyeTogcmVxdWlyZSgnLi9zcGFycWwtdG8tcXVlcnknKSxcbiAgc3BhcnFsVXBkYXRlUGFyc2VyOiByZXF1aXJlKCcuL3BhdGNoLXBhcnNlcicpLFxuICBTdGF0ZW1lbnQ6IHJlcXVpcmUoJy4vc3RhdGVtZW50JyksXG4gIHRlcm06IHJlcXVpcmUoJy4vbm9kZScpLmZyb21WYWx1ZSxcbiAgVXBkYXRlTWFuYWdlcjogcmVxdWlyZSgnLi91cGRhdGUtbWFuYWdlcicpLFxuICBVcGRhdGVzU29ja2V0OiByZXF1aXJlKCcuL3VwZGF0ZXMtdmlhJykuVXBkYXRlc1NvY2tldCxcbiAgVXBkYXRlc1ZpYTogcmVxdWlyZSgnLi91cGRhdGVzLXZpYScpLlVwZGF0ZXNWaWEsXG4gIHVyaTogcmVxdWlyZSgnLi91cmknKSxcbiAgVXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gIFZhcmlhYmxlOiByZXF1aXJlKCcuL3ZhcmlhYmxlJylcbn07XG5cbiRyZGYuTmV4dElkID0gJHJkZi5CbGFua05vZGUubmV4dElkO1xuXG4kcmRmLmZyb21OVCA9ICRyZGYuRm9ybXVsYS5wcm90b3R5cGUuZnJvbU5UO1xuJHJkZi5mZXRjaGVyID0gJHJkZi5EYXRhRmFjdG9yeS5mZXRjaGVyO1xuJHJkZi5ncmFwaCA9ICRyZGYuRGF0YUZhY3RvcnkuZ3JhcGg7XG4kcmRmLmxpdCA9ICRyZGYuRGF0YUZhY3RvcnkubGl0O1xuJHJkZi5zdCA9ICRyZGYuRGF0YUZhY3Rvcnkuc3Q7XG4kcmRmLnN5bSA9ICRyZGYuRGF0YUZhY3RvcnkubmFtZWROb2RlO1xuJHJkZi52YXJpYWJsZSA9ICRyZGYuRGF0YUZhY3RvcnkudmFyaWFibGU7XG5cbi8vIFJERkpTIERhdGFGYWN0b3J5IGludGVyZmFjZVxuJHJkZi5ibGFua05vZGUgPSAkcmRmLkRhdGFGYWN0b3J5LmJsYW5rTm9kZTtcbiRyZGYuZGVmYXVsdEdyYXBoID0gJHJkZi5EYXRhRmFjdG9yeS5kZWZhdWx0R3JhcGg7XG4kcmRmLmxpdGVyYWwgPSAkcmRmLkRhdGFGYWN0b3J5LmxpdGVyYWw7XG4kcmRmLm5hbWVkTm9kZSA9ICRyZGYuRGF0YUZhY3RvcnkubmFtZWROb2RlO1xuJHJkZi5xdWFkID0gJHJkZi5EYXRhRmFjdG9yeS5xdWFkO1xuJHJkZi50cmlwbGUgPSAkcmRmLkRhdGFGYWN0b3J5LnRyaXBsZTtcblxubW9kdWxlLmV4cG9ydHMgPSAkcmRmOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vLyAgSWRlbnRpdHkgbWFuYWdlbWVudCBhbmQgaW5kZXhpbmcgZm9yIFJERlxuLy9cbi8vIFRoaXMgZmlsZSBwcm92aWRlcyAgSW5kZXhlZEZvcm11bGEgYSBmb3JtdWxhIChzZXQgb2YgdHJpcGxlcykgd2hpY2hcbi8vIGluZGV4ZWQgYnkgcHJlZGljYXRlLCBzdWJqZWN0IGFuZCBvYmplY3QuXG4vL1xuLy8gSXQgXCJzbXVzaGVzXCIgIChtZXJnZXMgaW50byBhIHNpbmdsZSBub2RlKSB0aGluZ3Mgd2hpY2ggYXJlIGlkZW50aWNhbFxuLy8gYWNjb3JkaW5nIHRvIG93bDpzYW1lQXMgb3IgYW4gb3dsOkludmVyc2VGdW5jdGlvbmFsUHJvcGVydHlcbi8vIG9yIGFuIG93bDpGdW5jdGlvbmFsUHJvcGVydHlcbi8vXG4vL1xuLy8gIDIwMDUtMTAgV3JpdHRlbiBUaW0gQmVybmVycy1MZWVcbi8vICAyMDA3ICAgIENoYW5nZWQgc28gYXMgbm90IHRvIG11bmdlIHN0YXRlbWVudHMgZnJvbSBkb2N1bWVudHMgd2hlbiBzbXVzaGluZ1xuLy9cbi8vXG4vKiBqc2w6b3B0aW9uIGV4cGxpY2l0ICovXG52YXIgQXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi91dGlsJykuQXJyYXlJbmRleE9mO1xudmFyIEZvcm11bGEgPSByZXF1aXJlKCcuL2Zvcm11bGEnKTtcbi8vIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vbG9nJylcbnZhciBSREZBcnJheVJlbW92ZSA9IHJlcXVpcmUoJy4vdXRpbCcpLlJERkFycmF5UmVtb3ZlO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFZhcmlhYmxlID0gcmVxdWlyZSgnLi92YXJpYWJsZScpO1xuXG52YXIgb3dsX25zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsIyc7XG4vLyB2YXIgbGlua19ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rIydcblxuLy8gSGFuZGxlIEZ1bmN0aW9uYWwgUHJvcGVydHlcbmZ1bmN0aW9uIGhhbmRsZV9GUChmb3JtdWxhLCBzdWJqLCBwcmVkLCBvYmopIHtcbiAgdmFyIG8xID0gZm9ybXVsYS5hbnkoc3ViaiwgcHJlZCwgdW5kZWZpbmVkKTtcbiAgaWYgKCFvMSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gRmlyc3QgdGltZSB3aXRoIHRoaXMgdmFsdWVcbiAgfVxuICAvLyBsb2cud2FybihcIkVxdWF0aW5nIFwiK28xLnVyaStcIiBhbmQgXCIrb2JqLnVyaSArIFwiIGJlY2F1c2UgRlAgXCIrcHJlZC51cmkpOyAgLy9AQFxuICBmb3JtdWxhLmVxdWF0ZShvMSwgb2JqKTtcbiAgcmV0dXJuIHRydWU7XG59IC8vIGhhbmRsZV9GUFxuXG4vLyBIYW5kbGUgSW52ZXJzZSBGdW5jdGlvbmFsIFByb3BlcnR5XG5mdW5jdGlvbiBoYW5kbGVfSUZQKGZvcm11bGEsIHN1YmosIHByZWQsIG9iaikge1xuICB2YXIgczEgPSBmb3JtdWxhLmFueSh1bmRlZmluZWQsIHByZWQsIG9iaik7XG4gIGlmICghczEpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIEZpcnN0IHRpbWUgd2l0aCB0aGlzIHZhbHVlXG4gIH1cbiAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIitzMS51cmkrXCIgYW5kIFwiK3N1YmoudXJpICsgXCIgYmVjYXVzZSBJRlAgXCIrcHJlZC51cmkpOyAgLy9AQFxuICBmb3JtdWxhLmVxdWF0ZShzMSwgc3Viaik7XG4gIHJldHVybiB0cnVlO1xufSAvLyBoYW5kbGVfSUZQXG5cbmZ1bmN0aW9uIGhhbmRsZVJERlR5cGUoZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCB3aHkpIHtcbiAgaWYgKGZvcm11bGEudHlwZUNhbGxiYWNrKSB7XG4gICAgZm9ybXVsYS50eXBlQ2FsbGJhY2soZm9ybXVsYSwgb2JqLCB3aHkpO1xuICB9XG5cbiAgdmFyIHggPSBmb3JtdWxhLmNsYXNzQWN0aW9uc1tvYmouaGFzaFN0cmluZygpXTtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgaWYgKHgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvbmUgPSBkb25lIHx8IHhbaV0oZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCB3aHkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZG9uZTsgLy8gc3RhdGVtZW50IGdpdmVuIGlzIG5vdCBuZWVkZWQgaWYgdHJ1ZVxufVxuXG52YXIgSW5kZXhlZEZvcm11bGEgPSBmdW5jdGlvbiAoX0Zvcm11bGEpIHtcbiAgX2luaGVyaXRzKEluZGV4ZWRGb3JtdWxhLCBfRm9ybXVsYSk7XG5cbiAgLy8gSU4gZnV0dXJlIC0gYWxsb3cgcGFzcyBhcnJheSBvZiBzdGF0ZW1lbnRzIHRvIGNvbnN0cnVjdG9yXG4gIGZ1bmN0aW9uIEluZGV4ZWRGb3JtdWxhKGZlYXR1cmVzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEluZGV4ZWRGb3JtdWxhKTtcblxuICAgIC8vIHRoaXMuc3RhdGVtZW50cyA9IFtdIC8vIEFzIGluIEZvcm11bGEgTk8gZG9uJ3Qgb3ZlcndyaXRlIGluaGVyaXRlZFxuICAgIC8vIHRoaXMub3B0aW9uYWwgPSBbXVxuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEluZGV4ZWRGb3JtdWxhLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW5kZXhlZEZvcm11bGEpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnByb3BlcnR5QWN0aW9ucyA9IFtdOyAvLyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGdldHRpbmcgc3RhdGVtZW50IHdpdGgge3MgWCBvfVxuICAgIC8vIG1hcHMgPHVyaT4gdG8gW2YoRixzLHAsbyksLi4uXVxuICAgIF90aGlzLmNsYXNzQWN0aW9ucyA9IFtdOyAvLyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGFkZGluZyB7IHMgdHlwZSBYIH1cbiAgICBfdGhpcy5yZWRpcmVjdGlvbnMgPSBbXTsgLy8gcmVkaXJlY3QgdG8gbGV4aWNhbGx5IHNtYWxsZXIgZXF1aXZhbGVudCBzeW1ib2xcbiAgICBfdGhpcy5hbGlhc2VzID0gW107IC8vIHJldmVyc2UgbWFwcGluZyB0byByZWRpcmVjdGlvbjogYWxpYXNlcyBmb3IgdGhpc1xuICAgIF90aGlzLkhUVFBSZWRpcmVjdHMgPSBbXTsgLy8gcmVkaXJlY3Rpb25zIHdlIGdvdCBmcm9tIEhUVFBcbiAgICBfdGhpcy5zdWJqZWN0SW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBzdWJqZWN0XG4gICAgX3RoaXMucHJlZGljYXRlSW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBzdWJqZWN0XG4gICAgX3RoaXMub2JqZWN0SW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBvYmplY3RcbiAgICBfdGhpcy53aHlJbmRleCA9IFtdOyAvLyBBcnJheSBvZiBzdGF0ZW1lbnRzIHdpdGggWCBhcyBwcm92ZW5hbmNlXG4gICAgX3RoaXMuaW5kZXggPSBbX3RoaXMuc3ViamVjdEluZGV4LCBfdGhpcy5wcmVkaWNhdGVJbmRleCwgX3RoaXMub2JqZWN0SW5kZXgsIF90aGlzLndoeUluZGV4XTtcbiAgICBfdGhpcy5uYW1lc3BhY2VzID0ge307IC8vIERpY3Rpb25hcnkgb2YgbmFtZXNwYWNlIHByZWZpeGVzXG4gICAgX3RoaXMuZmVhdHVyZXMgPSBmZWF0dXJlcyB8fCBbJ3NhbWVBcycsICdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JywgJ0Z1bmN0aW9uYWxQcm9wZXJ0eSddO1xuICAgIF90aGlzLmluaXRQcm9wZXJ0eUFjdGlvbnMoX3RoaXMuZmVhdHVyZXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJbmRleGVkRm9ybXVsYSwgW3tcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHN0YXRlbWVudHNDb3B5ID0gdGhpcy5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoZWEpIHtcbiAgICAgICAgcmV0dXJuIGVhLnN1YnN0aXR1dGUoYmluZGluZ3MpO1xuICAgICAgfSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnSW5kZXhlZEZvcm11bGEgc3VicyBzdGF0ZW1udHM6JyArIHN0YXRlbWVudHNDb3B5KVxuICAgICAgdmFyIHkgPSBuZXcgSW5kZXhlZEZvcm11bGEoKTtcbiAgICAgIHkuYWRkKHN0YXRlbWVudHNDb3B5KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdpbmRleGVkLWZvcm0gc3VicyBmb3JtdWxhOicgKyB5KVxuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXBwbHlQYXRjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5UGF0Y2gocGF0Y2gsIHRhcmdldCwgcGF0Y2hDYWxsYmFjaykge1xuICAgICAgLy8gcGF0Y2hDYWxsYmFjayhlcnIpXG4gICAgICB2YXIgUXVlcnkgPSByZXF1aXJlKCcuL3F1ZXJ5JykuUXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0S0IgPSB0aGlzO1xuICAgICAgdmFyIGRzO1xuICAgICAgdmFyIGJpbmRpbmcgPSBudWxsO1xuXG4gICAgICAvLyAvLy8vLy8vLy8vLyBEZWJ1ZyBzdHJpbmdzXG4gICAgICAvKlxuICAgICAgdmFyIGJpbmRpbmdEZWJ1ZyA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHZhciBzdHIgPSAnJ1xuICAgICAgICB2YXIgdlxuICAgICAgICBmb3IgKHYgaW4gYikge1xuICAgICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgICBzdHIgKz0gJyAgICAnICsgdiArICcgLT4gJyArIGJbdl1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuICAgICAgKi9cbiAgICAgIHZhciBkb1BhdGNoID0gZnVuY3Rpb24gZG9QYXRjaChvbkRvbmVQYXRjaCkge1xuICAgICAgICBpZiAocGF0Y2hbJ2RlbGV0ZSddKSB7XG4gICAgICAgICAgZHMgPSBwYXRjaFsnZGVsZXRlJ107XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYmluZGluZ0RlYnVnKGJpbmRpbmcpKVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcyBiZWZvcmUgc3Vic3RpdHV0ZTogJyArIGRzKVxuICAgICAgICAgIGlmIChiaW5kaW5nKSBkcyA9IGRzLnN1YnN0aXR1dGUoYmluZGluZyk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2FwcGx5UGF0Y2g6IGRlbGV0ZTogJyArIGRzKVxuICAgICAgICAgIGRzID0gZHMuc3RhdGVtZW50cztcbiAgICAgICAgICB2YXIgYmFkID0gW107XG4gICAgICAgICAgdmFyIGRzMiA9IGRzLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGFjdHVhbCBzdGF0ZW1udHMgaW4gdGhlIHN0b3JlXG4gICAgICAgICAgICB2YXIgc3RzID0gdGFyZ2V0S0Iuc3RhdGVtZW50c01hdGNoaW5nKHN0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCB0YXJnZXQpO1xuICAgICAgICAgICAgaWYgKHN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gbG9nLmluZm8oXCJOT1QgRk9VTkQgZGVsZXRhYmxlIFwiICsgc3QpXG4gICAgICAgICAgICAgIGJhZC5wdXNoKHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBsb2cuaW5mbyhcIkZvdW5kIGRlbGV0YWJsZSBcIiArIHN0KVxuICAgICAgICAgICAgICByZXR1cm4gc3RzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChiYWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgdG8gZGVsZXRlICcgKyBiYWQubGVuZ3RoICsgJ3N0YXRlbWVudHMnKVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Rlc3BpdGUgJyArIHRhcmdldEtCLnN0YXRlbWVudHNNYXRjaGluZyhiYWRbMF0uc3ViamVjdCwgYmFkWzBdLnByZWRpY2F0ZSlbMF0pXG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnQ291bGQgbm90IGZpbmQgdG8gZGVsZXRlOiAnICsgYmFkLmpvaW4oJ1xcbiBvciAnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRzMi5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgICB0YXJnZXRLQi5yZW1vdmUoc3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaFsnaW5zZXJ0J10pIHtcbiAgICAgICAgICAvLyBsb2cuaW5mbyhcImRvUGF0Y2ggaW5zZXJ0IFwiK3BhdGNoWydpbnNlcnQnXSlcbiAgICAgICAgICBkcyA9IHBhdGNoWydpbnNlcnQnXTtcbiAgICAgICAgICBpZiAoYmluZGluZykgZHMgPSBkcy5zdWJzdGl0dXRlKGJpbmRpbmcpO1xuICAgICAgICAgIGRzID0gZHMuc3RhdGVtZW50cztcbiAgICAgICAgICBkcy5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgICBzdC53aHkgPSB0YXJnZXQ7XG4gICAgICAgICAgICB0YXJnZXRLQi5hZGQoc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QsIHN0LndoeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Eb25lUGF0Y2goKTtcbiAgICAgIH07XG4gICAgICBpZiAocGF0Y2gud2hlcmUpIHtcbiAgICAgICAgLy8gbG9nLmluZm8oXCJQcm9jZXNzaW5nIFdIRVJFOiBcIiArIHBhdGNoLndoZXJlICsgJ1xcbicpXG4gICAgICAgIHZhciBxdWVyeSA9IG5ldyBRdWVyeSgncGF0Y2gnKTtcbiAgICAgICAgcXVlcnkucGF0ID0gcGF0Y2gud2hlcmU7XG4gICAgICAgIHF1ZXJ5LnBhdC5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICBzdC53aHkgPSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBiaW5kaW5nc0ZvdW5kID0gW107XG5cbiAgICAgICAgdGFyZ2V0S0IucXVlcnkocXVlcnksIGZ1bmN0aW9uIG9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgYmluZGluZ3NGb3VuZC5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCcgICBnb3QgYSBiaW5kaW5nOiAnICsgYmluZGluZ0RlYnVnKGJpbmRpbmcpKVxuICAgICAgICB9LCB0YXJnZXRLQi5mZXRjaGVyLCBmdW5jdGlvbiBvbkRvbmUoKSB7XG4gICAgICAgICAgaWYgKGJpbmRpbmdzRm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnTm8gbWF0Y2ggZm91bmQgdG8gYmUgcGF0Y2hlZDonICsgcGF0Y2gud2hlcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYmluZGluZ3NGb3VuZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnUGF0Y2ggYW1iaWd1b3VzLiBObyBwYXRjaCBkb25lLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5kaW5nID0gYmluZGluZ3NGb3VuZFswXTtcbiAgICAgICAgICBkb1BhdGNoKHBhdGNoQ2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvUGF0Y2gocGF0Y2hDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVjbGFyZUV4aXN0ZW50aWFsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVjbGFyZUV4aXN0ZW50aWFsKHgpIHtcbiAgICAgIGlmICghdGhpcy5fZXhpc3RlbnRpYWxWYXJpYWJsZXMpIHRoaXMuX2V4aXN0ZW50aWFsVmFyaWFibGVzID0gW107XG4gICAgICB0aGlzLl9leGlzdGVudGlhbFZhcmlhYmxlcy5wdXNoKHgpO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaW5pdFByb3BlcnR5QWN0aW9ucycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRQcm9wZXJ0eUFjdGlvbnMoZmVhdHVyZXMpIHtcbiAgICAgIC8vIElmIHRoZSBwcmVkaWNhdGUgaXMgI3R5cGUsIHVzZSBoYW5kbGVSREZUeXBlIHRvIGNyZWF0ZSBhIHR5cGVDYWxsYmFjayBvbiB0aGUgb2JqZWN0XG4gICAgICB0aGlzLnByb3BlcnR5QWN0aW9uc1snPGh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlPiddID0gW2hhbmRsZVJERlR5cGVdO1xuXG4gICAgICAvLyBBc3N1bXB0aW9uOiB0aGVzZSB0ZXJtcyBhcmUgbm90IHJlZGlyZWN0ZWQgQEBmaXhtZVxuICAgICAgaWYgKEFycmF5SW5kZXhPZihmZWF0dXJlcywgJ3NhbWVBcycpID49IDApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUFjdGlvbnNbJzxodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNzYW1lQXM+J10gPSBbZnVuY3Rpb24gKGZvcm11bGEsIHN1YmosIHByZWQsIG9iaiwgd2h5KSB7XG4gICAgICAgICAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIitzdWJqLnVyaStcIiBzYW1lQXMgXCIrb2JqLnVyaSk7ICAvL0BAXG4gICAgICAgICAgZm9ybXVsYS5lcXVhdGUoc3Viaiwgb2JqKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBpZiBzdGF0ZW1lbnQgZ2l2ZW4gaXMgTk9UIG5lZWRlZCBpbiB0aGUgc3RvcmVcbiAgICAgICAgfV07IC8vIHNhbWVBcyAtPiBlcXVhdGUgJiBkb24ndCBhZGQgdG8gaW5kZXhcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheUluZGV4T2YoZmVhdHVyZXMsICdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JykgPj0gMCkge1xuICAgICAgICB0aGlzLmNsYXNzQWN0aW9uc1snPCcgKyBvd2xfbnMgKyAnSW52ZXJzZUZ1bmN0aW9uYWxQcm9wZXJ0eT4nXSA9IFtmdW5jdGlvbiAoZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCBhZGRGbikge1xuICAgICAgICAgIC8vIHllcyBzdWJqIG5vdCBwcmVkIVxuICAgICAgICAgIHJldHVybiBmb3JtdWxhLm5ld1Byb3BlcnR5QWN0aW9uKHN1YmosIGhhbmRsZV9JRlApO1xuICAgICAgICB9XTsgLy8gSUZQIC0+IGhhbmRsZV9JRlAsIGRvIGFkZCB0byBpbmRleFxuICAgICAgfVxuICAgICAgaWYgKEFycmF5SW5kZXhPZihmZWF0dXJlcywgJ0Z1bmN0aW9uYWxQcm9wZXJ0eScpID49IDApIHtcbiAgICAgICAgdGhpcy5jbGFzc0FjdGlvbnNbJzwnICsgb3dsX25zICsgJ0Z1bmN0aW9uYWxQcm9wZXJ0eT4nXSA9IFtmdW5jdGlvbiAoZm9ybXVsYSwgc3ViaiwgcHJvaiwgb2JqLCBhZGRGbikge1xuICAgICAgICAgIHJldHVybiBmb3JtdWxhLm5ld1Byb3BlcnR5QWN0aW9uKHN1YmosIGhhbmRsZV9GUCk7XG4gICAgICAgIH1dOyAvLyBGUCA9PiBoYW5kbGVGUCwgZG8gYWRkIHRvIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHRyaXBsZSB0byB0aGUgc3RvcmUuXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGVtZW50IGFkZGVkXG4gICAgICogKHdvdWxkIGl0IGJlIGJldHRlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsIGZvcm11bGEgZm9yIGNoYWluaW5nPylcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnYWRkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHN1YmosIHByZWQsIG9iaiwgd2h5KSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmIChzdWJqIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3Viai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGQoc3VialtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN1YmogaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmFkZChzdWJqLnN1YmplY3QsIHN1YmoucHJlZGljYXRlLCBzdWJqLm9iamVjdCwgc3Viai53aHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YmogaW5zdGFuY2VvZiBJbmRleGVkRm9ybXVsYSkge1xuICAgICAgICAgIHRoaXMuYWRkKHN1Ymouc3RhdGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgYWN0aW9ucztcbiAgICAgIHZhciBzdDtcbiAgICAgIGlmICghd2h5KSB7XG4gICAgICAgIC8vIHN5c3RlbSBnZW5lcmF0ZWRcbiAgICAgICAgd2h5ID0gdGhpcy5mZXRjaGVyID8gdGhpcy5mZXRjaGVyLmFwcE5vZGUgOiB0aGlzLnN5bSgnY2hyb21lOnRoZVNlc3Npb24nKTtcbiAgICAgIH1cbiAgICAgIHN1YmogPSBOb2RlLmZyb21WYWx1ZShzdWJqKTtcbiAgICAgIHByZWQgPSBOb2RlLmZyb21WYWx1ZShwcmVkKTtcbiAgICAgIG9iaiA9IE5vZGUuZnJvbVZhbHVlKG9iaik7XG4gICAgICB3aHkgPSBOb2RlLmZyb21WYWx1ZSh3aHkpO1xuICAgICAgaWYgKHRoaXMucHJlZGljYXRlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGVDYWxsYmFjayh0aGlzLCBwcmVkLCB3aHkpO1xuICAgICAgfVxuICAgICAgLy8gQWN0aW9uIHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3QgbmVlZCB0byBiZSBhZGRlZFxuICAgICAgdmFyIHByZWRIYXNoID0gdGhpcy5jYW5vbihwcmVkKS5oYXNoU3RyaW5nKCk7XG4gICAgICBhY3Rpb25zID0gdGhpcy5wcm9wZXJ0eUFjdGlvbnNbcHJlZEhhc2hdOyAvLyBQcmVkaWNhdGUgaGFzaFxuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICAgIC8vIGFsZXJ0KCd0eXBlOiAnK3R5cGVvZiBhY3Rpb25zICsnIEBAIGFjdGlvbnM9JythY3Rpb25zKVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRvbmUgPSBkb25lIHx8IGFjdGlvbnNbaV0odGhpcywgc3ViaiwgcHJlZCwgb2JqLCB3aHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ob2xkcyhzdWJqLCBwcmVkLCBvYmosIHdoeSkpIHtcbiAgICAgICAgLy8gVGFrZXMgdGltZSBidXQgc2F2ZXMgZHVwbGljYXRlc1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncmRmbGliOiBJZ25vcmluZyBkdXAhIHsnICsgc3ViaiArICcgJyArIHByZWQgKyAnICcgKyBvYmogKyAnICcgKyB3aHkgKyAnfScpXG4gICAgICAgIHJldHVybiBudWxsOyAvLyBAQGJldHRlciB0byByZXR1cm4gc2VsZiBpbiBhbGwgY2FzZXM/XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBhcmUgdHJhY2tpbmcgcHJvdmVuYW5jZSwgZXZlcnkgdGhpbmcgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoZSBzdG9yZVxuICAgICAgLy8gaWYgKGRvbmUpIHJldHVybiBuZXcgU3RhdGVtZW50KHN1YmosIHByZWQsIG9iaiwgd2h5KVxuICAgICAgLy8gRG9uJ3QgcHV0IGl0IGluIHRoZSBzdG9yZVxuICAgICAgLy8gc3RpbGwgcmV0dXJuIHRoaXMgc3RhdGVtZW50IGZvciBvd2w6c2FtZUFzIGlucHV0XG4gICAgICB2YXIgaGFzaCA9IFt0aGlzLmNhbm9uKHN1YmopLmhhc2hTdHJpbmcoKSwgcHJlZEhhc2gsIHRoaXMuY2Fub24ob2JqKS5oYXNoU3RyaW5nKCksIHRoaXMuY2Fub24od2h5KS5oYXNoU3RyaW5nKCldO1xuICAgICAgc3QgPSBuZXcgU3RhdGVtZW50KHN1YmosIHByZWQsIG9iaiwgd2h5KTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgdmFyIGl4ID0gdGhpcy5pbmRleFtpXTtcbiAgICAgICAgdmFyIGggPSBoYXNoW2ldO1xuICAgICAgICBpZiAoIWl4W2hdKSB7XG4gICAgICAgICAgaXhbaF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpeFtoXS5wdXNoKHN0KTsgLy8gU2V0IG9mIHRoaW5ncyB3aXRoIHRoaXMgYXMgc3ViamVjdCwgZXRjXG4gICAgICB9XG5cbiAgICAgIC8vIGxvZy5kZWJ1ZyhcIkFERElORyAgICB7XCIrc3ViaitcIiBcIitwcmVkK1wiIFwiK29iaitcIn0gXCIrd2h5KVxuICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3QpO1xuICAgICAgcmV0dXJuIHN0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FkZEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEFsbChzdGF0ZW1lbnRzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgc3RhdGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWFkKSB7XG4gICAgICAgIF90aGlzMi5hZGQocXVhZC5zdWJqZWN0LCBxdWFkLnByZWRpY2F0ZSwgcXVhZC5vYmplY3QsIHF1YWQuZ3JhcGgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYW55JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW55KHMsIHAsIG8sIGcpIHtcbiAgICAgIHZhciBzdCA9IHRoaXMuYW55U3RhdGVtZW50TWF0Y2hpbmcocywgcCwgbywgZyk7XG4gICAgICBpZiAoc3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmIChzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0LnN1YmplY3Q7XG4gICAgICB9IGVsc2UgaWYgKHAgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3QucHJlZGljYXRlO1xuICAgICAgfSBlbHNlIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0Lm9iamVjdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYW55VmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbnlWYWx1ZShzLCBwLCBvLCBnKSB7XG4gICAgICB2YXIgeSA9IHRoaXMuYW55KHMsIHAsIG8sIGcpO1xuICAgICAgcmV0dXJuIHkgPyB5LnZhbHVlIDogdm9pZCAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FueVN0YXRlbWVudE1hdGNoaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW55U3RhdGVtZW50TWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHkpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHksIHRydWUpO1xuICAgICAgaWYgKCF4IHx8IHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4geFswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2wgd2l0aCBjYW5vbmljYWwgVVJJIGFzIHNtdXNoZWRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnY2Fub24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5vbih0ZXJtKSB7XG4gICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICB9XG4gICAgICB2YXIgeSA9IHRoaXMucmVkaXJlY3Rpb25zW3Rlcm0uaGFzaFN0cmluZygpXTtcbiAgICAgIGlmICgheSkge1xuICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NoZWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICB0aGlzLmNoZWNrU3RhdGVtZW50TGlzdCh0aGlzLnN0YXRlbWVudHMpO1xuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgdmFyIGl4ID0gdGhpcy5pbmRleFtwXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGl4KSB7XG4gICAgICAgICAgaWYgKGl4Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZW1lbnRMaXN0KGl4W2tleV0sIHApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGYtY29uc2lzdGVuY3kgY2hlY2tpbmcgZm9yIGRpYWdub3N0aXMgb25seVxuICAgICAqIElzIGVhY2ggc3RhdGVtZW50IHByb3Blcmx5IGluZGV4ZWQ/XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2NoZWNrU3RhdGVtZW50TGlzdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrU3RhdGVtZW50TGlzdChzdHMsIGZyb20pIHtcbiAgICAgIHZhciBuYW1lcyA9IFsnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgJ3doeSddO1xuICAgICAgdmFyIG9yaWdpbiA9ICcgZm91bmQgaW4gJyArIG5hbWVzW2Zyb21dICsgJyBpbmRleC4nO1xuICAgICAgdmFyIHN0O1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3QgPSBzdHNbal07XG4gICAgICAgIHZhciB0ZXJtID0gW3N0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCBzdC53aHldO1xuICAgICAgICB2YXIgYXJyYXlDb250YWlucyA9IGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYSwgeCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFbaV0uc3ViamVjdC5zYW1lVGVybSh4LnN1YmplY3QpICYmIGFbaV0ucHJlZGljYXRlLnNhbWVUZXJtKHgucHJlZGljYXRlKSAmJiBhW2ldLm9iamVjdC5zYW1lVGVybSh4Lm9iamVjdCkgJiYgYVtpXS53aHkuc2FtZVRlcm0oeC53aHkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgICB2YXIgYyA9IHRoaXMuY2Fub24odGVybVtwXSk7XG4gICAgICAgICAgdmFyIGggPSBjLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaW5kZXhbcF1baF0pIHtcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignTm8gJyArIG5hbWVbcF0gKyAnIGluZGV4IGZvciBzdGF0ZW1lbnQgJyArIHN0ICsgJ0AnICsgc3Qud2h5ICsgb3JpZ2luKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWFycmF5Q29udGFpbnModGhpcy5pbmRleFtwXVtoXSwgc3QpKSB7XG4gICAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignSW5kZXggZm9yICcgKyBuYW1lW3BdICsgJyBkb2VzIG5vdCBoYXZlIHN0YXRlbWVudCAnICsgc3QgKyAnQCcgKyBzdC53aHkgKyBvcmlnaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXJyYXlDb250YWlucyh0aGlzLnN0YXRlbWVudHMsIHN0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhdGVtZW50IGxpc3QgZG9lcyBub3Qgc3RhdGVtZW50ICcgKyBzdCArICdAJyArIHN0LndoeSArIG9yaWdpbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjbG9zZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVwbGFjZXMgQHRlbXBsYXRlIHdpdGggQHRhcmdldCBhbmQgYWRkIGFwcHJvcHJpYXRlIHRyaXBsZXMgKG5vIHRyaXBsZVxuICAgICAqIHJlbW92ZWQpXG4gICAgICogb25lLWRpcmVjdGlvbiByZXBsaWNhdGlvblxuICAgICAqIEBtZXRob2QgY29weVRvXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2NvcHlUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHlUbyh0ZW1wbGF0ZSwgdGFyZ2V0LCBmbGFncykge1xuICAgICAgaWYgKCFmbGFncykgZmxhZ3MgPSBbXTtcbiAgICAgIHZhciBzdGF0TGlzdCA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHRlbXBsYXRlKTtcbiAgICAgIGlmIChBcnJheUluZGV4T2YoZmxhZ3MsICd0d28tZGlyZWN0aW9uJykgIT09IC0xKSB7XG4gICAgICAgIHN0YXRMaXN0LmNvbmNhdCh0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGVtcGxhdGUpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0ID0gc3RhdExpc3RbaV07XG4gICAgICAgIHN3aXRjaCAoc3Qub2JqZWN0LnRlcm1UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnTmFtZWROb2RlJzpcbiAgICAgICAgICAgIHRoaXMuYWRkKHRhcmdldCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTGl0ZXJhbCc6XG4gICAgICAgICAgY2FzZSAnQmxhbmtOb2RlJzpcbiAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHRoaXMuYWRkKHRhcmdldCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QuY29weSh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5SW5kZXhPZihmbGFncywgJ2RlbGV0ZScpICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKHN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNpbXBsaWZ5IGdyYXBoIGluIHN0b3JlIHdoZW4gd2UgcmVhbGl6ZSB0d28gaWRlbnRpZmllcnMgYXJlIGVxdWl2YWxlbnRcbiAgICAgKiBXZSByZXBsYWNlIHRoZSBiaWdnZXIgd2l0aCB0aGUgc21hbGxlci5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZXF1YXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXF1YXRlKHUxLCB1Mikge1xuICAgICAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIit1MStcIiBhbmQgXCIrdTIpOyAvLyBAQFxuICAgICAgLy8gQEBKQU1CTyBNdXN0IGNhbm9uaWNhbGl6ZSB0aGUgdXJpcyB0byBwcmV2ZW50IGVycm9ycyBmcm9tIGE9Yj1jXG4gICAgICAvLyAwMy0yMS0yMDEwXG4gICAgICB1MSA9IHRoaXMuY2Fub24odTEpO1xuICAgICAgdTIgPSB0aGlzLmNhbm9uKHUyKTtcbiAgICAgIHZhciBkID0gdTEuY29tcGFyZVRlcm0odTIpO1xuICAgICAgaWYgKCFkKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBObyBpbmZvcm1hdGlvbiBpbiB7YSA9IGF9XG4gICAgICB9XG4gICAgICAvLyB2YXIgYmlnXG4gICAgICAvLyB2YXIgc21hbGxcbiAgICAgIGlmIChkIDwgMCkge1xuICAgICAgICAvLyB1MSBsZXNzIHRoYW4gdTJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVdpdGgodTIsIHUxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VXaXRoKHUxLCB1Mik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZm9ybXVsYScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm11bGEoZmVhdHVyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgSW5kZXhlZEZvcm11bGEoZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIEluZGV4ZWRGb3JtdWxhLlxuICAgICAqIChHZXR0ZXIgcHJveHkgdG8gdGhpcy5zdGF0ZW1lbnRzKS5cbiAgICAgKiBVc2FnZTpcbiAgICAgKiAgICBgYGBcbiAgICAgKiAgICB2YXIga2IgPSByZGYuZ3JhcGgoKVxuICAgICAqICAgIGtiLmxlbmd0aCAgLy8gLT4gMFxuICAgICAqICAgIGBgYFxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbWF0Y2gnLFxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFueSBxdWFkcyBtYXRjaGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgICAqIFN0YW5kYXJkIFJERkpTIFRhc2tmb3JjZSBtZXRob2QgZm9yIFNvdXJjZSBvYmplY3RzLCBpbXBsZW1lbnRlZCBhcyBhblxuICAgICAqIGFsaWFzIHRvIGBzdGF0ZW1lbnRzTWF0Y2hpbmcoKWBcbiAgICAgKiBAbWV0aG9kIG1hdGNoXG4gICAgICogQHBhcmFtIHN1YmplY3Qge05vZGV8U3RyaW5nfE9iamVjdH1cbiAgICAgKiBAcGFyYW0gcHJlZGljYXRlIHtOb2RlfFN0cmluZ3xPYmplY3R9XG4gICAgICogQHBhcmFtIG9iamVjdCB7Tm9kZXxTdHJpbmd8T2JqZWN0fVxuICAgICAqIEBwYXJhbSBncmFwaCB7TmFtZWROb2RlfFN0cmluZ31cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF0Y2goc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoTm9kZS5mcm9tVmFsdWUoc3ViamVjdCksIE5vZGUuZnJvbVZhbHVlKHByZWRpY2F0ZSksIE5vZGUuZnJvbVZhbHVlKG9iamVjdCksIE5vZGUuZnJvbVZhbHVlKGdyYXBoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBvdXQgd2hldGhlciBhIGdpdmVuIFVSSSBpcyB1c2VkIGFzIHN5bWJvbCBpbiB0aGUgZm9ybXVsYVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtZW50aW9uc1VSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1lbnRpb25zVVJJKHVyaSkge1xuICAgICAgdmFyIGhhc2ggPSAnPCcgKyB1cmkgKyAnPic7XG4gICAgICByZXR1cm4gISF0aGlzLnN1YmplY3RJbmRleFtoYXNoXSB8fCAhIXRoaXMub2JqZWN0SW5kZXhbaGFzaF0gfHwgISF0aGlzLnByZWRpY2F0ZUluZGV4W2hhc2hdO1xuICAgIH1cblxuICAgIC8vIEV4aXN0ZW50aWFscyBhcmUgQk5vZGVzIC0gc29tZXRoaW5nIGV4aXN0cyB3aXRob3V0IG5hbWluZ1xuXG4gIH0sIHtcbiAgICBrZXk6ICduZXdFeGlzdGVudGlhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld0V4aXN0ZW50aWFsKHVyaSkge1xuICAgICAgaWYgKCF1cmkpIHJldHVybiB0aGlzLmJub2RlKCk7XG4gICAgICB2YXIgeCA9IHRoaXMuc3ltKHVyaSk7XG4gICAgICByZXR1cm4gdGhpcy5kZWNsYXJlRXhpc3RlbnRpYWwoeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmV3UHJvcGVydHlBY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXdQcm9wZXJ0eUFjdGlvbihwcmVkLCBhY3Rpb24pIHtcbiAgICAgIC8vIGxvZy5kZWJ1ZyhcIm5ld1Byb3BlcnR5QWN0aW9uOiAgXCIrcHJlZClcbiAgICAgIHZhciBoYXNoID0gcHJlZC5oYXNoU3RyaW5nKCk7XG4gICAgICBpZiAoIXRoaXMucHJvcGVydHlBY3Rpb25zW2hhc2hdKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlBY3Rpb25zW2hhc2hdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BlcnR5QWN0aW9uc1toYXNoXS5wdXNoKGFjdGlvbik7XG4gICAgICAvLyBOb3cgYXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHRvIHN0YXRlbWVudHMgYWxyZWFkeSBpbiB0aGUgc3RvcmVcbiAgICAgIHZhciB0b0JlRml4ZWQgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHByZWQsIHVuZGVmaW5lZCk7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0JlRml4ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gTk9UIG9wdGltaXplZCAtIHNvcnQgdG9CZUZpeGVkIGV0Y1xuICAgICAgICBkb25lID0gZG9uZSB8fCBhY3Rpb24odGhpcywgdG9CZUZpeGVkW2ldLnN1YmplY3QsIHByZWQsIHRvQmVGaXhlZFtpXS5vYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbmU7XG4gICAgfVxuXG4gICAgLy8gVW5pdmVyc2FscyBhcmUgVmFyaWFibGVzXG5cbiAgfSwge1xuICAgIGtleTogJ25ld1VuaXZlcnNhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld1VuaXZlcnNhbCh1cmkpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5zeW0odXJpKTtcbiAgICAgIGlmICghdGhpcy5fdW5pdmVyc2FsVmFyaWFibGVzKSB0aGlzLl91bml2ZXJzYWxWYXJpYWJsZXMgPSBbXTtcbiAgICAgIHRoaXMuX3VuaXZlcnNhbFZhcmlhYmxlcy5wdXNoKHgpO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgLy8gY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCBieSBOMyBwYXJzZXJcblxuICB9LCB7XG4gICAga2V5OiAndmFyaWFibGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YXJpYWJsZShuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IFZhcmlhYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYW4gdW51c2VkIGlkIGZvciBhIGZpbGUgYmVpbmcgZWRpdGVkOiByZXR1cm4gYSBzeW1ib2xcbiAgICAgKiAoTm90ZTogU2xvdyBpZmYgYSBsb3Qgb2YgdGhlbSAtLSBjb3VsZCBiZSBPKGxvZyhrKSkgKVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduZXh0U3ltYm9sJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dFN5bWJvbChkb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIHZhciB1cmkgPSBkb2MudXJpICsgJyNuJyArIGk7XG4gICAgICAgIGlmICghdGhpcy5tZW50aW9uc1VSSSh1cmkpKSByZXR1cm4gdGhpcy5zeW0odXJpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdxdWVyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHF1ZXJ5KG15UXVlcnksIGNhbGxiYWNrLCBmZXRjaGVyLCBvbkRvbmUpIHtcbiAgICAgIHZhciBpbmRleGVkRm9ybXVsYVF1ZXJ5ID0gcmVxdWlyZSgnLi9xdWVyeScpLmluZGV4ZWRGb3JtdWxhUXVlcnk7XG4gICAgICByZXR1cm4gaW5kZXhlZEZvcm11bGFRdWVyeS5jYWxsKHRoaXMsIG15UXVlcnksIGNhbGxiYWNrLCBmZXRjaGVyLCBvbkRvbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGEgc3RhdGVtZW50IG9iamVjdCBhbmQgcmVtb3ZlcyBpdFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdyZW1vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoc3QpIHtcbiAgICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZShzdFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAoc3QgaW5zdGFuY2VvZiBJbmRleGVkRm9ybXVsYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoc3Quc3RhdGVtZW50cyk7XG4gICAgICB9XG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QsIHN0LndoeSk7XG4gICAgICBpZiAoIXN0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZW1lbnQgdG8gYmUgcmVtb3ZlZCBpcyBub3Qgb24gc3RvcmU6ICcgKyBzdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZVN0YXRlbWVudChzdHNbMF0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgc3RhdGVtbnRzIGluIGEgZG9jXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZURvY3VtZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRG9jdW1lbnQoZG9jKSB7XG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZG9jKS5zbGljZSgpOyAvLyBUYWtlIGEgY29weSBhcyB0aGlzIGlzIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU3RhdGVtZW50KHN0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYWxsIHN0YXRlbWVudHMgbWF0Y2hpbmcgYXJncyAod2l0aGluIGxpbWl0KSAqXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZU1hbnknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVNYW55KHN1YmosIHByZWQsIG9iaiwgd2h5LCBsaW1pdCkge1xuICAgICAgLy8gbG9nLmRlYnVnKFwiZW50ZXJpbmcgcmVtb3ZlTWFueSB3LyBzdWJqLHByZWQsb2JqLHdoeSxsaW1pdCA9IFwiICsgc3ViaiArXCIsIFwiKyBwcmVkK1wiLCBcIiArIG9iaitcIiwgXCIgKyB3aHkrXCIsIFwiICsgbGltaXQpXG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHksIGZhbHNlKTtcbiAgICAgIC8vIFRoaXMgaXMgYSBzdWJ0bGUgYnVnIHRoYXQgb2NjY3VyZWQgaW4gdXBkYXRlQ2VudGVyLmpzIHRvby5cbiAgICAgIC8vIFRoZSBmYWN0IGlzLCB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyByZXR1cm5zIHRoaXMud2h5SW5kZXggaW5zdGVhZCBvZiBhIGNvcHkgb2YgaXRcbiAgICAgIC8vIGJ1dCBmb3IgcGVyZnJvbWFuY2UgY29uc2lkZXJhdGlvbiwgaXQncyBiZXR0ZXIgdG8ganVzdCBkbyB0aGF0XG4gICAgICAvLyBzbyBtYWtlIGEgY29weSBoZXJlLlxuICAgICAgdmFyIHN0YXRlbWVudHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaChzdHNbaV0pO1xuICAgICAgfWlmIChsaW1pdCkgc3RhdGVtZW50cyA9IHN0YXRlbWVudHMuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoc3RhdGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVtb3ZlTWF0Y2hlcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZU1hdGNoZXMoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIHdoeSkge1xuICAgICAgdGhpcy5yZW1vdmVTdGF0ZW1lbnRzKHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHBhcnRpY3VsYXIgc3RhdGVtZW50IG9iamVjdCBmcm9tIHRoZSBzdG9yZVxuICAgICAqXG4gICAgICogc3QgICAgYSBzdGF0ZW1lbnQgd2hpY2ggaXMgYWxyZWFkeSBpbiB0aGUgc3RvcmUgYW5kIGluZGV4ZWQuXG4gICAgICogICAgICBNYWtlIHN1cmUgeW91IG9ubHkgdXNlIHRoaXMgZm9yIHRoZXNlLlxuICAgICAqICAgIE90aGVyd2lzZSwgeW91IHNob3VsZCB1c2UgcmVtb3ZlKCkgYWJvdmUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZVN0YXRlbWVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVN0YXRlbWVudChzdCkge1xuICAgICAgLy8gbG9nLmRlYnVnKFwiZW50ZXJpbmcgcmVtb3ZlIHcvIHN0PVwiICsgc3QpXG4gICAgICB2YXIgdGVybSA9IFtzdC5zdWJqZWN0LCBzdC5wcmVkaWNhdGUsIHN0Lm9iamVjdCwgc3Qud2h5XTtcbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgNDsgcCsrKSB7XG4gICAgICAgIHZhciBjID0gdGhpcy5jYW5vbih0ZXJtW3BdKTtcbiAgICAgICAgdmFyIGggPSBjLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4W3BdW2hdKSB7XG4gICAgICAgICAgLy8gbG9nLndhcm4gKFwiU3RhdGVtZW50IHJlbW92YWw6IG5vIGluZGV4ICcrcCsnOiBcIitzdClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSREZBcnJheVJlbW92ZSh0aGlzLmluZGV4W3BdW2hdLCBzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFJERkFycmF5UmVtb3ZlKHRoaXMuc3RhdGVtZW50cywgc3QpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVtb3ZlU3RhdGVtZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVN0YXRlbWVudHMoc3RzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlbW92ZShzdHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZSBiaWcgd2l0aCBzbWFsbCwgb2Jzb2xldGVkIHdpdGggb2Jzb2xldGluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncmVwbGFjZVdpdGgnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlV2l0aChiaWcsIHNtYWxsKSB7XG4gICAgICAvLyBsb2cuZGVidWcoXCJSZXBsYWNpbmcgXCIrYmlnK1wiIHdpdGggXCIrc21hbGwpIC8vIEBAXG4gICAgICB2YXIgb2xkaGFzaCA9IGJpZy5oYXNoU3RyaW5nKCk7XG4gICAgICB2YXIgbmV3aGFzaCA9IHNtYWxsLmhhc2hTdHJpbmcoKTtcbiAgICAgIHZhciBtb3ZlSW5kZXggPSBmdW5jdGlvbiBtb3ZlSW5kZXgoaXgpIHtcbiAgICAgICAgdmFyIG9sZGxpc3QgPSBpeFtvbGRoYXNoXTtcbiAgICAgICAgaWYgKCFvbGRsaXN0KSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBub25lIHRvIG1vdmVcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3bGlzdCA9IGl4W25ld2hhc2hdO1xuICAgICAgICBpZiAoIW5ld2xpc3QpIHtcbiAgICAgICAgICBpeFtuZXdoYXNoXSA9IG9sZGxpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXhbbmV3aGFzaF0gPSBvbGRsaXN0LmNvbmNhdChuZXdsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgaXhbb2xkaGFzaF07XG4gICAgICB9O1xuICAgICAgLy8gdGhlIGNhbm9uaWNhbCBvbmUgY2FycmllcyBhbGwgdGhlIGluZGV4ZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIG1vdmVJbmRleCh0aGlzLmluZGV4W2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkaXJlY3Rpb25zW29sZGhhc2hdID0gc21hbGw7XG4gICAgICBpZiAoYmlnLnVyaSkge1xuICAgICAgICAvLyBAQEpBTUJPOiBtdXN0IHVwZGF0ZSByZWRpcmVjdGlvbnMsYWxpYXNlcyBmcm9tIHN1Yi1pdGVtcywgdG9vLlxuICAgICAgICBpZiAoIXRoaXMuYWxpYXNlc1tuZXdoYXNoXSkge1xuICAgICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXS5wdXNoKGJpZyk7IC8vIEJhY2sgbGlua1xuICAgICAgICBpZiAodGhpcy5hbGlhc2VzW29sZGhhc2hdKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYWxpYXNlc1tvbGRoYXNoXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGlvbnNbdGhpcy5hbGlhc2VzW29sZGhhc2hdW2ldLmhhc2hTdHJpbmcoKV0gPSBzbWFsbDtcbiAgICAgICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXS5wdXNoKHRoaXMuYWxpYXNlc1tvbGRoYXNoXVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkKHNtYWxsLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayN1cmknKSwgYmlnLnVyaSk7XG4gICAgICAgIC8vIElmIHR3byB0aGluZ3MgYXJlIGVxdWFsLCBhbmQgb25lIGlzIHJlcXVlc3RlZCwgd2Ugc2hvdWxkIHJlcXVlc3QgdGhlIG90aGVyLlxuICAgICAgICBpZiAodGhpcy5mZXRjaGVyKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaGVyLm5vd0tub3duQXMoYmlnLCBzbWFsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1vdmVJbmRleCh0aGlzLmNsYXNzQWN0aW9ucyk7XG4gICAgICBtb3ZlSW5kZXgodGhpcy5wcm9wZXJ0eUFjdGlvbnMpO1xuICAgICAgLy8gbG9nLmRlYnVnKFwiRXF1YXRlIGRvbmUuIFwiK2JpZytcIiB0byBiZSBrbm93biBhcyBcIitzbWFsbClcbiAgICAgIHJldHVybiB0cnVlOyAvLyB0cnVlIG1lYW5zIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3QgbmVlZCB0byBiZSBwdXQgaW5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIGVxdWl2YWxlbnQgVVJJcyBieSB3aGljaCB0aGlzIGlzIGtub3duXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2FsbEFsaWFzZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbGxBbGlhc2VzKHgpIHtcbiAgICAgIHZhciBhID0gdGhpcy5hbGlhc2VzW3RoaXMuY2Fub24oeCkuaGFzaFN0cmluZygpXSB8fCBbXTtcbiAgICAgIGEucHVzaCh0aGlzLmNhbm9uKHgpKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgYnkgY2Fub25pY2FsIFVSSSBhcyBzbXVzaGVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NhbWVUaGluZ3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lVGhpbmdzKHgsIHkpIHtcbiAgICAgIGlmICh4LnNhbWVUZXJtKHkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHgxID0gdGhpcy5jYW5vbih4KTtcbiAgICAgIC8vICAgIGFsZXJ0KCd4MT0nK3gxKVxuICAgICAgaWYgKCF4MSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHkxID0gdGhpcy5jYW5vbih5KTtcbiAgICAgIC8vICAgIGFsZXJ0KCd5MT0nK3kxKTsgLy9AQFxuICAgICAgaWYgKCF5MSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHgxLnVyaSA9PT0geTEudXJpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFByZWZpeEZvclVSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFByZWZpeEZvclVSSShwcmVmaXgsIG5zdXJpKSB7XG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgaGFjayBmb3Igb3VyIG93biBpc3N1ZXMsIHdoaWNoIG91Z2h0IHRvIGJlIGZpeGVkXG4gICAgICAvLyBwb3N0LXJlbGVhc2VcbiAgICAgIC8vIFNlZSBodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvY2dpLWJpbi9yb3VuZHVwLmNnaS8kcmRmL2lzc3VlMjI3XG4gICAgICBpZiAocHJlZml4ID09PSAndGFiJyAmJiB0aGlzLm5hbWVzcGFjZXNbJ3RhYiddKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhlcmUgYXJlIGZpbGVzIGFyb3VuZCB3aXRoIGxvbmcgYmFkbHkgZ2VuZXJhdGVkIHByZWZpeGVzIGxpa2UgdGhpc1xuICAgICAgaWYgKHByZWZpeC5zbGljZSgwLCAyKSA9PT0gJ25zJyB8fCBwcmVmaXguc2xpY2UoMCwgNykgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWVzcGFjZXNbcHJlZml4XSA9IG5zdXJpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBzdGF0ZW1lbnRzIG1hdGNoaW5nIGEgcGF0dGVyblxuICAgICAqIEFMTCBDT05WRU5JRU5DRSBMT09LVVAgRlVOQ1RJT05TIFJFTFkgT04gVEhJUyFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc3RhdGVtZW50c01hdGNoaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhdGVtZW50c01hdGNoaW5nKHN1YmosIHByZWQsIG9iaiwgd2h5LCBqdXN0T25lKSB7XG4gICAgICAvLyBsb2cuZGVidWcoXCJNYXRjaGluZyB7XCIrc3ViaitcIiBcIitwcmVkK1wiIFwiK29iaitcIn1cIilcbiAgICAgIHZhciBwYXQgPSBbc3ViaiwgcHJlZCwgb2JqLCB3aHldO1xuICAgICAgdmFyIHBhdHRlcm4gPSBbXTtcbiAgICAgIHZhciBoYXNoID0gW107XG4gICAgICB2YXIgd2lsZCA9IFtdOyAvLyB3aWxkY2FyZHNcbiAgICAgIHZhciBnaXZlbiA9IFtdOyAvLyBOb3Qgd2lsZFxuICAgICAgdmFyIHA7XG4gICAgICB2YXIgbGlzdDtcbiAgICAgIGZvciAocCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgcGF0dGVybltwXSA9IHRoaXMuY2Fub24oTm9kZS5mcm9tVmFsdWUocGF0W3BdKSk7XG4gICAgICAgIGlmICghcGF0dGVybltwXSkge1xuICAgICAgICAgIHdpbGQucHVzaChwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaXZlbi5wdXNoKHApO1xuICAgICAgICAgIGhhc2hbcF0gPSBwYXR0ZXJuW3BdLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdpdmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzO1xuICAgICAgfVxuICAgICAgaWYgKGdpdmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBFYXN5IHRvbywgd2UgaGF2ZSBhbiBpbmRleCBmb3IgdGhhdFxuICAgICAgICBwID0gZ2l2ZW5bMF07XG4gICAgICAgIGxpc3QgPSB0aGlzLmluZGV4W3BdW2hhc2hbcF1dO1xuICAgICAgICBpZiAobGlzdCAmJiBqdXN0T25lKSB7XG4gICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGlzdCA9IGxpc3Quc2xpY2UoMCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpc3QgPSBsaXN0IHx8IFtdO1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH1cbiAgICAgIC8vIE5vdyBnaXZlbi5sZW5ndGggaXMgMiwgMyBvciA0LlxuICAgICAgLy8gV2UgaG9wZSB0aGF0IHRoZSBzY2FsZS1mcmVlIG5hdHVyZSBvZiB0aGUgZGF0YSB3aWxsIG1lYW4gd2UgdGVuZCB0byBnZXRcbiAgICAgIC8vIGEgc2hvcnQgaW5kZXggaW4gdGhlcmUgc29tZXdoZXJlIVxuICAgICAgdmFyIGJlc3QgPSAxZTEwOyAvLyByZWFsbHkgYmFkXG4gICAgICB2YXIgYmVzdF9pO1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2l2ZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IGdpdmVuW2ldOyAvLyBXaGljaCBwYXJ0IHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICAgICAgbGlzdCA9IHRoaXMuaW5kZXhbcF1baGFzaFtwXV07XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgIHJldHVybiBbXTsgLy8gTm8gb2NjdXJyZW5jZXNcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPCBiZXN0KSB7XG4gICAgICAgICAgYmVzdCA9IGxpc3QubGVuZ3RoO1xuICAgICAgICAgIGJlc3RfaSA9IGk7IC8vIChub3QgcCEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9rLCB3ZSBoYXZlIHBpY2tlZCB0aGUgc2hvcnRlc3QgaW5kZXggYnV0IG5vdyB3ZSBoYXZlIHRvIGZpbHRlciBpdFxuICAgICAgdmFyIGJlc3RfcCA9IGdpdmVuW2Jlc3RfaV07XG4gICAgICB2YXIgcG9zc2libGVzID0gdGhpcy5pbmRleFtiZXN0X3BdW2hhc2hbYmVzdF9wXV07XG4gICAgICB2YXIgY2hlY2sgPSBnaXZlbi5zbGljZSgwLCBiZXN0X2kpLmNvbmNhdChnaXZlbi5zbGljZShiZXN0X2kgKyAxKSk7IC8vIHJlbW92ZSBiZXN0X2lcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgcGFydHMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsICd3aHknXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zc2libGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBzdCA9IHBvc3NpYmxlc1tqXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBmb3IgZWFjaCBwb3NpdGlvbiB0byBiZSBjaGVja2VkXG4gICAgICAgICAgcCA9IGNoZWNrW2ldO1xuICAgICAgICAgIGlmICghdGhpcy5jYW5vbihzdFtwYXJ0c1twXV0pLnNhbWVUZXJtKHBhdHRlcm5bcF0pKSB7XG4gICAgICAgICAgICBzdCA9IG51bGw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ICE9IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goc3QpO1xuICAgICAgICAgIGlmIChqdXN0T25lKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEEgbGlzdCBvZiBhbGwgdGhlIFVSSXMgYnkgd2hpY2ggdGhpcyB0aGluZyBpcyBrbm93blxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1cmlzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXJpcyh0ZXJtKSB7XG4gICAgICB2YXIgY3Rlcm0gPSB0aGlzLmNhbm9uKHRlcm0pO1xuICAgICAgdmFyIHRlcm1zID0gdGhpcy5hbGlhc2VzW2N0ZXJtLmhhc2hTdHJpbmcoKV07XG4gICAgICBpZiAoIWN0ZXJtLnVyaSkgcmV0dXJuIFtdO1xuICAgICAgdmFyIHJlcyA9IFtjdGVybS51cmldO1xuICAgICAgaWYgKHRlcm1zKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMucHVzaCh0ZXJtc1tpXS51cmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xlbmd0aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5kZXhlZEZvcm11bGE7XG59KEZvcm11bGEpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBJbmRleGVkRm9ybXVsYTtcblxuXG5JbmRleGVkRm9ybXVsYS5oYW5kbGVSREZUeXBlID0gaGFuZGxlUkRGVHlwZTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBqc29uUGFyc2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4ge1xuICAgIHBhcnNlSlNPTjogZnVuY3Rpb24gcGFyc2VKU09OKGRhdGEsIHNvdXJjZSwgc3RvcmUpIHtcbiAgICAgIHZhciBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdDtcbiAgICAgIHZhciBibm9kZXMgPSB7fTtcbiAgICAgIHZhciB3aHkgPSBzdG9yZS5zeW0oc291cmNlKTtcbiAgICAgIGZvciAodmFyIHggaW4gZGF0YSkge1xuICAgICAgICBpZiAoeC5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgaWYgKGJub2Rlc1t4XSkge1xuICAgICAgICAgICAgc3ViamVjdCA9IGJub2Rlc1t4XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViamVjdCA9IHN0b3JlLmJub2RlKHgpO1xuICAgICAgICAgICAgYm5vZGVzW3hdID0gc3ViamVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViamVjdCA9IHN0b3JlLnN5bSh4KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJlZHMgPSBkYXRhW3hdO1xuICAgICAgICBmb3IgKHZhciB5IGluIHByZWRzKSB7XG4gICAgICAgICAgdmFyIG9iamVjdHMgPSBwcmVkc1t5XTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBzdG9yZS5zeW0oeSk7XG4gICAgICAgICAgZm9yICh2YXIgeiBpbiBvYmplY3RzKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gb2JqZWN0c1t6XTtcbiAgICAgICAgICAgIGlmIChvYmoudHlwZSA9PT0gJ3VyaScpIHtcbiAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUuc3ltKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgIHN0b3JlLmFkZChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgd2h5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdCbGFua05vZGUnKSB7XG4gICAgICAgICAgICAgIGlmIChibm9kZXNbb2JqLnZhbHVlXSkge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IGJub2Rlc1tvYmoudmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IHN0b3JlLmJub2RlKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYm5vZGVzW29iai52YWx1ZV0gPSBvYmplY3Q7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgICAgICAgIC8vIHZhciBkYXRhdHlwZVxuICAgICAgICAgICAgICBpZiAob2JqLmRhdGF0eXBlKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUubGl0ZXJhbChvYmoudmFsdWUsIHVuZGVmaW5lZCwgc3RvcmUuc3ltKG9iai5kYXRhdHlwZSkpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iai5sYW5nKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUubGl0ZXJhbChvYmoudmFsdWUsIG9iai5sYW5nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBzdG9yZS5saXRlcmFsKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvcjogdW5leHBlY3RlZCB0ZXJtdHlwZTogJyArIHoudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25QYXJzZXI7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFhTRCA9IHJlcXVpcmUoJy4veHNkJyk7XG5cbnZhciBMaXRlcmFsID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhMaXRlcmFsLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSwgbGFuZ3VhZ2UsIGRhdGF0eXBlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpdGVyYWwpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKExpdGVyYWwuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihMaXRlcmFsKSkuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy50ZXJtVHlwZSA9IExpdGVyYWwudGVybVR5cGU7XG4gICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgIF90aGlzLmxhbmcgPSBsYW5ndWFnZTtcbiAgICAgIGRhdGF0eXBlID0gWFNELmxhbmdTdHJpbmc7XG4gICAgfVxuICAgIC8vIElmIG5vdCBzcGVjaWZpZWQsIGEgbGl0ZXJhbCBoYXMgdGhlIGltcGxpZWQgWFNELnN0cmluZyBkZWZhdWx0IGRhdGF0eXBlXG4gICAgaWYgKGRhdGF0eXBlKSB7XG4gICAgICBfdGhpcy5kYXRhdHlwZSA9IE5hbWVkTm9kZS5mcm9tVmFsdWUoZGF0YXR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGl0ZXJhbCwgW3tcbiAgICBrZXk6ICdjb3B5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSgpIHtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh0aGlzLnZhbHVlLCB0aGlzLmxhbmcsIHRoaXMuZGF0YXR5cGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50ZXJtVHlwZSA9PT0gb3RoZXIudGVybVR5cGUgJiYgdGhpcy52YWx1ZSA9PT0gb3RoZXIudmFsdWUgJiYgdGhpcy5sYW5ndWFnZSA9PT0gb3RoZXIubGFuZ3VhZ2UgJiYgKCF0aGlzLmRhdGF0eXBlICYmICFvdGhlci5kYXRhdHlwZSB8fCB0aGlzLmRhdGF0eXBlICYmIHRoaXMuZGF0YXR5cGUuZXF1YWxzKG90aGVyLmRhdGF0eXBlKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9OVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvTlQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG9mIFJERiBsaXRlcmFsIGlzIG5vdCBzdHJpbmcgb3IgbnVtYmVyOiAnICsgdGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgc3RyID0gdGhpcy52YWx1ZTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpO1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcXCIvZywgJ1xcXFxcIicpO1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKTtcbiAgICAgIHN0ciA9ICdcIicgKyBzdHIgKyAnXCInO1xuXG4gICAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgICBzdHIgKz0gJ0AnICsgdGhpcy5sYW5ndWFnZTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGF0YXR5cGUuZXF1YWxzKFhTRC5zdHJpbmcpKSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIGRhdGF0eXBlIGlmIGl0J3Mgbm90IGEgc3RyaW5nXG4gICAgICAgIHN0ciArPSAnXl4nICsgdGhpcy5kYXRhdHlwZS50b0Nhbm9uaWNhbCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnICsgdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tQm9vbGVhblxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0gdmFsdWUge0Jvb2xlYW59XG4gICAgICogQHJldHVybiB7TGl0ZXJhbH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbGFuZ3VhZ2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmxhbmcgPSBsYW5ndWFnZSB8fCAnJztcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ2Zyb21Cb29sZWFuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUJvb2xlYW4odmFsdWUpIHtcbiAgICAgIHZhciBzdHJWYWx1ZSA9IHZhbHVlID8gJzEnIDogJzAnO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHN0clZhbHVlLCBudWxsLCBYU0QuYm9vbGVhbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZnJvbURhdGVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHZhbHVlIHtEYXRlfVxuICAgICAqIEByZXR1cm4ge0xpdGVyYWx9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2Zyb21EYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbURhdGUodmFsdWUpIHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCB0byBMaXRlcmFsLmZyb21EYXRlKCknKTtcbiAgICAgIH1cbiAgICAgIHZhciBkMiA9IGZ1bmN0aW9uIGQyKHgpIHtcbiAgICAgICAgcmV0dXJuICgnJyArICgxMDAgKyB4KSkuc2xpY2UoMSwgMyk7XG4gICAgICB9O1xuICAgICAgdmFyIGRhdGUgPSAnJyArIHZhbHVlLmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKyBkMih2YWx1ZS5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKyBkMih2YWx1ZS5nZXRVVENEYXRlKCkpICsgJ1QnICsgZDIodmFsdWUuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBkMih2YWx1ZS5nZXRVVENNaW51dGVzKCkpICsgJzonICsgZDIodmFsdWUuZ2V0VVRDU2Vjb25kcygpKSArICdaJztcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbChkYXRlLCBudWxsLCBYU0QuZGF0ZVRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGZyb21OdW1iZXJcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHZhbHVlIHtOdW1iZXJ9XG4gICAgICogQHJldHVybiB7TGl0ZXJhbH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZnJvbU51bWJlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgdG8gTGl0ZXJhbC5mcm9tTnVtYmVyKCknKTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhdHlwZSA9IHZvaWQgMDtcbiAgICAgIHZhciBzdHJWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoc3RyVmFsdWUuaW5kZXhPZignZScpIDwgMCAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgZGF0YXR5cGUgPSBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSA/IFhTRC5pbnRlZ2VyIDogWFNELmRlY2ltYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhdHlwZSA9IFhTRC5kb3VibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwoc3RyVmFsdWUsIG51bGwsIGRhdGF0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tVmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtMaXRlcmFsfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmcm9tVmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpID09PSAnb2JqZWN0JyAmJiB2YWx1ZS50ZXJtVHlwZSkge1xuICAgICAgICAvLyB0aGlzIGlzIGEgTm9kZSBpbnN0YW5jZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIExpdGVyYWwuZnJvbURhdGUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgcmV0dXJuIExpdGVyYWwuZnJvbUJvb2xlYW4odmFsdWUpO1xuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgIHJldHVybiBMaXRlcmFsLmZyb21OdW1iZXIodmFsdWUpO1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtYWtlIGxpdGVyYWwgZnJvbSBcIiArIHZhbHVlICsgJyBvZiB0eXBlICcgKyAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGl0ZXJhbDtcbn0oTm9kZSk7XG5cbkxpdGVyYWwudGVybVR5cGUgPSAnTGl0ZXJhbCc7XG5MaXRlcmFsLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnTGl0ZXJhbCddO1xuTGl0ZXJhbC5wcm90b3R5cGUuZGF0YXR5cGUgPSBYU0Quc3RyaW5nO1xuTGl0ZXJhbC5wcm90b3R5cGUubGFuZyA9ICcnO1xuTGl0ZXJhbC5wcm90b3R5cGUuaXNWYXIgPSAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpdGVyYWw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQSBEdW1teSBsb2dcbiAqIEBtb2R1bGUgbG9nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZWJ1ZzogZnVuY3Rpb24gZGVidWcoeCkge1xuICAgIHJldHVybjtcbiAgfSxcbiAgd2FybjogZnVuY3Rpb24gd2Fybih4KSB7XG4gICAgcmV0dXJuO1xuICB9LFxuICBpbmZvOiBmdW5jdGlvbiBpbmZvKHgpIHtcbiAgICByZXR1cm47XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih4KSB7XG4gICAgcmV0dXJuO1xuICB9LFxuICBzdWNjZXNzOiBmdW5jdGlvbiBzdWNjZXNzKHgpIHtcbiAgICByZXR1cm47XG4gIH0sXG4gIG1zZzogZnVuY3Rpb24gbXNnKHgpIHtcbiAgICByZXR1cm47XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbi8qKlxuKlxuKiAgVVRGLTggZGF0YSBlbmNvZGUgLyBkZWNvZGVcbiogIGh0dHA6Ly93d3cud2VidG9vbGtpdC5pbmZvL1xuKlxuKiovXG52YXIgVXJpID0gcmVxdWlyZSgnLi91cmknKTtcbnZhciBBcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL3V0aWwnKS5BcnJheUluZGV4T2Y7XG5cbnZhciBOM1BhcnNlciA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIGhleGlmeShzdHIpIHtcbiAgICAgICAgLy8gYWxzbyB1c2VkIGluIHBhcnNlclxuICAgICAgICByZXR1cm4gZW5jb2RlVVJJKHN0cik7XG4gICAgfVxuXG4gICAgdmFyIFV0ZjggPSB7XG4gICAgICAgIC8vIHB1YmxpYyBtZXRob2QgZm9yIHVybCBlbmNvZGluZ1xuICAgICAgICBlbmNvZGU6IGZ1bmN0aW9uIGVuY29kZShzdHJpbmcpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB2YXIgdXRmdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+IDEyNyAmJiBjIDwgMjA0OCkge1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiA2IHwgMTkyKTtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgJiA2MyB8IDEyOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4gMTIgfCAyMjQpO1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiA2ICYgNjMgfCAxMjgpO1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyAmIDYzIHwgMTI4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGZ0ZXh0O1xuICAgICAgICB9LFxuICAgICAgICAvLyBwdWJsaWMgbWV0aG9kIGZvciB1cmwgZGVjb2RpbmdcbiAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUodXRmdGV4dCkge1xuICAgICAgICAgICAgdmFyIHN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChpIDwgdXRmdGV4dC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHZhciBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID4gMTkxICYmIGMgPCAyMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAzMSkgPDwgNiB8IHV0ZnRleHQuY2hhckNvZGVBdChpICsgMSkgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDE1KSA8PCAxMiB8ICh1dGZ0ZXh0LmNoYXJDb2RlQXQoaSArIDEpICYgNjMpIDw8IDYgfCB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSArIDIpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfVxuICAgIH07IC8vIFRoaW5ncyB3ZSBuZWVkIHRvIGRlZmluZSB0byBtYWtlIGNvbnZlcnRlZCBweXRobiBjb2RlIHdvcmsgaW4ganNcbiAgICAvLyBlbnZpcm9ubWVudCBvZiAkcmRmXG5cbiAgICB2YXIgUkRGU2lua19mb3JTb21lU3ltID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI2ZvclNvbWVcIjtcbiAgICB2YXIgUkRGU2lua19mb3JBbGxTeW0gPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjZm9yQWxsXCI7XG4gICAgdmFyIExvZ2ljX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI1wiO1xuXG4gICAgLy8gIHB5anMgc2VlbXMgdG8gcmVmZXJlbmNlIHJ1bnRpbWUgbGlicmFyeSB3aGljaCBJIGRpZG4ndCBmaW5kXG5cbiAgICB2YXIgcHlqc2xpYl9UdXBsZSA9IGZ1bmN0aW9uIHB5anNsaWJfVHVwbGUodGhlTGlzdCkge1xuICAgICAgICByZXR1cm4gdGhlTGlzdDtcbiAgICB9O1xuXG4gICAgdmFyIHB5anNsaWJfTGlzdCA9IGZ1bmN0aW9uIHB5anNsaWJfTGlzdCh0aGVMaXN0KSB7XG4gICAgICAgIHJldHVybiB0aGVMaXN0O1xuICAgIH07XG5cbiAgICB2YXIgcHlqc2xpYl9EaWN0ID0gZnVuY3Rpb24gcHlqc2xpYl9EaWN0KGxpc3RPZlBhaXJzKSB7XG4gICAgICAgIGlmIChsaXN0T2ZQYWlycy5sZW5ndGggPiAwKSB0aHJvdyBcIm1pc3NpbmcuanM6IG9vcHMgbm5vbmVtcHR5IGRpY3Qgbm90IGltcFwiO1xuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcblxuICAgIHZhciBweWpzbGliX2xlbiA9IGZ1bmN0aW9uIHB5anNsaWJfbGVuKHMpIHtcbiAgICAgICAgcmV0dXJuIHMubGVuZ3RoO1xuICAgIH07XG5cbiAgICB2YXIgcHlqc2xpYl9zbGljZSA9IGZ1bmN0aW9uIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBqKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyLnNsaWNlID09ICd1bmRlZmluZWQnKSB0aHJvdyAnQEAgbWlzaW5nLmpzOiBObyAuc2xpY2UgZnVuY3Rpb24gZm9yICcgKyBzdHIgKyAnIG9mIHR5cGUgJyArICh0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdHIpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBqID09ICd1bmRlZmluZWQnIHx8IGogPT0gbnVsbCkgcmV0dXJuIHN0ci5zbGljZShpKTtcbiAgICAgICAgcmV0dXJuIHN0ci5zbGljZShpLCBqKTsgLy8gQCBleGFjdGx5IHRoZSBzYW1lIHNwZWM/XG4gICAgfTtcbiAgICB2YXIgU3RvcEl0ZXJhdGlvbiA9IEVycm9yKCdkdW1teSBlcnJvciBzdG9wIGl0ZXJhdGlvbicpO1xuXG4gICAgdmFyIHB5anNsaWJfSXRlcmF0b3IgPSBmdW5jdGlvbiBweWpzbGliX0l0ZXJhdG9yKHRoZUxpc3QpIHtcbiAgICAgICAgdGhpcy5sYXN0ID0gMDtcbiAgICAgICAgdGhpcy5saSA9IHRoZUxpc3Q7XG4gICAgICAgIHRoaXMubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3QgPT0gdGhpcy5saS5sZW5ndGgpIHRocm93IFN0b3BJdGVyYXRpb247XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saVt0aGlzLmxhc3QrK107XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICB2YXIgb3JkID0gZnVuY3Rpb24gb3JkKHN0cikge1xuICAgICAgICByZXR1cm4gc3RyLmNoYXJDb2RlQXQoMCk7XG4gICAgfTtcblxuICAgIHZhciBzdHJpbmdfZmluZCA9IGZ1bmN0aW9uIHN0cmluZ19maW5kKHN0ciwgcykge1xuICAgICAgICByZXR1cm4gc3RyLmluZGV4T2Yocyk7XG4gICAgfTtcblxuICAgIHZhciBhc3NlcnRGdWRnZSA9IGZ1bmN0aW9uIGFzc2VydEZ1ZGdlKGNvbmRpdGlvbiwgZGVzYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNjKSB0aHJvdyBcInB5dGhvbiBBc3NlcnRpb24gZmFpbGVkOiBcIiArIGRlc2M7XG4gICAgICAgIHRocm93IFwiKHB5dGhvbikgQXNzZXJ0aW9uIGZhaWxlZC5cIjtcbiAgICB9O1xuXG4gICAgdmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IGZ1bmN0aW9uIHN0cmluZ0Zyb21DaGFyQ29kZSh1ZXNjKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHVlc2MpO1xuICAgIH07XG5cbiAgICBTdHJpbmcucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT0gJ3V0Zi04JykgdGhyb3cgXCJVVEY4X2NvbnZlcnRlcjogY2FuIG9ubHkgZG8gdXRmLThcIjtcbiAgICAgICAgcmV0dXJuIFV0ZjguZW5jb2RlKHRoaXMpO1xuICAgIH07XG4gICAgU3RyaW5nLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGVuY29kaW5nICE9ICd1dGYtOCcpIHRocm93IFwiVVRGOF9jb252ZXJ0ZXI6IGNhbiBvbmx5IGRvIHV0Zi04XCI7XG4gICAgICAgIC8vcmV0dXJuIFV0ZjguZGVjb2RlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgdmFyIHVyaXBhdGhfam9pbiA9IGZ1bmN0aW9uIHVyaXBhdGhfam9pbihiYXNlLCBnaXZlbikge1xuICAgICAgICByZXR1cm4gVXJpLmpvaW4oZ2l2ZW4sIGJhc2UpOyAvLyBzYWQgYnV0IHRydWVcbiAgICB9O1xuXG4gICAgdmFyIGJlY2F1c2VTdWJleHByZXNzaW9uID0gbnVsbDsgLy8gTm8gcmVhc29uIG5lZWRlZFxuICAgIHZhciBkaWFnX3RyYWNraW5nID0gMDtcbiAgICB2YXIgZGlhZ19jaGF0dHlfZmxhZyA9IDA7XG4gICAgdmFyIGRpYWdfcHJvZ3Jlc3MgPSBmdW5jdGlvbiBkaWFnX3Byb2dyZXNzKHN0cikge30gLyokcmRmLmxvZy5kZWJ1ZyhzdHIpOyovXG5cbiAgICAvLyB3aHlfQmVjYXVzZU9mRGF0YSA9IGZ1bmN0aW9uKGRvYywgcmVhc29uKSB7IHJldHVybiBkb2MgfTtcblxuXG4gICAgO3ZhciBSREZfdHlwZV9VUkkgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlXCI7XG4gICAgdmFyIERBTUxfc2FtZUFzX1VSSSA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjc2FtZUFzXCI7XG5cbiAgICAvKlxuICAgIGZ1bmN0aW9uIFN5bnRheEVycm9yKGRldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX1N5bnRheEVycm9yKGRldGFpbHMpO1xuICAgIH1cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gX19TeW50YXhFcnJvcihkZXRhaWxzKSB7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuXG4gICAgLypcbiAgICBcbiAgICAkSWQ6IG4zcGFyc2VyLmpzIDE0NTYxIDIwMDgtMDItMjMgMDY6Mzc6MjZaIGtlbm55bHVjayAkXG4gICAgXG4gICAgSEFORCBFRElURUQgRk9SIENPTlZFUlNJT04gVE8gSkFWQVNDUklQVFxuICAgIFxuICAgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBOcHRhdGlvbjMgcGFyc2VyLCBhbmQgdGhlIGZpbmFsXG4gICAgcGFydCBvZiBhIG5vdGF0aW9uMyBzZXJpYWxpemVyLlxuICAgIFxuICAgIFNlZSBhbHNvOlxuICAgIFxuICAgIE5vdGF0aW9uIDNcbiAgICBodHRwOi8vd3d3LnczLm9yZy9EZXNpZ25Jc3N1ZXMvTm90YXRpb24zXG4gICAgXG4gICAgQ2xvc2VkIFdvcmxkIE1hY2hpbmUgLSBhbmQgUkRGIFByb2Nlc3NvclxuICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9jd21cbiAgICBcbiAgICBUbyBETzogU2VlIGFsc28gXCJAQFwiIGluIGNvbW1lbnRzXG4gICAgXG4gICAgLSBDbGVhbiB1cCBpbnRlcmZhY2VzXG4gICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuICAgIFxuICAgIE1vZHVsZSBvcmlnaW5hbGx5IGJ5IERhbiBDb25ub2xseSwgaW5jbHVkZWluZyBub3RhdGlvbjNcbiAgICBwYXJzZXIgYW5kIFJERiBnZW5lcmF0b3IuIFRpbUJMIGFkZGVkIFJERiBzdHJlYW0gbW9kZWxcbiAgICBhbmQgTjMgZ2VuZXJhdGlvbiwgcmVwbGFjZWQgc3RyZWFtIG1vZGVsIHdpdGggdXNlXG4gICAgb2YgY29tbW9uIHN0b3JlL2Zvcm11bGEgQVBJLiAgWW9zaSBTY2hhcmYgZGV2ZWxvcHBlZFxuICAgIHRoZSBtb2R1bGUsIGluY2x1ZGluZyB0ZXN0cyBhbmQgdGVzdCBoYXJuZXNzLlxuICAgIFxuICAgICovXG5cbiAgICB2YXIgQURERURfSEFTSCA9IFwiI1wiO1xuICAgIHZhciBMT0dfaW1wbGllc19VUkkgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjaW1wbGllc1wiO1xuICAgIHZhciBJTlRFR0VSX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRlZ2VyXCI7XG4gICAgdmFyIEZMT0FUX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkb3VibGVcIjtcbiAgICB2YXIgREVDSU1BTF9EQVRBVFlQRSA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiO1xuICAgIHZhciBEQVRFX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlXCI7XG4gICAgdmFyIERBVEVUSU1FX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZVwiO1xuICAgIHZhciBCT09MRUFOX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCI7XG4gICAgdmFyIG9wdGlvbl9ub3JlZ2VuID0gMDtcbiAgICB2YXIgX25vdFFOYW1lQ2hhcnMgPSBcIlxcdFxcclxcbiAhXFxcIiMkJSYnKCkqLiwrLzs8PT4/QFtcXFxcXV5ge3x9flwiO1xuICAgIHZhciBfbm90TmFtZUNoYXJzID0gX25vdFFOYW1lQ2hhcnMgKyBcIjpcIjtcbiAgICB2YXIgX3JkZm5zID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjXCI7XG4gICAgdmFyIE4zQ29tbWVudENoYXJhY3RlciA9IFwiI1wiO1xuICAgIHZhciBlb2wgPSBuZXcgUmVnRXhwKFwiXlsgXFxcXHRdKigjW15cXFxcbl0qKT9cXFxccj9cXFxcblwiLCAnZycpO1xuICAgIHZhciBlb2YgPSBuZXcgUmVnRXhwKFwiXlsgXFxcXHRdKigjW15cXFxcbl0qKT8kXCIsICdnJyk7XG4gICAgdmFyIHdzID0gbmV3IFJlZ0V4cChcIl5bIFxcXFx0XSpcIiwgJ2cnKTtcbiAgICB2YXIgc2lnbmVkX2ludGVnZXIgPSBuZXcgUmVnRXhwKFwiXlstK10/WzAtOV0rXCIsICdnJyk7XG4gICAgdmFyIG51bWJlcl9zeW50YXggPSBuZXcgUmVnRXhwKFwiXihbLStdP1swLTldKykoXFxcXC5bMC05XSspPyhlWy0rXT9bMC05XSspP1wiLCAnZycpO1xuICAgIHZhciBkYXRldGltZV9zeW50YXggPSBuZXcgUmVnRXhwKCdeWzAtOV1bMC05XVswLTldWzAtOV0tWzAtOV1bMC05XS1bMC05XVswLTldKFRbMC05XVswLTldOlswLTldWzAtOV0oOlswLTldWzAtOV0oXFxcXC5bMC05XSopPyk/KT9aPycpO1xuXG4gICAgdmFyIGRpZ2l0c3RyaW5nID0gbmV3IFJlZ0V4cChcIl5bMC05XStcIiwgJ2cnKTtcbiAgICB2YXIgaW50ZXJlc3RpbmcgPSBuZXcgUmVnRXhwKFwiW1xcXFxcXFxcXFxcXHJcXFxcblxcXFxcXFwiXVwiLCAnZycpO1xuICAgIHZhciBsYW5nY29kZSA9IG5ldyBSZWdFeHAoXCJeW2EtekEtWjAtOV0rKC1bYS16QS1aMC05XSspKlwiLCAnZycpO1xuICAgIGZ1bmN0aW9uIFNpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX1NpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfX1NpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVuRm9ybXVsYSA9PSAndW5kZWZpbmVkJykgb3BlbkZvcm11bGEgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNEb2MgPT0gJ3VuZGVmaW5lZCcpIHRoaXNEb2MgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2VVUkkgPT0gJ3VuZGVmaW5lZCcpIGJhc2VVUkkgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGdlblByZWZpeCA9PSAndW5kZWZpbmVkJykgZ2VuUHJlZml4ID0gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRhVVJJID09ICd1bmRlZmluZWQnKSBtZXRhVVJJID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBmbGFncyA9PSAndW5kZWZpbmVkJykgZmxhZ3MgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHdoeSA9PSAndW5kZWZpbmVkJykgd2h5ID0gbnVsbDtcbiAgICAgICAgLypcbiAgICAgICAgbm90ZTogbmFtZXNwYWNlIG5hbWVzIHNob3VsZCAqbm90KiBlbmQgaW4gIztcbiAgICAgICAgdGhlICMgd2lsbCBnZXQgYWRkZWQgZHVyaW5nIHFuYW1lIHByb2Nlc3NpbmcgKi9cblxuICAgICAgICB0aGlzLl9iaW5kaW5ncyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xuICAgICAgICBpZiAodGhpc0RvYyAhPSBcIlwiKSB7XG4gICAgICAgICAgICBhc3NlcnRGdWRnZSh0aGlzRG9jLmluZGV4T2YoXCI6XCIpID49IDAsIFwiRG9jdW1lbnQgVVJJIG5vdCBhYnNvbHV0ZTogXCIgKyB0aGlzRG9jKTtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdzW1wiXCJdID0gdGhpc0RvYyArIFwiI1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIGlmIChnZW5QcmVmaXgpIHtcbiAgICAgICAgICAgIHN0b3JlLnNldEdlblByZWZpeChnZW5QcmVmaXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RoaXNEb2MgPSB0aGlzRG9jO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHN0b3JlLnN5bSh0aGlzRG9jKTtcbiAgICAgICAgdGhpcy5saW5lcyA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50Q291bnQgPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0T2ZMaW5lID0gMDtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xpbmUgPSAwO1xuICAgICAgICB0aGlzLl9nZW5QcmVmaXggPSBnZW5QcmVmaXg7XG4gICAgICAgIHRoaXMua2V5d29yZHMgPSBuZXcgcHlqc2xpYl9MaXN0KFtcImFcIiwgXCJ0aGlzXCIsIFwiYmluZFwiLCBcImhhc1wiLCBcImlzXCIsIFwib2ZcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIl0pO1xuICAgICAgICB0aGlzLmtleXdvcmRzU2V0ID0gMDtcbiAgICAgICAgdGhpcy5fYW5vbnltb3VzTm9kZXMgPSBuZXcgcHlqc2xpYl9EaWN0KFtdKTtcbiAgICAgICAgdGhpcy5fdmFyaWFibGVzID0gbmV3IHB5anNsaWJfRGljdChbXSk7XG4gICAgICAgIHRoaXMuX3BhcmVudFZhcmlhYmxlcyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICB0aGlzLl9yZWFzb24gPSB3aHk7XG4gICAgICAgIHRoaXMuX3JlYXNvbjIgPSBudWxsO1xuICAgICAgICBpZiAoZGlhZ190cmFja2luZykge1xuICAgICAgICAgICAgdGhpcy5fcmVhc29uMiA9IHdoeV9CZWNhdXNlT2ZEYXRhKHN0b3JlLnN5bSh0aGlzRG9jKSwgdGhpcy5fcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZVVSSSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZVVSSSA9IGJhc2VVUkk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpc0RvYykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VVUkkgPSB0aGlzRG9jO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYXNlVVJJID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRGdWRnZSghdGhpcy5fYmFzZVVSSSB8fCB0aGlzLl9iYXNlVVJJLmluZGV4T2YoXCI6XCIpID49IDApO1xuICAgICAgICBpZiAoIXRoaXMuX2dlblByZWZpeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RoaXNEb2MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW5QcmVmaXggPSB0aGlzLl90aGlzRG9jICsgXCIjX2dcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VuUHJlZml4ID0gUkRGU2lua191bmlxdWVVUkkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlbkZvcm11bGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RoaXNEb2MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtdWxhID0gc3RvcmUuZm9ybXVsYSh0aGlzRG9jICsgXCIjX2Zvcm11bGFcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm11bGEgPSBzdG9yZS5mb3JtdWxhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtdWxhID0gb3BlbkZvcm11bGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2Zvcm11bGE7XG4gICAgICAgIHRoaXMuX3BhcmVudENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmhlcmUgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuUHJlZml4ICsgXCJfTFwiICsgdGhpcy5saW5lcyArIFwiQ1wiICsgKGkgLSB0aGlzLnN0YXJ0T2ZMaW5lICsgMSk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmZvcm11bGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtdWxhO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5sb2FkU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQnVmKHN0cmVhbS5yZWFkKCkpO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5sb2FkQnVmID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAvKlxuICAgICAgICBQYXJzZXMgYSBidWZmZXIgYW5kIHJldHVybnMgaXRzIHRvcCBsZXZlbCBmb3JtdWxhKi9cblxuICAgICAgICB0aGlzLnN0YXJ0RG9jKCk7XG4gICAgICAgIHRoaXMuZmVlZChidWYpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmREb2MoKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZmVlZCA9IGZ1bmN0aW9uIChvY3RldHMpIHtcbiAgICAgICAgLypcbiAgICAgICAgRmVlZCBhbiBvY3RldCBzdHJlYW0gdG90aGUgcGFyc2VyXG4gICAgICAgICBpZiBCYWRTeW50YXggaXMgcmFpc2VkLCB0aGUgc3RyaW5nXG4gICAgICAgIHBhc3NlZCBpbiB0aGUgZXhjZXB0aW9uIG9iamVjdCBpcyB0aGVcbiAgICAgICAgcmVtYWluZGVyIGFmdGVyIGFueSBzdGF0ZW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQuXG4gICAgICAgIFNvIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBmZWVkIHRvIHRoZVxuICAgICAgICBwYXJzZXIsIGl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgdG8gcmVjb3Zlci4qL1xuXG4gICAgICAgIHZhciBzdHIgPSBvY3RldHMuZGVjb2RlKFwidXRmLThcIik7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRpcmVjdGl2ZU9yU3RhdGVtZW50KHN0ciwgaik7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIGRpcmVjdGl2ZSBvciBzdGF0ZW1lbnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZGlyZWN0aXZlT3JTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RyLCBoKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBoKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMuZGlyZWN0aXZlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrRG90KHN0ciwgaik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnN0YXRlbWVudChzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0RvdChzdHIsIGopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS50b2sgPSBmdW5jdGlvbiAodG9rLCBzdHIsIGkpIHtcbiAgICAgICAgLypcbiAgICAgICAgQ2hlY2sgZm9yIGtleXdvcmQuICBTcGFjZSBtdXN0IGhhdmUgYmVlbiBzdHJpcHBlZCBvbiBlbnRyeSBhbmRcbiAgICAgICAgd2UgbXVzdCBub3QgYmUgYXQgZW5kIG9mIGZpbGUuKi9cbiAgICAgICAgdmFyIHdoaXRlc3BhY2UgPSBcIlxcdFxcblxcdlxcZlxcciBcIjtcbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMSkgPT0gXCJAXCIpIHtcbiAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXlJbmRleE9mKHRoaXMua2V5d29yZHMsIHRvaykgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBrID0gaSArIHB5anNsaWJfbGVuKHRvayk7XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaykgPT0gdG9rICYmIF9ub3RRTmFtZUNoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChrKSkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZGlyZWN0aXZlID0gZnVuY3Rpb24gKHN0ciwgaSkge1xuICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcyA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiYmluZFwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwia2V5d29yZCBiaW5kIGlzIG9ic29sZXRlOiB1c2UgQHByZWZpeFwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwia2V5d29yZHNcIiwgc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuY29tbWFTZXBhcmF0ZWRMaXN0KHN0ciwgaiwgcmVzLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIidAa2V5d29yZHMnIG5lZWRzIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRLZXl3b3JkcyhweWpzbGliX3NsaWNlKHJlcywgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgICAgaWYgKGRpYWdfY2hhdHR5X2ZsYWcgPiA4MCkge1xuICAgICAgICAgICAgICAgIGRpYWdfcHJvZ3Jlc3MoXCJLZXl3b3JkcyBcIiwgdGhpcy5rZXl3b3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiZm9yQWxsXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmNvbW1hU2VwYXJhdGVkTGlzdChzdHIsIGosIHJlcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkJhZCB2YXJpYWJsZSBsaXN0IGFmdGVyIEBmb3JBbGxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfX3ggPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihyZXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IF9feC5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5SW5kZXhPZih0aGlzLl92YXJpYWJsZXMsIHgpIDwgMCB8fCBBcnJheUluZGV4T2YodGhpcy5fcGFyZW50VmFyaWFibGVzLCB4KSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZXNbeF0gPSB0aGlzLl9jb250ZXh0Lm5ld1VuaXZlcnNhbCh4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiZm9yU29tZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb21tYVNlcGFyYXRlZExpc3Qoc3RyLCBqLCByZXMsIHRoaXMudXJpX3JlZjIpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJCYWQgdmFyaWFibGUgbGlzdCBhZnRlciBAZm9yU29tZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9feCA9IG5ldyBweWpzbGliX0l0ZXJhdG9yKHJlcyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4ID0gX194Lm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRlY2xhcmVFeGlzdGVudGlhbCh4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgIT0gU3RvcEl0ZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnRvayhcInByZWZpeFwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnFuYW1lKHN0ciwgaiwgdCk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIHFuYW1lIGFmdGVyIEBwcmVmaXhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCB0KTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiZXhwZWN0ZWQgPHVyaXJlZj4gYWZ0ZXIgQHByZWZpeCBfcW5hbWVfXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5zID0gdFsxXS51cmk7XG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZVVSSSkge1xuICAgICAgICAgICAgICAgIHZhciBucyA9IHVyaXBhdGhfam9pbih0aGlzLl9iYXNlVVJJLCBucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydEZ1ZGdlKG5zLmluZGV4T2YoXCI6XCIpID49IDAsIFwiV2l0aCBubyBiYXNlIFVSSSwgY2Fubm90IGhhbmRsZSByZWxhdGl2ZSBVUkkgZm9yIE5TXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0RnVkZ2UobnMuaW5kZXhPZihcIjpcIikgPj0gMCk7XG4gICAgICAgICAgICB0aGlzLl9iaW5kaW5nc1t0WzBdWzBdXSA9IG5zO1xuXG4gICAgICAgICAgICB0aGlzLmJpbmQodFswXVswXSwgaGV4aWZ5KG5zKSk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiYmFzZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiwgdCk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIDx1cmk+IGFmdGVyIEBiYXNlIFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBucyA9IHRbMF0udXJpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VVUkkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbnMgPSB1cmlwYXRoX2pvaW4odGhpcy5fYmFzZVVSSSwgbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIldpdGggbm8gcHJldmlvdXMgYmFzZSBVUkksIGNhbm5vdCB1c2UgcmVsYXRpdmUgVVJJIGluIEBiYXNlICA8XCIgKyBucyArIFwiPlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEZ1ZGdlKG5zLmluZGV4T2YoXCI6XCIpID49IDApO1xuICAgICAgICAgICAgdGhpcy5fYmFzZVVSSSA9IG5zO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHFuLCB1cmkpIHtcbiAgICAgICAgaWYgKHFuID09IFwiXCIpIHt9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmUuc2V0UHJlZml4Rm9yVVJJKHFuLCB1cmkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnNldEtleXdvcmRzID0gZnVuY3Rpb24gKGspIHtcbiAgICAgICAgLypcbiAgICAgICAgVGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MqL1xuXG4gICAgICAgIGlmIChrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMua2V5d29yZHNTZXQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5rZXl3b3JkcyA9IGs7XG4gICAgICAgICAgICB0aGlzLmtleXdvcmRzU2V0ID0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5zdGFydERvYyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZW5kRG9jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvKlxuICAgICAgICBTaWduYWwgZW5kIG9mIGRvY3VtZW50IGFuZCBzdG9wIHBhcnNpbmcuIHJldHVybnMgZm9ybXVsYSovXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm11bGE7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm1ha2VTdGF0ZW1lbnQgPSBmdW5jdGlvbiAocXVhZCkge1xuICAgICAgICBxdWFkWzBdLmFkZChxdWFkWzJdLCBxdWFkWzFdLCBxdWFkWzNdLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50Q291bnQgKz0gMTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuc3RhdGVtZW50ID0gZnVuY3Rpb24gKHN0ciwgaSkge1xuICAgICAgICB2YXIgciA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICB2YXIgaSA9IHRoaXMub2JqZWN0KHN0ciwgaSwgcik7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnByb3BlcnR5X2xpc3Qoc3RyLCBpLCByWzBdKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIHByb3BlcnR5bGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gajtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuc3ViamVjdCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtKHN0ciwgaSwgcmVzKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudmVyYiA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBoYXMgX3Byb3BfXG4gICAgICAgIGlzIF9wcm9wXyBvZlxuICAgICAgICBhXG4gICAgICAgID1cbiAgICAgICAgX3Byb3BfXG4gICAgICAgID4tIHByb3AgLT5cbiAgICAgICAgPC0gcHJvcCAtPFxuICAgICAgICBfb3BlcmF0b3JfKi9cblxuICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHIgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnRvayhcImhhc1wiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMucHJvcChzdHIsIGosIHIpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJleHBlY3RlZCBwcm9wZXJ0eSBhZnRlciAnaGFzJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHJbMF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiaXNcIiwgc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnByb3Aoc3RyLCBqLCByKTtcbiAgICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiZXhwZWN0ZWQgPHByb3BlcnR5PiBhZnRlciAnaXMnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFbmQgb2YgZmlsZSBmb3VuZCwgZXhwZWN0ZWQgcHJvcGVydHkgYWZ0ZXIgJ2lzJ1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpID0gajtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy50b2soXCJvZlwiLCBzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJleHBlY3RlZCAnb2YnIGFmdGVyICdpcycgPHByb3A+XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gobmV3IHB5anNsaWJfVHVwbGUoW1wiPC1cIiwgclswXV0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJhXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHRoaXMuX3N0b3JlLnN5bShSREZfdHlwZV9VUkkpXSkpO1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMikgPT0gXCI8PVwiKSB7XG4gICAgICAgICAgICByZXMucHVzaChuZXcgcHlqc2xpYl9UdXBsZShbXCI8LVwiLCB0aGlzLl9zdG9yZS5zeW0oTG9naWNfTlMgKyBcImltcGxpZXNcIildKSk7XG4gICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMSkgPT0gXCI9XCIpIHtcbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSArIDEsIGkgKyAyKSA9PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHRoaXMuX3N0b3JlLnN5bShMb2dpY19OUyArIFwiaW1wbGllc1wiKV0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMucHVzaChuZXcgcHlqc2xpYl9UdXBsZShbXCItPlwiLCB0aGlzLl9zdG9yZS5zeW0oREFNTF9zYW1lQXNfVVJJKV0pKTtcbiAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAyKSA9PSBcIjo9XCIpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIExvZ2ljX05TICsgXCJiZWNvbWVzXCJdKSk7XG4gICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnByb3Aoc3RyLCBpLCByKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IHB5anNsaWJfVHVwbGUoW1wiLT5cIiwgclswXV0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDIpID09IFwiPi1cIiB8fCBweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDIpID09IFwiPC1cIikge1xuICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCI+LSAuLi4gLT4gc3ludGF4IGlzIG9ic29sZXRlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnByb3AgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbShzdHIsIGksIHJlcyk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aChzdHIsIGksIHJlcyk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmJsYW5rTm9kZSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuYm5vZGUodXJpLCB0aGlzLl9yZWFzb24yKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBQYXJzZSB0aGUgcGF0aCBwcm9kdWN0aW9uLlxuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5ub2RlT3JMaXRlcmFsKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoXCIhXi5cIi5pbmRleE9mKHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSkpID49IDApIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSk7XG4gICAgICAgICAgICBpZiAoY2ggPT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWhlYWQgPSBweWpzbGliX3NsaWNlKHN0ciwgaiArIDEsIGogKyAyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFoZWFkIHx8IF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihhaGVhZCkgPj0gMCAmJiBcIjo/PFt7KFwiLmluZGV4T2YoYWhlYWQpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3ViaiA9IHJlcy5wb3AoKTtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmJsYW5rTm9kZSh0aGlzLmhlcmUoaikpO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLm5vZGUoc3RyLCBqICsgMSwgcmVzKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiRU9GIGZvdW5kIGluIG1pZGRsZSBvZiBwYXRoIHN5bnRheFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwcmVkID0gcmVzLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGNoID09IFwiXlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlU3RhdGVtZW50KG5ldyBweWpzbGliX1R1cGxlKFt0aGlzLl9jb250ZXh0LCBwcmVkLCBvYmosIHN1YmpdKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZVN0YXRlbWVudChuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5fY29udGV4dCwgcHJlZCwgc3Viaiwgb2JqXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gob2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gajtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuYW5vbnltb3VzTm9kZSA9IGZ1bmN0aW9uIChsbikge1xuICAgICAgICAvKlxuICAgICAgICBSZW1lbWJlciBvciBnZW5lcmF0ZSBhIHRlcm0gZm9yIG9uZSBvZiB0aGVzZSBfOiBhbm9ueW1vdXMgbm9kZXMqL1xuXG4gICAgICAgIHZhciB0ZXJtID0gdGhpcy5fYW5vbnltb3VzTm9kZXNbbG5dO1xuICAgICAgICBpZiAodGVybSkge1xuICAgICAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRlcm0gPSB0aGlzLl9zdG9yZS5ibm9kZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9yZWFzb24yKTtcbiAgICAgICAgdGhpcy5fYW5vbnltb3VzTm9kZXNbbG5dID0gdGVybTtcbiAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMsIHN1YmplY3RBbHJlYWR5KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdEFscmVhZHkgPT0gJ3VuZGVmaW5lZCcpIHN1YmplY3RBbHJlYWR5ID0gbnVsbDtcbiAgICAgICAgLypcbiAgICAgICAgUGFyc2UgdGhlIDxub2RlPiBwcm9kdWN0aW9uLlxuICAgICAgICBTcGFjZSBpcyBub3cgc2tpcHBlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgaW5zdGVhZCBvZiBpbiBtdWx0aXBlIGNhbGxzIHRvIHNlbGYuc2tpcFNwYWNlKCkuXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIHN1YmogPSBzdWJqZWN0QWxyZWFkeTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gajtcbiAgICAgICAgdmFyIGNoID0gcHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKTtcbiAgICAgICAgaWYgKGNoID09IFwiW1wiKSB7XG4gICAgICAgICAgICB2YXIgYm5vZGVJRCA9IHRoaXMuaGVyZShpKTtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkVPRiBhZnRlciAnWydcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHZhciBpID0gaiArIDE7XG4gICAgICAgICAgICAgICAgdmFyIG9ianMgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMub2JqZWN0TGlzdChzdHIsIGksIG9ianMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViaiA9IG9ianNbMF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChweWpzbGliX2xlbihvYmpzKSA+IDEpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9fb2JqID0gbmV3IHB5anNsaWJfSXRlcmF0b3Iob2Jqcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBfX29iai5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlU3RhdGVtZW50KG5ldyBweWpzbGliX1R1cGxlKFt0aGlzLl9jb250ZXh0LCB0aGlzLl9zdG9yZS5zeW0oREFNTF9zYW1lQXNfVVJJKSwgc3Viaiwgb2JqXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBqKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkVPRiB3aGVuIG9iamVjdExpc3QgZXhwZWN0ZWQgYWZ0ZXIgWyA9IFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIjtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwib2JqZWN0TGlzdCBleHBlY3RlZCBhZnRlciBbPSBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1YmogPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJqID0gdGhpcy5ibGFua05vZGUoYm5vZGVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMucHJvcGVydHlfbGlzdChzdHIsIGosIHN1YmopO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJwcm9wZXJ0eV9saXN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFT0Ygd2hlbiAnXScgZXhwZWN0ZWQgYWZ0ZXIgWyA8cHJvcGVydHlMaXN0PlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpICE9IFwiXVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCInXScgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMucHVzaChzdWJqKTtcbiAgICAgICAgICAgIHJldHVybiBqICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT0gXCJ7XCIpIHtcbiAgICAgICAgICAgIHZhciBjaDIgPSBweWpzbGliX3NsaWNlKHN0ciwgaSArIDEsIGkgKyAyKTtcbiAgICAgICAgICAgIGlmIChjaDIgPT0gXCIkXCIpIHtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgbXlsaXN0ID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0X3J1biA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwibmVlZGVkICckfScsIGZvdW5kIGVuZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMikgPT0gXCIkfVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9ydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDEpID09IFwiLFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkOiAnLCdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RfcnVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSB0aGlzLml0ZW0oc3RyLCBpLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIGl0ZW0gaW4gc2V0IG9yICckfSdcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXlsaXN0LnB1c2goaXRlbVswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLm5ld1NldChteWxpc3QsIHRoaXMuX2NvbnRleHQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgb2xkUGFyZW50Q29udGV4dCA9IHRoaXMuX3BhcmVudENvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Q29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudEFub255bW91c05vZGVzID0gdGhpcy5fYW5vbnltb3VzTm9kZXM7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kUGFyZW50VmFyaWFibGVzID0gdGhpcy5fcGFyZW50VmFyaWFibGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudFZhcmlhYmxlcyA9IHRoaXMuX3ZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9hbm9ueW1vdXNOb2RlcyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHRoaXMuX3ZhcmlhYmxlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHZhciByZWFzb24yID0gdGhpcy5fcmVhc29uMjtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFzb24yID0gYmVjYXVzZVN1YmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgaWYgKHN1YmogPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViaiA9IHRoaXMuX3N0b3JlLmZvcm11bGEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IHN1Ymo7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwibmVlZGVkICd9JywgZm91bmQgZW5kLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKSA9PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5kaXJlY3RpdmVPclN0YXRlbWVudChzdHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiZXhwZWN0ZWQgc3RhdGVtZW50IG9yICd9J1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9hbm9ueW1vdXNOb2RlcyA9IHBhcmVudEFub255bW91c05vZGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHRoaXMuX3BhcmVudFZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnRWYXJpYWJsZXMgPSBncmFuZFBhcmVudFZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5fcGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFzb24yID0gcmVhc29uMjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnRDb250ZXh0ID0gb2xkUGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICByZXMucHVzaChzdWJqLmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PSBcIihcIikge1xuICAgICAgICAgICAgdmFyIHRoaW5nX3R5cGUgPSB0aGlzLl9zdG9yZS5saXN0O1xuICAgICAgICAgICAgdmFyIGNoMiA9IHB5anNsaWJfc2xpY2Uoc3RyLCBpICsgMSwgaSArIDIpO1xuICAgICAgICAgICAgaWYgKGNoMiA9PSBcIiRcIikge1xuICAgICAgICAgICAgICAgIHZhciB0aGluZ190eXBlID0gdGhpcy5fc3RvcmUubmV3U2V0O1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBqID0gaSArIDE7XG4gICAgICAgICAgICB2YXIgbXlsaXN0ID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBqKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJuZWVkZWQgJyknLCBmb3VuZCBlbmQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKSA9PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuaXRlbShzdHIsIGksIGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIGl0ZW0gaW4gbGlzdCBvciAnKSdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG15bGlzdC5wdXNoKGl0ZW1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2godGhpbmdfdHlwZShteWxpc3QsIHRoaXMuX2NvbnRleHQpKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJ0aGlzXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiS2V5d29yZCAndGhpcycgd2FzIGFuY2llbnQgTjMuIE5vdyB1c2UgQGZvclNvbWUgYW5kIEBmb3JBbGwga2V5d29yZHMuXCIpO1xuICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwidHJ1ZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXMucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJmYWxzZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXMucHVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3ViaiA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCByZXMpO1xuICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUucHJvcGVydHlfbGlzdCA9IGZ1bmN0aW9uIChzdHIsIGksIHN1YmopIHtcbiAgICAgICAgLypcbiAgICAgICAgUGFyc2UgcHJvcGVydHkgbGlzdFxuICAgICAgICBMZWF2ZXMgdGhlIHRlcm1pbmF0aW5nIHB1bmN0dWF0aW9uIGluIHRoZSBidWZmZXJcbiAgICAgICAgKi9cblxuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFT0YgZm91bmQgd2hlbiBleHBlY3RlZCB2ZXJiIGluIHByb3BlcnR5IGxpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyKSA9PSBcIjotXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGogKyAyO1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMubm9kZShzdHIsIGksIHJlcywgc3Viaik7XG4gICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiYmFkIHt9IG9yICgpIG9yIFtdIG5vZGUgYWZ0ZXIgOi0gXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnZlcmIoc3RyLCBpLCB2KTtcbiAgICAgICAgICAgIGlmIChqIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvYmpzID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMub2JqZWN0TGlzdChzdHIsIGosIG9ianMpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJvYmplY3RMaXN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX19vYmogPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihvYmpzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IF9fb2JqLm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdlswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpciA9IHBhaXJGdWRnZVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bSA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcIi0+XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVN0YXRlbWVudChuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5fY29udGV4dCwgc3ltLCBzdWJqLCBvYmpdKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ha2VTdGF0ZW1lbnQobmV3IHB5anNsaWJfVHVwbGUoW3RoaXMuX2NvbnRleHQsIHN5bSwgb2JqLCBzdWJqXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiRU9GIGZvdW5kIGluIGxpc3Qgb2Ygb2JqZWN0c1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDEpICE9IFwiO1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmNvbW1hU2VwYXJhdGVkTGlzdCA9IGZ1bmN0aW9uIChzdHIsIGosIHJlcywgb2ZVcmlzKSB7XG4gICAgICAgIC8qXG4gICAgICAgIHJldHVybiB2YWx1ZTogLTEgYmFkIHN5bnRheDsgPjEgbmV3IHBvc2l0aW9uIGluIHN0clxuICAgICAgICByZXMgaGFzIHRoaW5ncyBmb3VuZCBhcHBlbmRlZFxuICAgICAgICAgVXNlZCB0byB1c2UgYSBmaW5hbCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCBlLmcuIHRoaXMuYmFyZVdvcmRcbiAgICAgICAgYnV0IHBhc3NpbmcgdGhlIGZ1bmN0aW9uIGRpZG4ndCB3b3JrIGZvIGpzIGNvbnZlcmlvbiBweWpzXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiRU9GIGZvdW5kIGV4cGVjdGluZyBjb21tYSBzZXAgbGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiLlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZVcmlzKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCByZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmJhcmVXb3JkKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2ggPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgaWYgKGNoICE9IFwiLFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoICE9IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZVcmlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiArIDEsIHJlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5iYXJlV29yZChzdHIsIGogKyAxLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJiYWQgbGlzdCBjb250ZW50XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm9iamVjdExpc3QgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLm9iamVjdChzdHIsIGksIHJlcyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIkVPRiBmb3VuZCBhZnRlciBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSAhPSBcIixcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLm9iamVjdChzdHIsIGogKyAxLCByZXMpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuY2hlY2tEb3QgPSBmdW5jdGlvbiAoc3RyLCBpKSB7XG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIi5cIikge1xuICAgICAgICAgICAgcmV0dXJuIGogKyAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpID09IFwifVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIl1cIikge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJleHBlY3RlZCAnLicgb3IgJ30nIG9yICddJyBhdCBlbmQgb2Ygc3RhdGVtZW50XCIpO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudXJpX3JlZjIgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgLypcbiAgICAgICAgR2VuZXJhdGUgdXJpIGZyb20gbjMgcmVwcmVzZW50YXRpb24uXG4gICAgICAgICBOb3RlIHRoYXQgdGhlIFJERiBjb252ZW50aW9uIG9mIGRpcmVjdGx5IGNvbmNhdGVuYXRpbmdcbiAgICAgICAgTlMgYW5kIGxvY2FsIG5hbWUgaXMgbm93IHVzZWQgdGhvdWdoIEkgcHJlZmVyIGluc2VydGluZyBhICcjJ1xuICAgICAgICB0byBtYWtlIHRoZSBuYW1lc2FwY2VzIGxvb2sgbW9yZSBsaWtlIHdoYXQgWE1MIGZvbGtzIGV4cGVjdC5cbiAgICAgICAgKi9cblxuICAgICAgICB2YXIgcW4gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnFuYW1lKHN0ciwgaSwgcW4pO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gcW5bMF07XG4gICAgICAgICAgICB2YXIgcGZ4ID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgdmFyIGxuID0gcGFpckZ1ZGdlWzFdO1xuICAgICAgICAgICAgaWYgKHBmeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0RnVkZ2UoMCwgXCJub3QgdXNlZD9cIik7XG4gICAgICAgICAgICAgICAgdmFyIG5zID0gdGhpcy5fYmFzZVVSSSArIEFEREVEX0hBU0g7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBucyA9IHRoaXMuX2JpbmRpbmdzW3BmeF07XG4gICAgICAgICAgICAgICAgaWYgKCFucykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGZ4ID09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLmFub255bW91c05vZGUobG4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiUHJlZml4IFwiICsgcGZ4ICsgXCIgbm90IGJvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3ltYiA9IHRoaXMuX3N0b3JlLnN5bShucyArIGxuKTtcbiAgICAgICAgICAgIGlmIChBcnJheUluZGV4T2YodGhpcy5fdmFyaWFibGVzLCBzeW1iKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fdmFyaWFibGVzW3N5bWJdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goc3ltYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaSA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiP1wiKSB7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnZhcmlhYmxlKHN0ciwgaSwgdik7XG4gICAgICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh2WzBdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHIuY2hhckF0KGkpID09IFwiPFwiKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgdmFyIHN0ID0gaTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1cmVmID0gcHlqc2xpYl9zbGljZShzdHIsIHN0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VVUkkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmVmID0gdXJpcGF0aF9qb2luKHRoaXMuX2Jhc2VVUkksIHVyZWYpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RnVkZ2UodXJlZi5pbmRleE9mKFwiOlwiKSA+PSAwLCBcIldpdGggbm8gYmFzZSBVUkksIGNhbm5vdCBkZWFsIHdpdGggcmVsYXRpdmUgVVJJc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGkgLSAxLCBpKSA9PSBcIiNcIiAmJiAhKHB5anNsaWJfc2xpY2UodXJlZiwgLTEsIG51bGwpID09IFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVyZWYgPSB1cmVmICsgXCIjXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWIgPSB0aGlzLl9zdG9yZS5zeW0odXJlZik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheUluZGV4T2YodGhpcy5fdmFyaWFibGVzLCBzeW1iKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl92YXJpYWJsZXNbc3ltYl0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goc3ltYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJ1bnRlcm1pbmF0ZWQgVVJJIHJlZmVyZW5jZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmtleXdvcmRzU2V0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLmJhcmVXb3JkKHN0ciwgaSwgdik7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXlJbmRleE9mKHRoaXMua2V5d29yZHMsIHZbMF0pID49IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIktleXdvcmQgXFxcIlwiICsgdlswXSArIFwiXFxcIiBub3QgYWxsb3dlZCBoZXJlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLnN5bSh0aGlzLl9iaW5kaW5nc1tcIlwiXSArIHZbMF0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnNraXBTcGFjZSA9IGZ1bmN0aW9uIChzdHIsIGkpIHtcbiAgICAgICAgLypcbiAgICAgICAgU2tpcCB3aGl0ZSBzcGFjZSwgbmV3bGluZXMgYW5kIGNvbW1lbnRzLlxuICAgICAgICByZXR1cm4gLTEgaWYgRU9GLCBlbHNlIHBvc2l0aW9uIG9mIGZpcnN0IG5vbi13cyBjaGFyYWN0ZXIqL1xuXG4gICAgICAgIHZhciB3aGl0ZXNwYWNlID0gJyBcXG5cXHJcXHRcXGZcXHgwQlxceEEwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDBCXFx1MjAyOFxcdTIwMjlcXHUzMDAwJztcbiAgICAgICAgZm9yICh2YXIgaiA9IGkgPyBpIDogMDsgaiA8IHN0ci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChqKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiICAgIHNraXBzcGFjZSBqPSBcIitqICsgXCIgaT0gXCIgKyBpICsgXCIgbj0gXCIgKyBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiIHNraXBzcGFjZSBjaCA8XCIgKyBjaCArIFwiPlwiKTtcbiAgICAgICAgICAgIGlmICh3aGl0ZXNwYWNlLmluZGV4T2YoY2gpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vbm90IHdzXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgc2tpcHNwYWNlIDIgY2ggPFwiICsgY2ggKyBcIj5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaikgPT09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDs7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgICAgc2tpcHNwYWNlMiBqPSBcIitqICsgXCIgaT0gXCIgKyBpICsgXCIgbj0gXCIgKyBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBFT0ZcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGopID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3QgaGFzaCAtIHNvbWV0aGluZyBpbnRlcmVzdGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiBza2lwc3BhY2UgMyBjaCA8XCIgKyBjaCArIFwiPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXaGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgc2tpcHNwYWNlIDUgY2ggPFwiICsgY2ggKyBcIj5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaikgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gbmV4dCBqXG4gICAgICAgIHJldHVybiAtMTsgLy8gRU9GXG4gICAgfTtcblxuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudmFyaWFibGUgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgLypcbiAgICAgICAgP2FiYyAtPiB2YXJpYWJsZSg6YWJjKVxuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSkgIT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IGogKyAxO1xuICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgIGlmIChcIjAxMjM0NTY3ODktXCIuaW5kZXhPZihzdHIuY2hhckF0KGopKSA+PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIlZhcmlibGUgbmFtZSBjYW4ndCBzdGFydCB3aXRoICdcIiArIHN0ci5jaGFyQXQoaikgKyBcInMnXCIpO1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSAmJiBfbm90TmFtZUNoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChpKSkgPCAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRDb250ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiQ2FuJ3QgdXNlID94eHggc3ludGF4IGZvciB2YXJpYWJsZSBpbiBvdXRlcm1vc3QgbGV2ZWw6IFwiICsgcHlqc2xpYl9zbGljZShzdHIsIGogLSAxLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUudmFyaWFibGUocHlqc2xpYl9zbGljZShzdHIsIGosIGkpKSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5iYXJlV29yZCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBhYmMgLT4gOmFiY1xuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChqKTtcbiAgICAgICAgaWYgKFwiMDEyMzQ1Njc4OS1cIi5pbmRleE9mKGNoKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihjaCkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gajtcbiAgICAgICAgd2hpbGUgKGkgPCBweWpzbGliX2xlbihzdHIpICYmIF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihzdHIuY2hhckF0KGkpKSA8IDApIHtcbiAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2gocHlqc2xpYl9zbGljZShzdHIsIGosIGkpKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnFuYW1lID0gZnVuY3Rpb24gKHN0ciwgaSwgcmVzKSB7XG4gICAgICAgIC8qXG4gICAgICAgICB4eXo6ZGVmIC0+ICgneHl6JywgJ2RlZicpXG4gICAgICAgIElmIG5vdCBpbiBrZXl3b3JkcyBhbmQga2V5d29yZHNTZXQ6IGRlZiAtPiAoJycsICdkZWYnKVxuICAgICAgICA6ZGVmIC0+ICgnJywgJ2RlZicpXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChcIjAxMjM0NTY3ODktK1wiLmluZGV4T2YoYykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbm90TmFtZUNoYXJzLmluZGV4T2YoYykgPCAwKSB7XG4gICAgICAgICAgICB2YXIgbG4gPSBjO1xuICAgICAgICAgICAgdmFyIGkgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpZiAoX25vdE5hbWVDaGFycy5pbmRleE9mKGMpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG4gPSBsbiArIGM7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxuID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IHB5anNsaWJfbGVuKHN0cikgJiYgc3RyLmNoYXJBdChpKSA9PSBcIjpcIikge1xuICAgICAgICAgICAgdmFyIHBmeCA9IGxuO1xuICAgICAgICAgICAgdmFyIGkgPSBpICsgMTtcbiAgICAgICAgICAgIHZhciBsbiA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHB5anNsaWJfbGVuKHN0cikpIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihjKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbG4gKyBjO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtwZngsIGxuXSkpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobG4gJiYgdGhpcy5rZXl3b3Jkc1NldCAmJiBBcnJheUluZGV4T2YodGhpcy5rZXl3b3JkcywgbG4pIDwgMCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIlwiLCBsbl0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5vYmplY3QgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgdmFyIGogPSB0aGlzLnN1YmplY3Qoc3RyLCBpLCByZXMpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaSkgPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAzKSA9PSBcIlxcXCJcXFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbSA9IFwiXFxcIlxcXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGltID0gXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpID0gaSArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdGhpcy5zdHJjb25zdChzdHIsIGksIGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHBhaXJGdWRnZVswXTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHMpKTtcbiAgICAgICAgICAgICAgICBkaWFnX3Byb2dyZXNzKFwiTmV3IHN0cmluZyBjb25zdCBcIiwgcywgaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5ub2RlT3JMaXRlcmFsID0gZnVuY3Rpb24gKHN0ciwgaSwgcmVzKSB7XG4gICAgICAgIHZhciBqID0gdGhpcy5ub2RlKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoXCItKzA5ODc2NTQzMjFcIi5pbmRleE9mKGNoKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBkYXRldGltZV9zeW50YXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IGRhdGV0aW1lX3N5bnRheC5leGVjKHN0ci5zbGljZShpKSk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBqID0gICggaSArIGRhdGV0aW1lX3N5bnRheC5sYXN0SW5kZXggKSA7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBtWzBdO1xuICAgICAgICAgICAgICAgICAgICBqID0gaSArIHZhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5kZXhPZihcIlRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbCh2YWwsIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERBVEVUSU1FX0RBVEFUWVBFKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbCh2YWwsIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERBVEVfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXJfc3ludGF4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbnVtYmVyX3N5bnRheC5leGVjKHN0ci5zbGljZShpKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiQmFkIG51bWJlciBvciBkYXRlIHN5bnRheFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBqID0gaSArIG51bWJlcl9zeW50YXgubGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gcHlqc2xpYl9zbGljZShzdHIsIGksIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoXCJlXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLmxpdGVyYWwocGFyc2VGbG9hdCh2YWwpLCB1bmRlZmluZWQsIHRoaXMuX3N0b3JlLnN5bShGTE9BVF9EQVRBVFlQRSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaikuaW5kZXhPZihcIi5cIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbChwYXJzZUZsb2F0KHZhbCksIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERFQ0lNQUxfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHBhcnNlSW50KHZhbCksIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKElOVEVHRVJfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBqOyAvLyBXaGVyZSB3ZSBoYXZlIGdvdCB1cCB0b1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaSkgPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAzKSA9PSBcIlxcXCJcXFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbSA9IFwiXFxcIlxcXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGltID0gXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpID0gaSArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgZHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBwYWlyRnVkZ2UgPSB0aGlzLnN0cmNvbnN0KHN0ciwgaSwgZGVsaW0pO1xuICAgICAgICAgICAgICAgIHZhciBqID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgICAgIHZhciBzID0gcGFpckZ1ZGdlWzFdO1xuICAgICAgICAgICAgICAgIHZhciBsYW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIkBcIikge1xuICAgICAgICAgICAgICAgICAgICBsYW5nY29kZS5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbGFuZ2NvZGUuZXhlYyhzdHIuc2xpY2UoaiArIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcIkJhZCBsYW5ndWFnZSBjb2RlIHN5bnRheCBvbiBzdHJpbmcgbGl0ZXJhbCwgYWZ0ZXIgQFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGxhbmdjb2RlLmxhc3RJbmRleCArIGogKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gcHlqc2xpYl9zbGljZShzdHIsIGogKyAxLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyKSA9PSBcIl5eXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlczIgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiArIDIsIHJlczIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZHQgPSByZXMyWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHMsIGxhbmcsIGR0KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5zdHJjb25zdCA9IGZ1bmN0aW9uIChzdHIsIGksIGRlbGltKSB7XG4gICAgICAgIC8qXG4gICAgICAgIHBhcnNlIGFuIE4zIHN0cmluZyBjb25zdGFudCBkZWxpbWl0ZWQgYnkgZGVsaW0uXG4gICAgICAgIHJldHVybiBpbmRleCwgdmFsXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICB2YXIgdXN0ciA9IFwiXCI7XG4gICAgICAgIHZhciBzdGFydGxpbmUgPSB0aGlzLmxpbmVzO1xuICAgICAgICB3aGlsZSAoaiA8IHB5anNsaWJfbGVuKHN0cikpIHtcbiAgICAgICAgICAgIHZhciBpID0gaiArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaSkgPT0gZGVsaW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHB5anNsaWJfVHVwbGUoW2ksIHVzdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGopID09IFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludGVyZXN0aW5nLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICB2YXIgbSA9IGludGVyZXN0aW5nLmV4ZWMoc3RyLnNsaWNlKGopKTtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaiwgXCJDbG9zaW5nIHF1b3RlIG1pc3NpbmcgaW4gc3RyaW5nIGF0IF4gaW4gXCIgKyBweWpzbGliX3NsaWNlKHN0ciwgaiAtIDIwLCBqKSArIFwiXlwiICsgcHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSBqICsgaW50ZXJlc3RpbmcubGFzdEluZGV4IC0gMTtcbiAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBpKTtcbiAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoY2ggPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IGk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiXFxyXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIlxcblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGltID09IFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaSwgXCJuZXdsaW5lIGZvdW5kIGluIHN0cmluZyBsaXRlcmFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzID0gdGhpcy5saW5lcyArIDE7XG4gICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgY2g7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTGluZSA9IHRoaXMuc3RhcnRPZkxpbmU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydE9mTGluZSA9IGo7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiXFxcXFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgICAgIGlmICghY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcInVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCAoMilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrID0gc3RyaW5nX2ZpbmQoXCJhYmZydHZuXFxcXFxcXCJcIiwgY2gpO1xuICAgICAgICAgICAgICAgIGlmIChrID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVjaCA9IFwiXFxhXFxiXFxmXFxyXFx0XFx2XFxuXFxcXFxcXCJcIi5jaGFyQXQoayk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIHVjaDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwidVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWlyRnVkZ2UgPSB0aGlzLnVFc2NhcGUoc3RyLCBqICsgMSwgc3RhcnRsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBwYWlyRnVkZ2VbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgY2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIlVcIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdGhpcy5VRXNjYXBlKHN0ciwgaiArIDEsIHN0YXJ0bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBwYWlyRnVkZ2VbMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiYmFkIGVzY2FwZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWxcIik7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnVFc2NhcGUgPSBmdW5jdGlvbiAoc3RyLCBpLCBzdGFydGxpbmUpIHtcbiAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICB2YXIgdmFsdWUgPSAwO1xuICAgICAgICB3aGlsZSAoY291bnQgPCA0KSB7XG4gICAgICAgICAgICB2YXIgY2hGdWRnZSA9IHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSk7XG4gICAgICAgICAgICB2YXIgY2ggPSBjaEZ1ZGdlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgaiA9IGogKyAxO1xuICAgICAgICAgICAgaWYgKGNoID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgc3RhcnRsaW5lLCBzdHIsIGksIFwidW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsKDMpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGsgPSBzdHJpbmdfZmluZChcIjAxMjM0NTY3ODlhYmNkZWZcIiwgY2gpO1xuICAgICAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcImJhZCBzdHJpbmcgbGl0ZXJhbCBoZXggZXNjYXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWUgKiAxNiArIGs7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IHB5anNsaWJfVHVwbGUoW2osIHVjaF0pO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5VRXNjYXBlID0gZnVuY3Rpb24gKHN0ciwgaSwgc3RhcnRsaW5lKSB7XG4gICAgICAgIHZhciBqID0gaTtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgdmFyIHZhbHVlID0gJ1xcXFxVJztcbiAgICAgICAgd2hpbGUgKGNvdW50IDwgOCkge1xuICAgICAgICAgICAgdmFyIGNoRnVkZ2UgPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgdmFyIGNoID0gY2hGdWRnZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgIGlmIChjaCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcInVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCgzKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBrID0gc3RyaW5nX2ZpbmQoXCIwMTIzNDU2Nzg5YWJjZGVmXCIsIGNoKTtcbiAgICAgICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaSwgXCJiYWQgc3RyaW5nIGxpdGVyYWwgaGV4IGVzY2FwZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlICsgY2g7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVjaCA9IHN0cmluZ0Zyb21DaGFyQ29kZShcIjB4XCIgKyBweWpzbGliX3NsaWNlKHZhbHVlLCAyLCAxMCkgLSAwKTtcbiAgICAgICAgcmV0dXJuIG5ldyBweWpzbGliX1R1cGxlKFtqLCB1Y2hdKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIE9MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX09MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfX09MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgdGhpcy5fc3RyID0gc3RyLmVuY29kZShcInV0Zi04XCIpO1xuICAgICAgICB0aGlzLl9zdHIgPSBzdHI7XG4gICAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgICB0aGlzLl93aHkgPSB3aHk7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgIH1cbiAgICBfX09MRF9CYWRTeW50YXgucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5fc3RyO1xuICAgICAgICB2YXIgaSA9IHRoaXMuX2k7XG4gICAgICAgIHZhciBzdCA9IDA7XG4gICAgICAgIGlmIChpID4gNjApIHtcbiAgICAgICAgICAgIHZhciBwcmUgPSBcIi4uLlwiO1xuICAgICAgICAgICAgdmFyIHN0ID0gaSAtIDYwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfbGVuKHN0cikgLSBpID4gNjApIHtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gXCIuLi5cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJMaW5lICVpIG9mIDwlcz46IEJhZCBzeW50YXggKCVzKSBhdCBeIGluOlxcblxcXCIlcyVzXiVzJXNcXFwiXCIgJSBuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5saW5lcyArIDEsIHRoaXMuX3VyaSwgdGhpcy5fd2h5LCBwcmUsIHB5anNsaWJfc2xpY2Uoc3RyLCBzdCwgaSksIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgNjApLCBwb3N0XSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBCYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIFwiTGluZSBcIiArIChsaW5lcyArIDEpICsgXCIgb2YgPFwiICsgdXJpICsgXCI+OiBCYWQgc3ludGF4OiBcIiArIHdoeSArIFwiXFxuYXQ6IFxcXCJcIiArIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMzApICsgXCJcXFwiXCI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaXBDUihzdHIpIHtcbiAgICAgICAgdmFyIHJlcyA9IFwiXCI7XG5cbiAgICAgICAgdmFyIF9fY2ggPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihzdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSBfX2NoLm5leHQoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjaCAhPSBcIlxcclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSByZXMgKyBjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkdW1teVdyaXRlKHgpIHt9XG5cbiAgICByZXR1cm4gU2lua1BhcnNlcjtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOM1BhcnNlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG4vKipcbiAqIEBjbGFzcyBOYW1lZE5vZGVcbiAqIEBleHRlbmRzIE5vZGVcbiAqL1xuXG52YXIgTmFtZWROb2RlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhOYW1lZE5vZGUsIF9Ob2RlKTtcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpcmkge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIE5hbWVkTm9kZShpcmkpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmFtZWROb2RlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChOYW1lZE5vZGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihOYW1lZE5vZGUpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gTmFtZWROb2RlLnRlcm1UeXBlO1xuICAgIGlmICghaXJpLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZWROb2RlIElSSSBcIicgKyBpcmkgKyAnXCIgbXVzdCBiZSBhYnNvbHV0ZS4nKTtcbiAgICB9XG4gICAgaWYgKGlyaS5pbmNsdWRlcygnICcpKSB7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdFcnJvcjogTmFtZWROb2RlIElSSSBcIicgKyBpcmkgKyAnXCIgbXVzdCBub3QgY29udGFpbiB1bmVuY29kZWQgc3BhY2VzLic7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIF90aGlzLnZhbHVlID0gaXJpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiAkcmRmIG5vZGUgZm9yIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeSwgZW5kaW5nIGluIHNsYXNoLlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhOYW1lZE5vZGUsIFt7XG4gICAga2V5OiAnZGlyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlyKCkge1xuICAgICAgdmFyIHN0ciA9IHRoaXMudXJpLnNwbGl0KCcjJylbMF07XG4gICAgICB2YXIgcCA9IHN0ci5zbGljZSgwLCAtMSkubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIHZhciBxID0gc3RyLmluZGV4T2YoJy8vJyk7XG4gICAgICBpZiAocSA+PSAwICYmIHAgPCBxICsgMiB8fCBwIDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gbmV3IE5hbWVkTm9kZShzdHIuc2xpY2UoMCwgcCArIDEpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBOTiBmb3IgdGhlIHdob2xlIHdlYiBzaXRlLCBlbmRpbmcgaW4gc2xhc2guXG4gICAgICogQ29udHJhc3Qgd2l0aCB0aGUgXCJvcmlnaW5cIiB3aGljaCBkb2VzIE5PVCBoYXZlIGEgdHJhaWxpbmcgc2xhc2hcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2l0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpdGUoKSB7XG4gICAgICB2YXIgc3RyID0gdGhpcy51cmkuc3BsaXQoJyMnKVswXTtcbiAgICAgIHZhciBwID0gc3RyLmluZGV4T2YoJy8vJyk7XG4gICAgICBpZiAocCA8IDApIHRocm93IG5ldyBFcnJvcignVGhpcyBVUkkgZG9lcyBub3QgaGF2ZSBhIHdlYiBzaXRlIHBhcnQgKG9yaWdpbiknKTtcbiAgICAgIHZhciBxID0gc3RyLmluZGV4T2YoJy8nLCBwICsgMik7XG4gICAgICBpZiAocSA8IDApIHRocm93IG5ldyBFcnJvcignVGhpcyBVUkkgZG9lcyBub3QgaGF2ZSBhIHdlYiBzaXRlIHBhcnQuIChvcmlnaW4pJyk7XG4gICAgICByZXR1cm4gbmV3IE5hbWVkTm9kZShzdHIuc2xpY2UoMCwgcSArIDEpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkb2MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb2MoKSB7XG4gICAgICBpZiAodGhpcy51cmkuaW5kZXhPZignIycpIDwgMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHRoaXMudXJpLnNwbGl0KCcjJylbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJzwnICsgdGhpcy51cmkgKyAnPic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVnYWN5IGdldHRlciBhbmQgc2V0dGVyIGFsaWFzLCBub2RlLnVyaVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1cmknLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh1cmkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB1cmk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdmcm9tVmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc05vZGUgPSB2YWx1ZSAmJiB2YWx1ZS50ZXJtVHlwZTtcbiAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBOYW1lZE5vZGUodmFsdWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOYW1lZE5vZGU7XG59KE5vZGUpO1xuXG5OYW1lZE5vZGUudGVybVR5cGUgPSAnTmFtZWROb2RlJztcbk5hbWVkTm9kZS5wcm90b3R5cGUuY2xhc3NPcmRlciA9IENsYXNzT3JkZXJbJ05hbWVkTm9kZSddO1xuTmFtZWROb2RlLnByb3RvdHlwZS5pc1ZhciA9IDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTmFtZWROb2RlOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuXG5mdW5jdGlvbiBOYW1lc3BhY2UobnN1cmkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChsbikge1xuICAgIHJldHVybiBuZXcgTmFtZWROb2RlKG5zdXJpICsgKGxuIHx8ICcnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTmFtZXNwYWNlOyIsIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogVGhlIHN1cGVyY2xhc3Mgb2YgYWxsIFJERiBTdGF0ZW1lbnQgb2JqZWN0cywgdGhhdCBpc1xuICogTmFtZWROb2RlLCBMaXRlcmFsLCBCbGFua05vZGUsIGV0Yy5cbiAqIEBjbGFzcyBOb2RlXG4gKi9cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGUsIFt7XG4gICAga2V5OiAnc3Vic3RpdHV0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YnN0aXR1dGUoYmluZGluZ3MpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdAQEAgbm9kZSBzdWJzdGl0dXRlJyArIHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcGFyZVRlcm0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wYXJlVGVybShvdGhlcikge1xuICAgICAgaWYgKHRoaXMuY2xhc3NPcmRlciA8IG90aGVyLmNsYXNzT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2xhc3NPcmRlciA+IG90aGVyLmNsYXNzT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuICsxO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFsdWUgPCBvdGhlci52YWx1ZSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YWx1ZSA+IG90aGVyLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiArMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50ZXJtVHlwZSA9PT0gb3RoZXIudGVybVR5cGUgJiYgdGhpcy52YWx1ZSA9PT0gb3RoZXIudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzaFN0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc2hTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0Nhbm9uaWNhbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NhbWVUZXJtJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZVRlcm0ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmVxdWFscyhvdGhlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTlQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OVCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZS50b1N0cmluZygpIGlzIGFic3RyYWN0IC0gc2VlIHRoZSBzdWJjbGFzc2VzIGluc3RlYWQnKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZTtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gUkRGIE5vZGUgZnJvbSBhIG5hdGl2ZSBqYXZhc2NyaXB0IHZhbHVlLlxuICogUkRGIE5vZGVzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQsIHVuZGVmaW5lZCByZXR1cm5lZCBhcyBpdHNlbGYuXG4gKiBAbWV0aG9kIGZyb21WYWx1ZVxuICogQHN0YXRpY1xuICogQHBhcmFtIHZhbHVlIHtOb2RlfERhdGV8U3RyaW5nfE51bWJlcnxCb29sZWFufFVuZGVmaW5lZH1cbiAqIEByZXR1cm4ge05vZGV8Q29sbGVjdGlvbn1cbiAqL1xuTm9kZS5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSByZXF1aXJlKCcuL2NvbGxlY3Rpb24nKTtcbiAgdmFyIExpdGVyYWwgPSByZXF1aXJlKCcuL2xpdGVyYWwnKTtcbiAgdmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNOb2RlID0gdmFsdWUgJiYgdmFsdWUudGVybVR5cGU7XG4gIGlmIChpc05vZGUpIHtcbiAgICAvLyBhIE5vZGUgc3ViY2xhc3Mgb3IgYSBDb2xsZWN0aW9uXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIExpdGVyYWwuZnJvbVZhbHVlKHZhbHVlKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIganNvbmxkID0gcmVxdWlyZSgnanNvbmxkJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIE4zID0gcmVxdWlyZSgnbjMnKTsgLy8gQEAgR29hbDogcmVtb3ZlIHRoaXMgZGVwZW5kZW5jeVxudmFyIE4zUGFyc2VyID0gcmVxdWlyZSgnLi9uM3BhcnNlcicpO1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIHBhcnNlUkRGYURPTSA9IHJlcXVpcmUoJy4vcmRmYXBhcnNlcicpLnBhcnNlUkRGYURPTTtcbnZhciBSREZQYXJzZXIgPSByZXF1aXJlKCcuL3JkZnhtbHBhcnNlcicpO1xudmFyIHNwYXJxbFVwZGF0ZVBhcnNlciA9IHJlcXVpcmUoJy4vcGF0Y2gtcGFyc2VyJyk7XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHRoZSBncmFwaCBrYi5cbiAqIE5vcm1hbCBtZXRob2QgaXMgc3luYy5cbiAqIFVuZm9ydHVuYXRlbHkganNkb25sZCBpcyBjdXJyZW50bHkgd3JpdHRlbiB0byBuZWVkIHRvIGJlIGNhbGxlZCBhc3luYy5cbiAqIEhlbmNlIHRoZSBtZXNzIGJlbG93IHdpdGggZXhlY3V0ZUNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBwYXJzZShzdHIsIGtiLCBiYXNlLCBjb250ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZSB8fCAndGV4dC90dXJ0bGUnO1xuICB0cnkge1xuICAgIGlmIChjb250ZW50VHlwZSA9PT0gJ3RleHQvbjMnIHx8IGNvbnRlbnRUeXBlID09PSAndGV4dC90dXJ0bGUnKSB7XG4gICAgICB2YXIgcCA9IE4zUGFyc2VyKGtiLCBrYiwgYmFzZSwgYmFzZSwgbnVsbCwgbnVsbCwgJycsIG51bGwpO1xuICAgICAgcC5sb2FkQnVmKHN0cik7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcmRmK3htbCcpIHtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUkRGUGFyc2VyKGtiKTtcbiAgICAgIHBhcnNlci5wYXJzZShVdGlsLnBhcnNlWE1MKHN0ciksIGJhc2UsIGtiLnN5bShiYXNlKSk7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJykge1xuICAgICAgcGFyc2VSREZhRE9NKFV0aWwucGFyc2VYTUwoc3RyLCB7IGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veGh0bWwreG1sJyB9KSwga2IsIGJhc2UpO1xuICAgICAgZXhlY3V0ZUNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PT0gJ3RleHQvaHRtbCcpIHtcbiAgICAgIHBhcnNlUkRGYURPTShVdGlsLnBhcnNlWE1MKHN0ciwgeyBjb250ZW50VHlwZTogJ3RleHQvaHRtbCcgfSksIGtiLCBiYXNlKTtcbiAgICAgIGV4ZWN1dGVDYWxsYmFjaygpO1xuICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9zcGFycWwtdXBkYXRlJykge1xuICAgICAgLy8gQEAgd2UgaGFuZGxlIGEgc3Vic2V0XG4gICAgICBzcGFycWxVcGRhdGVQYXJzZXIoc3RyLCBrYiwgYmFzZSk7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vbGQranNvbicgfHwgY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9ucXVhZHMnIHx8IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vbi1xdWFkcycpIHtcbiAgICAgIHZhciBuM1BhcnNlciA9IE4zLlBhcnNlcigpO1xuICAgICAgdmFyIHRyaXBsZXMgPSBbXTtcbiAgICAgIGlmIChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nKSB7XG4gICAgICAgIHZhciBqc29uRG9jdW1lbnQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAganNvbkRvY3VtZW50ID0gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICB9IGNhdGNoIChwYXJzZUVycikge1xuICAgICAgICAgIGNhbGxiYWNrKHBhcnNlRXJyLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBqc29ubGQudG9SREYoanNvbkRvY3VtZW50LCB7IGZvcm1hdDogJ2FwcGxpY2F0aW9uL25xdWFkcycgfSwgbnF1YWRDYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBucXVhZENhbGxiYWNrKG51bGwsIHN0cik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvbid0IGtub3cgaG93IHRvIHBhcnNlIFwiICsgY29udGVudFR5cGUgKyAnIHlldCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGV4ZWN1dGVFcnJvckNhbGxiYWNrKGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhlY3V0ZUNhbGxiYWNrKCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sobnVsbCwga2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXhlY3V0ZUVycm9yQ2FsbGJhY2soZSkge1xuICAgIGlmIChjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nIHx8IGNvbnRlbnRUeXBlICE9PSAnYXBwbGljYXRpb24vbnF1YWRzJyB8fCBjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL24tcXVhZHMnKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soZSwga2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciB0cnlpbmcgdG8gcGFyc2UgPCcgKyBiYXNlICsgJz4gYXMgJyArIGNvbnRlbnRUeXBlICsgJzpcXG4nICsgZSArICc6XFxuJyArIGUuc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKlxuICAgIGZ1bmN0aW9uIHNldEpzb25MZEJhc2UgKGRvYywgYmFzZSkge1xuICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKCEoJ0Bjb250ZXh0JyBpbiBkb2MpKSB7XG4gICAgICAgIGRvY1snQGNvbnRleHQnXSA9IHt9XG4gICAgICB9XG4gICAgICBkb2NbJ0Bjb250ZXh0J11bJ0BiYXNlJ10gPSBiYXNlXG4gICAgfVxuICAqL1xuICBmdW5jdGlvbiBucXVhZENhbGxiYWNrKGVyciwgbnF1YWRzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBrYik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBuM1BhcnNlci5wYXJzZShucXVhZHMsIHRyaXBsZUNhbGxiYWNrKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwga2IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaXBsZUNhbGxiYWNrKGVyciwgdHJpcGxlLCBwcmVmaXhlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwga2IpO1xuICAgIH1cbiAgICBpZiAodHJpcGxlKSB7XG4gICAgICB0cmlwbGVzLnB1c2godHJpcGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlwbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZFRyaXBsZShrYiwgdHJpcGxlc1tpXSk7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCBrYik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkVHJpcGxlKGtiLCB0cmlwbGUpIHtcbiAgICB2YXIgc3ViamVjdCA9IGNyZWF0ZVRlcm0odHJpcGxlLnN1YmplY3QpO1xuICAgIHZhciBwcmVkaWNhdGUgPSBjcmVhdGVUZXJtKHRyaXBsZS5wcmVkaWNhdGUpO1xuICAgIHZhciBvYmplY3QgPSBjcmVhdGVUZXJtKHRyaXBsZS5vYmplY3QpO1xuICAgIHZhciB3aHkgPSBudWxsO1xuICAgIGlmICh0cmlwbGUuZ3JhcGgpIHtcbiAgICAgIHdoeSA9IGNyZWF0ZVRlcm0odHJpcGxlLmdyYXBoKTtcbiAgICB9XG4gICAga2IuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVGVybSh0ZXJtU3RyaW5nKSB7XG4gICAgdmFyIHZhbHVlO1xuICAgIGlmIChOMy5VdGlsLmlzTGl0ZXJhbCh0ZXJtU3RyaW5nKSkge1xuICAgICAgdmFsdWUgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZSh0ZXJtU3RyaW5nKTtcbiAgICAgIHZhciBsYW5ndWFnZSA9IE4zLlV0aWwuZ2V0TGl0ZXJhbExhbmd1YWdlKHRlcm1TdHJpbmcpO1xuICAgICAgdmFyIGRhdGF0eXBlID0gbmV3IE5hbWVkTm9kZShOMy5VdGlsLmdldExpdGVyYWxUeXBlKHRlcm1TdHJpbmcpKTtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSwgbGFuZ3VhZ2UsIGRhdGF0eXBlKTtcbiAgICB9IGVsc2UgaWYgKE4zLlV0aWwuaXNJUkkodGVybVN0cmluZykpIHtcbiAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHRlcm1TdHJpbmcpO1xuICAgIH0gZWxzZSBpZiAoTjMuVXRpbC5pc0JsYW5rKHRlcm1TdHJpbmcpKSB7XG4gICAgICB2YWx1ZSA9IHRlcm1TdHJpbmcuc3Vic3RyaW5nKDIsIHRlcm1TdHJpbmcubGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgQmxhbmtOb2RlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBQYXJzZSBhIHNpbXBsZSBTUEFSTC1VcGRhdGUgc3Vic2V0IHN5bnRheCBmb3IgcGF0Y2hlcy5cbi8vXG4vLyAgVGhpcyBwYXJzZXNcbi8vICAgV0hFUkUge3h4eH0gREVMRVRFIHt5eXl9IElOU0VSVCBEQVRBIHt6enp9XG4vLyAobm90IG5lY2Vzc2FyaWx5IGluIHRoYXQgb3JkZXIpXG4vLyBhcyB0aG91Z2ggaXQgd2VyZSB0aGUgbjNcbi8vICAgPCNxdWVyeT4gcGF0Y2g6d2hlcmUge3h4eH07IHBhdGNoOmRlbGV0ZSB7eXl5fTsgcGF0Y2g6aW5zZXJ0IHt6enp9LlxubW9kdWxlLmV4cG9ydHMgPSBzcGFycWxVcGRhdGVQYXJzZXI7XG5cbnZhciBOM1BhcnNlciA9IHJlcXVpcmUoJy4vbjNwYXJzZXInKTtcbnZhciBOYW1lc3BhY2UgPSByZXF1aXJlKCcuL25hbWVzcGFjZScpO1xuXG5mdW5jdGlvbiBzcGFycWxVcGRhdGVQYXJzZXIoc3RyLCBrYiwgYmFzZSkge1xuICB2YXIgaSwgaiwgaztcbiAgdmFyIGtleXdvcmRzID0gWydJTlNFUlQnLCAnREVMRVRFJywgJ1dIRVJFJ107XG4gIHZhciBTUU5TID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy9ucy9waW0vcGF0Y2gjJyk7XG4gIHZhciBwID0gTjNQYXJzZXIoa2IsIGtiLCBiYXNlLCBiYXNlLCBudWxsLCBudWxsLCAnJywgbnVsbCk7XG4gIHZhciBjbGF1c2VzID0ge307XG5cbiAgdmFyIGJhZFN5bnRheCA9IGZ1bmN0aW9uIGJhZFN5bnRheCh1cmksIGxpbmVzLCBzdHIsIGksIHdoeSkge1xuICAgIHJldHVybiAnTGluZSAnICsgKGxpbmVzICsgMSkgKyAnIG9mIDwnICsgdXJpICsgJz46IEJhZCBzeW50YXg6XFxuICAgJyArIHdoeSArICdcXG4gICBhdDogXCInICsgc3RyLnNsaWNlKGksIGkgKyAzMCkgKyAnXCInO1xuICB9O1xuXG4gIC8vIHZhciBjaGVjayA9IGZ1bmN0aW9uIChuZXh0LCBsYXN0LCBtZXNzYWdlKSB7XG4gIC8vICAgaWYgKG5leHQgPCAwKSB7XG4gIC8vICAgICB0aHJvdyBiYWRTeW50YXgocC5fdGhpc0RvYywgcC5saW5lcywgc3RyLCBqLCBsYXN0LCBtZXNzYWdlKVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gbmV4dFxuICAvLyB9XG4gIGkgPSAwO1xuICB2YXIgcXVlcnkgPSBrYi5zeW0oYmFzZSArICcjcXVlcnknKTsgLy8gSW52ZW50IGEgVVJJIGZvciB0aGUgcXVlcnlcbiAgY2xhdXNlc1sncXVlcnknXSA9IHF1ZXJ5OyAvLyBBIHdheSBvZiBhY2Nlc3NpbmcgaXQgaW4gaXRzIE4zIG1vZGVsLlxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJBIE5vdyBhdCBpID0gXCIgKyBpKVxuICAgIGogPSBwLnNraXBTcGFjZShzdHIsIGkpO1xuICAgIGlmIChqIDwgMCkge1xuICAgICAgcmV0dXJuIGNsYXVzZXM7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQiBBZnRlciBzcGFjZSBhdCBqPSBcIiArIGopXG4gICAgaWYgKHN0cltqXSA9PT0gJzsnKSB7XG4gICAgICBpID0gcC5za2lwU3BhY2Uoc3RyLCBqICsgMSk7XG4gICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGNsYXVzZXM7IC8vIEFsbG93IGVuZCBpbiBhXG4gICAgICB9XG4gICAgICBqID0gaTtcbiAgICB9XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChrID0gMDsgayA8IGtleXdvcmRzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5d29yZHNba107XG4gICAgICBpZiAoc3RyLnNsaWNlKGosIGogKyBrZXkubGVuZ3RoKSA9PT0ga2V5KSB7XG4gICAgICAgIGkgPSBwLnNraXBTcGFjZShzdHIsIGogKyBrZXkubGVuZ3RoKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgYmFkU3ludGF4KHAuX3RoaXNEb2MsIHAubGluZXMsIHN0ciwgaiArIGtleS5sZW5ndGgsICdmb3VuZCBFT0YsIG5lZWRlZCB7Li4ufSBhZnRlciAnICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGtleSA9PT0gJ0lOU0VSVCcgfHwga2V5ID09PSAnREVMRVRFJykgJiYgc3RyLnNsaWNlKGksIGkgKyA0KSA9PT0gJ0RBVEEnKSB7XG4gICAgICAgICAgLy8gU29tZSB3YW50ZWQgJ0RBVEEnLiBXaGF0ZXZlclxuICAgICAgICAgIGogPSBwLnNraXBTcGFjZShzdHIsIGkgKyA0KTtcbiAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IGJhZFN5bnRheChwLl90aGlzRG9jLCBwLmxpbmVzLCBzdHIsIGkgKyA0LCAnbmVlZGVkIHsuLi59IGFmdGVyIElOU0VSVCBEQVRBICcgKyBrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpID0gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzMiA9IFtdO1xuICAgICAgICBqID0gcC5ub2RlKHN0ciwgaSwgcmVzMik7IC8vIFBhcnNlIGFsbCB0aGUgY29tcGxleGl0eSBvZiB0aGUgY2xhdXNlXG5cbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgdGhyb3cgYmFkU3ludGF4KHAuX3RoaXNEb2MsIHAubGluZXMsIHN0ciwgaSwgJ2JhZCBzeW50YXggb3IgRU9GIGluIHsuLi59IGFmdGVyICcgKyBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXVzZXNba2V5LnRvTG93ZXJDYXNlKCldID0gcmVzMlswXTtcbiAgICAgICAga2IuYWRkKHF1ZXJ5LCBTUU5TKGtleS50b0xvd2VyQ2FzZSgpKSwgcmVzMlswXSk7IC8vICwga2Iuc3ltKGJhc2UpXG4gICAgICAgIC8vIGtleSBpcyB0aGUga2V5d29yZCBhbmQgcmVzMiBoYXMgdGhlIGNvbnRlbnRzXG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgaSA9IGo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQgJiYgc3RyLnNsaWNlKGosIGogKyA3KSA9PT0gJ0BwcmVmaXgnKSB7XG4gICAgICBpID0gcC5kaXJlY3RpdmUoc3RyLCBqKTtcbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICB0aHJvdyBiYWRTeW50YXgocC5fdGhpc0RvYywgcC5saW5lcywgc3RyLCBpLCAnYmFkIHN5bnRheCBvciBFT0YgYWZ0ZXIgQHByZWZpeCAnKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiUCBiZWZvcmUgZG90IGk9IFwiICsgaSlcbiAgICAgIGkgPSBwLmNoZWNrRG90KHN0ciwgaSk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlEgYWZ0ZXIgZG90IGk9IFwiICsgaSlcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJCYWQgc3ludGF4IFwiICsgailcbiAgICAgIHRocm93IGJhZFN5bnRheChwLl90aGlzRG9jLCBwLmxpbmVzLCBzdHIsIGosIFwiVW5rbm93biBzeW50YXggYXQgc3RhcnQgb2Ygc3RhdGVtZW10OiAnXCIgKyBzdHIuc2xpY2Uoaikuc2xpY2UoMCwgMjApICsgXCInXCIpO1xuICAgIH1cbiAgfSAvLyB3aGlsZVxuICAvLyByZXR1cm4gY2xhdXNlc1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG5cbmZ1bmN0aW9uIHF1ZXJ5VG9TUEFSUUwocXVlcnkpIHtcbiAgdmFyIGluZGVudCA9IDA7XG4gIGZ1bmN0aW9uIGdldFNlbGVjdChxdWVyeSkge1xuICAgIHZhciBzdHIgPSBhZGRJbmRlbnQoKSArICdTRUxFQ1QgJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXJ5LnZhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0ciArPSBxdWVyeS52YXJzW2ldICsgJyAnO1xuICAgIH1cbiAgICBzdHIgKz0gJ1xcbic7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhdHRlcm4ocGF0KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHZhciBzdCA9IHBhdC5zdGF0ZW1lbnRzO1xuICAgIGZvciAodmFyIHggaW4gc3QpIHtcbiAgICAgIGxvZy5kZWJ1ZygnRm91bmQgc3RhdGVtZW50OiAnICsgc3QpO1xuICAgICAgc3RyICs9IGFkZEluZGVudCgpICsgc3RbeF0gKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENvbnN0cmFpbnRzKHBhdCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciB2IGluIHBhdC5jb25zdHJhaW50cykge1xuICAgICAgdmFyIGZvbyA9IHBhdC5jb25zdHJhaW50c1t2XTtcbiAgICAgIHN0ciArPSBhZGRJbmRlbnQoKSArICdGSUxURVIgKCAnICsgZm9vLmRlc2NyaWJlKHYpICsgJyApICcgKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE9wdGlvbmFscyhwYXQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBwYXQub3B0aW9uYWwubGVuZ3RoOyB4KyspIHtcbiAgICAgIC8vIGFsZXJ0KHBhdC5vcHRpb25hbC50ZXJtVHlwZSlcbiAgICAgIGxvZy5kZWJ1ZygnRm91bmQgb3B0aW9uYWwgcXVlcnknKTtcbiAgICAgIHN0ciArPSBhZGRJbmRlbnQoKSArICdPUFRJT05BTCB7ICcgKyAnXFxuJztcbiAgICAgIGluZGVudCsrO1xuICAgICAgc3RyICs9IGdldFBhdHRlcm4ocGF0Lm9wdGlvbmFsW3hdKTtcbiAgICAgIHN0ciArPSBnZXRDb25zdHJhaW50cyhwYXQub3B0aW9uYWxbeF0pO1xuICAgICAgc3RyICs9IGdldE9wdGlvbmFscyhwYXQub3B0aW9uYWxbeF0pO1xuICAgICAgaW5kZW50LS07XG4gICAgICBzdHIgKz0gYWRkSW5kZW50KCkgKyAnfScgKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdoZXJlKHBhdCkge1xuICAgIHZhciBzdHIgPSBhZGRJbmRlbnQoKSArICdXSEVSRSBcXG4nICsgJ3sgXFxuJztcbiAgICBpbmRlbnQrKztcbiAgICBzdHIgKz0gZ2V0UGF0dGVybihwYXQpO1xuICAgIHN0ciArPSBnZXRDb25zdHJhaW50cyhwYXQpO1xuICAgIHN0ciArPSBnZXRPcHRpb25hbHMocGF0KTtcbiAgICBpbmRlbnQtLTtcbiAgICBzdHIgKz0gJ30nO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRJbmRlbnQoKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHtcbiAgICAgIHN0ciArPSAnICAgICc7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTUEFSUUwocXVlcnkpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0KHF1ZXJ5KSArIGdldFdoZXJlKHF1ZXJ5LnBhdCk7XG4gIH1cblxuICByZXR1cm4gZ2V0U1BBUlFMKHF1ZXJ5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWVyeVRvU1BBUlFMOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbmRleGVkRm9ybXVsYSA9IHJlcXVpcmUoJy4vaW5kZXhlZC1mb3JtdWxhJyk7XG5cbnZhciBfaW5kZXhlZEZvcm11bGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5kZXhlZEZvcm11bGEpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfSAvLyBNYXRjaGluZyBhIGZvcm11bGEgYWdhaW5zdCBhbm90aGVyIGZvcm11bGFcbi8vIEFzc3luYyBhcyB3ZWxsIGFzIFN5bmNocm9ub3VzbHlcbi8vXG4vLyBXM0Mgb3BlbiBzb3VyY2UgbGljZW5jZSAyMDA1LlxuLy9cbi8vIFRoaXMgYnVpbGRzIG9uIHRlcm0uanMsIG1hdGNoLmpzIChhbmQgaWRlbnRpdHkuanM/KVxuLy8gdG8gYWxsb3cgYSBxdWVyeSBvZiBhIGZvcm11bGEuXG4vL1xuLy8gSGVyZSB3ZSBpbnRyb2R1Y2UgZm9yIHRoZSBmaXJzdCB0aW1lIGEgc3ViY2xhc3Mgb2YgdGVybTogdmFyaWFibGUuXG4vL1xuLy8gU1ZOIElEOiAkSWQ6IHF1ZXJ5LmpzIDI1MTE2IDIwMDgtMTEtMTUgMTY6MTM6NDhaIHRpbWJsICRcblxuLy8gIFZhcmlhYmxlXG4vL1xuLy8gQ29tcGFyZSB3aXRoIEJsYW5rTm9kZS4gIFRoZXkgYXJlIHNpbWlsYXIsIGJ1dCBhIHZhcmlhYmxlXG4vLyBzdGFuZHMgZm9yIHNvbWV0aGluZyB3aG9zZSB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC5cbi8vIEFsc28sIHVzZXJzIG5hbWUgdmFyaWFibGVzIGFuZCB3YW50IHRoZSBzYW1lIG5hbWUgYmFjayB3aGVuIHN0dWZmIGlzIHByaW50ZWRcbi8qIGpzbDpvcHRpb24gZXhwbGljaXQqLyAvLyBUdXJuIG9uIEphdmFTY3JpcHRMaW50IHZhcmlhYmxlIGRlY2xhcmF0aW9uIGNoZWNraW5nXG5cbnZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpO1xudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG5cbi8qKlxuICogUXVlcnkgY2xhc3MsIGZvciB0cmFja2luZyBxdWVyaWVzIHRoZSB1c2VyIGhhcyBpbiB0aGUgVUkuXG4gKi9cblxudmFyIFF1ZXJ5ID0gZnVuY3Rpb24gUXVlcnkobmFtZSwgaWQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFF1ZXJ5KTtcblxuICB0aGlzLnBhdCA9IG5ldyBfaW5kZXhlZEZvcm11bGEyLmRlZmF1bHQoKTsgLy8gVGhlIHBhdHRlcm4gdG8gc2VhcmNoIGZvclxuICB0aGlzLnZhcnMgPSBbXTsgLy8gVXNlZCBieSBVSSBjb2RlIGJ1dCBub3QgaW4gcXVlcnkuanNcbiAgLy8gICAgdGhpcy5vcmRlckJ5ID0gW10gLy8gTm90IHVzZWQgeWV0XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuaWQgPSBpZDtcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIG1hdGNoIGEgcGF0dGVybiB0byB0aGUgY3VycmVudCBrYlxuICpcbiAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBtYXRjaCBpcyBmb3VuZFxuICogV2hlbiBmZXRjaGVyIGlzIHN1cHBsaWVkIHRoaXMgd2lsbCBiZSBjYWxsZWQgdG8gc2F0aXNmeSBhbnkgcmVzb3VyY2UgcmVxdWVzdHNcbiAqIGN1cnJlbnRseSBub3QgaW4gdGhlIGtiLiBUaGUgZmV0Y2hlciBmdW5jdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkIG1hbnVhbHkgYW5kXG4gKiBzaG91bGQgY2FsbCAkcmRmLlV0aWwuQUpBUl9oYW5kbGVOZXdUZXJtIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS5cbiAqXG4gKiBAcGFyYW1cdG15UXVlcnksXHRhIGtub3dsZWRnZWJhc2UgY29udGFpbmluZyBhIHBhdHRlcm4gdG8gdXNlIGFzIHF1ZXJ5XG4gKiBAcGFyYW1cdGNhbGxiYWNrLCBcdHdoZW5ldmVyIHRoZSBwYXR0ZXJuIGluIG15UXVlcnkgaXMgbWV0IHRoaXMgaXMgY2FsbGVkIHdpdGhcbiAqIFx0XHRcdFx0XHRcdHRoZSBuZXcgYmluZGluZ3MgYXMgcGFyYW1ldGVyXG4gKiBAcGFyYW1cdGZldGNoZXIsXHR3aGVuZXZlciBhIHJlc291cmNlIG5lZWRzIHRvIGJlIGxvYWRlZCB0aGlzIGdldHMgY2FsbGVkICBJR05PUkVEIE9CU09MRVRFXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZmV0ZWNoZXIgaXMgdXNlZCBhcyBhIEZldGNoZXIgaW5zdGFuY2UgdG8gZG8gdGhpcy5cbiAqIEBwYXJhbSAgICAgICBvbkRvbmUgICAgICAgICAgY2FsbGJhY2sgd2hlblxuICovXG5cblxuZnVuY3Rpb24gaW5kZXhlZEZvcm11bGFRdWVyeShteVF1ZXJ5LCBjYWxsYmFjaywgZmV0Y2hlciwgb25Eb25lKSB7XG4gIC8vIHZhciBrYiA9IHRoaXNcbiAgLy8gLy8vLy8vLy8vLy8gRGVidWcgc3RyaW5nc1xuICB2YXIgYmluZGluZ0RlYnVnID0gZnVuY3Rpb24gYmluZGluZ0RlYnVnKGIpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHY7XG4gICAgZm9yICh2IGluIGIpIHtcbiAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgIHN0ciArPSAnICAgICcgKyB2ICsgJyAtPiAnICsgYlt2XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICB2YXIgYmluZGluZ3NEZWJ1ZyA9IGZ1bmN0aW9uIGJpbmRpbmdzRGVidWcobmJzKSB7XG4gICAgdmFyIHN0ciA9ICdCaW5kaW5nczogJztcbiAgICB2YXIgaTtcbiAgICB2YXIgbiA9IG5icy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgc3RyICs9IGJpbmRpbmdEZWJ1ZyhuYnNbaV1bMF0pICsgJztcXG5cXHQnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9OyAvLyBiaW5kaW5nc0RlYnVnXG5cbiAgLy8gVW5pZmljYXRpb246IHNlZSBhbHNvXG4gIC8vICBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvdGVybS5weVxuICAvLyBmb3Igc2ltaWxhciB0aGluZ3MgaW4gcHl0aG9uXG4gIC8vXG4gIC8vIFVuaWZpY2F0aW9uIGZpbmRzIGFsbCBiaW5kaW5ncyBzdWNoIHRoYXQgd2hlbiB0aGUgYmluZGluZyBpcyBhcHBsaWVkXG4gIC8vIHRvIG9uZSB0ZXJtIGl0IGlzIGVxdWFsIHRvIHRoZSBvdGhlci5cbiAgLy8gUmV0dXJuczogYSBsaXN0IG9mIGJpbmRpbmdzLCB3aGVyZSBhIGJpbmRpbmcgaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXlcbiAgLy8gIG1hcHBpbmcgdmFyaXVhYmxlIHRvIHZhbHVlLlxuXG4gIHZhciB1bmlmeVRlcm0gPSBmdW5jdGlvbiB1bmlmeVRlcm0oc2VsZiwgb3RoZXIsIGJpbmRpbmdzLCBmb3JtdWxhKSB7XG4gICAgdmFyIGFjdHVhbCA9IGJpbmRpbmdzW3NlbGZdO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTm90IG1hcHBlZFxuICAgICAgaWYgKHNlbGYuaXNWYXIpIHtcbiAgICAgICAgLyogaWYgKHNlbGYuaXNCbGFuaykgIC8vYm5vZGVzIGFyZSBleGlzdGVudGlhbCB2YXJpYWJsZXNcbiAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnRvU3RyaW5nKCkgPT0gb3RoZXIudG9TdHJpbmcoKSkgcmV0dXJuIFtbIFtdLCBudWxsXV1cbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBbXVxuICAgICAgICB9Ki9cbiAgICAgICAgdmFyIGIgPSBbXTtcbiAgICAgICAgYltzZWxmXSA9IG90aGVyO1xuICAgICAgICByZXR1cm4gW1tiLCBudWxsXV07IC8vIE1hdGNoXG4gICAgICB9XG4gICAgICBhY3R1YWwgPSBzZWxmO1xuICAgIH1cbiAgICBpZiAoIWFjdHVhbC5jb21wbGV4VHlwZSkge1xuICAgICAgaWYgKGZvcm11bGEucmVkaXJlY3Rpb25zW2FjdHVhbF0pIHtcbiAgICAgICAgYWN0dWFsID0gZm9ybXVsYS5yZWRpcmVjdGlvbnNbYWN0dWFsXTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtdWxhLnJlZGlyZWN0aW9uc1tvdGhlcl0pIHtcbiAgICAgICAgb3RoZXIgPSBmb3JtdWxhLnJlZGlyZWN0aW9uc1tvdGhlcl07XG4gICAgICB9XG4gICAgICBpZiAoYWN0dWFsLnNhbWVUZXJtKG90aGVyKSkge1xuICAgICAgICByZXR1cm4gW1tbXSwgbnVsbF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoc2VsZiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5pZnlDb250ZW50cyhzZWxmLCBvdGhlciwgYmluZGluZ3MpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5LmpzOiBvb3BzIC0gY29kZSBub3Qgd3JpdHRlbiB5ZXQnKTtcbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkOyAgLy8gZm9yIGxpbnQgLSBubyBqc2xpbnQgb2JqZWN0cyB0byB1bnJlYWNoYWJsZXNcbiAgICAvLyAgICByZXR1cm4gYWN0dWFsLnVuaWZ5Q29udGVudHMob3RoZXIsIGJpbmRpbmdzKVxuICB9OyAvLyB1bmlmeVRlcm1cblxuICB2YXIgdW5pZnlDb250ZW50cyA9IGZ1bmN0aW9uIHVuaWZ5Q29udGVudHMoc2VsZiwgb3RoZXIsIGJpbmRpbmdzLCBmb3JtdWxhKSB7XG4gICAgdmFyIG5iczI7XG4gICAgaWYgKHNlbGYubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gbm8gd2F5XG4gICAgfVxuICAgIGlmICghc2VsZi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbW1tdLCBudWxsXV07IC8vIFN1Y2Nlc3NcbiAgICB9XG4gICAgdmFyIG5icyA9IHVuaWZ5VGVybShzZWxmWzBdLCBvdGhlclswXSwgYmluZGluZ3MsIGZvcm11bGEpO1xuICAgIGlmIChuYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmJzO1xuICAgIH1cbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGk7XG4gICAgdmFyIG4gPSBuYnMubGVuZ3RoO1xuICAgIHZhciBuYjtcbiAgICB2YXIgajtcbiAgICB2YXIgbTtcbiAgICB2YXIgdjtcbiAgICB2YXIgbmIyO1xuICAgIHZhciBiaW5kaW5nczI7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgLy8gZm9yIGVhY2ggcG9zc2liaWxpdHkgZnJvbSB0aGUgZmlyc3QgdGVybVxuICAgICAgbmIgPSBuYnNbaV1bMF07IC8vIG5ldyBiaW5kaW5nc1xuICAgICAgYmluZGluZ3MyID0gW107XG4gICAgICBmb3IgKHYgaW4gbmIpIHtcbiAgICAgICAgaWYgKG5iLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgYmluZGluZ3MyW3ZdID0gbmJbdl07IC8vIGNvcHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2IGluIGJpbmRpbmdzKSB7XG4gICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eSh2KSkge1xuICAgICAgICAgIGJpbmRpbmdzMlt2XSA9IGJpbmRpbmdzW3ZdOyAvLyBjb3B5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5iczIgPSB1bmlmeUNvbnRlbnRzKHNlbGYuc2xpY2UoMSksIG90aGVyLnNsaWNlKDEpLCBiaW5kaW5nczIsIGZvcm11bGEpO1xuICAgICAgbSA9IG5iczIubGVuZ3RoO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07IGorKykge1xuICAgICAgICBuYjIgPSBuYnMyW2pdWzBdOyAvLyBAQEBAIG5vIGlkZWEgd2hldGhlciB0aGlzIGlzIHVzZWQgb3IgcmlnaHRcbiAgICAgICAgZm9yICh2IGluIG5iKSB7XG4gICAgICAgICAgaWYgKG5iLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgICBuYjJbdl0gPSBuYlt2XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goW25iMiwgbnVsbF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9OyAvLyB1bmlmeUNvbnRlbnRzXG5cbiAgLy8gIE1hdGNoaW5nXG4gIC8vXG4gIC8vIE1hdGNoaW5nIGZpbmRzIGFsbCBiaW5kaW5ncyBzdWNoIHRoYXQgd2hlbiB0aGUgYmluZGluZyBpcyBhcHBsaWVkXG4gIC8vIHRvIG9uZSB0ZXJtIGl0IGlzIGVxdWFsIHRvIHRoZSBvdGhlciB0ZXJtLiAgV2Ugb25seSBtYXRjaCBmb3JtdWxhZS5cblxuICAvKiogaWYgeCBpcyBub3QgaW4gdGhlIGJpbmRpbmdzIGFycmF5LCByZXR1cm4gdGhlIHZhcjsgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGJpbmRpbmdzICoqL1xuICB2YXIgYmluZCA9IGZ1bmN0aW9uIGJpbmQoeCwgYmluZGluZykge1xuICAgIHZhciB5ID0gYmluZGluZ1t4XTtcbiAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG4gIH07XG5cbiAgLy8gV2hlbiB0aGVyZSBhcmUgT1BUSU9OQUwgY2xhdXNlcywgd2UgbXVzdCByZXR1cm4gYmluZGluZ3Mgd2l0aG91dCB0aGVtIGlmIG5vbmUgb2YgdGhlbVxuICAvLyBzdWNjZWVkLiBIb3dldmVyLCBpZiBhbnkgb2YgdGhlbSBkbyBzdWNjZWVkLCB3ZSBzaG91bGQgbm90LiAgKFRoaXMgaXMgd2hhdCBicmFuY2hDb3VudCgpXG4gIC8vIHRyYWNrZWQuIFRoZSBwcm9ibGVtIGN1cnJlbnRseSBpcyAoMjAxMS83KSB0aGF0IHdoZW4gc2V2ZXJhbCBvcHRpb25hbHMgZXhpc3QsIGFuZCB0aGV5XG4gIC8vIGFsbCBtYXRjaCwgbXVsdGlwbGUgc2V0cyBvZiBiaW5kaW5ncyBhcmUgcmV0dXJuZWQsIGVhY2ggd2l0aCBvbmUgb3B0aW9uYWwgZmlsbGVkIGluLilcblxuICB2YXIgdW5pb24gPSBmdW5jdGlvbiB1bmlvbihhLCBiKSB7XG4gICAgdmFyIGMgPSB7fTtcbiAgICB2YXIgeDtcbiAgICBmb3IgKHggaW4gYSkge1xuICAgICAgaWYgKGEuaGFzT3duUHJvcGVydHkoeCkpIHtcbiAgICAgICAgY1t4XSA9IGFbeF07XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoeCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eSh4KSkge1xuICAgICAgICBjW3hdID0gYlt4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgdmFyIE9wdGlvbmFsQnJhbmNoSnVuY3Rpb24gPSBmdW5jdGlvbiBPcHRpb25hbEJyYW5jaEp1bmN0aW9uKG9yaWdpbmFsQ2FsbGJhY2ssIHRydW5rQmluZGluZ3MpIHtcbiAgICB0aGlzLnRydW5rQmluZGluZ3MgPSB0cnVua0JpbmRpbmdzO1xuICAgIHRoaXMub3JpZ2luYWxDYWxsYmFjayA9IG9yaWdpbmFsQ2FsbGJhY2s7XG4gICAgdGhpcy5icmFuY2hlcyA9IFtdO1xuICAgIC8vIHRoaXMucmVzdWx0cyA9IFtdOyAvLyByZXN1bHRbaV0gaXMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIGJyYW5jaCBpXG4gICAgLy8gdGhpcy5kb25lID0ge307ICAvLyBkb25lW2ldIG1lYW5zIGFsbC9hbnkgcmVzdWx0cyBhcmUgaW4gZm9yIGJyYW5jaCBpXG4gICAgLy8gdGhpcy5jb3VudCA9IHt9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgT3B0aW9uYWxCcmFuY2hKdW5jdGlvbi5wcm90b3R5cGUuY2hlY2tBbGxEb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuYnJhbmNoZXNbaV0uZG9uZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5kZWJ1ZygnT1BUSU9OQUwgQklETklOR1MgQUxMIERPTkU6Jyk7XG4gICAgdGhpcy5kb0NhbGxCYWNrcyh0aGlzLmJyYW5jaGVzLmxlbmd0aCAtIDEsIHRoaXMudHJ1bmtCaW5kaW5ncyk7XG4gIH07XG4gIC8vIFJlY3J1cnNpdmVseSBnZW5lcmF0ZSB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgYmluZGluZ3NcbiAgT3B0aW9uYWxCcmFuY2hKdW5jdGlvbi5wcm90b3R5cGUuZG9DYWxsQmFja3MgPSBmdW5jdGlvbiAoYiwgYmluZGluZ3MpIHtcbiAgICB2YXIgajtcbiAgICBpZiAoYiA8IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ2FsbGJhY2soYmluZGluZ3MpO1xuICAgIH1cbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5icmFuY2hlc1tiXS5yZXN1bHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICB0aGlzLmRvQ2FsbEJhY2tzKGIgLSAxLCB1bmlvbihiaW5kaW5ncywgdGhpcy5icmFuY2hlc1tiXS5yZXN1bHRzW2pdKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEEgbWFuZGF0b3J5IGJyYW5jaCBpcyB0aGUgbm9ybWFsIG9uZSwgd2hlcmUgY2FsbGJhY2tzXG4gIC8vIGFyZSBtYWRlIGltbWVkaWF0ZWx5IGFuZCBubyBqdW5jdGlvbiBpcyBuZWVkZWQuXG4gIC8vIE1pZ2h0IGJlIHVzZWZ1bCBmb3Igb25GaW5zaWhlZCBjYWxsYmFjayBmb3IgcXVlcnkgQVBJLlxuICB2YXIgTWFuZGF0b3J5QnJhbmNoID0gZnVuY3Rpb24gTWFuZGF0b3J5QnJhbmNoKGNhbGxiYWNrLCBvbkRvbmUpIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAvLyB0aGlzLnJlc3VsdHMgPSBbXVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLm9uRG9uZSA9IG9uRG9uZTtcbiAgICAvLyB0aGlzLmp1bmN0aW9uID0ganVuY3Rpb25cbiAgICAvLyBqdW5jdGlvbi5icmFuY2hlcy5wdXNoKHRoaXMpXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgTWFuZGF0b3J5QnJhbmNoLnByb3RvdHlwZS5yZXBvcnRNYXRjaCA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgIC8vIGxvZy5lcnJvcihcIkBAQEAgcXVlcnkuanMgMVwiKTsgLy8gQEBcbiAgICB0aGlzLmNhbGxiYWNrKGJpbmRpbmdzKTtcbiAgICB0aGlzLnN1Y2Nlc3MgPSB0cnVlO1xuICB9O1xuXG4gIE1hbmRhdG9yeUJyYW5jaC5wcm90b3R5cGUucmVwb3J0RG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgIGxvZy5pbmZvKCdNYW5kYXRvcnkgcXVlcnkgYnJhbmNoIGZpbmlzaGVkLioqKicpO1xuICAgIGlmICh0aGlzLm9uRG9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9uRG9uZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBbiBvcHRpb25hbCBicmFuY2ggaG9hcmRzIGl0cyByZXN1bHRzLlxuICB2YXIgT3B0aW9uYWxCcmFuY2ggPSBmdW5jdGlvbiBPcHRpb25hbEJyYW5jaChqdW5jdGlvbikge1xuICAgIHRoaXMuY291bnQgPSAwO1xuICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgIHRoaXMuanVuY3Rpb24gPSBqdW5jdGlvbjtcbiAgICBqdW5jdGlvbi5icmFuY2hlcy5wdXNoKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIE9wdGlvbmFsQnJhbmNoLnByb3RvdHlwZS5yZXBvcnRNYXRjaCA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgIHRoaXMucmVzdWx0cy5wdXNoKGJpbmRpbmdzKTtcbiAgfTtcblxuICBPcHRpb25hbEJyYW5jaC5wcm90b3R5cGUucmVwb3J0RG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2cuZGVidWcoJ09wdGlvbmFsIGJyYW5jaCBmaW5pc2hlZCAtIHJlc3VsdHMubGVuZ3RoID0gJyArIHRoaXMucmVzdWx0cy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUaGlzIGlzIHdoYXQgb3B0aW9uYWwgbWVhbnM6IGlmIG5vIGhpdHMsXG4gICAgICB0aGlzLnJlc3VsdHMucHVzaCh7fSk7IC8vIG1pbWljIHN1Y2Nlc3MsIGJ1dCB3aXRoIG5vIGJpbmRpbmdzXG4gICAgICBsb2cuZGVidWcoXCJPcHRpb25hbCBicmFuY2ggRkFJTEVEIC0gdGhhdCdzIE9LLlwiKTtcbiAgICB9XG4gICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICB0aGlzLmp1bmN0aW9uLmNoZWNrQWxsRG9uZSgpO1xuICB9O1xuXG4gIC8qKiBwcmVwYXJlIC0tIHNldHMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHRoZSBwb3NzaWJsZSBtYXRjaGVzXG4gICAgICAqIEBwYXJhbSBmIC0gZm9ybXVsYVxuICAgICAgKiBAcGFyYW0gaXRlbSAtIGFuIFN0YXRlbWVudCwgcG9zc2libHkgdy8gdmFycyBpbiBpdFxuICAgICAgKiBAcGFyYW0gYmluZGluZ3MgLVxuICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXJ5IGZhaWxzIC0tIHRoZXJlIGFyZSBubyBpdGVtcyB0aGF0IG1hdGNoICoqL1xuICB2YXIgcHJlcGFyZSA9IGZ1bmN0aW9uIHByZXBhcmUoZiwgaXRlbSwgYmluZGluZ3MpIHtcbiAgICB2YXIgdCwgdGVybXMsIHRlcm1JbmRleCwgaSwgaW5kO1xuICAgIGl0ZW0ubnZhcnMgPSAwO1xuICAgIGl0ZW0uaW5kZXggPSBudWxsO1xuICAgIC8vIGlmICghZi5zdGF0ZW1lbnRzKSBsb2cud2FybihcIkBAQCBwcmVwYXJlOiBmIGlzIFwiK2YpXG4gICAgLy8gICAgbG9nLmRlYnVnKFwiUHJlcGFyZTogZiBoYXMgXCIrIGYuc3RhdGVtZW50cy5sZW5ndGgpXG4gICAgLy8gbG9nLmRlYnVnKFwiUHJlcGFyZTogS2Igc2l6ZSBcIitmLnN0YXRlbWVudHMubGVuZ3RoK1wiIFByZXBhcmluZyBcIitpdGVtKVxuXG4gICAgdGVybXMgPSBbaXRlbS5zdWJqZWN0LCBpdGVtLnByZWRpY2F0ZSwgaXRlbS5vYmplY3RdO1xuICAgIGluZCA9IFtmLnN1YmplY3RJbmRleCwgZi5wcmVkaWNhdGVJbmRleCwgZi5vYmplY3RJbmRleF07XG4gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgLy8gYWxlcnQoXCJQcmVwYXJlIFwiK3Rlcm1zW2ldK1wiIFwiKyh0ZXJtc1tpXSBpbiBiaW5kaW5ncykpXG4gICAgICBpZiAodGVybXNbaV0uaXNWYXIgJiYgIShiaW5kaW5nc1t0ZXJtc1tpXV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgaXRlbS5udmFycysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdCA9IGJpbmQodGVybXNbaV0sIGJpbmRpbmdzKTsgLy8gcmV0dXJucyB0aGUgUkRGIGJpbmRpbmcgaWYgYm91bmQsIG90aGVyd2lzZSBpdHNlbGZcbiAgICAgICAgLy8gaWYgKHRlcm1zW2ldIT1iaW5kKHRlcm1zW2ldLGJpbmRpbmdzKSBhbGVydChcIlRlcm06IFwiK3Rlcm1zW2ldK1wiQmluZGluZzogXCIrYmluZCh0ZXJtc1tpXSwgYmluZGluZ3MpKVxuICAgICAgICBpZiAoZi5yZWRpcmVjdGlvbnNbdC5oYXNoU3RyaW5nKCldKSB7XG4gICAgICAgICAgdCA9IGYucmVkaXJlY3Rpb25zW3QuaGFzaFN0cmluZygpXTsgLy8gcmVkaXJlY3RcbiAgICAgICAgfVxuICAgICAgICB0ZXJtSW5kZXggPSBpbmRbaV1bdC5oYXNoU3RyaW5nKCldO1xuXG4gICAgICAgIGlmICghdGVybUluZGV4KSB7XG4gICAgICAgICAgaXRlbS5pbmRleCA9IFtdO1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUXVlcnkgbGluZSBjYW5ub3QgbWF0Y2hcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5pbmRleCA9PT0gbnVsbCB8fCBpdGVtLmluZGV4Lmxlbmd0aCA+IHRlcm1JbmRleC5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmluZGV4ID0gdGVybUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uaW5kZXggPT09IG51bGwpIHtcbiAgICAgIC8vIEFsbCAzIGFyZSB2YXJpYWJsZXM/XG4gICAgICBpdGVtLmluZGV4ID0gZi5zdGF0ZW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgLy8gcHJlcGFyZVxuXG4gIC8qKiBzb3J0aW5nIGZ1bmN0aW9uIC0tIG5lZ2F0aXZlIGlmIHNlbGYgaXMgZWFzaWVyICoqL1xuICAvLyBXZSBhbHdheXMgcHJlZmVyIHRvIHN0YXJ0IHdpdGggYSBVUkkgdG8gYmUgYWJsZSB0byBicm93c2UgYSBncmFwaFxuICAvLyB0aGlzIGlzIHdoeSB3ZSBwdXQgb2ZmIGl0ZW1zIHdpdGggbW9yZSB2YXJpYWJsZXMgdGlsbCBsYXRlci5cbiAgZnVuY3Rpb24gZWFzaWVzdFF1ZXJ5KHNlbGYsIG90aGVyKSB7XG4gICAgaWYgKHNlbGYubnZhcnMgIT09IG90aGVyLm52YXJzKSB7XG4gICAgICByZXR1cm4gc2VsZi5udmFycyAtIG90aGVyLm52YXJzO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5pbmRleC5sZW5ndGggLSBvdGhlci5pbmRleC5sZW5ndGg7XG4gIH1cblxuICB2YXIgbWF0Y2hfaW5kZXggPSAwOyAvLyBpbmRleFxuICAvKiogbWF0Y2hlcyBhIHBhdHRlcm4gZm9ybXVsYSBhZ2FpbnN0IHRoZSBrbm93bGVkZ2UgYmFzZSwgZS5nLiB0byBmaW5kIG1hdGNoZXMgZm9yIHRhYmxlLXZpZXdcbiAgKlxuICAqIEBwYXJhbSBmIC0ga25vd2xlZGdlIGJhc2UgZm9ybXVsYVxuICAqIEBwYXJhbSBnIC0gcGF0dGVybiBmb3JtdWxhIChtYXkgaGF2ZSB2YXJzKVxuICAqIEBwYXJhbSBiaW5kaW5nc1NvRmFyICAtIGJpbmRpbmdzIGFjY3VtdWxhdGVkIGluIG1hdGNoaW5nIHRvIGRhdGVcbiAgKiBAcGFyYW0gbGV2ZWwgLSBzcGFjZXMgdG8gaW5kZW50IHN0dWZmIGFsc28gbGV0cyB5b3Uga25vdyB3aGF0IGxldmVsIG9mIHJlY3Vyc2lvbiB5b3UncmUgYXRcbiAgKiBAcGFyYW0gZmV0Y2hlciAtIGZ1bmN0aW9uICh0ZXJtLCByZXF1ZXN0ZWRCeSkgLSBteUZldGNoZXIgLyBBSkFSX2hhbmRsZU5ld1Rlcm0gLyB0aGUgc29ydFxuICAqIEBwYXJhbSBsb2NhbENhbGxiYWNrIC0gZnVuY3Rpb24oYmluZGluZ3MsIHBhdHRlcm4sIGJyYW5jaCkgY2FsbGVkIG9uIHN1Y2Vzc1xuICAqIEByZXR1cm5zIG5vdGhpbmdcbiAgKlxuICAqIFdpbGwgZmV0Y2ggbGlua2VkIGRhdGEgZnJvbSB0aGUgd2ViIGlmZiB0aGUga25vd2xlZGdlIGJhc2UgYW4gYXNzb2NpYXRlZCBzb3VyY2UgZmV0Y2hlciAoZi5mZXRjaGVyKVxuICAqKiovXG4gIHZhciBtYXRjaCA9IGZ1bmN0aW9uIG1hdGNoKGYsIGcsIGJpbmRpbmdzU29GYXIsIGxldmVsLCBmZXRjaGVyLCBsb2NhbENhbGxiYWNrLCBicmFuY2gpIHtcbiAgICBsb2cuZGVidWcoJ01hdGNoIGJlZ2lucywgQnJhbmNoIGNvdW50IG5vdzogJyArIGJyYW5jaC5jb3VudCArICcgZm9yICcgKyBicmFuY2gucGF0dGVybl9kZWJ1Zyk7XG4gICAgdmFyIHNmID0gZi5mZXRjaGVyID8gZi5mZXRjaGVyIDogbnVsbDtcbiAgICAvLyBsb2cuZGVidWcoXCJtYXRjaDogZiBoYXMgXCIrZi5zdGF0ZW1lbnRzLmxlbmd0aCtcIiwgZyBoYXMgXCIrZy5zdGF0ZW1lbnRzLmxlbmd0aClcbiAgICB2YXIgcGF0dGVybiA9IGcuc3RhdGVtZW50cztcbiAgICBpZiAocGF0dGVybi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdoZW4gaXQncyBzYXRpc2ZpZWQgYWxsIHRoZSBwYXR0ZXJuIHRyaXBsZXNcbiAgICAgIGxvZy5kZWJ1ZygnRk9VTkQgTUFUQ0ggV0lUSCBCSU5ESU5HUzonICsgYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKTtcbiAgICAgIGlmIChnLm9wdGlvbmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmFuY2gucmVwb3J0TWF0Y2goYmluZGluZ3NTb0Zhcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoJ09QVElPTkFMOiAnICsgZy5vcHRpb25hbCk7XG4gICAgICAgIHZhciBqdW5jdGlvbiA9IG5ldyBPcHRpb25hbEJyYW5jaEp1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nc1NvRmFyKTsgLy8gQEAgd29uJ3Qgd29yayB3aXRoIG5lc3RlZCBvcHRpb25hbHM/IG5lc3QgY2FsbGJhY2tzXG4gICAgICAgIHZhciBiciA9IFtdO1xuICAgICAgICB2YXIgYjtcbiAgICAgICAgZm9yIChiID0gMDsgYiA8IGcub3B0aW9uYWwubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICBicltiXSA9IG5ldyBPcHRpb25hbEJyYW5jaChqdW5jdGlvbik7IC8vIEFsbG9jYXRlIGJyYW5jaGVzIHRvIHByZXZlbnQgcHJlbWF0dXJlIGVuZGluZ1xuICAgICAgICAgIGJyW2JdLnBhdHRlcm5fZGVidWcgPSBnLm9wdGlvbmFsW2JdOyAvLyBmb3IgZGlhZ25vdGljcyBvbmx5XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChiID0gMDsgYiA8IGcub3B0aW9uYWwubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICBicltiXS5jb3VudCA9IGJyW2JdLmNvdW50ICsgMTsgLy8gQ291bnQgaG93IG1hbnkgbWF0Y2hlcyB3ZSBoYXZlIHlldCB0byBjb21wbGV0ZVxuICAgICAgICAgIG1hdGNoKGYsIGcub3B0aW9uYWxbYl0sIGJpbmRpbmdzU29GYXIsICcnLCBmZXRjaGVyLCBjYWxsYmFjaywgYnJbYl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmFuY2guY291bnQtLTtcbiAgICAgIGxvZy5kZWJ1ZygnTWF0Y2ggZW5kcyAtLSBzdWNjZXNzICwgQnJhbmNoIGNvdW50IG5vdzogJyArIGJyYW5jaC5jb3VudCArICcgZm9yICcgKyBicmFuY2gucGF0dGVybl9kZWJ1Zyk7XG4gICAgICByZXR1cm47IC8vIFN1Y2Nlc3NcbiAgICB9XG5cbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcbiAgICB2YXIgbiA9IHBhdHRlcm4ubGVuZ3RoO1xuICAgIC8vIGxvZy5kZWJ1ZyhsZXZlbCArIFwiTWF0Y2ggXCIrbitcIiBsZWZ0LCBicyBzbyBmYXI6XCIrYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKVxuXG4gICAgLy8gRm9sbG93IGxpbmtzIGZyb20gdmFyaWFibGVzIGluIHF1ZXJ5XG4gICAgaWYgKHNmKSB7XG4gICAgICAvLyBGZXRjaGVyIGlzIHVzZWQgdG8gZmV0Y2ggVVJJcywgZnVuY3Rpb24gZmlyc3QgdGVybSBpcyBhIFVSSSB0ZXJtLCBzZWNvbmQgaXMgdGhlIHJlcXVlc3RlclxuICAgICAgdmFyIGlkID0gJ21hdGNoJyArIG1hdGNoX2luZGV4Kys7XG4gICAgICB2YXIgZmV0Y2hSZXNvdXJjZSA9IGZ1bmN0aW9uIGZldGNoUmVzb3VyY2UocmVxdWVzdGVkVGVybSwgaWQpIHtcbiAgICAgICAgdmFyIGRvY3VyaSA9IHJlcXVlc3RlZFRlcm0udXJpLnNwbGl0KCcjJylbMF07XG4gICAgICAgIHNmLm5vd09yV2hlbkZldGNoZWQoZG9jdXJpLCB1bmRlZmluZWQsIGZ1bmN0aW9uIChlcnIsIGJvZHksIHhocikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBmb2xsb3dpbmcgbGluayB0byA8JyArIHJlcXVlc3RlZFRlcm0udXJpICsgJz4gaW4gcXVlcnk6ICcgKyBib2R5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0Y2goZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIC8vIG1hdGNoIG5vdCBtYXRjaDIgdG8gbG9vayB1cCBhbnkgb3RoZXJzIG5lY2Vzc2FyeS5cbiAgICAgICAgICBsb2NhbENhbGxiYWNrLCBicmFuY2gpO1xuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgaWYoIHNmICkge1xuICAgICAgICAgICAgc2YuYWRkQ2FsbGJhY2soJ2RvbmUnLCBmdW5jdGlvbih1cmkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGtiLmNhbm9uKGtiLnN5bSh1cmkpKS51cmkgIT09IHBhdGgpICYmICh1cmkgIT09IGtiLmNhbm9uKGtiLnN5bShwYXRoKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBmZXRjaGVyKHJlcXVlc3RlZFRlcm0sIGlkKVxuICAgICAgICAqL1xuICAgICAgfTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IHBhdHRlcm5baV07IC8vIGZvciBlYWNoIG9mIHRoZSB0cmlwbGVzIGluIHRoZSBxdWVyeVxuICAgICAgICBpZiAoYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdICE9PSB1bmRlZmluZWQgJiYgYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdLnVyaSAmJiBzZiAmJiBzZi5nZXRTdGF0ZShkb2NwYXJ0KGJpbmRpbmdzU29GYXJbaXRlbS5zdWJqZWN0XS51cmkpKSA9PT0gJ3VucmVxdWVzdGVkJykge1xuICAgICAgICAgIC8vIGZldGNoIHRoZSBzdWJqZWN0IGluZm8gYW5kIHJldHVybiB0byBpZFxuICAgICAgICAgIGZldGNoUmVzb3VyY2UoYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdLCBpZCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBvbmx5IGxvb2sgdXAgb25lIHBlciBsaW5lIHRoaXMgdGltZSwgYnV0IHdlIHdpbGwgY29tZSBiYWNrIGFnYWluIHRob3VnaCBtYXRjaFxuICAgICAgICB9XG4gICAgICAgIGlmIChiaW5kaW5nc1NvRmFyW2l0ZW0ub2JqZWN0XSAhPT0gdW5kZWZpbmVkICYmIGJpbmRpbmdzU29GYXJbaXRlbS5vYmplY3RdLnVyaSAmJiBzZiAmJiBzZi5nZXRTdGF0ZShkb2NwYXJ0KGJpbmRpbmdzU29GYXJbaXRlbS5vYmplY3RdLnVyaSkpID09PSAndW5yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgZmV0Y2hSZXNvdXJjZShiaW5kaW5nc1NvRmFyW2l0ZW0ub2JqZWN0XSwgaWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gaWYgc2ZcbiAgICBtYXRjaDIoZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIGxvY2FsQ2FsbGJhY2ssIGJyYW5jaCk7XG4gICAgcmV0dXJuO1xuICB9OyAvLyBtYXRjaFxuXG4gIHZhciBjb25zdHJhaW50c1NhdGlzZmllZCA9IGZ1bmN0aW9uIGNvbnN0cmFpbnRzU2F0aXNmaWVkKGJpbmRpbmdzLCBjb25zdHJhaW50cykge1xuICAgIHZhciByZXMgPSB0cnVlO1xuICAgIHZhciB4O1xuICAgIHZhciB0ZXN0O1xuICAgIGZvciAoeCBpbiBiaW5kaW5ncykge1xuICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KHgpKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50c1t4XSkge1xuICAgICAgICAgIHRlc3QgPSBjb25zdHJhaW50c1t4XS50ZXN0O1xuICAgICAgICAgIGlmICh0ZXN0ICYmICF0ZXN0KGJpbmRpbmdzW3hdKSkge1xuICAgICAgICAgICAgcmVzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLyoqIG1hdGNoMiAtLSBzdHVmZiBhZnRlciB0aGUgZmV0Y2ggKiovXG4gIHZhciBtYXRjaDIgPSBmdW5jdGlvbiBtYXRjaDIoZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIGNhbGxiYWNrLCBicmFuY2gpIHtcbiAgICAvLyBwb3N0IGZldGNoXG4gICAgdmFyIHBhdHRlcm4gPSBnLnN0YXRlbWVudHM7XG4gICAgdmFyIG4gPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgaztcbiAgICB2YXIgbms7XG4gICAgdmFyIHY7XG4gICAgdmFyIGJpbmRpbmdzMjtcbiAgICB2YXIgbmV3QmluZGluZ3MxO1xuICAgIHZhciBpdGVtO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIC8vIEZvciBlYWNoIHN0YXRlbWVudCBsZWZ0IGluIHRoZSBxdWVyeSwgcnVuIHByZXBhcmVcbiAgICAgIGl0ZW0gPSBwYXR0ZXJuW2ldO1xuICAgICAgbG9nLmluZm8oJ21hdGNoMjogaXRlbT0nICsgaXRlbSArICcsIGJpbmRpbmdzU29GYXI9JyArIGJpbmRpbmdEZWJ1ZyhiaW5kaW5nc1NvRmFyKSk7XG4gICAgICBwcmVwYXJlKGYsIGl0ZW0sIGJpbmRpbmdzU29GYXIpO1xuICAgIH1cbiAgICBwYXR0ZXJuLnNvcnQoZWFzaWVzdFF1ZXJ5KTtcbiAgICBpdGVtID0gcGF0dGVyblswXTtcbiAgICAvLyBsb2cuZGVidWcoXCJTb3J0ZWQgcGF0dGVybjpcXG5cIitwYXR0ZXJuKVxuICAgIHZhciByZXN0ID0gZi5mb3JtdWxhKCk7XG4gICAgcmVzdC5vcHRpb25hbCA9IGcub3B0aW9uYWw7XG4gICAgcmVzdC5jb25zdHJhaW50cyA9IGcuY29uc3RyYWludHM7XG4gICAgcmVzdC5zdGF0ZW1lbnRzID0gcGF0dGVybi5zbGljZSgxKTsgLy8gTm8gaW5kZXhlczogd2Ugd2lsbCBub3QgcXVlcnkgZy5cbiAgICBsb2cuZGVidWcobGV2ZWwgKyAnbWF0Y2gyIHNlYXJjaGluZyAnICsgaXRlbS5pbmRleC5sZW5ndGggKyAnIGZvciAnICsgaXRlbSArICc7IGJpbmRpbmdzIHNvIGZhcj0nICsgYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKTtcbiAgICAvLyB2YXIgcmVzdWx0cyA9IFtdXG4gICAgdmFyIGM7XG4gICAgdmFyIG5jID0gaXRlbS5pbmRleC5sZW5ndGg7XG4gICAgdmFyIG5iczE7XG4gICAgdmFyIHN0O1xuICAgIHZhciBvbndhcmQgPSAwO1xuICAgIC8vIHZhciB4XG4gICAgZm9yIChjID0gMDsgYyA8IG5jOyBjKyspIHtcbiAgICAgIC8vIEZvciBlYWNoIGNhbmRpZGF0ZSBzdGF0ZW1lbnRcbiAgICAgIHN0ID0gaXRlbS5pbmRleFtjXTsgLy8gZm9yIGVhY2ggc3RhdGVtZW50IGluIHRoZSBpdGVtJ3MgaW5kZXgsIHNwYXduIGEgbmV3IG1hdGNoIHdpdGggdGhhdCBiaW5kaW5nXG4gICAgICBuYnMxID0gdW5pZnlDb250ZW50cyhbaXRlbS5zdWJqZWN0LCBpdGVtLnByZWRpY2F0ZSwgaXRlbS5vYmplY3RdLCBbc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3RdLCBiaW5kaW5nc1NvRmFyLCBmKTtcbiAgICAgIGxvZy5pbmZvKGxldmVsICsgJyBGcm9tIGZpcnN0OiAnICsgbmJzMS5sZW5ndGggKyAnOiAnICsgYmluZGluZ3NEZWJ1ZyhuYnMxKSk7XG4gICAgICBuayA9IG5iczEubGVuZ3RoO1xuICAgICAgLy8gYnJhbmNoLmNvdW50ICs9IG5rXG4gICAgICAvLyBsb2cuZGVidWcoXCJCcmFuY2ggY291bnQgYnVtcGVkIFwiK25rK1wiIHRvOiBcIiticmFuY2guY291bnQpXG4gICAgICBmb3IgKGsgPSAwOyBrIDwgbms7IGsrKykge1xuICAgICAgICAvLyBGb3IgZWFjaCB3YXkgdGhhdCBzdGF0ZW1lbnQgYmluZHNcbiAgICAgICAgYmluZGluZ3MyID0gW107XG4gICAgICAgIG5ld0JpbmRpbmdzMSA9IG5iczFba11bMF07XG4gICAgICAgIGlmICghY29uc3RyYWludHNTYXRpc2ZpZWQobmV3QmluZGluZ3MxLCBnLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgIC8vIGJyYW5jaC5jb3VudC0tXG4gICAgICAgICAgbG9nLmRlYnVnKCdCcmFuY2ggY291bnQgQ1M6ICcgKyBicmFuY2guY291bnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodiBpbiBuZXdCaW5kaW5nczEpIHtcbiAgICAgICAgICAgIGlmIChuZXdCaW5kaW5nczEuaGFzT3duUHJvcGVydHkodikpIHtcbiAgICAgICAgICAgICAgYmluZGluZ3MyW3ZdID0gbmV3QmluZGluZ3MxW3ZdOyAvLyBjb3B5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodiBpbiBiaW5kaW5nc1NvRmFyKSB7XG4gICAgICAgICAgICBpZiAoYmluZGluZ3NTb0Zhci5oYXNPd25Qcm9wZXJ0eSh2KSkge1xuICAgICAgICAgICAgICBiaW5kaW5nczJbdl0gPSBiaW5kaW5nc1NvRmFyW3ZdOyAvLyBjb3B5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJhbmNoLmNvdW50Kys7IC8vIENvdW50IGhvdyBtYW55IG1hdGNoZXMgd2UgaGF2ZSB5ZXQgdG8gY29tcGxldGVcbiAgICAgICAgICBvbndhcmQrKztcbiAgICAgICAgICBtYXRjaChmLCByZXN0LCBiaW5kaW5nczIsIGxldmVsICsgJyAgJywgZmV0Y2hlciwgY2FsbGJhY2ssIGJyYW5jaCk7IC8vIGNhbGwgbWF0Y2hcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBicmFuY2guY291bnQtLTtcbiAgICBpZiAob253YXJkID09PSAwKSB7XG4gICAgICBsb2cuZGVidWcoJ01hdGNoMiBmYWlscyBjb21wbGV0ZWx5IG9uICcgKyBpdGVtKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKCdNYXRjaDIgZW5kcywgQnJhbmNoIGNvdW50OiAnICsgYnJhbmNoLmNvdW50ICsgJyBmb3IgJyArIGJyYW5jaC5wYXR0ZXJuX2RlYnVnKTtcbiAgICBpZiAoYnJhbmNoLmNvdW50ID09PSAwKSB7XG4gICAgICBsb2cuZGVidWcoJ0JyYW5jaCBmaW5pc2hlZC4nKTtcbiAgICAgIGJyYW5jaC5yZXBvcnREb25lKCk7XG4gICAgfVxuICB9OyAvLyBtYXRjaDJcbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQm9keSBvZiBxdWVyeSgpICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvKlxuICBpZighZmV0Y2hlcikge1xuICAgICAgZmV0Y2hlcj1mdW5jdGlvbiAoeCwgcmVxdWVzdGVkQnkpIHtcbiAgICAgICAgICBpZiAoeCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgJHJkZi5VdGlsLkFKQVJfaGFuZGxlTmV3VGVybShrYiwgeCwgcmVxdWVzdGVkQnkpXG4gICAgICB9XG4gIH1cbiAgKi9cbiAgLy8gcHJlcGFyZSwgb25jYWxsYmFjazogbWF0Y2gxXG4gIC8vIG1hdGNoMTogZmV0Y2hlciwgb25jYWxsYmFjazogbWF0Y2gyXG4gIC8vIG1hdGNoMiwgb25jYWxsYmFjazogcG9wdWxhdGV0YWJsZVxuICAvLyAgICBsb2cuZGVidWcoXCJRdWVyeSBGIGxlbmd0aFwiK3RoaXMuc3RhdGVtZW50cy5sZW5ndGgrXCIgRz1cIitteVF1ZXJ5KVxuICB2YXIgZiA9IHRoaXM7XG4gIGxvZy5kZWJ1ZygnUXVlcnkgb24gJyArIHRoaXMuc3RhdGVtZW50cy5sZW5ndGgpO1xuICAvLyBrYi5yZW1vdGVRdWVyeShteVF1ZXJ5LCdodHRwOi8vamVuYS5ocGwuaHAuY29tOjMwNDAvYmFja3N0YWdlJyxjYWxsYmFjaylcbiAgLy8gcmV0dXJuXG4gIHZhciB0cnVuY2sgPSBuZXcgTWFuZGF0b3J5QnJhbmNoKGNhbGxiYWNrLCBvbkRvbmUpO1xuICB0cnVuY2suY291bnQrKzsgLy8gY291bnQgb25lIGJyYW5jaCB0byBjb21wbGV0ZSBhdCB0aGUgbW9tZW50XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIG1hdGNoKGYsIG15UXVlcnkucGF0LCBteVF1ZXJ5LnBhdC5pbml0QmluZGluZ3MsICcnLCBmZXRjaGVyLCBjYWxsYmFjaywgdHJ1bmNrIC8qIGJyYW5jaCAqLyk7XG4gIH0sIDApO1xuXG4gIHJldHVybjsgLy8gcmV0dXJucyBub3RoaW5nOyBjYWxsYmFjayBkb2VzIHRoZSB3b3JrXG59IC8vIHF1ZXJ5XG5cbm1vZHVsZS5leHBvcnRzLlF1ZXJ5ID0gUXVlcnk7XG5tb2R1bGUuZXhwb3J0cy5pbmRleGVkRm9ybXVsYVF1ZXJ5ID0gaW5kZXhlZEZvcm11bGFRdWVyeTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8vICBSREZhIFBhcnNlciBmb3IgcmRmbGliLmpzXG5cbi8vIE9yaWdpbmFsbHkgYnk6IEFsZXggTWlsb3dza2lcbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FsZXhtaWxvd3NraS9ncmVlbi10dXJ0bGVcbi8vIENvbnZlcnRlZDogdGltYmwgMjAxNS0wOC0yNSBub3QgeWV0IHdvcmtpbmdcbi8vIEFkZGVkIHdyYXBwZXI6IGNzYXJ2ZW4gMjAxNi0wNS0wOSB3b3JraW5nXG5cbi8vIFJERmFQcm9jZXNzb3IucHJvdG90eXBlID0gbmV3IE9iamVjdCgpIC8vIFdhcyBVUklSZXNvbHZlclxuXG4vLyBSREZhUHJvY2Vzc29yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SREZhUHJvY2Vzc29yXG5cbi8vIG9wdGlvbnMuYmFzZSA9IGJhc2UgVVJJICAgIG5vdCByZWFsbHkgYW4gb3B0aW9uLCBzaG9wdWxkIGFsd2F5cyBiZSBzZXQuXG4vL1xuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIHJkZiA9IHJlcXVpcmUoJy4vZGF0YS1mYWN0b3J5Jyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgVXJpID0gcmVxdWlyZSgnLi91cmknKTtcbnZhciBVdGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmlmICh0eXBlb2YgTm9kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gIEBAQEBAQCBHbG9iYWwuIEludGVyZmFjZSB0byB4bWxkb20uXG4gIHZhciBOb2RlID0ge1xuICAgIEVMRU1FTlRfTk9ERTogMSxcbiAgICBBVFRSSUJVVEVfTk9ERTogMixcbiAgICBURVhUX05PREU6IDMsXG4gICAgQ0RBVEFfU0VDVElPTl9OT0RFOiA0LFxuICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSxcbiAgICBFTlRJVFlfTk9ERTogNixcbiAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IDcsXG4gICAgQ09NTUVOVF9OT0RFOiA4LFxuICAgIERPQ1VNRU5UX05PREU6IDksXG4gICAgRE9DVU1FTlRfVFlQRV9OT0RFOiAxMCxcbiAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSxcbiAgICBOT1RBVElPTl9OT0RFOiAxMlxuICB9O1xufVxuXG52YXIgUkRGYVByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUkRGYVByb2Nlc3NvcihrYiwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSREZhUHJvY2Vzc29yKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5rYiA9IGtiO1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgfHwge1xuICAgICAgZ3JhcGg6IHtcbiAgICAgICAgc3ViamVjdHM6IHt9LFxuICAgICAgICBwcmVmaXhlczoge30sXG4gICAgICAgIHRlcm1zOiB7fVxuICAgICAgfVxuICAgIH07XG4gICAgLy8gWFhYOiBBZGRlZCB0byB0cmFjayBibm9kZXNcbiAgICB0aGlzLmJsYW5rTm9kZXMgPSBbXTtcbiAgICAvLyBYWFg6IEFkZGVkIGZvciBub3JtYWxpc2F0aW9uXG4gICAgdGhpcy5odG1sT3B0aW9ucyA9IHtcbiAgICAgICdzZWxmQ2xvc2luZyc6ICdiciBpbWcgaW5wdXQgYXJlYSBiYXNlIGJhc2Vmb250IGNvbCBjb2xncm91cCBzb3VyY2Ugd2JyIGlzaW5kZXggbGluayBtZXRhIHBhcmFtIGhyJ1xuICAgIH07XG4gICAgdGhpcy50aGVPbmUgPSAnXzonICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5sYW5ndWFnZSA9IG51bGw7XG4gICAgdGhpcy52b2NhYnVsYXJ5ID0gbnVsbDtcbiAgICB0aGlzLmJsYW5rQ291bnRlciA9IDA7XG4gICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7IG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGxvY2FsTmFtZTogJ2xhbmcnIH1dO1xuICAgIHRoaXMuaW5YSFRNTE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmFic1VSSVJFID0gL1tcXHdcXF9cXC1dKzpcXFMrLztcbiAgICB0aGlzLmZpbmlzaGVkSGFuZGxlcnMgPSBbXTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSREZhUHJvY2Vzc29yLCBbe1xuICAgIGtleTogJ2FkZFRyaXBsZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRyaXBsZShvcmlnaW4sIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgICB2YXIgc3UsIG9iLCBwciwgb3I7XG4gICAgICBpZiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHN1ID0gcmRmLm5hbWVkTm9kZSh0aGlzLm9wdGlvbnMuYmFzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdSA9IHRoaXMudG9SREZOb2RlT2JqZWN0KHN1YmplY3QpO1xuICAgICAgfVxuICAgICAgcHIgPSB0aGlzLnRvUkRGTm9kZU9iamVjdChwcmVkaWNhdGUpO1xuICAgICAgb2IgPSB0aGlzLnRvUkRGTm9kZU9iamVjdChvYmplY3QpO1xuICAgICAgb3IgPSByZGYubmFtZWROb2RlKHRoaXMub3B0aW9ucy5iYXNlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdBZGRpbmcgeyAnICsgc3UgKyAnICcgKyBwciArICcgJyArIG9iICsgJyAnICsgb3IgKyAnIH0nKVxuICAgICAgdGhpcy5rYi5hZGQoc3UsIHByLCBvYiwgb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FuY2VzdG9yUGF0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFuY2VzdG9yUGF0aChub2RlKSB7XG4gICAgICB2YXIgcGF0aCA9ICcnO1xuICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgIHBhdGggPSAnLycgKyBub2RlLmxvY2FsTmFtZSArIHBhdGg7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb3B5TWFwcGluZ3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5TWFwcGluZ3MobWFwcGluZ3MpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5ncyA9IHt9O1xuICAgICAgZm9yICh2YXIgayBpbiBtYXBwaW5ncykge1xuICAgICAgICBuZXdNYXBwaW5nc1trXSA9IG1hcHBpbmdzW2tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld01hcHBpbmdzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvcHlQcm9wZXJ0aWVzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weVByb3BlcnRpZXMoKSB7fVxuICB9LCB7XG4gICAga2V5OiAnZGVyaXZlRGF0ZVRpbWVUeXBlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVyaXZlRGF0ZVRpbWVUeXBlKHZhbHVlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFJERmFQcm9jZXNzb3IuZGF0ZVRpbWVUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNoZWNraW5nIFwiK3ZhbHVlK1wiIGFnYWluc3QgXCIrUkRGYVByb2Nlc3Nvci5kYXRlVGltZVR5cGVzW2ldLnR5cGUpXG4gICAgICAgIHZhciBtYXRjaGVkID0gUkRGYVByb2Nlc3Nvci5kYXRlVGltZVR5cGVzW2ldLnBhdHRlcm4uZXhlYyh2YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaGVkICYmIG1hdGNoZWRbMF0ubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk1hdGNoZWQhXCIpXG4gICAgICAgICAgcmV0dXJuIFJERmFQcm9jZXNzb3IuZGF0ZVRpbWVUeXBlc1tpXS50eXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpbml0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHt9XG4gIH0sIHtcbiAgICBrZXk6ICduZXdCbGFua05vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXdCbGFua05vZGUoKSB7XG4gICAgICB0aGlzLmJsYW5rQ291bnRlcisrO1xuICAgICAgcmV0dXJuICdfOicgKyB0aGlzLmJsYW5rQ291bnRlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICduZXdTdWJqZWN0T3JpZ2luJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV3U3ViamVjdE9yaWdpbihvcmlnaW4sIHN1YmplY3QpIHt9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZUNVUklFJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VDVVJJRSh2YWx1ZSwgcHJlZml4ZXMsIGJhc2UpIHtcbiAgICAgIHZhciBjb2xvbiA9IHZhbHVlLmluZGV4T2YoJzonKTtcbiAgICAgIHZhciB1cmk7XG4gICAgICBpZiAoY29sb24gPj0gMCkge1xuICAgICAgICB2YXIgcHJlZml4ID0gdmFsdWUuc3Vic3RyaW5nKDAsIGNvbG9uKTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBkZWZhdWx0IHByZWZpeFxuICAgICAgICAgIHVyaSA9IHByZWZpeGVzWycnXTtcbiAgICAgICAgICByZXR1cm4gdXJpID8gdXJpICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSkgOiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ18nKSB7XG4gICAgICAgICAgLy8gYmxhbmsgbm9kZVxuICAgICAgICAgIHJldHVybiAnXzonICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoUkRGYVByb2Nlc3Nvci5OQ05BTUUudGVzdChwcmVmaXgpKSB7XG4gICAgICAgICAgdXJpID0gcHJlZml4ZXNbcHJlZml4XTtcbiAgICAgICAgICBpZiAodXJpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJpICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZUNVUklFT3JVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNVUklFT3JVUkkodmFsdWUsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICB2YXIgY3VyaWUgPSB0aGlzLnBhcnNlQ1VSSUUodmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgIGlmIChjdXJpZSkge1xuICAgICAgICByZXR1cm4gY3VyaWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQW5kTm9ybWFsaXplKGJhc2UsIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVByZWRpY2F0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUHJlZGljYXRlKHZhbHVlLCBkZWZhdWx0Vm9jYWJ1bGFyeSwgdGVybXMsIHByZWZpeGVzLCBiYXNlLCBpZ25vcmVUZXJtcykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSSh2YWx1ZSwgZGVmYXVsdFZvY2FidWxhcnksIGlnbm9yZVRlcm1zID8gbnVsbCA6IHRlcm1zLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICBpZiAocHJlZGljYXRlICYmIHByZWRpY2F0ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZWRpY2F0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVByZWZpeE1hcHBpbmdzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VQcmVmaXhNYXBwaW5ncyhzdHIsIHRhcmdldCkge1xuICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudG9rZW5pemUoc3RyKTtcbiAgICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgICAgLy8gdmFyIHVyaSA9IG51bGxcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbaV1bdmFsdWVzW2ldLmxlbmd0aCAtIDFdID09PSAnOicpIHtcbiAgICAgICAgICBwcmVmaXggPSB2YWx1ZXNbaV0uc3Vic3RyaW5nKDAsIHZhbHVlc1tpXS5sZW5ndGggLSAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICB0YXJnZXRbcHJlZml4XSA9IHRoaXMub3B0aW9ucy5iYXNlID8gVXJpLmpvaW4odmFsdWVzW2ldLCB0aGlzLm9wdGlvbnMuYmFzZSkgOiB2YWx1ZXNbaV07XG4gICAgICAgICAgcHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3BhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkodmFsdWUsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbSh2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSAnWycgJiYgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpID09PSAnXScpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09ICdfOicpIHtcbiAgICAgICAgICAvLyB0aGUgb25lIG5vZGVcbiAgICAgICAgICByZXR1cm4gdGhpcy50aGVPbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDVVJJRSh2YWx1ZSwgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDVVJJRU9yVVJJKHZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncGFyc2VUZXJtT3JDVVJJRU9yQWJzVVJJJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VUZXJtT3JDVVJJRU9yQWJzVVJJKHZhbHVlLCBkZWZhdWx0Vm9jYWJ1bGFyeSwgdGVybXMsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICAvLyBhbGVydChcIlBhcnNpbmcgXCIrdmFsdWUrXCIgd2l0aCBkZWZhdWx0IHZvY2FiIFwiK2RlZmF1bHRWb2NhYnVsYXJ5KVxuICAgICAgdmFsdWUgPSB0aGlzLnRyaW0odmFsdWUpO1xuICAgICAgdmFyIGN1cmllID0gdGhpcy5wYXJzZUNVUklFKHZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICBpZiAoY3VyaWUpIHtcbiAgICAgICAgcmV0dXJuIGN1cmllO1xuICAgICAgfSBlbHNlIGlmICh0ZXJtcykge1xuICAgICAgICBpZiAoZGVmYXVsdFZvY2FidWxhcnkgJiYgIXRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZvY2FidWxhcnkgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGVybSA9IHRlcm1zW3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGN2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRlcm0gPSB0ZXJtc1tsY3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVRlcm1PckNVUklFT3JVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVRlcm1PckNVUklFT3JVUkkodmFsdWUsIGRlZmF1bHRWb2NhYnVsYXJ5LCB0ZXJtcywgcHJlZml4ZXMsIGJhc2UpIHtcbiAgICAgIC8vIGFsZXJ0KFwiUGFyc2luZyBcIit2YWx1ZStcIiB3aXRoIGRlZmF1bHQgdm9jYWIgXCIrZGVmYXVsdFZvY2FidWxhcnkpXG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgY3VyaWUgPSB0aGlzLnBhcnNlQ1VSSUUodmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgIGlmIChjdXJpZSkge1xuICAgICAgICByZXR1cm4gY3VyaWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGVybSA9IHRlcm1zW3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGN2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRlcm0gPSB0ZXJtc1tsY3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFZvY2FidWxhcnkgJiYgIXRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZvY2FidWxhcnkgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncGFyc2VVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVVSSSh1cmkpIHtcbiAgICAgIHJldHVybiB1cmk7IC8vIFdlIGp1c3QgdXNlIHN0cmluZ3MgYXMgVVJJcywgbm90IG9iamVjdHMgbm93LlxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgIC8qXG4gICAgICBpZiAoIXdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICB3aW5kb3cuY29uc29sZSA9IHsgbG9nOiBmdW5jdGlvbigpIHt9IH1cbiAgICAgIH0qL1xuICAgICAgdmFyIGJhc2U7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgIGJhc2UgPSBub2RlLmJhc2VVUkk7XG4gICAgICAgIG5vZGUgPSBub2RlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbm9kZS5iYXNlVVJJID0gYmFzZTtcbiAgICAgICAgdGhpcy5zZXRDb250ZXh0KG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICB0aGlzLnNldENvbnRleHQobm9kZSk7XG4gICAgICB9XG4gICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgIC8vIEZpeCBmb3IgRmlyZWZveCB0aGF0IGluY2x1ZGVzIHRoZSBoYXNoIGluIHRoZSBiYXNlIFVSSVxuICAgICAgdmFyIHJlbW92ZUhhc2ggPSBmdW5jdGlvbiByZW1vdmVIYXNoKGJhc2VVUkkpIHtcbiAgICAgICAgLy8gRml4IGZvciB1bmRlZmluZWQgYmFzZVVSSSBwcm9wZXJ0eVxuICAgICAgICBpZiAoIWJhc2VVUkkgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmJhc2VVUkkpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5iYXNlVVJJO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc2ggPSBiYXNlVVJJLmluZGV4T2YoJyMnKTtcbiAgICAgICAgaWYgKGhhc2ggPj0gMCkge1xuICAgICAgICAgIGJhc2VVUkkgPSBiYXNlVVJJLnN1YnN0cmluZygwLCBoYXNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmJhc2VVUklNYXApIHtcbiAgICAgICAgICBiYXNlVVJJID0gb3B0aW9ucy5iYXNlVVJJTWFwKGJhc2VVUkkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVVJJO1xuICAgICAgfTtcbiAgICAgIHF1ZXVlLnB1c2goeyBjdXJyZW50OiBub2RlLFxuICAgICAgICBjb250ZXh0OiB0aGlzLnB1c2gobnVsbCwgcmVtb3ZlSGFzaChub2RlLmJhc2VVUkkpKVxuICAgICAgfSk7XG4gICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChpdGVtLnBhcmVudCkge1xuICAgICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMTQ6IGxpc3QgdHJpcGxlIGdlbmVyYXRpb25cbiAgICAgICAgICBpZiAoaXRlbS5jb250ZXh0LnBhcmVudCAmJiBpdGVtLmNvbnRleHQucGFyZW50Lmxpc3RNYXBwaW5nID09PSBpdGVtLmxpc3RNYXBwaW5nKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGEgY2hpbGQgY29udGV4dCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgbWFwcGluZ1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBsaXN0cyBmb3IgXCIraXRlbS5zdWJqZWN0K1wiLCB0YWcgXCIraXRlbS5wYXJlbnQubG9jYWxOYW1lKVxuICAgICAgICAgIGZvciAodmFyIF9wcmVkaWNhdGUgaW4gaXRlbS5saXN0TWFwcGluZykge1xuICAgICAgICAgICAgdmFyIGxpc3QgPSBpdGVtLmxpc3RNYXBwaW5nW19wcmVkaWNhdGVdO1xuICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGl0ZW0ucGFyZW50LCBpdGVtLnN1YmplY3QsIF9wcmVkaWNhdGUsIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI25pbCcgfSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJub2RlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxpc3QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIGJub2Rlcy5wdXNoKHRoaXMubmV3QmxhbmtOb2RlKCkpO1xuICAgICAgICAgICAgICAvLyB0aGlzLm5ld1N1YmplY3QoaXRlbS5wYXJlbnQsYm5vZGVzW2ldKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgYm5vZGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoaXRlbS5wYXJlbnQsIGJub2Rlc1tfaTJdLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2ZpcnN0JywgbGlzdFtfaTJdKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoaXRlbS5wYXJlbnQsIGJub2Rlc1tfaTJdLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3Jlc3QnLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogX2kyICsgMSA8IGJub2Rlcy5sZW5ndGggPyBibm9kZXNbX2kyICsgMV0gOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI25pbCcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShpdGVtLnBhcmVudCwgaXRlbS5zdWJqZWN0LCBfcHJlZGljYXRlLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogYm5vZGVzWzBdIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VycmVudCA9IGl0ZW0uY3VycmVudDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBpdGVtLmNvbnRleHQ7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFnOiBcIitjdXJyZW50LmxvY2FsTmFtZStcIiwgbGlzdE1hcHBpbmc9XCIrSlNPTi5zdHJpbmdpZnkoY29udGV4dC5saXN0TWFwcGluZykpXG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMVxuICAgICAgICB2YXIgc2tpcCA9IGZhbHNlO1xuICAgICAgICB2YXIgbmV3U3ViamVjdCA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSBudWxsO1xuICAgICAgICB2YXIgdHlwZWRSZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIHZhciBwcmVmaXhlcyA9IGNvbnRleHQucHJlZml4ZXM7XG4gICAgICAgIHZhciBwcmVmaXhlc0NvcGllZCA9IGZhbHNlO1xuICAgICAgICB2YXIgaW5jb21wbGV0ZSA9IFtdO1xuICAgICAgICB2YXIgbGlzdE1hcHBpbmcgPSBjb250ZXh0Lmxpc3RNYXBwaW5nO1xuICAgICAgICB2YXIgbGlzdE1hcHBpbmdEaWZmZXJlbnQgPSAhY29udGV4dC5wYXJlbnQ7XG4gICAgICAgIHZhciBsYW5ndWFnZSA9IGNvbnRleHQubGFuZ3VhZ2U7XG4gICAgICAgIHZhciB2b2NhYnVsYXJ5ID0gY29udGV4dC52b2NhYnVsYXJ5O1xuICAgICAgICAvLyBUT0RPOiB0aGUgXCJiYXNlXCIgZWxlbWVudCBtYXkgYmUgdXNlZCBmb3IgSFRNTCtSREZhIDEuMVxuICAgICAgICBiYXNlID0gdGhpcy5wYXJzZVVSSShyZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSkpO1xuICAgICAgICBjdXJyZW50Lml0ZW0gPSBudWxsO1xuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDI6IHNldCB0aGUgZGVmYXVsdCB2b2NhYnVsYXJ5XG4gICAgICAgIHZhciB2b2NhYkF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgndm9jYWInKTtcbiAgICAgICAgaWYgKHZvY2FiQXR0KSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50cmltKHZvY2FiQXR0LnZhbHVlKTtcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdm9jYWJ1bGFyeSA9IHZhbHVlO1xuICAgICAgICAgICAgdmFyIGJhc2VTdWJqZWN0ID0gYmFzZS5zcGVjO1xuICAgICAgICAgICAgLy8gdGhpcy5uZXdTdWJqZWN0KGN1cnJlbnQsYmFzZVN1YmplY3QpXG4gICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShjdXJyZW50LCBiYXNlU3ViamVjdCwgJ2h0dHA6Ly93d3cudzMub3JnL25zL3JkZmEjdXNlc1ZvY2FidWxhcnknLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogdm9jYWJ1bGFyeSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdm9jYWJ1bGFyeSA9IHRoaXMudm9jYWJ1bGFyeTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VxdWVuY2UgU3RlcCAzOiBJUkkgbWFwcGluZ3NcbiAgICAgICAgLy8gaGFuZGxlIHhtbG5zIGF0dHJpYnV0ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gY3VycmVudC5hdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgIC8vIGlmIChhdHQubmFtZXNwYWNlVVJJPT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCIpIHtcbiAgICAgICAgICBpZiAoYXR0Lm5vZGVOYW1lLmNoYXJBdCgwKSA9PT0gJ3gnICYmIGF0dC5ub2RlTmFtZS5pbmRleE9mKCd4bWxuczonKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKCFwcmVmaXhlc0NvcGllZCkge1xuICAgICAgICAgICAgICBwcmVmaXhlcyA9IHRoaXMuY29weU1hcHBpbmdzKHByZWZpeGVzKTtcbiAgICAgICAgICAgICAgcHJlZml4ZXNDb3BpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByZWZpeCA9IGF0dC5ub2RlTmFtZS5zdWJzdHJpbmcoNik7XG4gICAgICAgICAgICAvLyBUT0RPOiByZXNvbHZlIHJlbGF0aXZlP1xuICAgICAgICAgICAgdmFyIHJlZiA9IFJERmFQcm9jZXNzb3IudHJpbShhdHQudmFsdWUpO1xuICAgICAgICAgICAgcHJlZml4ZXNbcHJlZml4XSA9IHRoaXMub3B0aW9ucy5iYXNlID8gVXJpLmpvaW4ocmVmLCB0aGlzLm9wdGlvbnMuYmFzZSkgOiByZWY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaXggbWFwcGluZ3MgKEBwcmVmaXgpXG4gICAgICAgIHZhciBwcmVmaXhBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3ByZWZpeCcpO1xuICAgICAgICBpZiAocHJlZml4QXR0KSB7XG4gICAgICAgICAgaWYgKCFwcmVmaXhlc0NvcGllZCkge1xuICAgICAgICAgICAgcHJlZml4ZXMgPSB0aGlzLmNvcHlNYXBwaW5ncyhwcmVmaXhlcyk7XG4gICAgICAgICAgICBwcmVmaXhlc0NvcGllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucGFyc2VQcmVmaXhNYXBwaW5ncyhwcmVmaXhBdHQudmFsdWUsIHByZWZpeGVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDQ6IGxhbmd1YWdlXG4gICAgICAgIHZhciB4bWxMYW5nQXR0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgIXhtbExhbmdBdHQgJiYgX2kzIDwgdGhpcy5sYW5nQXR0cmlidXRlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgICAgeG1sTGFuZ0F0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZU5TKHRoaXMubGFuZ0F0dHJpYnV0ZXNbX2kzXS5uYW1lc3BhY2VVUkksIHRoaXMubGFuZ0F0dHJpYnV0ZXNbX2kzXS5sb2NhbE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4bWxMYW5nQXR0KSB7XG4gICAgICAgICAgdmFyIF92YWx1ZSA9IFJERmFQcm9jZXNzb3IudHJpbSh4bWxMYW5nQXR0LnZhbHVlKTtcbiAgICAgICAgICBpZiAoX3ZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxhbmd1YWdlID0gX3ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYW5ndWFnZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZWxBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3JlbCcpO1xuICAgICAgICB2YXIgcmV2QXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdyZXYnKTtcbiAgICAgICAgdmFyIHR5cGVvZkF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgndHlwZW9mJyk7XG4gICAgICAgIHZhciBwcm9wZXJ0eUF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgncHJvcGVydHknKTtcbiAgICAgICAgdmFyIGRhdGF0eXBlQXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdkYXRhdHlwZScpO1xuICAgICAgICB2YXIgZGF0ZXRpbWVBdHQgPSB0aGlzLmluSFRNTE1vZGUgPyBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2RhdGV0aW1lJykgOiBudWxsO1xuICAgICAgICB2YXIgY29udGVudEF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgnY29udGVudCcpO1xuICAgICAgICB2YXIgYWJvdXRBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2Fib3V0Jyk7XG4gICAgICAgIHZhciBzcmNBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3NyYycpO1xuICAgICAgICB2YXIgcmVzb3VyY2VBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3Jlc291cmNlJyk7XG4gICAgICAgIHZhciBocmVmQXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdocmVmJyk7XG4gICAgICAgIHZhciBpbmxpc3RBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2lubGlzdCcpO1xuICAgICAgICB2YXIgcmVsQXR0UHJlZGljYXRlcyA9IFtdO1xuICAgICAgICB2YXIgcHJlZGljYXRlLCB2YWx1ZXM7XG4gICAgICAgIGlmIChyZWxBdHQpIHtcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHJlbEF0dC52YWx1ZSk7XG4gICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgdmFsdWVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHRoaXMucGFyc2VQcmVkaWNhdGUodmFsdWVzW19pNF0sIHZvY2FidWxhcnksIGNvbnRleHQudGVybXMsIHByZWZpeGVzLCBiYXNlLCB0aGlzLmluSFRNTE1vZGUgJiYgcHJvcGVydHlBdHQgIT09IG51bGwpO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgICByZWxBdHRQcmVkaWNhdGVzLnB1c2gocHJlZGljYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJldkF0dFByZWRpY2F0ZXMgPSBbXTtcbiAgICAgICAgaWYgKHJldkF0dCkge1xuICAgICAgICAgIHZhbHVlcyA9IHRoaXMudG9rZW5pemUocmV2QXR0LnZhbHVlKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCB2YWx1ZXMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgICAgICAgcHJlZGljYXRlID0gdGhpcy5wYXJzZVByZWRpY2F0ZSh2YWx1ZXNbX2k1XSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UsIHRoaXMuaW5IVE1MTW9kZSAmJiBwcm9wZXJ0eUF0dCk7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICAgICAgICAgIHJldkF0dFByZWRpY2F0ZXMucHVzaChwcmVkaWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZWN0aW9uIDMuMSwgYnVsbGV0IDdcbiAgICAgICAgaWYgKHRoaXMuaW5IVE1MTW9kZSAmJiAocmVsQXR0IHx8IHJldkF0dCkgJiYgcHJvcGVydHlBdHQpIHtcbiAgICAgICAgICBpZiAocmVsQXR0UHJlZGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlbEF0dCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXZBdHRQcmVkaWNhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV2QXR0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbEF0dCB8fCByZXZBdHQpIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDY6IGVzdGFibGlzaCBuZXcgc3ViamVjdCBhbmQgdmFsdWVcbiAgICAgICAgICBpZiAoYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKGFib3V0QXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSBuZXdTdWJqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW5ld1N1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICBuZXdTdWJqZWN0ID0gcmVtb3ZlSGFzaChjdXJyZW50LmJhc2VVUkkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnBhcmVudE9iamVjdCkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBWZXJpZnk6IElmIHRoZSB4bWw6YmFzZSBoYXMgYmVlbiBzZXQgYW5kIHRoZSBwYXJlbnRPYmplY3QgaXMgdGhlIGJhc2VVUkkgb2YgdGhlIHBhcmVudCwgdGhlbiB0aGUgc3ViamVjdCBuZWVkcyB0byBiZSB0aGUgbmV3IGJhc2UgVVJJXG4gICAgICAgICAgICAgIG5ld1N1YmplY3QgPSByZW1vdmVIYXNoKGN1cnJlbnQucGFyZW50Tm9kZS5iYXNlVVJJKSA9PT0gY29udGV4dC5wYXJlbnRPYmplY3QgPyByZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSkgOiBjb250ZXh0LnBhcmVudE9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc291cmNlQXR0KSB7XG4gICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKHJlc291cmNlQXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaHJlZkF0dCkge1xuICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjQXR0KSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQgJiYgISh0aGlzLmluWEhUTUxNb2RlICYmIChjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2hlYWQnIHx8IGN1cnJlbnQubG9jYWxOYW1lID09PSAnYm9keScpKSkge1xuICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLm5ld0JsYW5rTm9kZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICFhYm91dEF0dCAmJiB0aGlzLmluWEhUTUxNb2RlICYmIChjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2hlYWQnIHx8IGN1cnJlbnQubG9jYWxOYW1lID09PSAnYm9keScpKSB7XG4gICAgICAgICAgICB0eXBlZFJlc291cmNlID0gbmV3U3ViamVjdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSBjdXJyZW50T2JqZWN0UmVzb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5QXR0ICYmICFjb250ZW50QXR0ICYmICFkYXRhdHlwZUF0dCkge1xuICAgICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgNS4xOiBlc3RhYmxpc2ggYSBuZXcgc3ViamVjdFxuICAgICAgICAgIGlmIChhYm91dEF0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkoYWJvdXRBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCAmJiBjdXJyZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICghbmV3U3ViamVjdCAmJiBjb250ZXh0LnBhcmVudE9iamVjdCkge1xuICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5OiBJZiB0aGUgeG1sOmJhc2UgaGFzIGJlZW4gc2V0IGFuZCB0aGUgcGFyZW50T2JqZWN0IGlzIHRoZSBiYXNlVVJJIG9mIHRoZSBwYXJlbnQsIHRoZW4gdGhlIHN1YmplY3QgbmVlZHMgdG8gYmUgdGhlIG5ldyBiYXNlIFVSSVxuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICF0eXBlZFJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSAmJiBocmVmQXR0KSB7XG4gICAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSAmJiBzcmNBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXR5cGVkUmVzb3VyY2UgJiYgKHRoaXMuaW5YSFRNTE1vZGUgfHwgdGhpcy5pbkhUTUxNb2RlKSAmJiAoY3VycmVudC5sb2NhbE5hbWUgPT09ICdoZWFkJyB8fCBjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2JvZHknKSkge1xuICAgICAgICAgICAgICB0eXBlZFJlc291cmNlID0gbmV3U3ViamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSkge1xuICAgICAgICAgICAgICB0eXBlZFJlc291cmNlID0gdGhpcy5uZXdCbGFua05vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHR5cGVkUmVzb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQubG9jYWxOYW1lK1wiLCBuZXdTdWJqZWN0PVwiK25ld1N1YmplY3QrXCIsIHR5cGVkUmVzb3VyY2U9XCIrdHlwZWRSZXNvdXJjZStcIiwgY3VycmVudE9iamVjdFJlc291cmNlPVwiK2N1cnJlbnRPYmplY3RSZXNvdXJjZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDUuMjogZXN0YWJsaXNoIGEgbmV3IHN1YmplY3RcbiAgICAgICAgICBpZiAoYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKGFib3V0QXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCAmJiByZXNvdXJjZUF0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuZXdTdWJqZWN0ICYmIGhyZWZBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuZXdTdWJqZWN0ICYmIHNyY0F0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgIG5ld1N1YmplY3QgPSByZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmluWEhUTUxNb2RlIHx8IHRoaXMuaW5IVE1MTW9kZSkgJiYgKGN1cnJlbnQubG9jYWxOYW1lID09PSAnaGVhZCcgfHwgY3VycmVudC5sb2NhbE5hbWUgPT09ICdib2R5JykpIHtcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMubmV3QmxhbmtOb2RlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQucGFyZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeTogSWYgdGhlIHhtbDpiYXNlIGhhcyBiZWVuIHNldCBhbmQgdGhlIHBhcmVudE9iamVjdCBpcyB0aGUgYmFzZVVSSSBvZiB0aGUgcGFyZW50LCB0aGVuIHRoZSBzdWJqZWN0IG5lZWRzIHRvIGJlIHRoZSBuZXcgYmFzZSBVUklcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5QXR0KSB7XG4gICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZkF0dCkge1xuICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQudGFnTmFtZStcIjogbmV3U3ViamVjdD1cIituZXdTdWJqZWN0K1wiLCBjdXJyZW50T2JqZWN0UmVzb3VyY2U9XCIrY3VycmVudE9iamVjdFJlc291cmNlK1wiLCB0eXBlZFJlc291cmNlPVwiK3R5cGVkUmVzb3VyY2UrXCIsIHNraXA9XCIrc2tpcClcbiAgICAgICAgLy8gdmFyIHJkZmFEYXRhID0gbnVsbFxuICAgICAgICBpZiAobmV3U3ViamVjdCkge1xuICAgICAgICAgIC8vIHRoaXMubmV3U3ViamVjdChjdXJyZW50LG5ld1N1YmplY3QpXG4gICAgICAgICAgaWYgKGFib3V0QXR0IHx8IHJlc291cmNlQXR0IHx8IHR5cGVkUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICFhYm91dEF0dCAmJiAhcmVzb3VyY2VBdHQgJiYgY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICAgIGlkID0gY3VycmVudE9iamVjdFJlc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJTZXR0aW5nIGRhdGEgYXR0cmlidXRlIGZvciBcIitjdXJyZW50LmxvY2FsTmFtZStcIiBmb3Igc3ViamVjdCBcIitpZClcbiAgICAgICAgICAgIHRoaXMubmV3U3ViamVjdE9yaWdpbihjdXJyZW50LCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgNzogZ2VuZXJhdGUgdHlwZSB0cmlwbGVcbiAgICAgICAgaWYgKHR5cGVkUmVzb3VyY2UpIHtcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHR5cGVvZkF0dC52YWx1ZSk7XG4gICAgICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgdmFsdWVzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSSh2YWx1ZXNbX2k2XSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKG9iamVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShjdXJyZW50LCB0eXBlZFJlc291cmNlLCBSREZhUHJvY2Vzc29yLnR5cGVVUkksIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiBvYmplY3QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgODogbmV3IGxpc3QgbWFwcGluZ3MgaWYgdGhlcmUgaXMgYSBuZXcgc3ViamVjdFxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlN0ZXAgODogbmV3U3ViamVjdD1cIituZXdTdWJqZWN0K1wiLCBjb250ZXh0LnBhcmVudE9iamVjdD1cIitjb250ZXh0LnBhcmVudE9iamVjdClcbiAgICAgICAgaWYgKG5ld1N1YmplY3QgJiYgbmV3U3ViamVjdCAhPT0gY29udGV4dC5wYXJlbnRPYmplY3QpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGxpc3QgbWFwcGluZyBmb3IgXCIrbmV3U3ViamVjdClcbiAgICAgICAgICBsaXN0TWFwcGluZyA9IHt9O1xuICAgICAgICAgIGxpc3RNYXBwaW5nRGlmZmVyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDk6IGdlbmVyYXRlIG9iamVjdCB0cmlwbGVcbiAgICAgICAgaWYgKGN1cnJlbnRPYmplY3RSZXNvdXJjZSkge1xuICAgICAgICAgIGlmIChyZWxBdHQgJiYgaW5saXN0QXR0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCByZWxBdHRQcmVkaWNhdGVzLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgICAgICAgdmFyIF9saXN0ID0gbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTddXTtcbiAgICAgICAgICAgICAgaWYgKCFfbGlzdCkge1xuICAgICAgICAgICAgICAgIF9saXN0ID0gW107XG4gICAgICAgICAgICAgICAgbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTddXSA9IF9saXN0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9saXN0LnB1c2goeyB0eXBlOiBSREZhUHJvY2Vzc29yLm9iamVjdFVSSSwgdmFsdWU6IGN1cnJlbnRPYmplY3RSZXNvdXJjZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJlbEF0dCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIHJlbEF0dFByZWRpY2F0ZXNbX2k4XSwgeyB0eXBlOiBSREZhUHJvY2Vzc29yLm9iamVjdFVSSSwgdmFsdWU6IGN1cnJlbnRPYmplY3RSZXNvdXJjZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldkF0dCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgcmV2QXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pOSsrKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIGN1cnJlbnRPYmplY3RSZXNvdXJjZSwgcmV2QXR0UHJlZGljYXRlc1tfaTldLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VxdWVuY2UgU3RlcCAxMDogaW5jb21wbGV0ZSB0cmlwbGVzXG4gICAgICAgICAgaWYgKG5ld1N1YmplY3QgJiYgIWN1cnJlbnRPYmplY3RSZXNvdXJjZSAmJiAocmVsQXR0IHx8IHJldkF0dCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHRoaXMubmV3QmxhbmtOb2RlKCk7XG4gICAgICAgICAgICAvLyBhbGVydChjdXJyZW50LnRhZ05hbWUrXCI6IGdlbmVyYXRlZCBibGFuayBub2RlLCBuZXdTdWJqZWN0PVwiK25ld1N1YmplY3QrXCIgY3VycmVudE9iamVjdFJlc291cmNlPVwiK2N1cnJlbnRPYmplY3RSZXNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlbEF0dCAmJiBpbmxpc3RBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTAgPSAwOyBfaTEwIDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTArKykge1xuICAgICAgICAgICAgICB2YXIgX2xpc3QyID0gbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTEwXV07XG4gICAgICAgICAgICAgIGlmICghX2xpc3QyKSB7XG4gICAgICAgICAgICAgICAgX2xpc3QyID0gW107XG4gICAgICAgICAgICAgICAgbGlzdE1hcHBpbmdbcHJlZGljYXRlXSA9IF9saXN0MjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkZGluZyBpbmNvbXBsZXRlIGxpc3QgZm9yIFwiK3ByZWRpY2F0ZSlcbiAgICAgICAgICAgICAgaW5jb21wbGV0ZS5wdXNoKHsgcHJlZGljYXRlOiByZWxBdHRQcmVkaWNhdGVzW19pMTBdLCBsaXN0OiBfbGlzdDIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWxBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTErKykge1xuICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goeyBwcmVkaWNhdGU6IHJlbEF0dFByZWRpY2F0ZXNbX2kxMV0sIGZvcndhcmQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXZBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgcmV2QXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTIrKykge1xuICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goeyBwcmVkaWNhdGU6IHJldkF0dFByZWRpY2F0ZXNbX2kxMl0sIGZvcndhcmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIDExOiBDdXJyZW50IHByb3BlcnR5IHZhbHVlc1xuICAgICAgICBpZiAocHJvcGVydHlBdHQpIHtcbiAgICAgICAgICB2YXIgZGF0YXR5cGUgPSBudWxsO1xuICAgICAgICAgIHZhciBjb250ZW50ID0gbnVsbDtcbiAgICAgICAgICBpZiAoZGF0YXR5cGVBdHQpIHtcbiAgICAgICAgICAgIGRhdGF0eXBlID0gZGF0YXR5cGVBdHQudmFsdWUgPT09ICcnID8gUkRGYVByb2Nlc3Nvci5QbGFpbkxpdGVyYWxVUkkgOiB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSShkYXRhdHlwZUF0dC52YWx1ZSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKGRhdGV0aW1lQXR0ICYmICFjb250ZW50QXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBkYXRldGltZUF0dC52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBkYXRhdHlwZSA9PT0gUkRGYVByb2Nlc3Nvci5YTUxMaXRlcmFsVVJJIHx8IGRhdGF0eXBlID09PSBSREZhUHJvY2Vzc29yLkhUTUxMaXRlcmFsVVJJID8gbnVsbCA6IGNvbnRlbnRBdHQgPyBjb250ZW50QXR0LnZhbHVlIDogY3VycmVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRBdHQpIHtcbiAgICAgICAgICAgIGRhdGF0eXBlID0gUkRGYVByb2Nlc3Nvci5QbGFpbkxpdGVyYWxVUkk7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudEF0dC52YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGV0aW1lQXR0KSB7XG4gICAgICAgICAgICBjb250ZW50ID0gZGF0ZXRpbWVBdHQudmFsdWU7XG4gICAgICAgICAgICBkYXRhdHlwZSA9IFJERmFQcm9jZXNzb3IuZGVyaXZlRGF0ZVRpbWVUeXBlKGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFkYXRhdHlwZSkge1xuICAgICAgICAgICAgICBkYXRhdHlwZSA9IFJERmFQcm9jZXNzb3IuUGxhaW5MaXRlcmFsVVJJO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXJlbEF0dCAmJiAhcmV2QXR0KSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VBdHQpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29udGVudCAmJiBocmVmQXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbnRlbnQgJiYgc3JjQXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKHNyY0F0dC52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFkYXRhdHlwZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQpIHtcbiAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTtcbiAgICAgICAgICAgICAgY29udGVudCA9IHR5cGVkUmVzb3VyY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZW50ID0gY3VycmVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW5IVE1MTW9kZSAmJiBjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLmRlcml2ZURhdGVUaW1lVHlwZShjb250ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhdGF0eXBlKSB7XG4gICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHByb3BlcnR5QXR0LnZhbHVlKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gMDsgX2kxMyA8IHZhbHVlcy5sZW5ndGg7IF9pMTMrKykge1xuICAgICAgICAgICAgdmFyIF9wcmVkaWNhdGUyID0gdGhpcy5wYXJzZVByZWRpY2F0ZSh2YWx1ZXNbX2kxM10sIHZvY2FidWxhcnksIGNvbnRleHQudGVybXMsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIGlmIChfcHJlZGljYXRlMikge1xuICAgICAgICAgICAgICBpZiAoaW5saXN0QXR0KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9saXN0MyA9IGxpc3RNYXBwaW5nW19wcmVkaWNhdGUyXTtcbiAgICAgICAgICAgICAgICBpZiAoIV9saXN0Mykge1xuICAgICAgICAgICAgICAgICAgX2xpc3QzID0gW107XG4gICAgICAgICAgICAgICAgICBsaXN0TWFwcGluZ1tfcHJlZGljYXRlMl0gPSBfbGlzdDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9saXN0My5wdXNoKGRhdGF0eXBlID09PSBSREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkkgfHwgZGF0YXR5cGUgPT09IFJERmFQcm9jZXNzb3IuSFRNTExpdGVyYWxVUkkgPyB7IHR5cGU6IGRhdGF0eXBlLCB2YWx1ZTogY3VycmVudC5jaGlsZE5vZGVzIH0gOiB7IHR5cGU6IGRhdGF0eXBlID8gZGF0YXR5cGUgOiBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSwgdmFsdWU6IGNvbnRlbnQsIGxhbmd1YWdlOiBsYW5ndWFnZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YXR5cGUgPT09IFJERmFQcm9jZXNzb3IuWE1MTGl0ZXJhbFVSSSB8fCBkYXRhdHlwZSA9PT0gUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoY3VycmVudCwgbmV3U3ViamVjdCwgX3ByZWRpY2F0ZTIsIHsgdHlwZTogZGF0YXR5cGUsIHZhbHVlOiBjdXJyZW50LmNoaWxkTm9kZXMgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIF9wcmVkaWNhdGUyLCB7IHR5cGU6IGRhdGF0eXBlID8gZGF0YXR5cGUgOiBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSwgdmFsdWU6IGNvbnRlbnQsIGxhbmd1YWdlOiBsYW5ndWFnZSB9KTtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG5ld1N1YmplY3QrXCIgXCIrcHJlZGljYXRlK1wiPVwiK2NvbnRlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMTI6IGNvbXBsZXRlIGluY29tcGxldGUgdHJpcGxlcyB3aXRoIG5ldyBzdWJqZWN0XG4gICAgICAgIGlmIChuZXdTdWJqZWN0ICYmICFza2lwKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBjb250ZXh0LmluY29tcGxldGUubGVuZ3RoOyBfaTE0KyspIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluY29tcGxldGVbX2kxNF0ubGlzdCkge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkZGluZyBzdWJqZWN0IFwiK25ld1N1YmplY3QrXCIgdG8gbGlzdCBmb3IgXCIrY29udGV4dC5pbmNvbXBsZXRlW2ldLnByZWRpY2F0ZSlcbiAgICAgICAgICAgICAgLy8gVE9ETzogaXQgaXMgdW5jbGVhciB3aGF0IHRvIGRvIGhlcmVcbiAgICAgICAgICAgICAgY29udGV4dC5pbmNvbXBsZXRlW19pMTRdLmxpc3QucHVzaCh7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5pbmNvbXBsZXRlW19pMTRdLmZvcndhcmQpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY3VycmVudC50YWdOYW1lK1wiOiBjb21wbGV0aW5nIGZvcndhcmQgdHJpcGxlIFwiK2NvbnRleHQuaW5jb21wbGV0ZVtpXS5wcmVkaWNhdGUrXCIgd2l0aCBvYmplY3Q9XCIrbmV3U3ViamVjdClcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoY3VycmVudCwgY29udGV4dC5zdWJqZWN0LCBjb250ZXh0LmluY29tcGxldGVbX2kxNF0ucHJlZGljYXRlLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQudGFnTmFtZStcIjogY29tcGxldGluZyByZXZlcnNlIHRyaXBsZSB3aXRoIG9iamVjdD1cIitjb250ZXh0LnN1YmplY3QpXG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIGNvbnRleHQuaW5jb21wbGV0ZVtfaTE0XS5wcmVkaWNhdGUsIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiBjb250ZXh0LnN1YmplY3QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZENvbnRleHQgPSBudWxsO1xuICAgICAgICB2YXIgbGlzdFN1YmplY3QgPSBuZXdTdWJqZWN0O1xuICAgICAgICBpZiAoc2tpcCkge1xuICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBzdWJqZWN0IGJlIG51bGw/XG4gICAgICAgICAgY2hpbGRDb250ZXh0ID0gdGhpcy5wdXNoKGNvbnRleHQsIGNvbnRleHQuc3ViamVjdCk7XG4gICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHRoZSBlbnRPYmplY3QgYmUgcGFzc2VkIGFsb25nPyAgSWYgbm90LCB0aGVuIGludGVybWVkaWFyeSBjaGlsZHJlbiB3aWxsIGtlZXAgcHJvcGVydGllcyBmcm9tIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBpbmNvbXBsZXRlIHRyaXBsZXMuXG4gICAgICAgICAgLy8gVE9ETzogVmVyaWZ5OiBpZiB0aGUgY3VycmVudCBiYXNlVVJJIGhhcyBjaGFuZ2VkIGFuZCB0aGUgcGFyZW50T2JqZWN0IGlzIHRoZSBwYXJlbnQncyBiYXNlIFVSSSwgdGhlbiB0aGUgYmFzZVVSSSBzaG91bGQgY2hhbmdlXG4gICAgICAgICAgY2hpbGRDb250ZXh0LnBhcmVudE9iamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5pbmNvbXBsZXRlID0gY29udGV4dC5pbmNvbXBsZXRlO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5wcmVmaXhlcyA9IHByZWZpeGVzO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC52b2NhYnVsYXJ5ID0gdm9jYWJ1bGFyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZENvbnRleHQgPSB0aGlzLnB1c2goY29udGV4dCwgbmV3U3ViamVjdCk7XG4gICAgICAgICAgY2hpbGRDb250ZXh0LnBhcmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RSZXNvdXJjZSA/IGN1cnJlbnRPYmplY3RSZXNvdXJjZSA6IG5ld1N1YmplY3QgPyBuZXdTdWJqZWN0IDogY29udGV4dC5zdWJqZWN0O1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5wcmVmaXhlcyA9IHByZWZpeGVzO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5pbmNvbXBsZXRlID0gaW5jb21wbGV0ZTtcbiAgICAgICAgICBpZiAoY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGxpc3QgbWFwcGluZyBmb3IgXCIrY3VycmVudE9iamVjdFJlc291cmNlKVxuICAgICAgICAgICAgbGlzdFN1YmplY3QgPSBjdXJyZW50T2JqZWN0UmVzb3VyY2U7XG4gICAgICAgICAgICBsaXN0TWFwcGluZyA9IHt9O1xuICAgICAgICAgICAgbGlzdE1hcHBpbmdEaWZmZXJlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZENvbnRleHQubGlzdE1hcHBpbmcgPSBsaXN0TWFwcGluZztcbiAgICAgICAgICBjaGlsZENvbnRleHQubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgICBjaGlsZENvbnRleHQudm9jYWJ1bGFyeSA9IHZvY2FidWxhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RNYXBwaW5nRGlmZmVyZW50KSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQdXNoaW5nIGxpc3QgcGFyZW50IFwiK2N1cnJlbnQubG9jYWxOYW1lKVxuICAgICAgICAgIHF1ZXVlLnVuc2hpZnQoeyBwYXJlbnQ6IGN1cnJlbnQsIGNvbnRleHQ6IGNvbnRleHQsIHN1YmplY3Q6IGxpc3RTdWJqZWN0LCBsaXN0TWFwcGluZzogbGlzdE1hcHBpbmcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBjdXJyZW50Lmxhc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQdXNoaW5nIGNoaWxkIFwiK2NoaWxkLmxvY2FsTmFtZSlcbiAgICAgICAgICAgIGNoaWxkLmJhc2VVUkkgPSBjdXJyZW50LmJhc2VVUkk7XG4gICAgICAgICAgICBxdWV1ZS51bnNoaWZ0KHsgY3VycmVudDogY2hpbGQsIGNvbnRleHQ6IGNoaWxkQ29udGV4dCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluSFRNTE1vZGUpIHtcbiAgICAgICAgdGhpcy5jb3B5UHJvcGVydGllcygpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCB0aGlzLmZpbmlzaGVkSGFuZGxlcnMubGVuZ3RoOyBfaTE1KyspIHtcbiAgICAgICAgdGhpcy5maW5pc2hlZEhhbmRsZXJzW19pMTVdKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3B1c2gnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHBhcmVudCwgc3ViamVjdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIHN1YmplY3Q6IHN1YmplY3QgPyBzdWJqZWN0IDogcGFyZW50ID8gcGFyZW50LnN1YmplY3QgOiBudWxsLFxuICAgICAgICBwYXJlbnRPYmplY3Q6IG51bGwsXG4gICAgICAgIGluY29tcGxldGU6IFtdLFxuICAgICAgICBsaXN0TWFwcGluZzogcGFyZW50ID8gcGFyZW50Lmxpc3RNYXBwaW5nIDoge30sXG4gICAgICAgIGxhbmd1YWdlOiBwYXJlbnQgPyBwYXJlbnQubGFuZ3VhZ2UgOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICBwcmVmaXhlczogcGFyZW50ID8gcGFyZW50LnByZWZpeGVzIDogdGhpcy50YXJnZXQuZ3JhcGgucHJlZml4ZXMsXG4gICAgICAgIHRlcm1zOiBwYXJlbnQgPyBwYXJlbnQudGVybXMgOiB0aGlzLnRhcmdldC5ncmFwaC50ZXJtcyxcbiAgICAgICAgdm9jYWJ1bGFyeTogcGFyZW50ID8gcGFyZW50LnZvY2FidWxhcnkgOiB0aGlzLnZvY2FidWxhcnlcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVzb2x2ZUFuZE5vcm1hbGl6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgdXJpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkpvaW5pbmcgXCIgKyB1cmkgKyBcIiB0byBcIiArIGJhc2UgKyBcIiBtYWtpbmcgXCIgKyAgVXJpLmpvaW4odXJpLCBiYXNlKSlcbiAgICAgIHJldHVybiBVcmkuam9pbih1cmksIGJhc2UpOyAvLyBAQCBub3JtYWxpemU/XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0Q29udGV4dCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRleHQobm9kZSkge1xuICAgICAgLy8gV2Ugb25seSByZWNvZ25pemVkIFhIVE1MK1JERmEgMS4xIGlmIHRoZSB2ZXJzaW9uIGlzIHNldCBwcm9wZXJ0eWx5XG4gICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdodG1sJyAmJiBub2RlLmdldEF0dHJpYnV0ZSgndmVyc2lvbicpID09PSAnWEhUTUwrUkRGYSAxLjEnKSB7XG4gICAgICAgIHRoaXMuc2V0WEhUTUxDb250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnaHRtbCcgfHwgbm9kZS5uYW1lc3BhY2VVUkkgPT09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJykge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N0eXBlKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3R5cGUucHVibGljSWQgPT09ICctLy9XM0MvL0RURCBYSFRNTCtSREZhIDEuMC8vRU4nICYmIGRvY3VtZW50LmRvY3R5cGUuc3lzdGVtSWQgPT09ICdodHRwOi8vd3d3LnczLm9yZy9NYXJrVXAvRFREL3hodG1sLXJkZmEtMS5kdGQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogUkRGIDEuMCBpcyBub3Qgc3VwcG9ydGVkLiAgRGVmYXVsdGluZyB0byBIVE1MNSBtb2RlLicpO1xuICAgICAgICAgICAgdGhpcy5zZXRIVE1MQ29udGV4dCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZG9jdHlwZS5wdWJsaWNJZCA9PT0gJy0vL1czQy8vRFREIFhIVE1MK1JERmEgMS4xLy9FTicgJiYgZG9jdW1lbnQuZG9jdHlwZS5zeXN0ZW1JZCA9PT0gJ2h0dHA6Ly93d3cudzMub3JnL01hcmtVcC9EVEQveGh0bWwtcmRmYS0yLmR0ZCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0WEhUTUxDb250ZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SFRNTENvbnRleHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRIVE1MQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFhNTENvbnRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRIVE1MQ29udGV4dCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEhUTUxDb250ZXh0KCkge1xuICAgICAgdGhpcy5zZXRJbml0aWFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnXG4gICAgICB9LCB7IG5hbWVzcGFjZVVSSTogbnVsbCwgbG9jYWxOYW1lOiAnbGFuZycgfV07XG4gICAgICB0aGlzLmluWEhUTUxNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmluSFRNTE1vZGUgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldEluaXRpYWxDb250ZXh0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SW5pdGlhbENvbnRleHQoKSB7XG4gICAgICB0aGlzLnZvY2FidWxhcnkgPSBudWxsO1xuICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIHByZWZpeGVzIGFyZSB0ZXJtcyBhcmUgbG9hZGVkIHRvIHRoZSBSREZhIDEuMS4gc3RhbmRhcmQgd2l0aGluIHRoZSBncmFwaCBjb25zdHJ1Y3RvclxuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnXG4gICAgICB9XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRYSFRNTENvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRYSFRNTENvbnRleHQoKSB7XG4gICAgICB0aGlzLnNldEluaXRpYWxDb250ZXh0KCk7XG4gICAgICB0aGlzLmluWEhUTUxNb2RlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5IVE1MTW9kZSA9IGZhbHNlO1xuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnIH0sIHsgbmFtZXNwYWNlVVJJOiBudWxsLCBsb2NhbE5hbWU6ICdsYW5nJyB9XTtcbiAgICAgIC8vIEZyb20gaHR0cDovL3d3dy53My5vcmcvMjAxMS9yZGZhLWNvbnRleHQveGh0bWwtcmRmYS0xLjFcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydhbHRlcm5hdGUnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2FsdGVybmF0ZSc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snYXBwZW5kaXgnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2FwcGVuZGl4JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydib29rbWFyayddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjYm9va21hcmsnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NpdGUnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2NpdGUnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NoYXB0ZXInXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2NoYXB0ZXInO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NvbnRlbnRzJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNjb250ZW50cyc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snY29weXJpZ2h0J10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNjb3B5cmlnaHQnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2ZpcnN0J10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNmaXJzdCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snZ2xvc3NhcnknXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2dsb3NzYXJ5JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydoZWxwJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNoZWxwJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydpY29uJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNpY29uJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydpbmRleCddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjaW5kZXgnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2xhc3QnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2xhc3QnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2xpY2Vuc2UnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2xpY2Vuc2UnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ21ldGEnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI21ldGEnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ25leHQnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI25leHQnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ3ByZXYnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3ByZXYnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ3ByZXZpb3VzJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNwcmV2aW91cyc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc2VjdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc2VjdGlvbic7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3R5bGVzaGVldCddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc3R5bGVzaGVldCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3Vic2VjdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc3Vic2VjdGlvbic7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3RhcnQnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3N0YXJ0JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWyd0b3AnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3RvcCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1sndXAnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3VwJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydwM3B2MSddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjcDNwdjEnO1xuICAgICAgLy8gb3RoZXJcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydyZWxhdGVkJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNyZWxhdGVkJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydyb2xlJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNyb2xlJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWyd0cmFuc2Zvcm1hdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjdHJhbnNmb3JtYXRpb24nO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFhNTENvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRYTUxDb250ZXh0KCkge1xuICAgICAgdGhpcy5zZXRJbml0aWFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5pblhIVE1MTW9kZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pbkhUTUxNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9rZW5pemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b2tlbml6ZShzdHIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyaW0oc3RyKS5zcGxpdCgvXFxzKy8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvUkRGTm9kZU9iamVjdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUkRGTm9kZU9iamVjdCh4KSB7XG4gICAgICBpZiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoeC5zdWJzdHJpbmcoMCwgMikgPT09ICdfOicpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmxhbmtOb2Rlc1t4LnN1YnN0cmluZygyKV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmJsYW5rTm9kZXNbeC5zdWJzdHJpbmcoMildID0gbmV3IEJsYW5rTm9kZSh4LnN1YnN0cmluZygyKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmJsYW5rTm9kZXNbeC5zdWJzdHJpbmcoMildO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZGYubmFtZWROb2RlKHgpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh4LnR5cGUpIHtcbiAgICAgICAgY2FzZSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTpcbiAgICAgICAgICBpZiAoeC52YWx1ZS5zdWJzdHJpbmcoMCwgMikgPT09ICdfOicpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5ibGFua05vZGVzW3gudmFsdWUuc3Vic3RyaW5nKDIpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5ibGFua05vZGVzW3gudmFsdWUuc3Vic3RyaW5nKDIpXSA9IG5ldyBCbGFua05vZGUoeC52YWx1ZS5zdWJzdHJpbmcoMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxhbmtOb2Rlc1t4LnZhbHVlLnN1YnN0cmluZygyKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZGYubmFtZWROb2RlKHgudmFsdWUpO1xuICAgICAgICBjYXNlIFJERmFQcm9jZXNzb3IuUGxhaW5MaXRlcmFsVVJJOlxuICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh4LnZhbHVlLCB4Lmxhbmd1YWdlIHx8ICcnKTtcbiAgICAgICAgY2FzZSBSREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkk6XG4gICAgICAgIGNhc2UgUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSTpcbiAgICAgICAgICB2YXIgc3RyaW5nID0gJyc7XG4gICAgICAgICAgT2JqZWN0LmtleXMoeC52YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgc3RyaW5nICs9IFV0aWwuZG9tVG9TdHJpbmcoeC52YWx1ZVtpXSwgdGhpcy5odG1sT3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHN0cmluZywgJycsIG5ldyBOYW1lZE5vZGUoeC50eXBlKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHgudmFsdWUsICcnLCBuZXcgTmFtZWROb2RlKHgudHlwZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RyaW0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmltKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzXFxzKi8sICcnKS5yZXBsYWNlKC9cXHNcXHMqJC8sICcnKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ3BhcnNlUkRGYURPTScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUkRGYURPTShkb20sIGtiLCBiYXNlKSB7XG4gICAgICB2YXIgcCA9IG5ldyBSREZhUHJvY2Vzc29yKGtiLCB7ICdiYXNlJzogYmFzZSB9KTtcbiAgICAgIGRvbS5iYXNlVVJJID0gYmFzZTtcbiAgICAgIHAucHJvY2Vzcyhkb20pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSREZhUHJvY2Vzc29yO1xufSgpO1xuXG5SREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1hNTExpdGVyYWwnO1xuUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjSFRNTCc7XG5SREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjUGxhaW5MaXRlcmFsJztcblJERmFQcm9jZXNzb3Iub2JqZWN0VVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyNvYmplY3QnO1xuUkRGYVByb2Nlc3Nvci50eXBlVVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcblJERmFQcm9jZXNzb3IubmFtZUNoYXIgPSAnWy1BLVpfYS16XFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUxMDAwMC1cXHVFRkZGRi4wLTlcXHhCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0nO1xuUkRGYVByb2Nlc3Nvci5uYW1lU3RhcnRDaGFyID0gJ1tBLVphLXpcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx4RkZcXHUwMTAwLVxcdTAxMzFcXHUwMTM0LVxcdTAxM0VcXHUwMTQxLVxcdTAxNDhcXHUwMTRBLVxcdTAxN0VcXHUwMTgwLVxcdTAxQzNcXHUwMUNELVxcdTAxRjBcXHUwMUY0LVxcdTAxRjVcXHUwMUZBLVxcdTAyMTdcXHUwMjUwLVxcdTAyQThcXHUwMkJCLVxcdTAyQzFcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNDRVxcdTAzRDAtXFx1MDNENlxcdTAzREFcXHUwM0RDXFx1MDNERVxcdTAzRTBcXHUwM0UyLVxcdTAzRjNcXHUwNDAxLVxcdTA0MENcXHUwNDBFLVxcdTA0NEZcXHUwNDUxLVxcdTA0NUNcXHUwNDVFLVxcdTA0ODFcXHUwNDkwLVxcdTA0QzRcXHUwNEM3LVxcdTA0QzhcXHUwNENCLVxcdTA0Q0NcXHUwNEQwLVxcdTA0RUJcXHUwNEVFLVxcdTA0RjVcXHUwNEY4LVxcdTA0RjlcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg2XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMS1cXHUwNjNBXFx1MDY0MS1cXHUwNjRBXFx1MDY3MS1cXHUwNkI3XFx1MDZCQS1cXHUwNkJFXFx1MDZDMC1cXHUwNkNFXFx1MDZEMC1cXHUwNkQzXFx1MDZENVxcdTA2RTUtXFx1MDZFNlxcdTA5MDUtXFx1MDkzOVxcdTA5M0RcXHUwOTU4LVxcdTA5NjFcXHUwOTg1LVxcdTA5OENcXHUwOThGLVxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlEQy1cXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMC1cXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRi1cXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMi1cXHUwQTMzXFx1MEEzNS1cXHUwQTM2XFx1MEEzOC1cXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4QlxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyLVxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFFMFxcdTBCMDUtXFx1MEIwQ1xcdTBCMEYtXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzItXFx1MEIzM1xcdTBCMzYtXFx1MEIzOVxcdTBCM0RcXHUwQjVDLVxcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5LVxcdTBCOUFcXHUwQjlDXFx1MEI5RS1cXHUwQjlGXFx1MEJBMy1cXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI1XFx1MEJCNy1cXHUwQkI5XFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzMzXFx1MEMzNS1cXHUwQzM5XFx1MEM2MC1cXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENERVxcdTBDRTAtXFx1MENFMVxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQyOFxcdTBEMkEtXFx1MEQzOVxcdTBENjAtXFx1MEQ2MVxcdTBFMDEtXFx1MEUyRVxcdTBFMzBcXHUwRTMyLVxcdTBFMzNcXHUwRTQwLVxcdTBFNDVcXHUwRTgxLVxcdTBFODJcXHUwRTg0XFx1MEU4Ny1cXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUEtXFx1MEVBQlxcdTBFQUQtXFx1MEVBRVxcdTBFQjBcXHUwRUIyLVxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjY5XFx1MTBBMC1cXHUxMEM1XFx1MTBEMC1cXHUxMEY2XFx1MTEwMFxcdTExMDItXFx1MTEwM1xcdTExMDUtXFx1MTEwN1xcdTExMDlcXHUxMTBCLVxcdTExMENcXHUxMTBFLVxcdTExMTJcXHUxMTNDXFx1MTEzRVxcdTExNDBcXHUxMTRDXFx1MTE0RVxcdTExNTBcXHUxMTU0LVxcdTExNTVcXHUxMTU5XFx1MTE1Ri1cXHUxMTYxXFx1MTE2M1xcdTExNjVcXHUxMTY3XFx1MTE2OVxcdTExNkQtXFx1MTE2RVxcdTExNzItXFx1MTE3M1xcdTExNzVcXHUxMTlFXFx1MTFBOFxcdTExQUJcXHUxMUFFLVxcdTExQUZcXHUxMUI3LVxcdTExQjhcXHUxMUJBXFx1MTFCQy1cXHUxMUMyXFx1MTFFQlxcdTExRjBcXHUxMUY5XFx1MUUwMC1cXHUxRTlCXFx1MUVBMC1cXHUxRUY5XFx1MUYwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIxMjZcXHUyMTJBLVxcdTIxMkJcXHUyMTJFXFx1MjE4MC1cXHUyMTgyXFx1MzA0MS1cXHUzMDk0XFx1MzBBMS1cXHUzMEZBXFx1MzEwNS1cXHUzMTJDXFx1QUMwMC1cXHVEN0EzXFx1NEUwMC1cXHU5RkE1XFx1MzAwN1xcdTMwMjEtXFx1MzAyOV9dJztcblJERmFQcm9jZXNzb3IuTkNOQU1FID0gbmV3IFJlZ0V4cCgnXicgKyBSREZhUHJvY2Vzc29yLm5hbWVTdGFydENoYXIgKyBSREZhUHJvY2Vzc29yLm5hbWVDaGFyICsgJyokJyk7XG5cbi8qXG5SREZhUHJvY2Vzc29yLnByb3RvdHlwZS5yZXNvbHZlQW5kTm9ybWFsaXplID0gZnVuY3Rpb24oYmFzZSxocmVmKSB7XG4gICB2YXIgdSA9IGJhc2UucmVzb2x2ZShocmVmKVxuICAgdmFyIHBhcnNlZCA9IHRoaXMucGFyc2VVUkkodSlcbiAgIHBhcnNlZC5ub3JtYWxpemUoKVxuICAgcmV0dXJuIHBhcnNlZC5zcGVjXG59XG4qL1xuXG5SREZhUHJvY2Vzc29yLmRhdGVUaW1lVHlwZXMgPSBbeyBwYXR0ZXJuOiAvLT9QKD86WzAtOV0rWSk/KD86WzAtOV0rTSk/KD86WzAtOV0rRCk/KD86VCg/OlswLTldK0gpPyg/OlswLTldK00pPyg/OlswLTldKyg/OlxcLlswLTldKyk/Uyk/KT8vLFxuICB0eXBlOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZHVyYXRpb24nIH0sIHsgcGF0dGVybjogLy0/KD86WzEtOV1bMC05XVswLTldWzAtOV18MFsxLTldWzAtOV1bMC05XXwwMFsxLTldWzAtOV18MDAwWzEtOV0pLVswLTldWzAtOV0tWzAtOV1bMC05XVQoPzpbMC0xXVswLTldfDJbMC00XSk6WzAtNV1bMC05XTpbMC01XVswLTldKD86XFwuWzAtOV0rKT8oPzpafFsrXFwtXVswLTldWzAtOV06WzAtOV1bMC05XSk/LyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RhdGVUaW1lJyB9LCB7IHBhdHRlcm46IC8tPyg/OlsxLTldWzAtOV1bMC05XVswLTldfDBbMS05XVswLTldWzAtOV18MDBbMS05XVswLTldfDAwMFsxLTldKS1bMC05XVswLTldLVswLTldWzAtOV0oPzpafFsrXFwtXVswLTldWzAtOV06WzAtOV1bMC05XSk/LyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RhdGUnIH0sIHsgcGF0dGVybjogLyg/OlswLTFdWzAtOV18MlswLTRdKTpbMC01XVswLTldOlswLTVdWzAtOV0oPzpcXC5bMC05XSspPyg/Olp8WytcXC1dWzAtOV1bMC05XTpbMC05XVswLTldKT8vLFxuICB0eXBlOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjdGltZScgfSwgeyBwYXR0ZXJuOiAvLT8oPzpbMS05XVswLTldWzAtOV1bMC05XXwwWzEtOV1bMC05XVswLTldfDAwWzEtOV1bMC05XXwwMDBbMS05XSktWzAtOV1bMC05XS8sXG4gIHR5cGU6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNnWWVhck1vbnRoJyB9LCB7IHBhdHRlcm46IC8tP1sxLTldWzAtOV1bMC05XVswLTldfDBbMS05XVswLTldWzAtOV18MDBbMS05XVswLTldfDAwMFsxLTldLyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2dZZWFyJyB9XTtcblxubW9kdWxlLmV4cG9ydHMgPSBSREZhUHJvY2Vzc29yOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiAgUkRGL1hNTCBQQVJTRVJcbiAqXG4gKiBWZXJzaW9uIDAuMVxuICogIFBhcnNlciBiZWxpZXZlZCB0byBiZSBpbiBmdWxsIHBvc2l0aXZlIFJERi9YTUwgcGFyc2luZyBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mIGhhbmRsaW5nIGRlcHJlY2F0ZWQgUkRGIGF0dHJpYnV0ZXNcbiAqICBhcHByb3ByaWF0ZWx5LiBQYXJzZXIgaXMgYmVsaWV2ZWQgdG8gY29tcGx5IGZ1bGx5IHdpdGggb3RoZXIgVzNDXG4gKiAgYW5kIGluZHVzdHJ5IHN0YW5kYXJkcyB3aGVyZSBhcHByb3ByaWF0ZSAoRE9NLCBFQ01BU2NyaXB0LCAmYy4pXG4gKlxuICogIEF1dGhvcjogRGF2aWQgU2hlZXRzIDxkc2hlZXRzQG1pdC5lZHU+XG4gKlxuICogVzNDwq4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFXG4gKiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxXG4gKiBUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yXG4gKiBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXJcbiAqIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssXG4gKiB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbFxuICogY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy5cbiAqXG4gKiBQZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzXG4gKiBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBmb3IgYW55IHB1cnBvc2UgYW5kXG4gKiB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlXG4gKiB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yXG4gKiBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uczpcbiAqXG4gKiAxLiBUaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2ZcbiAqIHRoZSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay5cbiAqIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSBXM0MgU29mdHdhcmUgU2hvcnQgTm90aWNlIHNob3VsZCBiZVxuICogaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHlcbiAqIG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZS5cbiAqIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZVxuICogZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvblxuICogZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLilcbiAqXG4gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEIFwiQVMgSVMsXCIgQU5EIENPUFlSSUdIVFxuICogSE9MREVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTXG4gKiBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SXG4gKiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLFxuICogVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuXG4gKlxuICogQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTFxuICogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SXG4gKiBET0NVTUVOVEFUSU9OLlxuICpcbiAqIFRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpblxuICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsXG4gKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnlcbiAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHRcbiAqIGhvbGRlcnMuXG4gKi9cbi8qKlxuICogQGNsYXNzIENsYXNzIGRlZmluaW5nIGFuIFJERlBhcnNlciByZXNvdXJjZSBvYmplY3QgdGllZCB0byBhbiBSREZTdG9yZVxuICpcbiAqIEBhdXRob3IgRGF2aWQgU2hlZXRzIDxkc2hlZXRzQG1pdC5lZHU+XG4gKiBAdmVyc2lvbiAwLjFcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UkRGU3RvcmV9IHN0b3JlIEFuIFJERlN0b3JlIG9iamVjdFxuICovXG52YXIgdXJpVXRpbCA9IHJlcXVpcmUoJy4vdXJpJyk7XG5cbnZhciBSREZQYXJzZXIgPSBmdW5jdGlvbiBSREZQYXJzZXIoc3RvcmUpIHtcbiAgdmFyIFJERlBhcnNlciA9IHt9O1xuXG4gIC8qKiBTdGFuZGFyZCBuYW1lc3BhY2VzIHRoYXQgd2Uga25vdyBob3cgdG8gaGFuZGxlIEBmaW5hbFxuICAgKiAgQG1lbWJlciBSREZQYXJzZXJcbiAgICovXG4gIFJERlBhcnNlci5ucyA9IHsgJ1JERic6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJywgJ1JERlMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIycgfTtcblxuICAvKiogRE9NIExldmVsIDIgbm9kZSB0eXBlIG1hZ2ljIG51bWJlcnMgQGZpbmFsXG4gICAqICBAbWVtYmVyIFJERlBhcnNlclxuICAgKi9cbiAgUkRGUGFyc2VyLm5vZGVUeXBlID0geyAnRUxFTUVOVCc6IDEsICdBVFRSSUJVVEUnOiAyLCAnVEVYVCc6IDMsXG4gICAgJ0NEQVRBX1NFQ1RJT04nOiA0LCAnRU5USVRZX1JFRkVSRU5DRSc6IDUsXG4gICAgJ0VOVElUWSc6IDYsICdQUk9DRVNTSU5HX0lOU1RSVUNUSU9OJzogNyxcbiAgICAnQ09NTUVOVCc6IDgsICdET0NVTUVOVCc6IDksICdET0NVTUVOVF9UWVBFJzogMTAsXG4gICAgJ0RPQ1VNRU5UX0ZSQUdNRU5UJzogMTEsICdOT1RBVElPTic6IDEyIH07XG5cbiAgLyoqXG4gICAqIEZyYW1lIGNsYXNzIGZvciBuYW1lc3BhY2UgYW5kIGJhc2UgVVJJIGxvb2t1cHNcbiAgICogQmFzZSBsb29rdXBzIHdpbGwgYWx3YXlzIHJlc29sdmUgYmVjYXVzZSB0aGUgcGFyc2VyIGtub3dzXG4gICAqIHRoZSBkZWZhdWx0IGJhc2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHRoaXMuZnJhbWVGYWN0b3J5ID0gZnVuY3Rpb24gKHBhcnNlciwgcGFyZW50LCBlbGVtZW50KSB7XG4gICAgcmV0dXJuIHsgJ05PREUnOiAxLCAnQVJDJzogMiwgJ3BhcmVudCc6IHBhcmVudCwgJ3BhcnNlcic6IHBhcnNlciwgJ3N0b3JlJzogcGFyc2VyLnN0b3JlLCAnZWxlbWVudCc6IGVsZW1lbnQsXG4gICAgICAnbGFzdENoaWxkJzogMCwgJ2Jhc2UnOiBudWxsLCAnbGFuZyc6IG51bGwsICdub2RlJzogbnVsbCwgJ25vZGVUeXBlJzogbnVsbCwgJ2xpc3RJbmRleCc6IDEsICdyZGZpZCc6IG51bGwsICdkYXRhdHlwZSc6IG51bGwsICdjb2xsZWN0aW9uJzogZmFsc2UsIC8qKiBUZXJtaW5hdGUgdGhlIGZyYW1lIGFuZCBub3RpZnkgdGhlIHN0b3JlIHRoYXQgd2UncmUgZG9uZSAqL1xuICAgICAgJ3Rlcm1pbmF0ZUZyYW1lJzogZnVuY3Rpb24gdGVybWluYXRlRnJhbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLm5vZGUuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIEFkZCBhIHN5bWJvbCBvZiBhIGNlcnRhaW4gdHlwZSB0byB0aGUgdGhpcyBmcmFtZSAqLydhZGRTeW1ib2wnOiBmdW5jdGlvbiBhZGRTeW1ib2wodHlwZSwgdXJpKSB7XG4gICAgICAgIHVyaSA9IHVyaVV0aWwuam9pbih1cmksIHRoaXMuYmFzZSk7XG4gICAgICAgIHRoaXMubm9kZSA9IHRoaXMuc3RvcmUuc3ltKHVyaSk7XG5cbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHR5cGU7XG4gICAgICB9LCAvKiogTG9hZCBhbnkgY29uc3RydWN0ZWQgdHJpcGxlcyBpbnRvIHRoZSBzdG9yZSAqLydsb2FkVHJpcGxlJzogZnVuY3Rpb24gbG9hZFRyaXBsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50LnBhcmVudC5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQucGFyZW50Lm5vZGUuYXBwZW5kKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5hZGQodGhpcy5wYXJlbnQucGFyZW50Lm5vZGUsIHRoaXMucGFyZW50Lm5vZGUsIHRoaXMubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQucmRmaWQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHJlaWZ5XG4gICAgICAgICAgdmFyIHRyaXBsZSA9IHRoaXMuc3RvcmUuc3ltKHVyaVV0aWwuam9pbignIycgKyB0aGlzLnBhcmVudC5yZGZpZCwgdGhpcy5iYXNlKSk7XG4gICAgICAgICAgdGhpcy5zdG9yZS5hZGQodHJpcGxlLCB0aGlzLnN0b3JlLnN5bShSREZQYXJzZXIubnMuUkRGICsgJ3R5cGUnKSwgdGhpcy5zdG9yZS5zeW0oUkRGUGFyc2VyLm5zLlJERiArICdTdGF0ZW1lbnQnKSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAnc3ViamVjdCcpLCB0aGlzLnBhcmVudC5wYXJlbnQubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAncHJlZGljYXRlJyksIHRoaXMucGFyZW50Lm5vZGUsIHRoaXMucGFyc2VyLndoeSk7XG5cbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAnb2JqZWN0JyksIHRoaXMubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIENoZWNrIGlmIGl0J3MgT0sgdG8gbG9hZCBhIHRyaXBsZSAqLydpc1RyaXBsZVRvTG9hZCc6IGZ1bmN0aW9uIGlzVHJpcGxlVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLm5vZGVUeXBlID09PSB0aGlzLk5PREUgJiYgdGhpcy5wYXJlbnQubm9kZVR5cGUgPT09IHRoaXMuQVJDICYmIHRoaXMucGFyZW50LnBhcmVudC5ub2RlVHlwZSA9PT0gdGhpcy5OT0RFO1xuICAgICAgfSwgLyoqIEFkZCBhIHN5bWJvbGljIG5vZGUgdG8gdGhpcyBmcmFtZSAqLydhZGROb2RlJzogZnVuY3Rpb24gYWRkTm9kZSh1cmkpIHtcbiAgICAgICAgdGhpcy5hZGRTeW1ib2wodGhpcy5OT0RFLCB1cmkpO1xuICAgICAgICBpZiAodGhpcy5pc1RyaXBsZVRvTG9hZCgpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkVHJpcGxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIC8qKiBBZGQgYSBjb2xsZWN0aW9uIG5vZGUgdG8gdGhpcyBmcmFtZSAqLydhZGRDb2xsZWN0aW9uJzogZnVuY3Rpb24gYWRkQ29sbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHRoaXMuTk9ERTtcbiAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5zdG9yZS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmlzVHJpcGxlVG9Mb2FkKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRUcmlwbGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIEFkZCBhIGNvbGxlY3Rpb24gYXJjIHRvIHRoaXMgZnJhbWUgKi8nYWRkQ29sbGVjdGlvbkFyYyc6IGZ1bmN0aW9uIGFkZENvbGxlY3Rpb25BcmMoKSB7XG4gICAgICAgIHRoaXMubm9kZVR5cGUgPSB0aGlzLkFSQztcbiAgICAgIH0sIC8qKiBBZGQgYSBibm9kZSB0byB0aGlzIGZyYW1lICovJ2FkZEJOb2RlJzogZnVuY3Rpb24gYWRkQk5vZGUoaWQpIHtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXJzZXIuYm5vZGVzW2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnBhcnNlci5ibm9kZXNbaWRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnBhcnNlci5ibm9kZXNbaWRdID0gdGhpcy5zdG9yZS5ibm9kZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnN0b3JlLmJub2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHRoaXMuTk9ERTtcbiAgICAgICAgaWYgKHRoaXMuaXNUcmlwbGVUb0xvYWQoKSkge1xuICAgICAgICAgIHRoaXMubG9hZFRyaXBsZSgpO1xuICAgICAgICB9XG4gICAgICB9LCAvKiogQWRkIGFuIGFyYyBvciBwcm9wZXJ0eSB0byB0aGlzIGZyYW1lICovJ2FkZEFyYyc6IGZ1bmN0aW9uIGFkZEFyYyh1cmkpIHtcbiAgICAgICAgaWYgKHVyaSA9PT0gUkRGUGFyc2VyLm5zLlJERiArICdsaScpIHtcbiAgICAgICAgICB1cmkgPSBSREZQYXJzZXIubnMuUkRGICsgJ18nICsgdGhpcy5wYXJlbnQubGlzdEluZGV4O1xuICAgICAgICAgIHRoaXMucGFyZW50Lmxpc3RJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRTeW1ib2wodGhpcy5BUkMsIHVyaSk7XG4gICAgICB9LCAvKiogQWRkIGEgbGl0ZXJhbCB0byB0aGlzIGZyYW1lICovJ2FkZExpdGVyYWwnOiBmdW5jdGlvbiBhZGRMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudC5kYXRhdHlwZSkge1xuICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMuc3RvcmUubGl0ZXJhbCh2YWx1ZSwgJycsIHRoaXMuc3RvcmUuc3ltKHRoaXMucGFyZW50LmRhdGF0eXBlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5zdG9yZS5saXRlcmFsKHZhbHVlLCB0aGlzLmxhbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVR5cGUgPSB0aGlzLk5PREU7XG4gICAgICAgIGlmICh0aGlzLmlzVHJpcGxlVG9Mb2FkKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRUcmlwbGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gZnJvbSB0aGUgT3BlbkxheWVycyBzb3VyY2UgLi4gbmVlZGVkIHRvIGdldCBhcm91bmQgSUUgcHJvYmxlbXMuXG4gIHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TID0gZnVuY3Rpb24gKG5vZGUsIHVyaSwgbmFtZSkge1xuICAgIHZhciBhdHRyaWJ1dGVOb2RlID0gbnVsbDtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlTlMpIHtcbiAgICAgIGF0dHJpYnV0ZU5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgIHZhciBwb3RlbnRpYWxOb2RlLCBmdWxsTmFtZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBwb3RlbnRpYWxOb2RlID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgaWYgKHBvdGVudGlhbE5vZGUubmFtZXNwYWNlVVJJID09PSB1cmkpIHtcbiAgICAgICAgICBmdWxsTmFtZSA9IHBvdGVudGlhbE5vZGUucHJlZml4ID8gcG90ZW50aWFsTm9kZS5wcmVmaXggKyAnOicgKyBuYW1lIDogbmFtZTtcbiAgICAgICAgICBpZiAoZnVsbE5hbWUgPT09IHBvdGVudGlhbE5vZGUubm9kZU5hbWUpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5vZGUgPSBwb3RlbnRpYWxOb2RlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVOb2RlO1xuICB9O1xuXG4gIC8qKiBPdXIgdHJpcGxlIHN0b3JlIHJlZmVyZW5jZSBAcHJpdmF0ZSAqL1xuXG4gIHRoaXMuc3RvcmUgPSBzdG9yZTsgLyoqIE91ciBpZGVudGlmaWVkIGJsYW5rIG5vZGVzIEBwcml2YXRlICovXG4gIHRoaXMuYm5vZGVzID0ge307IC8qKiBBIGNvbnRleHQgZm9yIGNvbnRleHQtYXdhcmUgc3RvcmVzIEBwcml2YXRlICovXG4gIHRoaXMud2h5ID0gbnVsbDsgLyoqIFJlaWZpY2F0aW9uIGZsYWcgKi9cbiAgdGhpcy5yZWlmeSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBvdXIgaW5pdGlhbCBzY29wZSBmcmFtZSBhbmQgcGFyc2UgdGhlIERPTSBpbnRvIHRyaXBsZXNcbiAgICogQHBhcmFtIHtET01UcmVlfSBkb2N1bWVudCBUaGUgRE9NIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiYXNlIFRoZSBiYXNlIFVSTCB0byB1c2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHdoeSBUaGUgY29udGV4dCB0byB3aGljaCB0aGlzIHJlc291cmNlIGJlbG9uZ3NcbiAgICovXG5cbiAgdGhpcy5wYXJzZSA9IGZ1bmN0aW9uIChkb2N1bWVudCwgYmFzZSwgd2h5KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZG9jdW1lbnQuY2hpbGROb2RlczsgLy8gY2xlYW4gdXAgZm9yIHRoZSBuZXh0IHJ1blxuICAgIHRoaXMuY2xlYW5QYXJzZXIoKTsgLy8gZmlndXJlIG91dCB0aGUgcm9vdCBlbGVtZW50XG4gICAgdmFyIHJvb3Q7XG4gICAgaWYgKGRvY3VtZW50Lm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuRE9DVU1FTlQpIHtcbiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NdLm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuRUxFTUVOVCkge1xuICAgICAgICAgIHJvb3QgPSBjaGlsZHJlbltjXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5FTEVNRU5UKSB7XG4gICAgICByb290ID0gZG9jdW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJERlBhcnNlcjogY2FuJ3QgZmluZCByb290IGluIFwiICsgYmFzZSArICcuIEhhbHRpbmcuICcpO1xuICAgICAgLy8gcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHRoaXMud2h5ID0gd2h5OyAvLyBvdXIgdG9wbW9zdCBmcmFtZVxuICAgIHZhciBmID0gdGhpcy5mcmFtZUZhY3RvcnkodGhpcyk7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICBmLmJhc2UgPSBiYXNlO1xuICAgIGYubGFuZyA9IG51bGw7IC8vIHdhcyAnJyBidXQgY2FuJ3QgaGF2ZSBsYW5ncyBsaWtlIHRoYXQgMjAxNSAoISlcbiAgICB0aGlzLnBhcnNlRE9NKHRoaXMuYnVpbGRGcmFtZShmLCByb290KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdGhpcy5wYXJzZURPTSA9IGZ1bmN0aW9uIChmcmFtZSkge1xuICAgIC8vIGEgRE9NIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBpbiBwYXJzaW5nXG4gICAgdmFyIHJkZmlkO1xuICAgIHZhciBlbGVtZW50VVJJID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICBpZiAoZWwubmFtZXNwYWNlVVJJID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSREYvWE1MIHN5bnRheCBlcnJvcjogTm8gbmFtZXNwYWNlIGZvciAnICsgZWwubG9jYWxOYW1lICsgJyBpbiAnICsgdGhpcy5iYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5uYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgZWwubmFtZXNwYWNlVVJJO1xuICAgICAgfVxuICAgICAgaWYgKGVsLmxvY2FsTmFtZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBlbC5sb2NhbE5hbWU7XG4gICAgICB9IGVsc2UgaWYgKGVsLm5vZGVOYW1lKSB7XG4gICAgICAgIGlmIChlbC5ub2RlTmFtZS5pbmRleE9mKCc6JykgPj0gMCkgcmVzdWx0ID0gcmVzdWx0ICsgZWwubm9kZU5hbWUuc3BsaXQoJzonKVsxXTtlbHNlIHJlc3VsdCA9IHJlc3VsdCArIGVsLm5vZGVOYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LmJpbmQodGhpcyk7XG4gICAgdmFyIGRpZyA9IHRydWU7IC8vIGlmIHdlJ2xsIGRpZyBkb3duIGluIHRoZSB0cmVlIG9uIHRoZSBuZXh0IGl0ZXJcbiAgICB3aGlsZSAoZnJhbWUucGFyZW50KSB7XG4gICAgICB2YXIgZG9tID0gZnJhbWUuZWxlbWVudDtcbiAgICAgIHZhciBhdHRycyA9IGRvbS5hdHRyaWJ1dGVzO1xuICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gUkRGUGFyc2VyLm5vZGVUeXBlLlRFWFQgfHwgZG9tLm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuQ0RBVEFfU0VDVElPTikge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgbGl0ZXJhbFxuICAgICAgICBpZiAoZnJhbWUucGFyZW50Lm5vZGVUeXBlID09PSBmcmFtZS5OT0RFKSB7XG4gICAgICAgICAgLy8gbXVzdCBoYXZlIGhhZCBhdHRyaWJ1dGVzLCBzdG9yZSBhcyByZGY6dmFsdWVcbiAgICAgICAgICBmcmFtZS5hZGRBcmMoUkRGUGFyc2VyLm5zLlJERiArICd2YWx1ZScpO1xuICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5hZGRMaXRlcmFsKGRvbS5ub2RlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50VVJJKGRvbSkgIT09IFJERlBhcnNlci5ucy5SREYgKyAnUkRGJykge1xuICAgICAgICAvLyBub3Qgcm9vdFxuICAgICAgICBpZiAoZnJhbWUucGFyZW50ICYmIGZyYW1lLnBhcmVudC5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgLy8gd2UncmUgYSBjb2xsZWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBmcmFtZS5hZGRDb2xsZWN0aW9uQXJjKCk7XG4gICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgIGZyYW1lLnBhcmVudC5lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyYW1lLnBhcmVudCB8fCAhZnJhbWUucGFyZW50Lm5vZGVUeXBlIHx8IGZyYW1lLnBhcmVudC5ub2RlVHlwZSA9PT0gZnJhbWUuQVJDKSB7XG4gICAgICAgICAgLy8gd2UgbmVlZCBhIG5vZGVcbiAgICAgICAgICB2YXIgYWJvdXQgPSB0aGlzLmdldEF0dHJpYnV0ZU5vZGVOUyhkb20sIFJERlBhcnNlci5ucy5SREYsICdhYm91dCcpO1xuICAgICAgICAgIHJkZmlkID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnSUQnKTtcbiAgICAgICAgICBpZiAoYWJvdXQgJiYgcmRmaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUkRGUGFyc2VyOiAnICsgZG9tLm5vZGVOYW1lICsgJyBoYXMgYm90aCByZGY6aWQgYW5kIHJkZjphYm91dC4nICsgJyBIYWx0aW5nLiBPbmx5IG9uZSBvZiB0aGVzZScgKyAnIHByb3BlcnRpZXMgbWF5IGJlIHNwZWNpZmllZCBvbiBhJyArICcgbm9kZS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFhYm91dCAmJiByZGZpZCkge1xuICAgICAgICAgICAgZnJhbWUuYWRkTm9kZSgnIycgKyByZGZpZC5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUocmRmaWQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWJvdXQgPT0gbnVsbCAmJiByZGZpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgYm5pZCA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ25vZGVJRCcpO1xuICAgICAgICAgICAgaWYgKGJuaWQpIHtcbiAgICAgICAgICAgICAgZnJhbWUuYWRkQk5vZGUoYm5pZC5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlTm9kZShibmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyYW1lLmFkZE5vZGUoYWJvdXQubm9kZVZhbHVlKTtcbiAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGFib3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVHlwZWQgbm9kZXNcbiAgICAgICAgICB2YXIgcmRmdHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ3R5cGUnKTtcbiAgICAgICAgICBpZiAoUkRGUGFyc2VyLm5zLlJERiArICdEZXNjcmlwdGlvbicgIT09IGVsZW1lbnRVUkkoZG9tKSkge1xuICAgICAgICAgICAgcmRmdHlwZSA9IHsgJ25vZGVWYWx1ZSc6IGVsZW1lbnRVUkkoZG9tKSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmRmdHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmFkZChmcmFtZS5ub2RlLCB0aGlzLnN0b3JlLnN5bShSREZQYXJzZXIubnMuUkRGICsgJ3R5cGUnKSwgdGhpcy5zdG9yZS5zeW0odXJpVXRpbC5qb2luKHJkZnR5cGUubm9kZVZhbHVlLCBmcmFtZS5iYXNlKSksIHRoaXMud2h5KTtcbiAgICAgICAgICAgIGlmIChyZGZ0eXBlLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHJkZnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBQcm9wZXJ0eSBBdHRyaWJ1dGVzXG4gICAgICAgICAgZm9yICh2YXIgeCA9IGF0dHJzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmFkZChmcmFtZS5ub2RlLCB0aGlzLnN0b3JlLnN5bShlbGVtZW50VVJJKGF0dHJzW3hdKSksIHRoaXMuc3RvcmUubGl0ZXJhbChhdHRyc1t4XS5ub2RlVmFsdWUsIGZyYW1lLmxhbmcpLCB0aGlzLndoeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgYW4gYXJjIChvciBpbXBsaWNpdCBibm9kZSthcmMpXG4gICAgICAgICAgZnJhbWUuYWRkQXJjKGVsZW1lbnRVUkkoZG9tKSk7IC8vIHNhdmUgdGhlIGFyYydzIHJkZjpJRCBpZiBpdCBoYXMgb25lXG4gICAgICAgICAgaWYgKHRoaXMucmVpZnkpIHtcbiAgICAgICAgICAgIHJkZmlkID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnSUQnKTtcbiAgICAgICAgICAgIGlmIChyZGZpZCkge1xuICAgICAgICAgICAgICBmcmFtZS5yZGZpZCA9IHJkZmlkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUocmRmaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcGFyc2V0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAncGFyc2VUeXBlJyk7XG4gICAgICAgICAgdmFyIGRhdGF0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnZGF0YXR5cGUnKTtcbiAgICAgICAgICBpZiAoZGF0YXR5cGUpIHtcbiAgICAgICAgICAgIGZyYW1lLmRhdGF0eXBlID0gZGF0YXR5cGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUoZGF0YXR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyc2V0eXBlKSB7XG4gICAgICAgICAgICB2YXIgbnYgPSBwYXJzZXR5cGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgaWYgKG52ID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgZnJhbWUuZGF0YXR5cGUgPSBSREZQYXJzZXIubnMuUkRGICsgJ1hNTExpdGVyYWwnOyAvLyAodGhpcy5idWlsZEZyYW1lKGZyYW1lKSkuYWRkTGl0ZXJhbChkb20pXG4gICAgICAgICAgICAgIC8vIHNob3VsZCB3b3JrIGJ1dCBkb2Vzbid0XG4gICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgICAgZnJhbWUuYWRkTGl0ZXJhbChkb20pO1xuICAgICAgICAgICAgICBkaWcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnYgPT09ICdSZXNvdXJjZScpIHtcbiAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgICAgICBmcmFtZS5wYXJlbnQuZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG52ID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgICAgICBmcmFtZS5wYXJlbnQuZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZENvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHBhcnNldHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ3Jlc291cmNlJyk7XG4gICAgICAgICAgICB2YXIgYm5pZDIgPSB0aGlzLmdldEF0dHJpYnV0ZU5vZGVOUyhkb20sIFJERlBhcnNlci5ucy5SREYsICdub2RlSUQnKTtcbiAgICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICBmcmFtZS5hZGROb2RlKHJlc291cmNlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHJlc291cmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChibmlkMikge1xuICAgICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKGJuaWQyLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYm5pZDIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIHgxID0gYXR0cnMubGVuZ3RoIC0gMTsgeDEgPj0gMDsgeDEtLSkge1xuICAgICAgICAgICAgICB2YXIgZiA9IHRoaXMuYnVpbGRGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgIGYuYWRkQXJjKGVsZW1lbnRVUkkoYXR0cnNbeDFdKSk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50VVJJKGF0dHJzW3gxXSkgPT09IFJERlBhcnNlci5ucy5SREYgKyAndHlwZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZikuYWRkTm9kZShhdHRyc1t4MV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZikuYWRkTGl0ZXJhbChhdHRyc1t4MV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUpLmFkZExpdGVyYWwoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyByZGY6UkRGXG4gICAgICAvLyBkaWcgZHVnXG4gICAgICBkb20gPSBmcmFtZS5lbGVtZW50O1xuICAgICAgd2hpbGUgKGZyYW1lLnBhcmVudCkge1xuICAgICAgICB2YXIgcGZyYW1lID0gZnJhbWU7XG4gICAgICAgIHdoaWxlIChkb20gPT0gbnVsbCkge1xuICAgICAgICAgIGZyYW1lID0gZnJhbWUucGFyZW50O1xuICAgICAgICAgIGRvbSA9IGZyYW1lLmVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGRvbS5jaGlsZE5vZGVzICYmIGRvbS5jaGlsZE5vZGVzW2ZyYW1lLmxhc3RDaGlsZF07XG4gICAgICAgIGlmICghY2FuZGlkYXRlIHx8ICFkaWcpIHtcbiAgICAgICAgICBmcmFtZS50ZXJtaW5hdGVGcmFtZSgpO1xuICAgICAgICAgIGlmICghKGZyYW1lID0gZnJhbWUucGFyZW50KSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSAvLyBkb25lXG4gICAgICAgICAgZG9tID0gZnJhbWUuZWxlbWVudDtcbiAgICAgICAgICBkaWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5ub2RlVHlwZSAhPT0gUkRGUGFyc2VyLm5vZGVUeXBlLkVMRU1FTlQgJiYgY2FuZGlkYXRlLm5vZGVUeXBlICE9PSBSREZQYXJzZXIubm9kZVR5cGUuVEVYVCAmJiBjYW5kaWRhdGUubm9kZVR5cGUgIT09IFJERlBhcnNlci5ub2RlVHlwZS5DREFUQV9TRUNUSU9OIHx8IChjYW5kaWRhdGUubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5URVhUIHx8IGNhbmRpZGF0ZS5ub2RlVHlwZSA9PT0gUkRGUGFyc2VyLm5vZGVUeXBlLkNEQVRBX1NFQ1RJT04pICYmIGRvbS5jaGlsZE5vZGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIGZyYW1lLmxhc3RDaGlsZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdCBhIGxlYWZcbiAgICAgICAgICBmcmFtZS5sYXN0Q2hpbGQrKztcbiAgICAgICAgICBmcmFtZSA9IHRoaXMuYnVpbGRGcmFtZShwZnJhbWUsIGRvbS5jaGlsZE5vZGVzW2ZyYW1lLmxhc3RDaGlsZCAtIDFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gd2hpbGVcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYW5zIG91dCBzdGF0ZSBmcm9tIGEgcHJldmlvdXMgcGFyc2UgcnVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLmNsZWFuUGFyc2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYm5vZGVzID0ge307XG4gICAgdGhpcy53aHkgPSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2NvcGUgZnJhbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuYnVpbGRGcmFtZSA9IGZ1bmN0aW9uIChwYXJlbnQsIGVsZW1lbnQpIHtcbiAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lRmFjdG9yeSh0aGlzLCBwYXJlbnQsIGVsZW1lbnQpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGZyYW1lLmJhc2UgPSBwYXJlbnQuYmFzZTtcbiAgICAgIGZyYW1lLmxhbmcgPSBwYXJlbnQubGFuZztcbiAgICB9XG4gICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5URVhUIHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5DREFUQV9TRUNUSU9OKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICAgIHZhciBhdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICB2YXIgYmFzZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgneG1sOmJhc2UnKTtcbiAgICBpZiAoYmFzZSAhPSBudWxsKSB7XG4gICAgICBmcmFtZS5iYXNlID0gYmFzZS5ub2RlVmFsdWU7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgneG1sOmJhc2UnKTtcbiAgICB9XG4gICAgdmFyIGxhbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3htbDpsYW5nJyk7XG4gICAgaWYgKGxhbmcgIT0gbnVsbCkge1xuICAgICAgZnJhbWUubGFuZyA9IGxhbmcubm9kZVZhbHVlO1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3htbDpsYW5nJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBhbGwgZXh0cmFuZW91cyB4bWwgYW5kIHhtbG5zIGF0dHJpYnV0ZXNcbiAgICBmb3IgKHZhciB4ID0gYXR0cnMubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHtcbiAgICAgIGlmIChhdHRyc1t4XS5ub2RlTmFtZS5zdWJzdHIoMCwgMykgPT09ICd4bWwnKSB7XG4gICAgICAgIGlmIChhdHRyc1t4XS5uYW1lLnNsaWNlKDAsIDYpID09PSAneG1sbnM6Jykge1xuICAgICAgICAgIHZhciB1cmkgPSBhdHRyc1t4XS5ub2RlVmFsdWU7IC8vIGFsZXJ0KCdiYXNlIGZvciBuYW1lc3BhYyBhdHRyOicrdGhpcy5iYXNlKVxuICAgICAgICAgIGlmICh0aGlzLmJhc2UpIHVyaSA9IHVyaVV0aWwuam9pbih1cmksIHRoaXMuYmFzZSk7XG4gICAgICAgICAgdGhpcy5zdG9yZS5zZXRQcmVmaXhGb3JVUkkoYXR0cnNbeF0ubmFtZS5zbGljZSg2KSwgdXJpKTtcbiAgICAgICAgfVxuICAgICAgICAvL1x0XHRhbGVydCgncmRmcGFyc2VyOiB4bWwgYXRyaWJ1dGU6ICcrYXR0cnNbeF0ubmFtZSkgLy9AQFxuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cnNbeF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhbWU7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJERlBhcnNlcjsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VyaWFsaXplO1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpO1xudmFyIFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZXInKTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdFxuICogQEAgQ3VycmVudGx5IE5RdWFkcyBhbmQgSlNPTi9MRCBhcmUgZGVhbCB3aXRoIGV4dHJlbGVtZW50bHkgaW5lZmZpY2llbnRseVxuICogdGhyb3VnaCBtdXRpcGxlIGNvbnZlcnNpb25zLlxuICovXG5mdW5jdGlvbiBzZXJpYWxpemUodGFyZ2V0LCBrYiwgYmFzZSwgY29udGVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIGJhc2UgPSBiYXNlIHx8IHRhcmdldC51cmk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICd0ZXh0L3R1cnRsZSc7IC8vIHRleHQvbjMgaWYgY29tcGxleD9cbiAgdmFyIGRvY3VtZW50U3RyaW5nID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB2YXIgc3ogPSBTZXJpYWxpemVyKGtiKTtcbiAgICBpZiAob3B0aW9ucy5mbGFncykgc3ouc2V0RmxhZ3Mob3B0aW9ucy5mbGFncyk7XG4gICAgdmFyIG5ld1N0cyA9IGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YXJnZXQpO1xuICAgIHZhciBuM1N0cmluZztcbiAgICBzei5zdWdnZXN0TmFtZXNwYWNlcyhrYi5uYW1lc3BhY2VzKTtcbiAgICBzei5zZXRCYXNlKGJhc2UpO1xuICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOlxuICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb1hNTChuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vbjMnOlxuICAgICAgICAvLyBMZWdhY3lcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OMyhuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ3RleHQvdHVydGxlJzpcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtdHVydGxlJzpcbiAgICAgICAgLy8gTGVnYWN5XG4gICAgICAgIHN6LnNldEZsYWdzKCdzaScpOyAvLyBTdXBwcmVzcyA9IGZvciBzYW1lQXMgYW5kID0+IGZvciBpbXBsaWVzXG4gICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVDYWxsYmFjayhudWxsLCBkb2N1bWVudFN0cmluZyk7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9uLXRyaXBsZXMnOlxuICAgICAgICBzei5zZXRGbGFncygnZGVpbnByc3R1eCcpOyAvLyBTdXBwcmVzcyBuaWNlIHBhcnRzIG9mIE4zIHRvIG1ha2UgbnRyaXBsZXNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2xkK2pzb24nOlxuICAgICAgICBzei5zZXRGbGFncygnZGVpbnByc3R1eCcpOyAvLyBVc2UgYWRhcHRlcnMgdG8gY29ubmVjdCB0byBpbmNtcGF0aWJsZSBwYXJzZXJcbiAgICAgICAgbjNTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpO1xuICAgICAgICAvLyBuM1N0cmluZyA9IHN6LnN0YXRlbWVudHNUb04zKG5ld1N0cylcbiAgICAgICAgY29udmVydC5jb252ZXJ0VG9Kc29uKG4zU3RyaW5nLCBjYWxsYmFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24vbi1xdWFkcyc6XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9ucXVhZHMnOlxuICAgICAgICAvLyBAQEAganVzdCBvdXRwb3V0IHRoZSBxdWFkcz8gRG9lcyBub3Qgd29yayBmb3IgY29sbGVjdGlvbnNcbiAgICAgICAgc3ouc2V0RmxhZ3MoJ2RlaW5wcnN0dXggcScpOyAvLyBTdXBwcmVzcyBuaWNlIHBhcnRzIG9mIE4zIHRvIG1ha2UgbnRyaXBsZXNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpOyAvLyBxIGluIGZsYWcgbWVhbnMgYWN0dWFsbHkgcXVhZHNcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVDYWxsYmFjayhudWxsLCBkb2N1bWVudFN0cmluZyk7XG4gICAgICAgIC8vIG4zU3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKVxuICAgICAgICAvLyBkb2N1bWVudFN0cmluZyA9IGNvbnZlcnQuY29udmVydFRvTlF1YWRzKG4zU3RyaW5nLCBjYWxsYmFjaylcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZTogQ29udGVudC10eXBlICcgKyBjb250ZW50VHlwZSArICcgbm90IHN1cHBvcnRlZCBmb3IgZGF0YSB3cml0ZS4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHRocm93IGVycjsgLy8gRG9uJ3QgaGlkZSBwcm9ibGVtcyBmcm9tIGNhbGxlciBpbiBzeW5jIG1vZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhlcnIsIHJlc3VsdCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxuLyogICAgICBTZXJpYWxpemF0aW9uIG9mIFJERiBHcmFwaHNcbioqXG4qKiBUaW0gQmVybmVycy1MZWUgMjAwNlxuKiogVGhpcyBpcyB3YXMgaHR0cDovL2RpZy5jc2FpbC5taXQuZWR1LzIwMDUvYWphci9hamF3L2pzL3JkZi9zZXJpYWxpemUuanNcbioqIFRoaXMgaXMgb3Igd2FzIGh0dHBzOi8vZ2l0aHViLmNvbS9saW5rZWRkYXRhL3JkZmxpYi5qcy9ibG9iL21hc3Rlci9zcmMvc2VyaWFsaXplci5qc1xuKiogTGljZW5jZTogTUlUXG4qL1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIEJsYW5rTm9kZSA9IHJlcXVpcmUoJy4vYmxhbmstbm9kZScpO1xudmFyIFVyaSA9IHJlcXVpcmUoJy4vdXJpJyk7XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIFhTRCA9IHJlcXVpcmUoJy4veHNkJyk7XG5cbnZhciBTZXJpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX19TZXJpYWxpemVyID0gZnVuY3Rpb24gX19TZXJpYWxpemVyKHN0b3JlKSB7XG4gICAgdGhpcy5mbGFncyA9ICcnO1xuICAgIHRoaXMuYmFzZSA9IG51bGw7XG5cbiAgICB0aGlzLnByZWZpeGVzID0gW107IC8vIHN1Z2dlc3RlZCBwcmVmaXhlc1xuICAgIHRoaXMubmFtZXNwYWNlcyA9IFtdOyAvLyBjb21wbGVtZW50YXJ5IGluZGV4ZXNcblxuICAgIHRoaXMuc3VnZ2VzdFByZWZpeCgncmRmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnKTsgLy8gWE1MIGNvZGUgYXNzdW1lcyB0aGlzIVxuICAgIHRoaXMuc3VnZ2VzdFByZWZpeCgneG1sJywgJ3Jlc2VydmVkOnJlc2VydmVkRm9yRnV0dXJlVXNlJyk7IC8vIFhNTCByZXNlcnZlcyB4bWw6IGluIHRoZSBzcGVjLlxuXG4gICAgdGhpcy5uYW1lc3BhY2VzVXNlZCA9IFtdOyAvLyBDb3VudCBhY3R1YWxseSB1c2VkIGFuZCBzbyBuZWVkZWQgaW4gQHByZWZpeGVzXG4gICAgdGhpcy5rZXl3b3JkcyA9IFsnYSddOyAvLyBUaGUgb25seSBvbmUgd2UgZ2VuZXJhdGUgYXQgdGhlIG1vbWVudFxuICAgIHRoaXMucHJlZml4Y2hhcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHF1c3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XG4gICAgdGhpcy5pbmNvbWluZyA9IG51bGw7IC8vIEFycmF5IG5vdCBjYWxjdWxhdGVkIHlldFxuICAgIHRoaXMuZm9ybXVsYXMgPSBbXTsgLy8gcmVtZWJlcmluZyBvcmlnaW5hbCBmb3JtdWxhZSBmcm9tIGhhc2hlc1xuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnNldEJhc2UgPSBmdW5jdGlvbiAoYmFzZSkge1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7cmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncyB8fCAnJztyZXR1cm4gdGhpcztcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnRvU3RyID0gZnVuY3Rpb24gKHgpIHtcbiAgICB2YXIgcyA9IHgudG9OVCgpO1xuICAgIGlmICh4LnRlcm1UeXBlID09PSAnR3JhcGgnKSB7XG4gICAgICB0aGlzLmZvcm11bGFzW3NdID0geDsgLy8gcmVtZW1iZXIgYXMgcmV2ZXJzZSBkb2VzIG5vdCB3b3JrXG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuZnJvbVN0ciA9IGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHNbMF0gPT09ICd7Jykge1xuICAgICAgdmFyIHggPSB0aGlzLmZvcm11bGFzW3NdO1xuICAgICAgaWYgKCF4KSBjb25zb2xlLmxvZygnTm8gZm9ybXVsYSBvYmplY3QgZm9yICcgKyBzKTtcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5mcm9tTlQocyk7XG4gIH07XG4gIC8qIEFjY3VtdWxhdGUgTmFtZXNwYWNlc1xuICAqKlxuICAqKiBUaGVzZSBhcmUgb25seSBoaW50cy4gIElmIHR3byBvdmVybGFwLCBvbmx5IG9uZSBnZXRzIHVzZWRcbiAgKiogVGhlcmUgaXMgdGhlcmVmb3JlIG5vIGd1YXJhbnRlZSBpbiBnZW5lcmFsLlxuICAqL1xuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN1Z2dlc3RQcmVmaXggPSBmdW5jdGlvbiAocHJlZml4LCB1cmkpIHtcbiAgICBpZiAocHJlZml4LnNsaWNlKDAsIDcpID09PSAnZGVmYXVsdCcpIHJldHVybjsgLy8gVHJ5IHRvIHdlZWQgdGhlc2Ugb3V0XG4gICAgaWYgKHByZWZpeC5zbGljZSgwLCAyKSA9PT0gJ25zJykgcmV0dXJuOyAvLyAgRnJvbSBvdGhlcnMgaW5mZXJpb3IgYWxnb3NcbiAgICBpZiAoIXByZWZpeCB8fCAhdXJpKSByZXR1cm47IC8vIGVtcHR5IHN0cmluZ3Mgbm90IHN1aXRhYmxlXG4gICAgaWYgKHByZWZpeCBpbiB0aGlzLm5hbWVzcGFjZXMgfHwgdXJpIGluIHRoaXMucHJlZml4ZXMpIHJldHVybjsgLy8gYWxyZWFkeSB1c2VkXG4gICAgdGhpcy5wcmVmaXhlc1t1cmldID0gcHJlZml4O1xuICAgIHRoaXMubmFtZXNwYWNlc1twcmVmaXhdID0gdXJpO1xuICB9O1xuXG4gIC8vIFRha2VzIGEgbmFtZXNwYWNlIC0+IHByZWZpeCBtYXBcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdWdnZXN0TmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChuYW1lc3BhY2VzKSB7XG4gICAgZm9yICh2YXIgcHggaW4gbmFtZXNwYWNlcykge1xuICAgICAgdGhpcy5zdWdnZXN0UHJlZml4KHB4LCBuYW1lc3BhY2VzW3B4XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuY2hlY2tJbnRlZ3JpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHAsIG5zO1xuICAgIGZvciAocCBpbiB0aGlzLm5hbWVzcGFjZXMpIHtcbiAgICAgIGlmICh0aGlzLnByZWZpeGVzW3RoaXMubmFtZXNwYWNlc1twXV0gIT09IHApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJpYWxpemVyIGludGVnaXR5IGVycm9yIDE6ICcgKyBwICsgJywgJyArIHRoaXMubmFtZXNwYWNlc1twXSArICcsICcgKyB0aGlzLnByZWZpeGVzW3RoaXMubmFtZXNwYWNlc1twXV0gKyAnIScpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKG5zIGluIHRoaXMucHJlZml4ZXMpIHtcbiAgICAgIGlmICh0aGlzLm5hbWVzcGFjZXNbdGhpcy5wcmVmaXhlc1tuc11dICE9PSBucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZXIgaW50ZWdpdHkgZXJyb3IgMjogJyArIG5zICsgJywgJyArIHRoaXMucHJlZml4c1tuc10gKyAnLCAnICsgdGhpcy5uYW1lc3BhY2VzW3RoaXMucHJlZml4ZXNbbnNdXSArICchJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIE1ha2UgdXAgYW4gdW51c2VkIHByZWZpeCBmb3IgYSByYW5kb20gbmFtZXNwYWNlXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUubWFrZVVwUHJlZml4ID0gZnVuY3Rpb24gKHVyaSkge1xuICAgIHZhciBwID0gdXJpO1xuICAgIGZ1bmN0aW9uIGNhblVzZU1ldGhvZChwcCkge1xuICAgICAgaWYgKCFfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnZhbGlkUHJlZml4LnRlc3QocHApKSByZXR1cm4gZmFsc2U7IC8vIGJhZCBmb3JtYXRcbiAgICAgIGlmIChwcCA9PT0gJ25zJykgcmV0dXJuIGZhbHNlOyAvLyBib3JpbmdcbiAgICAgIGlmIChwcCBpbiB0aGlzLm5hbWVzcGFjZXMpIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSB1c2VkXG4gICAgICB0aGlzLnByZWZpeGVzW3VyaV0gPSBwcDtcbiAgICAgIHRoaXMubmFtZXNwYWNlc1twcF0gPSB1cmk7XG4gICAgICByZXR1cm4gcHA7XG4gICAgfVxuICAgIHZhciBjYW5Vc2UgPSBjYW5Vc2VNZXRob2QuYmluZCh0aGlzKTtcblxuICAgIGlmICgnIy8nLmluZGV4T2YocFtwLmxlbmd0aCAtIDFdKSA+PSAwKSBwID0gcC5zbGljZSgwLCAtMSk7XG4gICAgdmFyIHNsYXNoID0gcC5sYXN0SW5kZXhPZignLycpO1xuICAgIGlmIChzbGFzaCA+PSAwKSBwID0gcC5zbGljZShzbGFzaCArIDEpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHAubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5wcmVmaXhjaGFycy5pbmRleE9mKHBbaV0pKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwID0gcC5zbGljZSgwLCBpKTtcblxuICAgIGlmIChwLmxlbmd0aCA8IDYgJiYgY2FuVXNlKHApKSByZXR1cm4gcDsgLy8gZXhhY3QgaXMgYmVzdFxuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAzKSkpIHJldHVybiBwLnNsaWNlKDAsIDMpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAyKSkpIHJldHVybiBwLnNsaWNlKDAsIDIpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCA0KSkpIHJldHVybiBwLnNsaWNlKDAsIDQpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAxKSkpIHJldHVybiBwLnNsaWNlKDAsIDEpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCA1KSkpIHJldHVybiBwLnNsaWNlKDAsIDUpO1xuICAgIGlmICghX19TZXJpYWxpemVyLnByb3RvdHlwZS52YWxpZFByZWZpeC50ZXN0KHApKSB7XG4gICAgICBwID0gJ24nOyAvLyBPdGhlcndpc2UgdGhlIGxvb3AgYmVsb3cgbWF5IG5ldmVyIHRlcm1pbW5hdGVcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7OyBqKyspIHtcbiAgICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAzKSArIGopKSByZXR1cm4gcC5zbGljZSgwLCAzKSArIGo7XG4gICAgfVxuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUucm9vdFN1YmplY3RzID0gZnVuY3Rpb24gKHN0cykge1xuICAgIHZhciBpbmNvbWluZyA9IHt9O1xuICAgIHZhciBzdWJqZWN0cyA9IHt9O1xuICAgIHZhciBhbGxCbm9kZXMgPSB7fTtcblxuICAgIC8qIFRoaXMgc2NhbiBpcyB0byBmaW5kIG91dCB3aGljaCBub2RlcyB3aWxsIGhhdmUgdG8gYmUgdGhlIHJvb3RzIG9mIHRyZWVzXG4gICAgKiogaW4gdGhlIHNlcmlhbGl6ZWQgZm9ybS4gVGhpcyB3aWxsIGJlIGFueSBzeW1ib2xzLCBhbmQgYW55IGJub2Rlc1xuICAgICoqIHdoaWNoIGh2ZSBtb3JlIG9yIGxlc3MgdGhhbiBvbmUgaW5jb21pbmcgYXJjLCBhbmQgYW55IGJub2RlcyB3aGljaCBoYXZlXG4gICAgKiogb25lIGluY29taW5nIGFyYyBidXQgaXQgaXMgYW4gdW5pbnRlcnJ1cHRlZCBsb29wIG9mIHN1Y2ggbm9kZXMgYmFjayB0byBpdHNlbGYuXG4gICAgKiogVGhpcyBzaG91bGQgYmUga2VwdCBsaW5lYXIgdGltZSB3aXRoIHJlcGVjdCB0byB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMuXG4gICAgKiogTm90ZSBpdCBkb2VzIG5vdCB1c2UgYW55IGluZGV4aW5nIG9mIHRoZSBzdG9yZS5cbiAgICAqL1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3QgPSBzdHNbaV07XG4gICAgICB2YXIgY2hlY2tNZW50aW9ucyA9IGZ1bmN0aW9uIGNoZWNrTWVudGlvbnMoeCkge1xuICAgICAgICBpZiAoIWluY29taW5nLmhhc093blByb3BlcnR5KHgpKSBpbmNvbWluZ1t4XSA9IFtdO1xuICAgICAgICBpbmNvbWluZ1t4XS5wdXNoKHN0LnN1YmplY3QpOyAvLyBMaXN0IG9mIHRoaW5ncyB3aGljaCB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgcHJpbnRlZFxuICAgICAgfTtcbiAgICAgIHZhciBzdDIgPSBbc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3RdO1xuICAgICAgc3QyLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICBpZiAoeS50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScpIHtcbiAgICAgICAgICBhbGxCbm9kZXNbeS50b05UKCldID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh5LnRlcm1UeXBlID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICB5LmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKHopIHtcbiAgICAgICAgICAgIGNoZWNrTWVudGlvbnMoeik7IC8vIGJub2RlcyBpbiBjb2xsZWN0aW9ucyBpbXBvcnRhbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjaGVja01lbnRpb25zKHN0c1tpXS5vYmplY3QpO1xuICAgICAgdmFyIHNzID0gc3ViamVjdHNbdGhpcy50b1N0cihzdC5zdWJqZWN0KV07IC8vIFN0YXRlbWVudHMgd2l0aCB0aGlzIGFzIHN1YmplY3RcbiAgICAgIGlmICghc3MpIHNzID0gW107XG4gICAgICBzcy5wdXNoKHN0KTtcbiAgICAgIHN1YmplY3RzW3RoaXMudG9TdHIoc3Quc3ViamVjdCldID0gc3M7IC8vIE1ha2UgaGFzaC4gQEAgdG9vIHNsb3cgZm9yIGZvcm11bGE/XG4gICAgfVxuXG4gICAgdmFyIHJvb3RzID0gW107XG4gICAgZm9yICh2YXIgeE5UIGluIHN1YmplY3RzKSB7XG4gICAgICBpZiAoIXN1YmplY3RzLmhhc093blByb3BlcnR5KHhOVCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHkgPSB0aGlzLmZyb21TdHIoeE5UKTtcbiAgICAgIGlmICh5LnRlcm1UeXBlICE9PSAnQmxhbmtOb2RlJyB8fCAhaW5jb21pbmdbeV0gfHwgaW5jb21pbmdbeV0ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHJvb3RzLnB1c2goeSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluY29taW5nID0gaW5jb21pbmc7IC8vIEtlZXAgZm9yIHNlcmlhbGl6aW5nIEBAIEJ1ZyBmb3IgbmVzdGVkIGZvcm11bGFzXG5cbiAgICAvLyBOb3cgZG8gdGhlIHNjYW4gdXNpbmcgZXhpc3Rpbmcgcm9vdHNcbiAgICB2YXIgcm9vdHNIYXNoID0ge307XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCByb290cy5sZW5ndGg7IGsrKykge1xuICAgICAgcm9vdHNIYXNoW3Jvb3RzW2tdLnRvTlQoKV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4geyAncm9vdHMnOiByb290cywgJ3N1YmplY3RzJzogc3ViamVjdHMsXG4gICAgICAncm9vdHNIYXNoJzogcm9vdHNIYXNoLCAnaW5jb21pbmcnOiBpbmNvbWluZyB9O1xuICB9O1xuXG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUudG9OMyA9IGZ1bmN0aW9uIChmKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50c1RvTjMoZi5zdGF0ZW1lbnRzKTtcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3RRTmFtZUNoYXJzID0gJ1xcdFxcclxcbiAhXCIjJCUmXFwnKCkqLiwrLzs8PT4/QFtcXFxcXV5ge3x9fic7XG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuX25vdE5hbWVDaGFycyA9IF9fU2VyaWFsaXplci5wcm90b3R5cGUuX25vdFFOYW1lQ2hhcnMgKyAnOic7XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5leHBsaWNpdFVSSSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdyJykgPCAwICYmIHRoaXMuYmFzZSkge1xuICAgICAgdXJpID0gVXJpLnJlZlRvKHRoaXMuYmFzZSwgdXJpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmxhZ3MuaW5kZXhPZigndScpID49IDApIHtcbiAgICAgIC8vIFVuaWNvZGUgZW5jb2RpbmcgTlRyaXBsZXMgc3R5bGVcbiAgICAgIHVyaSA9IGJhY2tzbGFzaFVpZnkodXJpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJpID0gaGV4aWZ5KHVyaSk7XG4gICAgfVxuICAgIHJldHVybiAnPCcgKyB1cmkgKyAnPic7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdGF0ZW1lbnRzVG9OVHJpcGxlcyA9IGZ1bmN0aW9uIChzdHMpIHtcbiAgICB2YXIgc29ydGVkID0gc3RzLnNsaWNlKCk7XG4gICAgc29ydGVkLnNvcnQoKTtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHJkZm5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIHZhciB0ZXJtVG9OVCA9IGZ1bmN0aW9uIHRlcm1Ub05UKHgpIHtcbiAgICAgIGlmICh4LnRlcm1UeXBlICE9PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuYXRvbWljVGVybVRvTjMoeCk7XG4gICAgICB9XG4gICAgICB2YXIgbGlzdCA9IHguZWxlbWVudHM7XG4gICAgICB2YXIgcmVzdCA9IGtiLnN5bShyZGZucyArICduaWxsJyk7XG4gICAgICBmb3IgKHZhciBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgYm5vZGUgPSBuZXcgQmxhbmtOb2RlKCk7XG4gICAgICAgIHN0ciArPSB0ZXJtVG9OVChibm9kZSkgKyAnICcgKyB0ZXJtVG9OVChrYi5zeW0ocmRmbnMgKyAnZmlyc3QnKSkgKyAnICcgKyB0ZXJtVG9OVChsaXN0W2ldKSArICcuXFxuJztcbiAgICAgICAgc3RyICs9IHRlcm1Ub05UKGJub2RlKSArICcgJyArIHRlcm1Ub05UKGtiLnN5bShyZGZucyArICdyZXN0JykpICsgJyAnICsgdGVybVRvTlQocmVzdCkgKyAnLlxcbic7XG4gICAgICAgIHJlc3QgPSBibm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmLmF0b21pY1Rlcm1Ub04zKHJlc3QpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdCA9IHNvcnRlZFtpXTtcbiAgICAgIHZhciBzID0gJyc7XG4gICAgICBzICs9IHRlcm1Ub05UKHN0LnN1YmplY3QpICsgJyAnO1xuICAgICAgcyArPSB0ZXJtVG9OVChzdC5wcmVkaWNhdGUpICsgJyAnO1xuICAgICAgcyArPSB0ZXJtVG9OVChzdC5vYmplY3QpICsgJyAnO1xuICAgICAgaWYgKHRoaXMuZmxhZ3MuaW5kZXhPZigncScpID49IDApIHtcbiAgICAgICAgLy8gRG8gcXVhZHMgbm90IG5ydGlwbGVzXG4gICAgICAgIHMgKz0gdGVybVRvTlQoc3Qud2h5KSArICcgJztcbiAgICAgIH1cbiAgICAgIHMgKz0gJy5cXG4nO1xuICAgICAgc3RyICs9IHM7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdGF0ZW1lbnRzVG9OMyA9IGZ1bmN0aW9uIChzdHMpIHtcbiAgICB2YXIgaW5kZW50ID0gNDtcbiAgICB2YXIgd2lkdGggPSA4MDtcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIC8vIEEgVVJJIE1hcCBhbG93cyB1cyB0byBwdXQgdGhlIHR5cGUgc3RhdGVtbnRzIGF0IHRoZSB0b3AuXG4gICAgdmFyIHVyaU1hcCA9IHsgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJzogJ2FhYTowMCcgfTtcbiAgICB2YXIgU1BPID0gZnVuY3Rpb24gU1BPKHgsIHkpIHtcbiAgICAgIC8vIERvIGxpbWl0ZWQgY2Fub25pY2FsaXphdGlvbiBvZiBibm9kZXNcbiAgICAgIHJldHVybiBVdGlsLmhlYXZ5Q29tcGFyZVNQTyh4LCB5LCBrYiwgdXJpTWFwKTtcbiAgICB9O1xuICAgIHN0cy5zb3J0KFNQTyk7XG5cbiAgICBpZiAodGhpcy5iYXNlICYmICF0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgIHRoaXMuZGVmYXVsdE5hbWVzcGFjZSA9IHRoaXMuYmFzZSArICcjJztcbiAgICB9XG5cbiAgICB2YXIgcHJlZE1hcCA9IHt9O1xuICAgIGlmICh0aGlzLmZsYWdzLmluZGV4T2YoJ3MnKSA8IDApIHtcbiAgICAgIHByZWRNYXBbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI3NhbWVBcyddID0gJz0nO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCd0JykgPCAwKSB7XG4gICAgICBwcmVkTWFwWydodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZSddID0gJ2EnO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdpJykgPCAwKSB7XG4gICAgICBwcmVkTWFwWydodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI2ltcGxpZXMnXSA9ICc9Pic7XG4gICAgfVxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBcnJhbmdlIHRoZSBiaXRzIG9mIHRleHRcblxuICAgIHZhciBzcGFjZXMgPSBmdW5jdGlvbiBzcGFjZXMobikge1xuICAgICAgdmFyIHMgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHMgKz0gJyAnO1xuICAgICAgfXJldHVybiBzO1xuICAgIH07XG5cbiAgICB2YXIgdHJlZVRvTGluZSA9IGZ1bmN0aW9uIHRyZWVUb0xpbmUodHJlZSkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBicmFuY2ggPSB0cmVlW2ldO1xuICAgICAgICB2YXIgczIgPSB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IHRyZWVUb0xpbmUoYnJhbmNoKTtcbiAgICAgICAgLy8gTm90ZSB0aGUgc3BhY2UgYmVmb3JlIHRoZSBkb3QgaW4gY2FzZSBzdGF0ZW1lbnQgZW5kcyAxMjMuIHdoaWNoIGlzIGluIGZhY3QgYWxsb3dlZCBidXQgYmUgY29uc2VydmF0aXZlLlxuICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgIHZhciBjaCA9IHN0ci5zbGljZSgtMSkgfHwgJyAnO1xuICAgICAgICAgIGlmIChzMiA9PT0gJywnIHx8IHMyID09PSAnOycpIHtcbiAgICAgICAgICAgIC8vIG5vIGdhcFxuICAgICAgICAgIH0gZWxzZSBpZiAoczIgPT09ICcuJyAmJiAhJzAxMjM0NTY3ODkuJy5pbmNsdWRlcyhjaCkpIHsvLyBubyBnYXAgZXhjZXB0IGFmdGVyIG51bWJlclxuICAgICAgICAgICAgLy8gbm8gZ2FwXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSAnICc7IC8vIHNlcGFyYXRlIGZyb20gcHJldmlvdXMgdG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IHMyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9O1xuXG4gICAgLy8gQ29udmVydCBhIG5lc3RlZCB0cmVlIG9mIGxpc3RzIGFuZCBzdHJpbmdzIHRvIGEgc3RyaW5nXG4gICAgdmFyIHRyZWVUb1N0cmluZyA9IGZ1bmN0aW9uIHRyZWVUb1N0cmluZyh0cmVlLCBsZXZlbCkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgdmFyIGxhc3RMZW5ndGggPSAxMDAwMDA7XG4gICAgICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgbGV2ZWwgPSAtMTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBicmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFyIHN1YnN0ciA9IHRyZWVUb1N0cmluZyhicmFuY2gsIGxldmVsICsgMSk7XG4gICAgICAgICAgaWYgKHN1YnN0ci5sZW5ndGggPCAxMCAqICh3aWR0aCAtIGluZGVudCAqIGxldmVsKSAmJiBzdWJzdHIuaW5kZXhPZignXCJcIlwiJykgPCAwKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBtZXNzIHVwIG11bHRpbGluZSBzdHJpbmdzXG4gICAgICAgICAgICB2YXIgbGluZSA9IHRyZWVUb0xpbmUoYnJhbmNoKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IHdpZHRoIC0gaW5kZW50ICogbGV2ZWwpIHtcbiAgICAgICAgICAgICAgYnJhbmNoID0gbGluZTsgLy8gICBOb3RlISB0cmVhdCBhcyBzdHJpbmcgYmVsb3dcbiAgICAgICAgICAgICAgc3Vic3RyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJzdHIpIGxhc3RMZW5ndGggPSAxMDAwMDtcbiAgICAgICAgICBzdHIgKz0gc3Vic3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmIChicmFuY2gubGVuZ3RoID09PSAxICYmIHN0ci5zbGljZSgtMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoJywuOycuaW5kZXhPZihicmFuY2gpID49IDApIHtcbiAgICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArIGJyYW5jaCArICdcXG4nOyAvLyAgc2xpcCBwdW5jdCduIG9uIGVuZFxuICAgICAgICAgICAgICBsYXN0TGVuZ3RoICs9IDE7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGFzdExlbmd0aCA8IGluZGVudCAqIGxldmVsICsgNCB8fCAvLyBpZiBuZXcgbGluZSBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgbGFzdExlbmd0aCArIGJyYW5jaC5sZW5ndGggKyAxIDwgd2lkdGggJiYgJzsuJy5pbmRleE9mKHN0cltzdHIubGVuZ3RoIC0gMl0pIDwgMCkge1xuICAgICAgICAgICAgLy8gb3IgdGhlIHN0cmluZyBmaXRzIG9uIGxhc3QgbGluZVxuICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArICcgJyArIGJyYW5jaCArICdcXG4nOyAvLyB0aGVuIGNvbnRpbnVlIG9uIHRoaXMgbGluZVxuICAgICAgICAgICAgbGFzdExlbmd0aCArPSBicmFuY2gubGVuZ3RoICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIF9saW5lID0gc3BhY2VzKGluZGVudCAqIGxldmVsKSArIGJyYW5jaDtcbiAgICAgICAgICAgIHN0ciArPSBfbGluZSArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCA9IF9saW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHtcbiAgICAgICAgICAgICAgc3RyICs9ICdcXG4nOyAvLyBleHRyYSBibGFuayBsaW5lXG4gICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAxMDAwMDA7IC8vIGRvbid0IHRvdWNoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH07XG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTdHJ1Y3R1cmUgZm9yIE4zXG4gICAgLy8gQ29udmVydCBhIHNldCBvZiBzdGF0ZW1lbnRzIGludG8gYSBuZXN0ZWQgdHJlZSBvZiBsaXN0cyBhbmQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIHN0YXRlbWVudExpc3RUb1RyZWVNZXRob2Qoc3RhdGVtZW50cykge1xuICAgICAgdmFyIHN0YXRzID0gdGhpcy5yb290U3ViamVjdHMoc3RhdGVtZW50cyk7XG4gICAgICB2YXIgcm9vdHMgPSBzdGF0cy5yb290cztcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb290ID0gcm9vdHNbaV07XG4gICAgICAgIHJlc3VsdHMucHVzaChzdWJqZWN0VHJlZShyb290LCBzdGF0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBzdGF0ZW1lbnRMaXN0VG9UcmVlID0gc3RhdGVtZW50TGlzdFRvVHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gVGhlIHRyZWUgZm9yIGEgc3ViamVjdFxuICAgIGZ1bmN0aW9uIHN1YmplY3RUcmVlKHN1YmplY3QsIHN0YXRzKSB7XG4gICAgICBpZiAoc3ViamVjdC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScgJiYgIXN0YXRzLmluY29taW5nW3N1YmplY3RdKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RUcmVlKHN1YmplY3QsIHN0YXRzLCB0cnVlKS5jb25jYXQoWycuJ10pOyAvLyBBbm9ueW1vdXMgYm5vZGUgc3ViamVjdFxuICAgICAgfVxuICAgICAgcmV0dXJuIFt0ZXJtVG9OMyhzdWJqZWN0LCBzdGF0cyldLmNvbmNhdChbcHJvcGVydHlUcmVlKHN1YmplY3QsIHN0YXRzKV0pLmNvbmNhdChbJy4nXSk7XG4gICAgfVxuICAgIC8vIFRoZSBwcm9wZXJ0eSB0cmVlIGZvciBhIHNpbmdsZSBzdWJqZWN0IG9yIGFub255bW91cyBub2RlXG4gICAgZnVuY3Rpb24gcHJvcGVydHlUcmVlTWV0aG9kKHN1YmplY3QsIHN0YXRzKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgdmFyIGxhc3RQcmVkID0gbnVsbDtcbiAgICAgIHZhciBzdHMgPSBzdGF0cy5zdWJqZWN0c1t0aGlzLnRvU3RyKHN1YmplY3QpXSB8fCBbXTsgLy8gcmVsZXZhbnQgc3RhdGVtZW50c1xuICAgICAgaWYgKHR5cGVvZiBzdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudCBmaW5kIHN0YXRlbWVudHMgZm9yICcgKyBzdWJqZWN0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdCA9IHN0c1tpXTtcbiAgICAgICAgaWYgKHN0LnByZWRpY2F0ZS51cmkgPT09IGxhc3RQcmVkKSB7XG4gICAgICAgICAgb2JqZWN0cy5wdXNoKCcsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGxhc3RQcmVkKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoW29iamVjdHNdKS5jb25jYXQoWyc7J10pO1xuICAgICAgICAgICAgb2JqZWN0cyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRzLnB1c2gocHJlZE1hcFtzdC5wcmVkaWNhdGUudXJpXSA/IHByZWRNYXBbc3QucHJlZGljYXRlLnVyaV0gOiB0ZXJtVG9OMyhzdC5wcmVkaWNhdGUsIHN0YXRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFByZWQgPSBzdC5wcmVkaWNhdGUudXJpO1xuICAgICAgICBvYmplY3RzLnB1c2gob2JqZWN0VHJlZShzdC5vYmplY3QsIHN0YXRzKSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoW29iamVjdHNdKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICB2YXIgcHJvcGVydHlUcmVlID0gcHJvcGVydHlUcmVlTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBmdW5jdGlvbiBvYmplY3RUcmVlTWV0aG9kKG9iaiwgc3RhdHMsIGZvcmNlKSB7XG4gICAgICBpZiAob2JqLnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJyAmJiAoZm9yY2UgfHwgc3RhdHMucm9vdHNIYXNoW29iai50b05UKCldID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIGlmIG5vdCBhIHJvb3RcbiAgICAgICAgaWYgKHN0YXRzLnN1YmplY3RzW3RoaXMudG9TdHIob2JqKV0pIHtcbiAgICAgICAgICByZXR1cm4gWydbJywgcHJvcGVydHlUcmVlKG9iaiwgc3RhdHMpLCAnXSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnW10nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybVRvTjMob2JqLCBzdGF0cyk7XG4gICAgfVxuICAgIHZhciBvYmplY3RUcmVlID0gb2JqZWN0VHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gdGVybVRvTjNNZXRob2QoZXhwciwgc3RhdHMpIHtcbiAgICAgIC8vXG4gICAgICB2YXIgaSwgcmVzO1xuICAgICAgc3dpdGNoIChleHByLnRlcm1UeXBlKSB7XG4gICAgICAgIGNhc2UgJ0dyYXBoJzpcbiAgICAgICAgICByZXMgPSBbJ3snXTtcbiAgICAgICAgICByZXMgPSByZXMuY29uY2F0KHN0YXRlbWVudExpc3RUb1RyZWUoZXhwci5zdGF0ZW1lbnRzKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoWyd9J10pO1xuXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJlcyA9IFsnKCddO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXMucHVzaChbb2JqZWN0VHJlZShleHByLmVsZW1lbnRzW2ldLCBzdGF0cyldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnB1c2goJyknKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXRvbWljVGVybVRvTjMoZXhwcik7XG4gICAgICB9XG4gICAgfVxuICAgIF9fU2VyaWFsaXplci5wcm90b3R5cGUudGVybVRvTjMgPSB0ZXJtVG9OMztcbiAgICB2YXIgdGVybVRvTjMgPSB0ZXJtVG9OM01ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gcHJlZml4RGlyZWN0aXZlc01ldGhvZCgpIHtcbiAgICAgIHZhciBzdHIgPSAnJztcbiAgICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgICAgc3RyICs9ICdAcHJlZml4IDogJyArIHRoaXMuZXhwbGljaXRVUkkodGhpcy5kZWZhdWx0TmFtZXNwYWNlKSArICcuXFxuJztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIG5zIGluIHRoaXMucHJlZml4ZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByZWZpeGVzLmhhc093blByb3BlcnR5KG5zKSkgY29udGludWU7XG4gICAgICAgIGlmICghdGhpcy5uYW1lc3BhY2VzVXNlZFtuc10pIGNvbnRpbnVlO1xuICAgICAgICBzdHIgKz0gJ0BwcmVmaXggJyArIHRoaXMucHJlZml4ZXNbbnNdICsgJzogJyArIHRoaXMuZXhwbGljaXRVUkkobnMpICsgJy5cXG4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ciArICdcXG4nO1xuICAgIH1cbiAgICB2YXIgcHJlZml4RGlyZWN0aXZlcyA9IHByZWZpeERpcmVjdGl2ZXNNZXRob2QuYmluZCh0aGlzKTtcbiAgICAvLyBCb2R5IG9mIHN0YXRlbWVudHNUb04zOlxuICAgIHZhciB0cmVlID0gc3RhdGVtZW50TGlzdFRvVHJlZShzdHMpO1xuICAgIHJldHVybiBwcmVmaXhEaXJlY3RpdmVzKCkgKyB0cmVlVG9TdHJpbmcodHJlZSk7XG4gIH07XG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEF0b21pYyBUZXJtc1xuXG4gIC8vICBEZWFsIHdpdGggdGVybSBsZXZlbCB0aGluZ3MgYW5kIG5lc3Rpbmcgd2l0aCBubyBibm9kZSBzdHJ1Y3R1cmVcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5hdG9taWNUZXJtVG9OMyA9IGZ1bmN0aW9uIGF0b21pY1Rlcm1Ub04zKGV4cHIsIHN0YXRzKSB7XG4gICAgc3dpdGNoIChleHByLnRlcm1UeXBlKSB7XG4gICAgICBjYXNlICdCbGFua05vZGUnOlxuICAgICAgY2FzZSAnVmFyaWFibGUnOlxuICAgICAgICByZXR1cm4gZXhwci50b05UKCk7XG4gICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgdmFyIHZhbCA9IGV4cHIudmFsdWUudG9TdHJpbmcoKTsgLy8gc2hvdWxkIGJlIGEgc3RyaW5nIGFscmVhZHlcbiAgICAgICAgaWYgKGV4cHIuZGF0YXR5cGUgJiYgdGhpcy5mbGFncy5pbmRleE9mKCd4JykgPCAwKSB7XG4gICAgICAgICAgLy8gU3VwcmVzcyBuYXRpdmUgbnVtYmVyc1xuICAgICAgICAgIHN3aXRjaCAoZXhwci5kYXRhdHlwZS51cmkpIHtcblxuICAgICAgICAgICAgY2FzZSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50ZWdlcic6XG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XG5cbiAgICAgICAgICAgIGNhc2UgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWwnOlxuICAgICAgICAgICAgICAvLyBJbiB1cnRsZSBtdXN0IGhhdmUgZG90XG4gICAgICAgICAgICAgIGlmICh2YWwuaW5kZXhPZignLicpIDwgMCkgdmFsICs9ICcuMCc7XG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XG5cbiAgICAgICAgICAgIGNhc2UgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RvdWJsZSc6XG4gICAgICAgICAgICAgIC8vIE11c3QgZm9yY2UgdXNlIG9mICdlJ1xuICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJy4nKSA8IDApIHZhbCArPSAnLjAnO1xuICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJ2UnKSA8IDApIHZhbCArPSAnZTAnO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuXG4gICAgICAgICAgICBjYXNlICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJpbmdUb04zKGV4cHIudmFsdWUpO1xuICAgICAgICBpZiAoZXhwci5sYW5ndWFnZSkge1xuICAgICAgICAgIHN0ciArPSAnQCcgKyBleHByLmxhbmd1YWdlO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHByLmRhdGF0eXBlLmVxdWFscyhYU0Quc3RyaW5nKSkge1xuICAgICAgICAgIHN0ciArPSAnXl4nICsgdGhpcy5hdG9taWNUZXJtVG9OMyhleHByLmRhdGF0eXBlLCBzdGF0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIGNhc2UgJ05hbWVkTm9kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRvTjMoZXhwcik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsOiBhdG9taWNUZXJtVG9OMyBjYW5ub3QgaGFuZGxlICcgKyBleHByICsgJyBvZiB0ZXJtVHlwZTogJyArIGV4cHIudGVybVR5cGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyAgc3RyaW5nVG9OMzogIFN0cmluZyBlc2NhcGluZyBmb3IgTjNcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnZhbGlkUHJlZml4ID0gbmV3IFJlZ0V4cCgvXlthLXpBLVpdW2EtekEtWjAtOV0qJC8pO1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuZm9yYmlkZGVuMSA9IG5ldyBSZWdFeHAoL1tcXFxcXCJcXGJcXGZcXHJcXHZcXHRcXG5cXHUwMDgwLVxcdWZmZmZdL2dtKTtcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5mb3JiaWRkZW4zID0gbmV3IFJlZ0V4cCgvW1xcXFxcIlxcYlxcZlxcclxcdlxcdTAwODAtXFx1ZmZmZl0vZ20pO1xuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN0cmluZ1RvTjMgPSBmdW5jdGlvbiBzdHJpbmdUb04zKHN0ciwgZmxhZ3MpIHtcbiAgICBpZiAoIWZsYWdzKSBmbGFncyA9ICdlJztcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGksIGosIGs7XG4gICAgdmFyIGRlbGltO1xuICAgIHZhciBmb3JiaWRkZW47XG4gICAgaWYgKHN0ci5sZW5ndGggPiAyMCAmJiAvLyBMb25nIGVub3VnaCB0byBtYWtlIHNlbnNlXG4gICAgc3RyLnNsaWNlKC0xKSAhPT0gJ1wiJyAmJiAvLyBjb3JuZXIgY2FzZSdcbiAgICBmbGFncy5pbmRleE9mKCduJykgPCAwICYmICggLy8gRm9yY2Ugc2luZ2xlIGxpbmVcbiAgICBzdHIuaW5kZXhPZignXFxuJykgPiAwIHx8IHN0ci5pbmRleE9mKCdcIicpID4gMCkpIHtcbiAgICAgIGRlbGltID0gJ1wiXCJcIic7XG4gICAgICBmb3JiaWRkZW4gPSBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLmZvcmJpZGRlbjM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGltID0gJ1wiJztcbiAgICAgIGZvcmJpZGRlbiA9IF9fU2VyaWFsaXplci5wcm90b3R5cGUuZm9yYmlkZGVuMTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGg7KSB7XG4gICAgICBmb3JiaWRkZW4ubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBtID0gZm9yYmlkZGVuLmV4ZWMoc3RyLnNsaWNlKGkpKTtcbiAgICAgIGlmIChtID09IG51bGwpIGJyZWFrO1xuICAgICAgaiA9IGkgKyBmb3JiaWRkZW4ubGFzdEluZGV4IC0gMTtcbiAgICAgIHJlcyArPSBzdHIuc2xpY2UoaSwgaik7XG4gICAgICB2YXIgY2ggPSBzdHJbal07XG4gICAgICBpZiAoY2ggPT09ICdcIicgJiYgZGVsaW0gPT09ICdcIlwiXCInICYmIHN0ci5zbGljZShqLCBqICsgMykgIT09ICdcIlwiXCInKSB7XG4gICAgICAgIHJlcyArPSBjaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsgPSAnXFxiXFxmXFxyXFx0XFx2XFxuXFxcXFwiJy5pbmRleE9mKGNoKTsgLy8gTm8gZXNjYXBpbmcgb2YgYmVsbCAoNyk/XG4gICAgICAgIGlmIChrID49IDApIHtcbiAgICAgICAgICByZXMgKz0gJ1xcXFwnICsgJ2JmcnR2blxcXFxcIidba107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ2UnKSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBVbmljb2RlIGVzY2FwaW5nIGluIHN0cmluZ3Mgbm90IHVuaXggc3R5bGVcbiAgICAgICAgICAgIHJlcyArPSAnXFxcXHUnICsgKCcwMDAnICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKSkuc2xpY2UoLTQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyAnZScgZmxhZ1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSA9IGogKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZGVsaW0gKyByZXMgKyBzdHIuc2xpY2UoaSkgKyBkZWxpbTtcbiAgfTtcbiAgLy8gIEEgc2luZ2xlIHN5bWJvbCwgZWl0aGVyIGluICA8PiBvciBuYW1lc3BhY2Ugbm90YXRpb25cblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN5bWJvbFRvTjMgPSBmdW5jdGlvbiBzeW1ib2xUb04zKHgpIHtcbiAgICAvLyBjLmYuIHN5bWJvbFN0cmluZygpIGluIG5vdGF0aW9uMy5weVxuICAgIHZhciB1cmkgPSB4LnVyaTtcbiAgICB2YXIgaiA9IHVyaS5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGogPCAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZignLycpIDwgMCkge1xuICAgICAgaiA9IHVyaS5sYXN0SW5kZXhPZignLycpO1xuICAgIH1cbiAgICBpZiAoaiA+PSAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZigncCcpIDwgMCAmJiAoXG4gICAgLy8gQ2FuIHNwbGl0IGF0IG5hbWVzcGFjZSBidXQgb25seSBpZiBodHRwW3NdOiBVUkkgb3IgZmlsZTogb3Igd3Nbc10gKHdoeSBub3Qgb3RoZXJzPylcbiAgICB1cmkuaW5kZXhPZignaHR0cCcpID09PSAwIHx8IHVyaS5pbmRleE9mKCd3cycpID09PSAwIHx8IHVyaS5pbmRleE9mKCdmaWxlJykgPT09IDApKSB7XG4gICAgICB2YXIgY2FuU3BsaXQgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgdXJpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3ROYW1lQ2hhcnMuaW5kZXhPZih1cmlba10pID49IDApIHtcbiAgICAgICAgICBjYW5TcGxpdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgICAgICAgaWYgKHVyaS5zbGljZSgwLCBqICsgMSkgPT09IHRoaXMuYmFzZSArICcjJykgeyAvLyBiYXNlLXJlbGF0aXZlXG4gICAgICAgICAgICAgIGlmIChjYW5TcGxpdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnOicgKyB1cmkuc2xpY2UoaiArIDEpIC8vIGFzc3VtZSBkZWFmdWx0IG5zIGlzIGxvY2FsXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICc8IycgKyB1cmkuc2xpY2UoaiArIDEpICsgJz4nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICovXG4gICAgICBpZiAoY2FuU3BsaXQpIHtcbiAgICAgICAgdmFyIGxvY2FsaWQgPSB1cmkuc2xpY2UoaiArIDEpO1xuICAgICAgICB2YXIgbmFtZXNwID0gdXJpLnNsaWNlKDAsIGogKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdE5hbWVzcGFjZSAmJiB0aGlzLmRlZmF1bHROYW1lc3BhY2UgPT09IG5hbWVzcCAmJiB0aGlzLmZsYWdzLmluZGV4T2YoJ2QnKSA8IDApIHtcbiAgICAgICAgICAvLyBkIC0+IHN1cHByZXNzIGRlZmF1bHRcbiAgICAgICAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdrJykgPj0gMCAmJiB0aGlzLmtleW9yZHMuaW5kZXhPZihsb2NhbGlkKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJzonICsgbG9jYWxpZDtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLmNoZWNrSW50ZWdyaXR5KCkgLy8gIEBAQCBSZW1vdmUgd2hlbiBub3QgdGVzdGluZ1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5wcmVmaXhlc1tuYW1lc3BdO1xuICAgICAgICBpZiAoIXByZWZpeCkgcHJlZml4ID0gdGhpcy5tYWtlVXBQcmVmaXgobmFtZXNwKTtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgIHRoaXMubmFtZXNwYWNlc1VzZWRbbmFtZXNwXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCArICc6JyArIGxvY2FsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbCB0aG91Z2ggaWYgY2FuJ3QgZG8gcW5hbWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXRVUkkodXJpKTtcbiAgfTtcbiAgLy8gU3RyaW5nIGVzY2FwaW5nIHV0aWxpdGllc1xuXG4gIGZ1bmN0aW9uIGhleGlmeShzdHIpIHtcbiAgICAvLyBhbHNvIHVzZWQgaW4gcGFyc2VyXG4gICAgcmV0dXJuIGVuY29kZVVSSShzdHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFja3NsYXNoVWlmeShzdHIpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGs7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGsgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChrID4gNjU1MzUpIHtcbiAgICAgICAgcmVzICs9ICdcXFxcVScgKyAoJzAwMDAwMDAwJyArIGsudG9TdHJpbmcoMTYpKS5zbGljZSgtOCk7IC8vIGNvbnZlcnQgdG8gdXBwZXI/XG4gICAgICB9IGVsc2UgaWYgKGsgPiAxMjYpIHtcbiAgICAgICAgcmVzICs9ICdcXFxcdScgKyAoJzAwMDAnICsgay50b1N0cmluZygxNikpLnNsaWNlKC00KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyArPSBzdHJbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gUXVhZCBzdG9yZSBzZXJpYWxpemF0aW9uXG5cbiAgLy8gQHBhcmEuIHdyaXRlICAtIGEgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIHN0cmluZyB0byBiZSBvdXRwdXRcbiAgLy9cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS53cml0ZVN0b3JlID0gZnVuY3Rpb24gKHdyaXRlKSB7XG4gICAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgICB2YXIgZmV0Y2hlciA9IGtiLmZldGNoZXI7XG4gICAgdmFyIHNlc3Npb24gPSBmZXRjaGVyICYmIGZldGNoZXIuYXBwTm9kZTtcblxuICAgIC8vIFRoZSBjb3JlIGRhdGFcblxuICAgIHZhciBzb3VyY2VzID0gdGhpcy5zdG9yZS5pbmRleFszXTtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZXMpIHtcbiAgICAgIC8vIC0+IGFzc3VtZSB3ZSBjYW4gdXNlIC0+IGFzIHNob3J0IGZvciBsb2c6c2VtYW50aWNzXG4gICAgICB2YXIgc291cmNlID0ga2IuZnJvbU5UKHMpO1xuICAgICAgaWYgKHNlc3Npb24gJiYgc291cmNlLnNhbWVUZXJtKHNlc3Npb24pKSBjb250aW51ZTtcbiAgICAgIHdyaXRlKCdcXG4nICsgdGhpcy5hdG9taWNUZXJtVG9OMyhzb3VyY2UpICsgJyAnICsgdGhpcy5hdG9taWNUZXJtVG9OMyhrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjc2VtYW50aWNzJykpICsgJyB7ICcgKyB0aGlzLnN0YXRlbWVudHNUb04zKGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzb3VyY2UpKSArICcgfS5cXG4nKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWV0YWRhdGEgZnJvbSBIVFRQIGludGVyYWN0aW9uczpcblxuICAgIGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNyZXF1ZXN0ZWRVUkknKSkubWFwKGZ1bmN0aW9uIChzdCkge1xuICAgICAgd3JpdGUoJ1xcbjwnICsgc3Qub2JqZWN0LnZhbHVlICsgJz4gbG9nOm1ldGFkYXRhIHtcXG4nKTtcbiAgICAgIHZhciBzdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgc3Quc3ViamVjdCk7XG4gICAgICB3cml0ZSh0aGlzLnN0YXRlbWVudHNUb04zKHRoaXMuc3RhdGVtZW50c1RvTjMoc3RzKSkpO1xuICAgICAgd3JpdGUoJ30uXFxuJyk7XG4gICAgfSk7XG5cbiAgICAvLyBJbmZlcmVuY2VzIHdlIGhhdmUgbWFkZSBvdXJzZWx2ZXMgbm90IGF0dHJpYnV0YWJsZSB0byBhbnlvbmUgZWxzZVxuXG4gICAgdmFyIG1ldGFTb3VyY2VzID0gW107XG4gICAgaWYgKHNlc3Npb24pIG1ldGFTb3VyY2VzLnB1c2goc2Vzc2lvbik7XG4gICAgdmFyIG1ldGFkYXRhID0gW107XG4gICAgbWV0YVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGEuY29uY2F0KGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzb3VyY2UpKTtcbiAgICB9KTtcbiAgICB3cml0ZSh0aGlzLnN0YXRlbWVudHNUb04zKG1ldGFkYXRhKSk7XG4gIH07XG5cbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBYTUwgc2VyaWFsaXphdGlvblxuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuc3RhdGVtZW50c1RvWE1MID0gZnVuY3Rpb24gKHN0cykge1xuICAgIHZhciBpbmRlbnQgPSA0O1xuICAgIHZhciB3aWR0aCA9IDgwO1xuXG4gICAgdmFyIG5hbWVzcGFjZUNvdW50cyA9IFtdOyAvLyB3aGljaCBoYXZlIGJlZW4gdXNlZFxuICAgIG5hbWVzcGFjZUNvdW50c1snaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyddID0gdHJ1ZTtcblxuICAgIHZhciBsaVByZWZpeCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjXyc7IC8vIHByZWZpeCBmb3Igb3JkZXJlZCBsaXN0IGl0ZW1zXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQXJyYW5nZSB0aGUgYml0cyBvZiBYTUwgdGV4dFxuXG4gICAgdmFyIHNwYWNlcyA9IGZ1bmN0aW9uIHNwYWNlcyhuKSB7XG4gICAgICB2YXIgcyA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgcyArPSAnICc7XG4gICAgICB9cmV0dXJuIHM7XG4gICAgfTtcblxuICAgIHZhciBYTUx0cmVlVG9MaW5lID0gZnVuY3Rpb24gWE1MdHJlZVRvTGluZSh0cmVlKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGJyYW5jaCA9IHRyZWVbaV07XG4gICAgICAgIHZhciBzMiA9IHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogWE1MdHJlZVRvTGluZShicmFuY2gpO1xuICAgICAgICBzdHIgKz0gczI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH07XG5cbiAgICAvLyBDb252ZXJ0IGEgbmVzdGVkIHRyZWUgb2YgbGlzdHMgYW5kIHN0cmluZ3MgdG8gYSBzdHJpbmdcbiAgICB2YXIgWE1MdHJlZVRvU3RyaW5nID0gZnVuY3Rpb24gWE1MdHJlZVRvU3RyaW5nKHRyZWUsIGxldmVsKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG4gICAgICB2YXIgbGluZTtcbiAgICAgIHZhciBsYXN0TGVuZ3RoID0gMTAwMDAwO1xuICAgICAgaWYgKCFsZXZlbCkgbGV2ZWwgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBicmFuY2ggPSB0cmVlW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgc3Vic3RyID0gWE1MdHJlZVRvU3RyaW5nKGJyYW5jaCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICBpZiAoc3Vic3RyLmxlbmd0aCA8IDEwICogKHdpZHRoIC0gaW5kZW50ICogbGV2ZWwpICYmIHN1YnN0ci5pbmRleE9mKCdcIlwiXCInKSA8IDApIHtcbiAgICAgICAgICAgIC8vIERvbid0IG1lc3MgdXAgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgICAgIGxpbmUgPSBYTUx0cmVlVG9MaW5lKGJyYW5jaCk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPCB3aWR0aCAtIGluZGVudCAqIGxldmVsKSB7XG4gICAgICAgICAgICAgIGJyYW5jaCA9ICcgICAnICsgbGluZTsgLy8gICBAQCBIYWNrOiB0cmVhdCBhcyBzdHJpbmcgYmVsb3dcbiAgICAgICAgICAgICAgc3Vic3RyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJzdHIpIGxhc3RMZW5ndGggPSAxMDAwMDtcbiAgICAgICAgICBzdHIgKz0gc3Vic3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmIChsYXN0TGVuZ3RoIDwgaW5kZW50ICogbGV2ZWwgKyA0KSB7XG4gICAgICAgICAgICAvLyBjb250aW51ZVxuICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArICcgJyArIGJyYW5jaCArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCArPSBicmFuY2gubGVuZ3RoICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZSA9IHNwYWNlcyhpbmRlbnQgKiBsZXZlbCkgKyBicmFuY2g7XG4gICAgICAgICAgICBzdHIgKz0gbGluZSArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsvLyBub3Qgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHN0YXRlbWVudExpc3RUb1hNTFRyZWVNZXRob2Qoc3RhdGVtZW50cykge1xuICAgICAgdGhpcy5zdWdnZXN0UHJlZml4KCdyZGYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycpO1xuICAgICAgdmFyIHN0YXRzID0gdGhpcy5yb290U3ViamVjdHMoc3RhdGVtZW50cyk7XG4gICAgICB2YXIgcm9vdHMgPSBzdGF0cy5yb290cztcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb290ID0gcm9vdHNbaV07XG4gICAgICAgIHJlc3VsdHMucHVzaChzdWJqZWN0WE1MVHJlZShyb290LCBzdGF0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBzdGF0ZW1lbnRMaXN0VG9YTUxUcmVlID0gc3RhdGVtZW50TGlzdFRvWE1MVHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gZXNjYXBlRm9yWE1MKHN0cikge1xuICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0BAQHVuZGVmaW5lZEBAQEAnO1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bJjxcIl0vZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgc3dpdGNoIChtWzBdKSB7XG4gICAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJyZhbXA7JztcbiAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIHJldHVybiAnJmx0Oyc7XG4gICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgcmV0dXJuICcmcXVvdDsnOyAvLyAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbFVSSU1ldGhvZCh0ZXJtKSB7XG4gICAgICByZXR1cm4gZXNjYXBlRm9yWE1MKHRoaXMuYmFzZSA/IFV0aWwudXJpLnJlZlRvKHRoaXMuYmFzZSwgdGVybS51cmkpIDogdGVybS51cmkpO1xuICAgIH1cbiAgICB2YXIgcmVsVVJJID0gcmVsVVJJTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICAvLyBUaGUgdHJlZSBmb3IgYSBzdWJqZWN0XG4gICAgZnVuY3Rpb24gc3ViamVjdFhNTFRyZWVNZXRob2Qoc3ViamVjdCwgc3RhdHMpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgdHlwZSwgdCwgc3QsIHByZWQ7XG4gICAgICB2YXIgc3RzID0gc3RhdHMuc3ViamVjdHNbdGhpcy50b1N0cihzdWJqZWN0KV07IC8vIHJlbGV2YW50IHN0YXRlbWVudHNcbiAgICAgIGlmICh0eXBlb2Ygc3RzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBlbXB0eSBibm9kZVxuICAgICAgICByZXR1cm4gcHJvcGVydHlYTUxUcmVlKHN1YmplY3QsIHN0YXRzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBvbmx5IG9uIHRoZSBwcmVkaWNhdGUsIGxlYXZlIHRoZSBvcmRlciBhdCBvYmplY3RcbiAgICAgIC8vIGxldmVsIHVuZGlzdHVyYmVkLiAgVGhpcyBsZWF2ZXMgbXVsdGlsaW5ndWFsIGNvbnRlbnQgaW5cbiAgICAgIC8vIHRoZSBvcmRlciBvZiBlbnRyeSAoZm9yIHBhcnRuZXIgbGl0ZXJhbHMpLCB3aGljaCBoZWxwc1xuICAgICAgLy8gcmVhZGFiaWxpdHkuXG4gICAgICAvL1xuICAgICAgLy8gRm9yIHRoZSBwcmVkaWNhdGUgc29ydCwgd2UgYXR0ZW1wdCB0byBzcGxpdCB0aGUgdXJpXG4gICAgICAvLyBhcyBhIGhpbnQgdG8gdGhlIHNlcXVlbmNlXG4gICAgICBzdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2YXIgYXAgPSBhLnByZWRpY2F0ZS51cmk7XG4gICAgICAgIHZhciBicCA9IGIucHJlZGljYXRlLnVyaTtcbiAgICAgICAgaWYgKGFwLnN1YnN0cmluZygwLCBsaVByZWZpeC5sZW5ndGgpID09PSBsaVByZWZpeCB8fCBicC5zdWJzdHJpbmcoMCwgbGlQcmVmaXgubGVuZ3RoKSA9PT0gbGlQcmVmaXgpIHtcbiAgICAgICAgICAvLyB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gc29ydGluZyBsaXN0IGl0ZW1zXG4gICAgICAgICAgcmV0dXJuIGFwLmxvY2FsZUNvbXBhcmUoYnApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFzID0gYXAuc3Vic3RyaW5nKGxpUHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIHZhciBicyA9IGJwLnN1YnN0cmluZyhsaVByZWZpeC5sZW5ndGgpO1xuICAgICAgICB2YXIgYW4gPSBwYXJzZUludChhcywgMTApO1xuICAgICAgICB2YXIgYm4gPSBwYXJzZUludChicywgMTApO1xuICAgICAgICBpZiAoaXNOYU4oYW4pIHx8IGlzTmFOKGJuKSB8fCBhbiAhPT0gYXMgfHwgYm4gIT09IGJzKSB7XG4gICAgICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IGludGVnZXJzXG4gICAgICAgICAgcmV0dXJuIGFwLmxvY2FsZUNvbXBhcmUoYnApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuIC0gYm47XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3QgPSBzdHNbaV07XG4gICAgICAgIC8vIGxvb2sgZm9yIGEgdHlwZVxuICAgICAgICBpZiAoc3QucHJlZGljYXRlLnVyaSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyAmJiAhdHlwZSAmJiBzdC5vYmplY3QudGVybVR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgdHlwZSA9IHN0Lm9iamVjdDtcbiAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgaW5jbHVkZSBpdCBhcyBhIGNoaWxkIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlZSB3aGV0aGVyIHByZWRpY2F0ZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBcImxpXCJcbiAgICAgICAgcHJlZCA9IHN0LnByZWRpY2F0ZTtcbiAgICAgICAgaWYgKHByZWQudXJpLnN1YnN0cigwLCBsaVByZWZpeC5sZW5ndGgpID09PSBsaVByZWZpeCkge1xuICAgICAgICAgIHZhciBudW1iZXIgPSBwcmVkLnVyaS5zdWJzdHIobGlQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlc2UgYXJlIGFjdHVhbGx5IG51bWVyaWMgbGlzdCBpdGVtc1xuICAgICAgICAgIHZhciBpbnROdW1iZXIgPSBwYXJzZUludChudW1iZXIsIDEwKTtcbiAgICAgICAgICBpZiAobnVtYmVyID09PSBpbnROdW1iZXIudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgLy8gd2FzIG51bWVyaWM7IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgb3JkZXJpbmcgc2luY2Ugd2UndmUgYWxyZWFkeVxuICAgICAgICAgICAgLy8gc29ydGVkIHRoZSBzdGF0ZW1lbnRzXG4gICAgICAgICAgICBwcmVkID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xpJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdCA9IHFuYW1lKHByZWQpO1xuICAgICAgICBzd2l0Y2ggKHN0Lm9iamVjdC50ZXJtVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0JsYW5rTm9kZSc6XG4gICAgICAgICAgICBpZiAoc3RhdHMuaW5jb21pbmdbc3Qub2JqZWN0XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBzb21ldGhpbmcgaW4gdGhlIGluY29taW5nIGFycmF5IGZvciBhIGJub2RlXG4gICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnBhcnNlVHlwZT1cIlJlc291cmNlXCI+Jywgc3ViamVjdFhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyB0ICsgJz4nXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHQgKyAnIHJkZjpub2RlSUQ9XCInICsgc3Qub2JqZWN0LnRvTlQoKS5zbGljZSgyKSArICdcIi8+J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTmFtZWROb2RlJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnJlc291cmNlPVwiJyArIHJlbFVSSShzdC5vYmplY3QpICsgJ1wiLz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArIChzdC5vYmplY3QuZGF0YXR5cGUuZXF1YWxzKFhTRC5zdHJpbmcpID8gJycgOiAnIHJkZjpkYXRhdHlwZT1cIicgKyBlc2NhcGVGb3JYTUwoc3Qub2JqZWN0LmRhdGF0eXBlLnVyaSkgKyAnXCInKSArIChzdC5vYmplY3QubGFuZ3VhZ2UgPyAnIHhtbDpsYW5nPVwiJyArIHN0Lm9iamVjdC5sYW5ndWFnZSArICdcIicgOiAnJykgKyAnPicgKyBlc2NhcGVGb3JYTUwoc3Qub2JqZWN0LnZhbHVlKSArICc8LycgKyB0ICsgJz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnBhcnNlVHlwZT1cIkNvbGxlY3Rpb25cIj4nLCBjb2xsZWN0aW9uWE1MVHJlZShzdC5vYmplY3QsIHN0YXRzKSwgJzwvJyArIHQgKyAnPiddKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgXCIgKyBzdC5vYmplY3QudGVybVR5cGUgKyAnIGludG8gWE1MJyk7XG4gICAgICAgIH0gLy8gc3dpdGNoXG4gICAgICB9XG5cbiAgICAgIHZhciB0YWcgPSB0eXBlID8gcW5hbWUodHlwZSkgOiAncmRmOkRlc2NyaXB0aW9uJztcblxuICAgICAgdmFyIGF0dHJzID0gJyc7XG4gICAgICBpZiAoc3ViamVjdC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScpIHtcbiAgICAgICAgaWYgKCFzdGF0cy5pbmNvbWluZ1tzdWJqZWN0XSB8fCBzdGF0cy5pbmNvbWluZ1tzdWJqZWN0XS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAvLyBub3QgYW4gYW5vbnltb3VzIGJub2RlXG4gICAgICAgICAgYXR0cnMgPSAnIHJkZjpub2RlSUQ9XCInICsgc3ViamVjdC50b05UKCkuc2xpY2UoMikgKyAnXCInO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9ICcgcmRmOmFib3V0PVwiJyArIHJlbFVSSShzdWJqZWN0KSArICdcIic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbJzwnICsgdGFnICsgYXR0cnMgKyAnPiddLmNvbmNhdChbcmVzdWx0c10pLmNvbmNhdChbJzwvJyArIHRhZyArICc+J10pO1xuICAgIH1cblxuICAgIHZhciBzdWJqZWN0WE1MVHJlZSA9IHN1YmplY3RYTUxUcmVlTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0aW9uWE1MVHJlZShzdWJqZWN0LCBzdGF0cykge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJqZWN0LmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHN1YmplY3RYTUxUcmVlKHN1YmplY3QuZWxlbWVudHNbaV0sIHN0YXRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcm9wZXJ0eSB0cmVlIGZvciBhIHNpbmdsZSBzdWJqZWN0IG9yIGFub255bW9zIG5vZGVcbiAgICBmdW5jdGlvbiBwcm9wZXJ0eVhNTFRyZWVNZXRob2Qoc3ViamVjdCwgc3RhdHMpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgc3RzID0gc3RhdHMuc3ViamVjdHNbdGhpcy50b1N0cihzdWJqZWN0KV07IC8vIHJlbGV2YW50IHN0YXRlbWVudHNcbiAgICAgIGlmICghc3RzKSByZXR1cm4gcmVzdWx0czsgLy8gTm8gcmVsZXZhbnQgc3RhdGVtZW50c1xuICAgICAgc3RzLnNvcnQoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdCA9IHN0c1tpXTtcbiAgICAgICAgc3dpdGNoIChzdC5vYmplY3QudGVybVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdCbGFua05vZGUnOlxuICAgICAgICAgICAgaWYgKHN0YXRzLnJvb3RzSGFzaFtzdC5vYmplY3QudG9OVCgpXSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGJub2RlIGhhcyBiZWVuIGRvbmUgYXMgYSByb290IC0tIG5vIGNvbnRlbnQgaGVyZSBAQCB3aGF0IGJvdXQgZmlyc3QgdGltZVxuICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHFuYW1lKHN0LnByZWRpY2F0ZSkgKyAnIHJkZjpub2RlSUQ9XCInICsgc3Qub2JqZWN0LnRvTlQoKS5zbGljZSgyKSArICdcIj4nLCAnPC8nICsgcW5hbWUoc3QucHJlZGljYXRlKSArICc+J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJyByZGY6cGFyc2VUeXBlPVwiUmVzb3VyY2VcIj4nLCBwcm9wZXJ0eVhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJz4nXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdOYW1lZE5vZGUnOlxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJyByZGY6cmVzb3VyY2U9XCInICsgcmVsVVJJKHN0Lm9iamVjdCkgKyAnXCIvPiddKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgKHN0Lm9iamVjdC5kYXRhdHlwZS5lcXVhbHMoWFNELnN0cmluZykgPyAnJyA6ICcgcmRmOmRhdGF0eXBlPVwiJyArIGVzY2FwZUZvclhNTChzdC5vYmplY3QuZGF0YXR5cGUudmFsdWUpICsgJ1wiJykgKyAoc3Qub2JqZWN0Lmxhbmd1YWdlID8gJyB4bWw6bGFuZz1cIicgKyBzdC5vYmplY3QubGFuZ3VhZ2UgKyAnXCInIDogJycpICsgJz4nICsgZXNjYXBlRm9yWE1MKHN0Lm9iamVjdC52YWx1ZSkgKyAnPC8nICsgcW5hbWUoc3QucHJlZGljYXRlKSArICc+J10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHFuYW1lKHN0LnByZWRpY2F0ZSkgKyAnIHJkZjpwYXJzZVR5cGU9XCJDb2xsZWN0aW9uXCI+JywgY29sbGVjdGlvblhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlIFwiICsgc3Qub2JqZWN0LnRlcm1UeXBlICsgJyBpbnRvIFhNTCcpO1xuICAgICAgICB9IC8vIHN3aXRjaFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBwcm9wZXJ0eVhNTFRyZWUgPSBwcm9wZXJ0eVhNTFRyZWVNZXRob2QuYmluZCh0aGlzKTtcblxuICAgIGZ1bmN0aW9uIHFuYW1lTWV0aG9kKHRlcm0pIHtcbiAgICAgIHZhciB1cmkgPSB0ZXJtLnVyaTtcblxuICAgICAgdmFyIGogPSB1cmkuaW5kZXhPZignIycpO1xuICAgICAgaWYgKGogPCAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZignLycpIDwgMCkge1xuICAgICAgICBqID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICB9XG4gICAgICBpZiAoaiA8IDApIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1ha2UgcW5hbWUgb3V0IG9mIDwnICsgdXJpICsgJz4nKTtcblxuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgdXJpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3ROYW1lQ2hhcnMuaW5kZXhPZih1cmlba10pID49IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIFwiJyArIHVyaVtrXSArICdcIiBjYW5ub3QgYmUgaW4gWE1MIHFuYW1lIGZvciBVUkk6ICcgKyB1cmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgbG9jYWxpZCA9IHVyaS5zbGljZShqICsgMSk7XG4gICAgICB2YXIgbmFtZXNwID0gdXJpLnNsaWNlKDAsIGogKyAxKTtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UgJiYgdGhpcy5kZWZhdWx0TmFtZXNwYWNlID09PSBuYW1lc3AgJiYgdGhpcy5mbGFncy5pbmRleE9mKCdkJykgPCAwKSB7XG4gICAgICAgIC8vIGQgLT4gc3VwcHJlc3MgZGVmYXVsdFxuICAgICAgICByZXR1cm4gbG9jYWxpZDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmVmaXggPSB0aGlzLnByZWZpeGVzW25hbWVzcF07XG4gICAgICBpZiAoIXByZWZpeCkgcHJlZml4ID0gdGhpcy5tYWtlVXBQcmVmaXgobmFtZXNwKTtcbiAgICAgIG5hbWVzcGFjZUNvdW50c1tuYW1lc3BdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwcmVmaXggKyAnOicgKyBsb2NhbGlkO1xuICAgIH1cbiAgICB2YXIgcW5hbWUgPSBxbmFtZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gQm9keSBvZiB0b1hNTDpcblxuICAgIHZhciB0cmVlID0gc3RhdGVtZW50TGlzdFRvWE1MVHJlZShzdHMpO1xuICAgIHZhciBzdHIgPSAnPHJkZjpSREYnO1xuICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgIHN0ciArPSAnIHhtbG5zPVwiJyArIGVzY2FwZUZvclhNTCh0aGlzLmRlZmF1bHROYW1lc3BhY2UpICsgJ1wiJztcbiAgICB9XG4gICAgZm9yICh2YXIgbnMgaW4gbmFtZXNwYWNlQ291bnRzKSB7XG4gICAgICBpZiAoIW5hbWVzcGFjZUNvdW50cy5oYXNPd25Qcm9wZXJ0eShucykpIGNvbnRpbnVlO1xuICAgICAgLy8gUmVsIHVyaXMgaW4geG1sIG5zIGlzIG5vdCBzdHJpY3RseSBhbGxvd2VkIGluIHRoZSBYTUxOUyBzcGVjIGJ1dCBuZWVkZWQgaW4gcHJhY3RpY2Ugb2Z0ZW5cbiAgICAgIHZhciBuczIgPSB0aGlzLmJhc2UgJiYgdGhpcy5mbGFncy5pbmNsdWRlcygneicpID8gVXRpbC51cmkucmVmVG8odGhpcy5iYXNlLCBucykgOiBucztcbiAgICAgIHN0ciArPSAnXFxuIHhtbG5zOicgKyB0aGlzLnByZWZpeGVzW25zXSArICc9XCInICsgZXNjYXBlRm9yWE1MKG5zMikgKyAnXCInO1xuICAgIH1cbiAgICBzdHIgKz0gJz4nO1xuXG4gICAgdmFyIHRyZWUyID0gW3N0ciwgdHJlZSwgJzwvcmRmOlJERj4nXTsgLy8gQEAgbmFtZXNwYWNlIGRlY2xyYXRpb25zXG4gICAgcmV0dXJuIFhNTHRyZWVUb1N0cmluZyh0cmVlMiwgLTEpO1xuICB9OyAvLyBFbmQgQEAgYm9keVxuXG4gIHZhciBTZXJpYWxpemVyID0gZnVuY3Rpb24gU2VyaWFsaXplcihzdG9yZSkge1xuICAgIHJldHVybiBuZXcgX19TZXJpYWxpemVyKHN0b3JlKTtcbiAgfTtcbiAgcmV0dXJuIFNlcmlhbGl6ZXI7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VyaWFsaXplcjsiLCIndXNlIHN0cmljdCc7XG5cbi8vIENvbnZlcnRpbmcgYmV0d2VlbiBTUEFSUUwgcXVlcmllcyBhbmQgdGhlICRyZGYgcXVlcnkgQVBJXG4vKlxuXG5mdW5jdGlvbiBTUXVlcnkgKCkge1xuICB0aGlzLnRlcm1zID0gW11cbiAgcmV0dXJuIHRoaXNcbn1cblxuU1Rlcm0ucHJvdG90eXBlLnRvU3RyaW5nID0gU1Rlcm0udmFsXG5TUXVlcnkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChzdHIpIHt0aGlzLnRlcm1zLnB1c2goKX0qL1xuXG52YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTtcbnZhciBRdWVyeSA9IHJlcXVpcmUoJy4vcXVlcnknKS5RdWVyeTtcbi8vIGNvbnN0IEZldGNoZXIgPSByZXF1aXJlKCcuL2ZldGNoZXInKVxuXG4vKipcbiAqIEBTUEFSUUw6IFNQQVJRTCB0ZXh0IHRoYXQgaXMgY29udmVydGVkIHRvIGEgcXVlcnkgb2JqZWN0IHdoaWNoIGlzIHJldHVybmVkLlxuICogQHRlc3RNb2RlOiB0ZXN0aW5nIGZsYWcuIFByZXZlbnRzIGxvYWRpbmcgb2Ygc291cmNlcy5cbiAqL1xuZnVuY3Rpb24gU1BBUlFMVG9RdWVyeShTUEFSUUwsIHRlc3RNb2RlLCBrYikge1xuICAvLyBBSkFSX0NsZWFyVGFibGUoKVxuICB2YXIgdmFyaWFibGVIYXNoID0gW107XG4gIGZ1bmN0aW9uIG1ha2VWYXIobmFtZSkge1xuICAgIGlmICh2YXJpYWJsZUhhc2hbbmFtZV0pIHtcbiAgICAgIHJldHVybiB2YXJpYWJsZUhhc2hbbmFtZV07XG4gICAgfVxuICAgIHZhciBuZXdWYXIgPSBrYi52YXJpYWJsZShuYW1lKTtcbiAgICB2YXJpYWJsZUhhc2hbbmFtZV0gPSBuZXdWYXI7XG4gICAgcmV0dXJuIG5ld1ZhcjtcbiAgfVxuXG4gIC8vIHRlcm0gdHlwZSBmdW5jdGlvbnNcbiAgZnVuY3Rpb24gaXNSZWFsVGV4dCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC9bXiBcXG5cXHRdLyk7XG4gIH1cbiAgZnVuY3Rpb24gaXNWYXIodGVybSkge1xuICAgIHJldHVybiB0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycgJiYgdGVybS5tYXRjaCgvXltcXD9cXCRdLyk7XG4gIH1cbiAgZnVuY3Rpb24gZml4U3ltYm9sQnJhY2tldHModGVybSkge1xuICAgIGlmICh0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0ZXJtLnJlcGxhY2UoL14mbHQ7LywgJzwnKS5yZXBsYWNlKC8mZ3Q7JC8sICc+Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc1N5bWJvbCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC9ePFtePl0qPiQvKTtcbiAgfVxuICBmdW5jdGlvbiBpc0Jub2RlKHRlcm0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHRlcm0gPT09ICdzdHJpbmcnICYmICh0ZXJtLm1hdGNoKC9eXzovKSB8fCB0ZXJtLm1hdGNoKC9eJC8pKTtcbiAgfVxuICBmdW5jdGlvbiBpc1ByZWZpeCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC86JC8pO1xuICB9XG4gIGZ1bmN0aW9uIGlzUHJlZml4ZWRTeW1ib2wodGVybSkge1xuICAgIHJldHVybiB0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycgJiYgdGVybS5tYXRjaCgvXjp8XlteX11bXjpdKjovKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVmaXgodGVybSkge1xuICAgIHZhciBhID0gdGVybS5zcGxpdCgnOicpO1xuICAgIHJldHVybiBhWzBdO1xuICB9XG4gIGZ1bmN0aW9uIGdldFN1ZmZpeCh0ZXJtKSB7XG4gICAgdmFyIGEgPSB0ZXJtLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIGFbMV07XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHModGVybSkge1xuICAgIGlmIChpc1N5bWJvbCh0ZXJtKSkge1xuICAgICAgcmV0dXJuIHRlcm0uc2xpY2UoMSwgdGVybS5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG4gIC8vIHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIExpdGVyYWxzIGluIHRoZSBwbGFjZSBvZiBsaXRlcmFsc1xuICBmdW5jdGlvbiBwYXJzZUxpdGVyYWxzKHN0cikge1xuICAgIC8vIHZhciBzaW4gPSAoc3RyLmluZGV4T2YoL1sgXFxuXVxcJy8pPT0tMSk/bnVsbDpzdHIuaW5kZXhPZigvWyBcXG5dXFwnLyksIGRvdWIgPSAoc3RyLmluZGV4T2YoL1sgXFxuXVxcXCIvKT09LTEpP251bGw6c3RyLmluZGV4T2YoL1sgXFxuXVxcXCIvKVxuICAgIHZhciBzaW4gPSBzdHIuaW5kZXhPZihcIidcIikgPT09IC0xID8gbnVsbCA6IHN0ci5pbmRleE9mKFwiJ1wiKTtcbiAgICB2YXIgZG91YiA9IHN0ci5pbmRleE9mKCdcIicpID09PSAtMSA/IG51bGwgOiBzdHIuaW5kZXhPZignXCInKTtcbiAgICAvLyBhbGVydChcIlM6IFwiK3NpbitcIiBEOiBcIitkb3ViKVxuICAgIGlmICghc2luICYmICFkb3ViKSB7XG4gICAgICB2YXIgYSA9IG5ldyBBcnJheSgxKTtcbiAgICAgIGFbMF0gPSBzdHI7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSgyKTtcbiAgICB2YXIgYnI7XG4gICAgdmFyIGluZDtcbiAgICBpZiAoIXNpbiB8fCBkb3ViICYmIGRvdWIgPCBzaW4pIHtcbiAgICAgIGJyID0gJ1wiJztcbiAgICAgIGluZCA9IGRvdWI7XG4gICAgfSBlbHNlIGlmICghZG91YiB8fCBzaW4gJiYgc2luIDwgZG91Yikge1xuICAgICAgYnIgPSBcIidcIjtcbiAgICAgIGluZCA9IHNpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmVycm9yKCdTUUFSUUwgUVVFUlkgT09QUyEnKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJlc1swXSA9IHN0ci5zbGljZSgwLCBpbmQpO1xuICAgIHZhciBlbmQgPSBzdHIuc2xpY2UoaW5kICsgMSkuaW5kZXhPZihicik7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIGxvZy5lcnJvcignU1BBUlFMIHBhcnNpbmcgZXJyb3I6IG5vIG1hdGNoaW5nIHBhcmVudGhlc2VzIGluIGxpdGVyYWwgJyArIHN0cik7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvLyBhbGVydChzdHIuc2xpY2UoZW5kICsgaW5kICsgMikubWF0Y2goL15cXF5cXF4vKSlcbiAgICB2YXIgZW5kMjtcbiAgICBpZiAoc3RyLnNsaWNlKGVuZCArIGluZCArIDIpLm1hdGNoKC9eXFxeXFxeLykpIHtcbiAgICAgIGVuZDIgPSBzdHIuc2xpY2UoZW5kICsgaW5kICsgMikuaW5kZXhPZignICcpO1xuICAgICAgLy8gYWxlcnQoZW5kMilcbiAgICAgIHJlc1sxXSA9IGtiLmxpdGVyYWwoc3RyLnNsaWNlKGluZCArIDEsIGluZCArIDEgKyBlbmQpLCAnJywga2Iuc3ltKHJlbW92ZUJyYWNrZXRzKHN0ci5zbGljZShpbmQgKyA0ICsgZW5kLCBpbmQgKyAyICsgZW5kICsgZW5kMikpKSk7XG4gICAgICAvLyBhbGVydChyZXNbMV0uZGF0YXR5cGUudXJpKVxuICAgICAgcmVzID0gcmVzLmNvbmNhdChwYXJzZUxpdGVyYWxzKHN0ci5zbGljZShlbmQgKyBpbmQgKyAzICsgZW5kMikpKTtcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZShlbmQgKyBpbmQgKyAyKS5tYXRjaCgvXkAvKSkge1xuICAgICAgZW5kMiA9IHN0ci5zbGljZShlbmQgKyBpbmQgKyAyKS5pbmRleE9mKCcgJyk7XG4gICAgICAvLyBhbGVydChlbmQyKVxuICAgICAgcmVzWzFdID0ga2IubGl0ZXJhbChzdHIuc2xpY2UoaW5kICsgMSwgaW5kICsgMSArIGVuZCksIHN0ci5zbGljZShpbmQgKyAzICsgZW5kLCBpbmQgKyAyICsgZW5kICsgZW5kMiksIG51bGwpO1xuICAgICAgLy8gYWxlcnQocmVzWzFdLmRhdGF0eXBlLnVyaSlcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQocGFyc2VMaXRlcmFscyhzdHIuc2xpY2UoZW5kICsgaW5kICsgMiArIGVuZDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1sxXSA9IGtiLmxpdGVyYWwoc3RyLnNsaWNlKGluZCArIDEsIGluZCArIDEgKyBlbmQpLCAnJywgbnVsbCk7XG4gICAgICBsb2cuaW5mbygnTGl0ZXJhbCBmb3VuZDogJyArIHJlc1sxXSk7XG4gICAgICByZXMgPSByZXMuY29uY2F0KHBhcnNlTGl0ZXJhbHMoc3RyLnNsaWNlKGVuZCArIGluZCArIDIpKSk7IC8vIGZpbmRzIGFueSBvdGhlciBsaXRlcmFsc1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgZnVuY3Rpb24gc3BhY2VEZWxpbWl0KHN0cikge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXCgvZywgJyAoICcpLnJlcGxhY2UoL1xcKS9nLCAnICkgJykucmVwbGFjZSgvPC9nLCAnIDwnKS5yZXBsYWNlKC8+L2csICc+ICcpLnJlcGxhY2UoL3svZywgJyB7ICcpLnJlcGxhY2UoL30vZywgJyB9ICcpLnJlcGxhY2UoL1tcXHRcXG5cXHJdL2csICcgJykucmVwbGFjZSgvOyAvZywgJyA7ICcpLnJlcGxhY2UoL1xcLiAvZywgJyAuICcpLnJlcGxhY2UoLywgL2csICcgLCAnKTtcbiAgICBsb2cuaW5mbygnTmV3IHN0ciBpbnRvIHNwYWNlRGVsaW1pdDogXFxuJyArIHN0cik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBiciA9IHN0ci5zcGxpdCgnICcpO1xuICAgIGZvciAodmFyIHggaW4gYnIpIHtcbiAgICAgIGlmIChpc1JlYWxUZXh0KGJyW3hdKSkge1xuICAgICAgICByZXMgPSByZXMuY29uY2F0KGJyW3hdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VLZXl3b3JkcyhpbnB1dCkge1xuICAgIHZhciBzdHJhcnIgPSBpbnB1dDtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHN0cmFyci5sZW5ndGg7IHgrKykge1xuICAgICAgaWYgKHN0cmFyclt4XSA9PT0gJ2EnKSB7XG4gICAgICAgIHN0cmFyclt4XSA9ICc8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+JztcbiAgICAgIH1cbiAgICAgIGlmIChzdHJhcnJbeF0gPT09ICdpcycgJiYgc3RyYXJyW3ggKyAyXSA9PT0gJ29mJykge1xuICAgICAgICBzdHJhcnIuc3BsaWNlKHgsIDEpO1xuICAgICAgICBzdHJhcnIuc3BsaWNlKHggKyAxLCAxKTtcbiAgICAgICAgdmFyIHMgPSBzdHJhcnJbeCAtIDFdO1xuICAgICAgICBzdHJhcnJbeCAtIDFdID0gc3RyYXJyW3ggKyAxXTtcbiAgICAgICAgc3RyYXJyW3ggKyAxXSA9IHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJhcnI7XG4gIH1cblxuICBmdW5jdGlvbiB0b1Rlcm1zKGlucHV0KSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgaW5wdXQubGVuZ3RoOyB4KyspIHtcbiAgICAgIGlmICh0eXBlb2YgaW5wdXRbeF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc1t4XSA9IGlucHV0W3hdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlucHV0W3hdID0gZml4U3ltYm9sQnJhY2tldHMoaW5wdXRbeF0pO1xuICAgICAgaWYgKGlzVmFyKGlucHV0W3hdKSkge1xuICAgICAgICByZXNbeF0gPSBtYWtlVmFyKGlucHV0W3hdLnNsaWNlKDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCbm9kZShpbnB1dFt4XSkpIHtcbiAgICAgICAgbG9nLmluZm8oaW5wdXRbeF0gKyAnIHdhcyBpZGVudGlmaWVkIGFzIGEgYm5vZGUuJyk7XG4gICAgICAgIHJlc1t4XSA9IGtiLmJub2RlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3ltYm9sKGlucHV0W3hdKSkge1xuICAgICAgICBsb2cuaW5mbyhpbnB1dFt4XSArICcgd2FzIGlkZW50aWZpZWQgYXMgYSBzeW1ib2wuJyk7XG4gICAgICAgIHJlc1t4XSA9IGtiLnN5bShyZW1vdmVCcmFja2V0cyhpbnB1dFt4XSkpO1xuICAgICAgfSBlbHNlIGlmIChpc1ByZWZpeGVkU3ltYm9sKGlucHV0W3hdKSkge1xuICAgICAgICBsb2cuaW5mbyhpbnB1dFt4XSArICcgd2FzIGlkZW50aWZpZWQgYXMgYSBwcmVmaXhlZCBzeW1ib2wnKTtcbiAgICAgICAgaWYgKHByZWZpeGVzW2dldFByZWZpeChpbnB1dFt4XSldKSB7XG4gICAgICAgICAgcmVzW3hdID0ga2Iuc3ltKGlucHV0W3hdID0gcHJlZml4ZXNbZ2V0UHJlZml4KGlucHV0W3hdKV0gKyBnZXRTdWZmaXgoaW5wdXRbeF0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1NQQVJRTCBlcnJvcjogJyArIGlucHV0W3hdICsgJyB3aXRoIHByZWZpeCAnICsgZ2V0UHJlZml4KGlucHV0W3hdKSArICcgZG9lcyBub3QgaGF2ZSBhIGNvcnJlY3QgcHJlZml4IGVudHJ5LicpO1xuICAgICAgICAgIHJlc1t4XSA9IGlucHV0W3hdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNbeF0gPSBpbnB1dFt4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuaXplKHN0cikge1xuICAgIHZhciB0b2tlbjEgPSBwYXJzZUxpdGVyYWxzKHN0cik7XG4gICAgdmFyIHRva2VuMiA9IFtdO1xuICAgIGZvciAodmFyIHggaW4gdG9rZW4xKSB7XG4gICAgICBpZiAodHlwZW9mIHRva2VuMVt4XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdG9rZW4yID0gdG9rZW4yLmNvbmNhdChzcGFjZURlbGltaXQodG9rZW4xW3hdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbjIgPSB0b2tlbjIuY29uY2F0KHRva2VuMVt4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRva2VuMiA9IHJlcGxhY2VLZXl3b3Jkcyh0b2tlbjIpO1xuICAgIGxvZy5pbmZvKCdTUEFSUUwgVG9rZW5zOiAnICsgdG9rZW4yKTtcbiAgICByZXR1cm4gdG9rZW4yO1xuICB9XG5cbiAgLy8gQ0FTRS1JTlNFTlNJVElWRVxuICBmdW5jdGlvbiBhcnJheUluZGV4T2Yoc3RyLCBhcnIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXS50b0xvd2VyQ2FzZSgpID09PSBzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbG9nLndhcm4oXCJObyBpbnN0YW5jZSBvZiBcIitzdHIrXCIgaW4gYXJyYXkgXCIrYXJyKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ0FTRS1JTlNFTlNJVElWRVxuICBmdW5jdGlvbiBhcnJheUluZGljZXNPZihzdHIsIGFycikge1xuICAgIHZhciBpbmQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXS50b0xvd2VyQ2FzZSgpID09PSBzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBpbmQucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZhcnMoaW5wdXQsIHF1ZXJ5KSB7XG4gICAgbG9nLmluZm8oJ1NQQVJRTCB2YXJzOiAnICsgaW5wdXQpO1xuICAgIGZvciAodmFyIHggaW4gaW5wdXQpIHtcbiAgICAgIGlmIChpc1ZhcihpbnB1dFt4XSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0FkZGVkICcgKyBpbnB1dFt4XSArICcgdG8gcXVlcnkgdmFyaWFibGVzIGZyb20gU1BBUlFMJyk7XG4gICAgICAgIHZhciB2ID0gbWFrZVZhcihpbnB1dFt4XS5zbGljZSgxKSk7XG4gICAgICAgIHF1ZXJ5LnZhcnMucHVzaCh2KTtcbiAgICAgICAgdi5sYWJlbCA9IGlucHV0W3hdLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oJ0luY29ycmVjdCBTUEFSUUwgdmFyaWFibGUgaW4gU0VMRUNUOiAnICsgaW5wdXRbeF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZWZpeERlY2xhcmF0aW9ucyhpbnB1dCkge1xuICAgIHZhciBwcmVmSW5kID0gYXJyYXlJbmRpY2VzT2YoJ1BSRUZJWCcsIGlucHV0KTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBwcmVmSW5kKSB7XG4gICAgICB2YXIgYSA9IGlucHV0W3ByZWZJbmRbaV0gKyAxXTtcbiAgICAgIHZhciBiID0gaW5wdXRbcHJlZkluZFtpXSArIDJdO1xuICAgICAgaWYgKCFpc1ByZWZpeChhKSkge1xuICAgICAgICBsb2cuZXJyb3IoJ0ludmFsaWQgU1BBUlFMIHByZWZpeDogJyArIGEpO1xuICAgICAgfSBlbHNlIGlmICghaXNTeW1ib2woYikpIHtcbiAgICAgICAgbG9nLmVycm9yKCdJbnZhbGlkIFNQQVJRTCBzeW1ib2w6ICcgKyBiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5pbmZvKCdQcmVmaXggZm91bmQ6ICcgKyBhICsgJyAtPiAnICsgYik7XG4gICAgICAgIHZhciBwcmVmID0gZ2V0UHJlZml4KGEpO1xuICAgICAgICB2YXIgc3ltYm9sID0gcmVtb3ZlQnJhY2tldHMoYik7XG4gICAgICAgIHJlc1twcmVmXSA9IHN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1hdGNoaW5nQnJhY2tldChhcnIsIG9wZW4sIGNsb3NlKSB7XG4gICAgbG9nLmluZm8oJ0xvb2tpbmcgZm9yIGEgY2xvc2UgYnJhY2tldCBvZiB0eXBlICcgKyBjbG9zZSArICcgaW4gJyArIGFycik7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gb3Blbikge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXSA9PT0gY2xvc2UpIHtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5lcnJvcignU3RhdGVtZW50IGhhZCBubyBjbG9zZSBwYXJlbnRoZXNpcyBpbiBTUEFSUUwgcXVlcnknKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbnRHcmVhdGVyVGhhbih2YWx1ZSkge1xuICAgIHRoaXMuZGVzY3JpYmUgPSBmdW5jdGlvbiAodmFyc3RyKSB7XG4gICAgICByZXR1cm4gdmFyc3RyICsgJyA+ICcgKyB2YWx1ZS50b05UKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlc3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgICAgaWYgKHRlcm0udmFsdWUubWF0Y2goL1swLTldKyhcXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPy8pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRlcm0udmFsdWUpID4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGVybS50b05UKCkgPiB2YWx1ZS50b05UKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbnRMZXNzVGhhbih2YWx1ZSkge1xuICAgIC8vIHRoaXMgaXMgbm90IHRoZSByZWNvbW1lbmRlZCB1c2FnZS4gU2hvdWxkIG9ubHkgd29yayBvbiBsaXRlcmFsLCBudW1lcmljLCBkYXRlVGltZVxuICAgIHRoaXMuZGVzY3JpYmUgPSBmdW5jdGlvbiAodmFyc3RyKSB7XG4gICAgICByZXR1cm4gdmFyc3RyICsgJyA8ICcgKyB2YWx1ZS50b05UKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlc3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgICAgLy8gdGhpcy5kZXNjcmliZSA9IGZ1bmN0aW9uICh2YXJzdHIpIHsgcmV0dXJuIHZhcnN0ciArIFwiIDwgXCIrdmFsdWUgfVxuICAgICAgaWYgKHRlcm0udmFsdWUubWF0Y2goL1swLTldKyhcXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPy8pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRlcm0udmFsdWUpIDwgcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGVybS50b05UKCkgPCB2YWx1ZS50b05UKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBUaGlzIHNob3VsZCBvbmx5IHdvcmsgb24gbGl0ZXJhbHMgYnV0IGRvZXNuJ3QuXG4gIGZ1bmN0aW9uIENvbnN0cmFpbnRFcXVhbFRvKHZhbHVlKSB7XG4gICAgdGhpcy5kZXNjcmliZSA9IGZ1bmN0aW9uICh2YXJzdHIpIHtcbiAgICAgIHJldHVybiB2YXJzdHIgKyAnID0gJyArIHZhbHVlLnRvTlQoKTtcbiAgICB9O1xuICAgIHRoaXMudGVzdCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc2FtZVRlcm0odGVybSk7XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHZhbHVlIG11c3QgYmUgYSBsaXRlcmFsXG4gIGZ1bmN0aW9uIENvbnN0cmFpbnRSZWdleHAodmFsdWUpIHtcbiAgICB0aGlzLmRlc2NyaWJlID0gZnVuY3Rpb24gKHZhcnN0cikge1xuICAgICAgcmV0dXJuIFwiUkVHRVhQKCAnXCIgKyB2YWx1ZSArIFwiJyAsIFwiICsgdmFyc3RyICsgJyApJztcbiAgICB9O1xuICAgIHRoaXMudGVzdCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICB2YXIgc3RyID0gdmFsdWU7XG4gICAgICAvLyBzdHIgPSBzdHIucmVwbGFjZSgvXi8vLFwiXCIpLnJlcGxhY2UoLy8kLyxcIlwiKVxuICAgICAgdmFyIHJnID0gbmV3IFJlZ0V4cChzdHIpO1xuICAgICAgaWYgKHRlcm0udmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJnLnRlc3QodGVybS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENvbnN0cmFpbnQoaW5wdXQsIHBhdCkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDMgJiYgaW5wdXRbMF0udGVybVR5cGUgPT09ICdWYXJpYWJsZScgJiYgKGlucHV0WzJdLnRlcm1UeXBlID09PSAnTmFtZWROb2RlJyB8fCBpbnB1dFsyXS50ZXJtVHlwZSA9PT0gJ0xpdGVyYWwnKSkge1xuICAgICAgaWYgKGlucHV0WzFdID09PSAnPScpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdDb25zdHJhaW50IGFkZGVkOiAnICsgaW5wdXQpO1xuICAgICAgICBwYXQuY29uc3RyYWludHNbaW5wdXRbMF1dID0gbmV3IENvbnN0cmFpbnRFcXVhbFRvKGlucHV0WzJdKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXRbMV0gPT09ICc+Jykge1xuICAgICAgICBsb2cuZGVidWcoJ0NvbnN0cmFpbnQgYWRkZWQ6ICcgKyBpbnB1dCk7XG4gICAgICAgIHBhdC5jb25zdHJhaW50c1tpbnB1dFswXV0gPSBuZXcgQ29uc3RyYWludEVxdWFsVG8oaW5wdXRbMl0pO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dFsxXSA9PT0gJzwnKSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnQ29uc3RyYWludCBhZGRlZDogJyArIGlucHV0KTtcbiAgICAgICAgcGF0LmNvbnN0cmFpbnRzW2lucHV0WzBdXSA9IG5ldyBDb25zdHJhaW50RXF1YWxUbyhpbnB1dFsyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cud2FybihcIkkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBjb25zdHJhaW50OiBcIiArIGlucHV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA9PT0gNiAmJiB0eXBlb2YgaW5wdXRbMF0gPT09ICdzdHJpbmcnICYmIGlucHV0WzBdLnRvTG93ZXJDYXNlKCkgPT09ICdyZWdleHAnICYmIGlucHV0WzFdID09PSAnKCcgJiYgaW5wdXRbNV0gPT09ICcpJyAmJiBpbnB1dFszXSA9PT0gJywnICYmIGlucHV0WzRdLnRlcm1UeXBlID09PSAnVmFyaWFibGUnICYmIGlucHV0WzJdLnRlcm1UeXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgIGxvZy5kZWJ1ZygnQ29uc3RyYWludCBhZGRlZDogJyArIGlucHV0KTtcbiAgICAgIHBhdC5jb25zdHJhaW50c1tpbnB1dFs0XV0gPSBuZXcgQ29uc3RyYWludFJlZ2V4cChpbnB1dFsyXS52YWx1ZSk7XG4gICAgfVxuICAgIC8vIGxvZy53YXJuKFwiSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIGNvbnN0cmFpbnQ6IFwiK2lucHV0KVxuICAgIC8vIGFsZXJ0KFwibGVuZ3RoOiBcIitpbnB1dC5sZW5ndGgrXCIgaW5wdXQgMCB0eXBlOiBcIitpbnB1dFswXS50ZXJtVHlwZStcIiBpbnB1dCAxOiBcIitpbnB1dFsxXStcIiBpbnB1dFsyXSB0eXBlOiBcIitpbnB1dFsyXS50ZXJtVHlwZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldE9wdGlvbmFsKHRlcm1zLCBwYXQpIHtcbiAgICBsb2cuZGVidWcoJ09wdGlvbmFsIHF1ZXJ5OiAnICsgdGVybXMgKyAnIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gICAgdmFyIG9wdCA9IGtiLmZvcm11bGEoKTtcbiAgICBzZXRXaGVyZSh0ZXJtcywgb3B0KTtcbiAgICBwYXQub3B0aW9uYWwucHVzaChvcHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0V2hlcmUoaW5wdXQsIHBhdCkge1xuICAgIHZhciB0ZXJtcyA9IHRvVGVybXMoaW5wdXQpO1xuICAgIHZhciBlbmQ7XG4gICAgbG9nLmRlYnVnKCdXSEVSRTogJyArIHRlcm1zKTtcbiAgICB2YXIgb3B0O1xuICAgIC8vIHZhciBvcHQgPSBhcnJheUluZGljZXNPZihcIk9QVElPTkFMXCIsdGVybXMpXG4gICAgd2hpbGUgKGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcykpIHtcbiAgICAgIG9wdCA9IGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcyk7XG4gICAgICBsb2cuZGVidWcoJ09QVDogJyArIG9wdCArICcgJyArIHRlcm1zW29wdF0gKyAnIGluICcgKyB0ZXJtcyk7XG4gICAgICBpZiAodGVybXNbb3B0ICsgMV0gIT09ICd7Jykge1xuICAgICAgICBsb2cud2FybignQmFkIG9wdGlvbmFsIG9wZW5pbmcgYnJhY2tldCBpbiB3b3JkICcgKyBvcHQpO1xuICAgICAgfVxuICAgICAgZW5kID0gZ2V0TWF0Y2hpbmdCcmFja2V0KHRlcm1zLnNsaWNlKG9wdCArIDIpLCAneycsICd9Jyk7XG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICBsb2cuZXJyb3IoJ05vIG1hdGNoaW5nIGJyYWNrZXQgaW4gd29yZCAnICsgb3B0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE9wdGlvbmFsKHRlcm1zLnNsaWNlKG9wdCArIDIsIG9wdCArIDIgKyBlbmQpLCBwYXQpO1xuICAgICAgICAvLyBhbGVydChwYXQuc3RhdGVtZW50c1swXS50b05UKCkpXG4gICAgICAgIG9wdCA9IGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcyk7XG4gICAgICAgIGVuZCA9IGdldE1hdGNoaW5nQnJhY2tldCh0ZXJtcy5zbGljZShvcHQgKyAyKSwgJ3snLCAnfScpO1xuICAgICAgICB0ZXJtcy5zcGxpY2Uob3B0LCBlbmQgKyAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdXSEVSRSBhZnRlciBvcHRpb25hbHM6ICcgKyB0ZXJtcyk7XG4gICAgd2hpbGUgKGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpKSB7XG4gICAgICB2YXIgZmlsdCA9IGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpO1xuICAgICAgaWYgKHRlcm1zW2ZpbHQgKyAxXSAhPT0gJygnKSB7XG4gICAgICAgIGxvZy53YXJuKCdCYWQgZmlsdGVyIG9wZW5pbmcgYnJhY2tldCBpbiB3b3JkICcgKyBmaWx0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGdldE1hdGNoaW5nQnJhY2tldCh0ZXJtcy5zbGljZShmaWx0ICsgMiksICcoJywgJyknKTtcbiAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgIGxvZy5lcnJvcignTm8gbWF0Y2hpbmcgYnJhY2tldCBpbiB3b3JkICcgKyBmaWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENvbnN0cmFpbnQodGVybXMuc2xpY2UoZmlsdCArIDIsIGZpbHQgKyAyICsgZW5kKSwgcGF0KTtcbiAgICAgICAgZmlsdCA9IGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpO1xuICAgICAgICBlbmQgPSBnZXRNYXRjaGluZ0JyYWNrZXQodGVybXMuc2xpY2UoZmlsdCArIDIpLCAnKCcsICcpJyk7XG4gICAgICAgIHRlcm1zLnNwbGljZShmaWx0LCBlbmQgKyAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdXSEVSRSBhZnRlciBmaWx0ZXJzIGFuZCBvcHRpb25hbHM6ICcgKyB0ZXJtcyk7XG4gICAgZXh0cmFjdFN0YXRlbWVudHModGVybXMsIHBhdCk7XG4gIH1cblxuICBmdW5jdGlvbiBleHRyYWN0U3RhdGVtZW50cyh0ZXJtcywgZm9ybXVsYSkge1xuICAgIHZhciBhcnJheVplcm8gPSBuZXcgQXJyYXkoMSk7XG4gICAgYXJyYXlaZXJvWzBdID0gLTE7IC8vIHRoaXMgaXMganVzdCB0byBhZGQgdGhlIGJlZ2lubmluZyBvZiB0aGUgd2hlcmUgdG8gdGhlIHBlcmlvZHMgaW5kZXguXG4gICAgdmFyIHBlciA9IGFycmF5WmVyby5jb25jYXQoYXJyYXlJbmRpY2VzT2YoJy4nLCB0ZXJtcykpO1xuICAgIHZhciBzdGF0ID0gW107XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBwZXIubGVuZ3RoIC0gMTsgeCsrKSB7XG4gICAgICBzdGF0W3hdID0gdGVybXMuc2xpY2UocGVyW3hdICsgMSwgcGVyW3ggKyAxXSk7XG4gICAgfVxuICAgIC8vIE5vdyBpdCdzIGluIGFuIGFycmF5IG9mIHN0YXRlbWVudHNcbiAgICBmb3IgKHggaW4gc3RhdCkge1xuICAgICAgLy8gVEhJUyBNVVNUIEJFIENIQU5HRUQgRk9SIENPTU1BLCBTRU1JQ09MT05cbiAgICAgIGxvZy5pbmZvKCdzK3ArbyAnICsgeCArICcgPSAnICsgc3RhdFt4XSk7XG4gICAgICB2YXIgc3ViaiA9IHN0YXRbeF1bMF07XG4gICAgICBzdGF0W3hdLnNwbGljZSgwLCAxKTtcbiAgICAgIHZhciBzZW0gPSBhcnJheVplcm8uY29uY2F0KGFycmF5SW5kaWNlc09mKCc7Jywgc3RhdFt4XSkpO1xuICAgICAgc2VtLnB1c2goc3RhdFt4XS5sZW5ndGgpO1xuICAgICAgdmFyIHN0YXQyID0gW107XG4gICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHNlbS5sZW5ndGggLSAxOyB5KyspIHtcbiAgICAgICAgc3RhdDJbeV0gPSBzdGF0W3hdLnNsaWNlKHNlbVt5XSArIDEsIHNlbVt5ICsgMV0pO1xuICAgICAgfVxuICAgICAgZm9yICh4IGluIHN0YXQyKSB7XG4gICAgICAgIGxvZy5pbmZvKCdwK28gJyArIHggKyAnID0gJyArIHN0YXRbeF0pO1xuICAgICAgICB2YXIgcHJlZCA9IHN0YXQyW3hdWzBdO1xuICAgICAgICBzdGF0Mlt4XS5zcGxpY2UoMCwgMSk7XG4gICAgICAgIHZhciBjb20gPSBhcnJheVplcm8uY29uY2F0KGFycmF5SW5kaWNlc09mKCcsJywgc3RhdDJbeF0pKTtcbiAgICAgICAgY29tLnB1c2goc3RhdDJbeF0ubGVuZ3RoKTtcbiAgICAgICAgdmFyIHN0YXQzID0gW107XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBjb20ubGVuZ3RoIC0gMTsgeSsrKSB7XG4gICAgICAgICAgc3RhdDNbeV0gPSBzdGF0Mlt4XS5zbGljZShjb21beV0gKyAxLCBjb21beSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHggaW4gc3RhdDMpIHtcbiAgICAgICAgICB2YXIgb2JqID0gc3RhdDNbeF1bMF07XG4gICAgICAgICAgbG9nLmluZm8oJ1N1Ymo9JyArIHN1YmogKyAnIFByZWQ9JyArIHByZWQgKyAnIE9iaj0nICsgb2JqKTtcbiAgICAgICAgICBmb3JtdWxhLmFkZChzdWJqLCBwcmVkLCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCb2R5IG9mIFNQQVJRTFRvUXVlcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgbG9nLmluZm8oJ1NQQVJRTCBpbnB1dDogXFxuJyArIFNQQVJRTCk7XG4gIHZhciBxID0gbmV3IFF1ZXJ5KCk7XG4gIHZhciBzcCA9IHRva2VuaXplKFNQQVJRTCk7IC8vIGZpcnN0IHRva2VuaXplIGV2ZXJ5dGhpbmdcbiAgdmFyIHByZWZpeGVzID0gZ2V0UHJlZml4RGVjbGFyYXRpb25zKHNwKTtcbiAgaWYgKCFwcmVmaXhlcy5yZGYpIHtcbiAgICBwcmVmaXhlcy5yZGYgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc7XG4gIH1cbiAgaWYgKCFwcmVmaXhlcy5yZGZzKSB7XG4gICAgcHJlZml4ZXMucmRmcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjJztcbiAgfVxuICB2YXIgc2VsZWN0TG9jID0gYXJyYXlJbmRleE9mKCdTRUxFQ1QnLCBzcCk7XG4gIHZhciB3aGVyZUxvYyA9IGFycmF5SW5kZXhPZignV0hFUkUnLCBzcCk7XG4gIGlmIChzZWxlY3RMb2MgPCAwIHx8IHdoZXJlTG9jIDwgMCB8fCBzZWxlY3RMb2MgPiB3aGVyZUxvYykge1xuICAgIGxvZy5lcnJvcignSW52YWxpZCBvciBub25leGlzdGVudCBTRUxFQ1QgYW5kIFdIRVJFIHRhZ3MgaW4gU1BBUlFMIHF1ZXJ5Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHNldFZhcnMoc3Auc2xpY2Uoc2VsZWN0TG9jICsgMSwgd2hlcmVMb2MpLCBxKTtcblxuICBzZXRXaGVyZShzcC5zbGljZSh3aGVyZUxvYyArIDIsIHNwLmxlbmd0aCAtIDEpLCBxLnBhdCk7XG5cbiAgaWYgKHRlc3RNb2RlKSB7XG4gICAgcmV0dXJuIHE7XG4gIH1cblxuICBmb3IgKHZhciB4IGluIHEucGF0LnN0YXRlbWVudHMpIHtcbiAgICB2YXIgc3QgPSBxLnBhdC5zdGF0ZW1lbnRzW3hdO1xuICAgIGlmIChzdC5zdWJqZWN0LnRlcm1UeXBlID09PSAnTmFtZWROb2RlJykge1xuICAgICAgLyogJiYgc2YuaXNQZW5kaW5nKHN0LnN1YmplY3QudXJpKSAqLyAvLyBUaGlzIGRvZXNuJ3Qgd29yay5cbiAgICAgIC8vIHNmLnJlcXVlc3RVUkkoc3Quc3ViamVjdC51cmksXCJzcGFycWw6XCIrc3Quc3ViamVjdCkgS2Vubnk6IEkgcmVtb3ZlIHRoZXNlIHR3b1xuICAgICAgaWYgKGtiLmZldGNoZXIpIHtcbiAgICAgICAga2IuZmV0Y2hlci5sb29rVXBUaGluZyhzdC5zdWJqZWN0LCAnc3BhcnFsOicgKyBzdC5zdWJqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0Lm9iamVjdC50ZXJtVHlwZSA9PT0gJ05hbWVkTm9kZScpIHtcbiAgICAgIC8qICYmIHNmLmlzUGVuZGluZyhzdC5vYmplY3QudXJpKSAqL1xuICAgICAgLy8gc2YucmVxdWVzdFVSSShzdC5vYmplY3QudXJpLFwic3BhcnFsOlwiK3N0Lm9iamVjdClcbiAgICAgIGlmIChrYi5mZXRjaGVyKSB7XG4gICAgICAgIGtiLmZldGNoZXIubG9va1VwVGhpbmcoc3Qub2JqZWN0LCAnc3BhcnFsOicgKyBzdC5vYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbGVydChxLnBhdClcbiAgcmV0dXJuIHE7XG4gIC8vIGNoZWNrVmFycygpXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNQQVJRTFRvUXVlcnk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdGF0ZW1lbnQoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlbWVudCk7XG5cbiAgICB0aGlzLnN1YmplY3QgPSBOb2RlLmZyb21WYWx1ZShzdWJqZWN0KTtcbiAgICB0aGlzLnByZWRpY2F0ZSA9IE5vZGUuZnJvbVZhbHVlKHByZWRpY2F0ZSk7XG4gICAgdGhpcy5vYmplY3QgPSBOb2RlLmZyb21WYWx1ZShvYmplY3QpO1xuICAgIHRoaXMud2h5ID0gZ3JhcGg7IC8vIHByb3BlcnR5IGN1cnJlbnRseSB1c2VkIGJ5IHJkZmxpYlxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFN0YXRlbWVudCwgW3tcbiAgICBrZXk6ICdlcXVhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICAgIHJldHVybiBvdGhlci5zdWJqZWN0LmVxdWFscyh0aGlzLnN1YmplY3QpICYmIG90aGVyLnByZWRpY2F0ZS5lcXVhbHModGhpcy5wcmVkaWNhdGUpICYmIG90aGVyLm9iamVjdC5lcXVhbHModGhpcy5vYmplY3QpICYmIG90aGVyLmdyYXBoLmVxdWFscyh0aGlzLmdyYXBoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHkgPSBuZXcgU3RhdGVtZW50KHRoaXMuc3ViamVjdC5zdWJzdGl0dXRlKGJpbmRpbmdzKSwgdGhpcy5wcmVkaWNhdGUuc3Vic3RpdHV0ZShiaW5kaW5ncyksIHRoaXMub2JqZWN0LnN1YnN0aXR1dGUoYmluZGluZ3MpLCB0aGlzLndoeS5zdWJzdGl0dXRlKGJpbmRpbmdzKSk7IC8vIDIwMTZcbiAgICAgIGNvbnNvbGUubG9nKCdAQEAgc3RhdGVtZW50IHN1YnN0aXR1dGU6JyArIHkpO1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHZhciB0ZXJtcyA9IFt0aGlzLnN1YmplY3QudG9DYW5vbmljYWwoKSwgdGhpcy5wcmVkaWNhdGUudG9DYW5vbmljYWwoKSwgdGhpcy5vYmplY3QudG9DYW5vbmljYWwoKV07XG4gICAgICBpZiAodGhpcy5ncmFwaCAmJiB0aGlzLmdyYXBoLnRlcm1UeXBlICE9PSAnRGVmYXVsdEdyYXBoJykge1xuICAgICAgICB0ZXJtcy5wdXNoKHRoaXMuZ3JhcGgudG9DYW5vbmljYWwoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybXMuam9pbignICcpICsgJyAuJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OVCgpIHtcbiAgICAgIHJldHVybiBbdGhpcy5zdWJqZWN0LnRvTlQoKSwgdGhpcy5wcmVkaWNhdGUudG9OVCgpLCB0aGlzLm9iamVjdC50b05UKCldLmpvaW4oJyAnKSArICcgLic7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTlQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdncmFwaCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy53aHk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChnKSB7XG4gICAgICB0aGlzLndoeSA9IGc7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXRlbWVudDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0ZW1lbnQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfaW5kZXhlZEZvcm11bGEgPSByZXF1aXJlKCcuL2luZGV4ZWQtZm9ybXVsYScpO1xuXG52YXIgX2luZGV4ZWRGb3JtdWxhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luZGV4ZWRGb3JtdWxhKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gSm9lIFByZXNicmV5IDxwcmVzYnJleUBtaXQuZWR1PlxuLy8gMjAwNy0wNy0xNVxuLy8gMjAxMC0wOC0wOCBUaW1CTCBmb2xkZWQgaW4gS2VubnkncyBXRUJEQVZcbi8vIDIwMTAtMTItMDcgVGltQkwgYWRkcmVkIGxvY2FsIGZpbGUgd3JpdGUgY29kZVxudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG52YXIgRmV0Y2hlciA9IHJlcXVpcmUoJy4vZmV0Y2hlcicpO1xudmFyIGdyYXBoID0gcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKS5ncmFwaDtcblxudmFyIG5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vZGF0YS1mYWN0b3J5JykubmFtZWROb2RlO1xudmFyIE5hbWVzcGFjZSA9IHJlcXVpcmUoJy4vbmFtZXNwYWNlJyk7XG52YXIgU2VyaWFsaXplciA9IHJlcXVpcmUoJy4vc2VyaWFsaXplcicpO1xudmFyIHVyaUpvaW4gPSByZXF1aXJlKCcuL3VyaScpLmpvaW47XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgVXBkYXRlTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNwYXJxbCA9IGZ1bmN0aW9uIHNwYXJxbChzdG9yZSkge1xuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICBpZiAoc3RvcmUudXBkYXRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IGhhdmUgdHdvIFVwZGF0ZU1hbmFnZXJzIGZvciB0aGUgc2FtZSBzdG9yZVwiKTtcbiAgICB9XG4gICAgaWYgKCFzdG9yZS5mZXRjaGVyKSB7XG4gICAgICAvLyBUaGUgc3RvcmUgbXVzdCBhbHNvL2FscmVhZHkgaGF2ZSBhIGZldGNoZXJcbiAgICAgIG5ldyBGZXRjaGVyKHN0b3JlKTtcbiAgICB9XG4gICAgc3RvcmUudXBkYXRlciA9IHRoaXM7XG4gICAgdGhpcy5pZnBzID0ge307XG4gICAgdGhpcy5mcHMgPSB7fTtcbiAgICB0aGlzLm5zID0ge307XG4gICAgdGhpcy5ucy5saW5rID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rIycpO1xuICAgIHRoaXMubnMuaHR0cCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvaHR0cCMnKTtcbiAgICB0aGlzLm5zLmh0dHBoID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9odHRwaCMnKTtcbiAgICB0aGlzLm5zLmxkcCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvbnMvbGRwIycpO1xuICAgIHRoaXMubnMucmRmID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyk7XG4gICAgdGhpcy5ucy5yZGZzID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjJyk7XG4gICAgdGhpcy5ucy5yZGYgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnKTtcbiAgICB0aGlzLm5zLm93bCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjJyk7XG5cbiAgICB0aGlzLnBhdGNoQ29udHJvbCA9IFtdOyAvLyBpbmRleCBvZiBvYmplY3RzIGZybyBjb29yZGluYXRpbmcgaW5jb21uZyBhbmQgb3V0Z29pbmcgcGF0Y2hlc1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUucGF0Y2hDb250cm9sRm9yID0gZnVuY3Rpb24gKGRvYykge1xuICAgIGlmICghdGhpcy5wYXRjaENvbnRyb2xbZG9jLnVyaV0pIHtcbiAgICAgIHRoaXMucGF0Y2hDb250cm9sW2RvYy51cmldID0gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhdGNoQ29udHJvbFtkb2MudXJpXTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIFRoZSBtZXRob2Qgc3RyaW5nIFNQQVJRTCBvciBEQVYgb3IgTE9DQUxGSUxFIG9yIGZhbHNlIGlmIGtub3duLCB1bmRlZmluZWQgaWYgbm90IGtub3duLlxuICAvL1xuICAvLyBGaWxlcyBoYXZlIHRvIGhhdmUgYSBzcGVjaWZpYyBhbm5vdGF0b24gdGhhdCB0aGV5IGFyZSBtYWNoaW5lIHdyaXR0ZW4sIGZvciBzYWZldHkuXG4gIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNoZWNrIGZvciB3cml0ZSBhY2Nlc3Mgb24gZmlsZXMuXG4gIC8vXG4gIHNwYXJxbC5wcm90b3R5cGUuZWRpdGFibGUgPSBmdW5jdGlvbiAodXJpLCBrYikge1xuICAgIGlmICghdXJpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIEVnIHN1YmplY3QgaXMgYm5vZGUsIG5vIGtub3duIGRvYyB0byB3cml0ZSB0b1xuICAgIH1cbiAgICBpZiAoIWtiKSB7XG4gICAgICBrYiA9IHRoaXMuc3RvcmU7XG4gICAgfVxuXG4gICAgaWYgKHVyaS5zbGljZSgwLCA4KSA9PT0gJ2ZpbGU6Ly8vJykge1xuICAgICAgaWYgKGtiLmhvbGRzKGtiLnN5bSh1cmkpLCBuYW1lZE5vZGUoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyksIG5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNNYWNoaW5lRWRpdGFibGVEb2N1bWVudCcpKSkge1xuICAgICAgICByZXR1cm4gJ0xPQ0FMRklMRSc7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcoa2Iuc3ltKHVyaSksIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm90IE1hY2hpbmVFZGl0YWJsZURvY3VtZW50IGZpbGUgJyArIHVyaSArICdcXG4nKTtcbiAgICAgIGNvbnNvbGUubG9nKHN0cy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHgudG9OVCgpO1xuICAgICAgfSkuam9pbignXFxuJykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gQEAgV291bGQgYmUgbmlmdHkgb2YgY291cnNlIHRvIHNlZSB3aGV0aGVyIHdlIGFjdHVhbGx5IGhhdmUgd3JpdGUgYWNlc3MgZmlyc3QuXG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGRlZmluaXRpdmUgPSBmYWxzZTtcbiAgICB2YXIgcmVxdWVzdHMgPSBrYi5lYWNoKHVuZGVmaW5lZCwgdGhpcy5ucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwgZG9jcGFydCh1cmkpKTtcblxuICAgIC8vIEhhY2sgZm9yIHRoZSBtb21lbnQgQEBAQCAyMDE2LTAyLTEyXG4gICAgaWYgKGtiLmhvbGRzKG5hbWVkTm9kZSh1cmkpLCB0aGlzLm5zLnJkZigndHlwZScpLCB0aGlzLm5zLmxkcCgnUmVzb3VyY2UnKSkpIHtcbiAgICAgIHJldHVybiAnU1BBUlFMJztcbiAgICB9XG4gICAgdmFyIGk7XG4gICAgdmFyIG1ldGhvZDtcbiAgICBmb3IgKHZhciByID0gMDsgciA8IHJlcXVlc3RzLmxlbmd0aDsgcisrKSB7XG4gICAgICByZXF1ZXN0ID0gcmVxdWVzdHNbcl07XG4gICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShyZXF1ZXN0LCB0aGlzLm5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIGFjY2VwdFBhdGNoID0ga2IuZWFjaChyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnYWNjZXB0LXBhdGNoJykpO1xuICAgICAgICAgIGlmIChhY2NlcHRQYXRjaC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2NlcHRQYXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBtZXRob2QgPSBhY2NlcHRQYXRjaFtpXS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgIGlmIChtZXRob2QuaW5kZXhPZignYXBwbGljYXRpb24vc3BhcnFsLXVwZGF0ZScpID49IDApIHJldHVybiAnU1BBUlFMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF1dGhvcl92aWEgPSBrYi5lYWNoKHJlc3BvbnNlLCB0aGlzLm5zLmh0dHBoKCdtcy1hdXRob3ItdmlhJykpO1xuICAgICAgICAgIGlmIChhdXRob3JfdmlhLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF1dGhvcl92aWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbWV0aG9kID0gYXV0aG9yX3ZpYVtpXS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgIGlmIChtZXRob2QuaW5kZXhPZignU1BBUlFMJykgPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnU1BBUlFMJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobWV0aG9kLmluZGV4T2YoJ0RBVicpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0RBVic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IGtiLmVhY2gocmVzcG9uc2UsIHRoaXMubnMuaHR0cCgnc3RhdHVzJykpO1xuICAgICAgICAgIGlmIChzdGF0dXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNbaV0gPT09IDIwMCB8fCBzdGF0dXNbaV0gPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIGRlZmluaXRpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSAvLyBBIGRlZmluaXRpdmUgYW5zd2VyXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm8gcmVzcG9uc2UgZm9yICcgKyB1cmkgKyAnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm8gcmVxdWVzdCBmb3IgJyArIHVyaSArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlZmluaXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBXZSBoYXZlIGdvdCBhIHJlcXVlc3QgYW5kIGl0IGRpZCBOT1Qgc2F5IGVkaXRhYmxlID0+IG5vdCBlZGl0YWJsZVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnc3BhcnFsLmVkaXRhYmxlOiBpbmNvbmNsdXNpdmUgZm9yICcgKyB1cmkgKyAnXFxuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gV2UgZG9uJ3Qga25vdyAoeWV0KSBhcyB3ZSBoYXZlbid0IGhhZCBhIHJlc3BvbnNlICh5ZXQpXG4gIH07XG5cbiAgLy8gLy8vLy8vLy8vICBUaGUgaWRlbnRpZmljYXRpb24gb2YgYm5vZGVzXG5cbiAgc3BhcnFsLnByb3RvdHlwZS5hbm9ueW1pemUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iai50b05UKCkuc3Vic3RyKDAsIDIpID09PSAnXzonICYmIHRoaXMuX21lbnRpb25lZChvYmopID8gJz8nICsgb2JqLnRvTlQoKS5zdWJzdHIoMikgOiBvYmoudG9OVCgpO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuYW5vbnltaXplTlQgPSBmdW5jdGlvbiAoc3RtdCkge1xuICAgIHJldHVybiB0aGlzLmFub255bWl6ZShzdG10LnN1YmplY3QpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3RtdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3RtdC5vYmplY3QpICsgJyAuJztcbiAgfTtcblxuICAvLyBBIGxpc3Qgb2YgYWxsIGJub2RlcyBvY2N1cmluZyBpbiBhIHN0YXRlbWVudFxuICBzcGFycWwucHJvdG90eXBlLl9zdGF0ZW1lbnRfYm5vZGVzID0gZnVuY3Rpb24gKHN0KSB7XG4gICAgcmV0dXJuIFtzdC5zdWJqZWN0LCBzdC5wcmVkaWNhdGUsIHN0Lm9iamVjdF0uZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geC5pc0JsYW5rO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEEgbGlzdCBvZiBhbGwgYm5vZGVzIG9jY3VyaW5nIGluIGEgbGlzdCBvZiBzdGF0ZW1lbnRzXG4gIHNwYXJxbC5wcm90b3R5cGUuX3N0YXRlbWVudF9hcnJheV9ibm9kZXMgPSBmdW5jdGlvbiAoc3RzKSB7XG4gICAgdmFyIGJub2RlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBibm9kZXMgPSBibm9kZXMuY29uY2F0KHRoaXMuX3N0YXRlbWVudF9ibm9kZXMoc3RzW2ldKSk7XG4gICAgfVxuICAgIGJub2Rlcy5zb3J0KCk7IC8vIGluIHBsYWNlIHNvcnQgLSByZXN1bHQgbWF5IGhhdmUgZHVwbGljYXRlc1xuICAgIHZhciBibm9kZXMyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBibm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChqID09PSAwIHx8ICFibm9kZXNbal0uc2FtZVRlcm0oYm5vZGVzW2ogLSAxXSkpIHtcbiAgICAgICAgYm5vZGVzMi5wdXNoKGJub2Rlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBibm9kZXMyO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2NhY2hlX2lmcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTWFrZSBhIGNhY2hlZCBsaXN0IG9mIFtJbnZlcnNlLV1GdW5jdGlvbmFsIHByb3BlcnRpZXNcbiAgICAvLyBDYWxsIHRoaXMgb25jZSBiZWZvcmUgY2FsbGluZyBjb250ZXh0X3N0YXRlbWVudHNcbiAgICB0aGlzLmlmcHMgPSB7fTtcbiAgICB2YXIgYSA9IHRoaXMuc3RvcmUuZWFjaCh1bmRlZmluZWQsIHRoaXMubnMucmRmKCd0eXBlJyksIHRoaXMubnMub3dsKCdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pZnBzW2FbaV0udXJpXSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuZnBzID0ge307XG4gICAgYSA9IHRoaXMuc3RvcmUuZWFjaCh1bmRlZmluZWQsIHRoaXMubnMucmRmKCd0eXBlJyksIHRoaXMubnMub3dsKCdGdW5jdGlvbmFsUHJvcGVydHknKSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZnBzW2FbaV0udXJpXSA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHVybnMgYSBjb250ZXh0IHRvIGJpbmQgYSBnaXZlbiBub2RlLCB1cCB0byBhIGdpdmVuIGRlcHRoXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHQyID0gZnVuY3Rpb24gKHgsIHNvdXJjZSwgZGVwdGgpIHtcbiAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIHN0YXRlbWVudHMgd2hpY2ggaW5kaXJlY3RseSBpZGVudGlmeSBhIG5vZGVcbiAgICAvLyAgRGVwdGggPiAxIGlmIHRyeSBmdXJ0aGVyIGluZGlyZWN0aW9uLlxuICAgIC8vICBSZXR1cm4gYXJyYXkgb2Ygc3RhdGVtZW50cyAocG9zc2libHkgZW1wdHkpLCBvciBudWxsIGlmIGZhaWx1cmVcbiAgICB2YXIgc3RzID0gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHgsIHNvdXJjZSk7IC8vIGluY29taW5nIGxpbmtzXG4gICAgdmFyIHk7XG4gICAgdmFyIHJlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZnBzW3N0c1tpXS5wcmVkaWNhdGUudXJpXSkge1xuICAgICAgICB5ID0gc3RzW2ldLnN1YmplY3Q7XG4gICAgICAgIGlmICgheS5pc0JsYW5rKSB7XG4gICAgICAgICAgcmV0dXJuIFtzdHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuX2Jub2RlX2NvbnRleHQyKHksIHNvdXJjZSwgZGVwdGggLSAxKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChbc3RzW2ldXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG91dGdvaW5nIGxpbmtzXG4gICAgc3RzID0gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoeCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHNvdXJjZSk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaWZwc1tzdHNbaV0ucHJlZGljYXRlLnVyaV0pIHtcbiAgICAgICAgeSA9IHN0c1tpXS5vYmplY3Q7XG4gICAgICAgIGlmICgheS5pc0JsYW5rKSB7XG4gICAgICAgICAgcmV0dXJuIFtzdHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuX2Jub2RlX2NvbnRleHQyKHksIHNvdXJjZSwgZGVwdGggLSAxKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChbc3RzW2ldXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsOyAvLyBGYWlsdXJlXG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgY29udGV4dCB0byBiaW5kIGEgZ2l2ZW4gc2luZ2xlIGJub2RlXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHRfMSA9IGZ1bmN0aW9uICh4LCBzb3VyY2UpIHtcbiAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIHN0YXRlbWVudHMgd2hpY2ggaW5kaXJlY3RseSBpZGVudGlmeSBhIG5vZGVcbiAgICAvLyAgIEJyZWFkdGgtZmlyc3RcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yICh2YXIgZGVwdGggPSAwOyBkZXB0aCA8IDM7IGRlcHRoKyspIHtcbiAgICAgIC8vIFRyeSBzaW1wbGUgZmlyc3RcbiAgICAgIHZhciBjb24gPSB0aGlzLl9ibm9kZV9jb250ZXh0Mih4LCBzb3VyY2UsIGRlcHRoKTtcbiAgICAgIGlmIChjb24gIT09IG51bGwpIHJldHVybiBjb247XG4gICAgfVxuICAgIC8vIElmIHdlIGNhbid0IGd1YXJhbnRlZSB1bmlxdWUgd2l0aCBsb2dpYyBqdXN0IHNlbmQgYWxsIGluZm8gYWJvdXQgbm9kZVxuICAgIHJldHVybiB0aGlzLnN0b3JlLmNvbm5lY3RlZFN0YXRlbWVudHMoeCwgc291cmNlKTsgLy8gd2FzOlxuICAgIC8vIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGJub2RlOiAnICsgeC50b05UKCkpXG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5fbWVudGlvbmVkID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoeCkubGVuZ3RoICE9PSAwIHx8IC8vIERvbid0IHBpbiBmcmVzaCBibm9kZXNcbiAgICB0aGlzLnN0b3JlLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHgpLmxlbmd0aCAhPT0gMCB8fCB0aGlzLnN0b3JlLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgeCkubGVuZ3RoICE9PSAwO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHQgPSBmdW5jdGlvbiAoYm5vZGVzLCBkb2MpIHtcbiAgICB2YXIgY29udGV4dCA9IFtdO1xuICAgIGlmIChibm9kZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9jYWNoZV9pZnBzKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBEb2VzIHRoaXMgb2NjdXIgaW4gb2xkIGdyYXBoP1xuICAgICAgICB2YXIgYm5vZGUgPSBibm9kZXNbaV07XG4gICAgICAgIGlmICghdGhpcy5fbWVudGlvbmVkKGJub2RlKSkgY29udGludWU7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvbmNhdCh0aGlzLl9ibm9kZV9jb250ZXh0XzEoYm5vZGUsIGRvYykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICAvKiAgV2VpcmQgY29kZSBkb2VzIG5vdCBtYWtlIHNlbnNlIC0tIHNvbWUgY29kZSBjb3JydXB0aW9uIGFsb25nIHRoZSBsaW5lIC0tIHN0IHVuZGVmaW5lZCAtLSB3ZWlyZFxuICAgICAgc3BhcnFsLnByb3RvdHlwZS5fYm5vZGVfY29udGV4dCA9IGZ1bmN0aW9uKGJub2Rlcykge1xuICAgICAgICAgIHZhciBjb250ZXh0ID0gW11cbiAgICAgICAgICBpZiAoYm5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3Quc3ViamVjdC5pc0JsYW5rP3VuZGVmaW5lZDpzdC5zdWJqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnByZWRpY2F0ZS5pc0JsYW5rP3VuZGVmaW5lZDpzdC5wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Qub2JqZWN0LmlzQmxhbms/dW5kZWZpbmVkOnN0Lm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC53aHkpLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb25jYXQoc3QpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZV9pZnBzKClcbiAgICAgICAgICAgICAgICAgIGZvciAoeCBpbiBibm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb25jYXQodGhpcy5fYm5vZGVfY29udGV4dF8xKGJub2Rlc1t4XSwgc3Qud2h5KSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgfVxuICAqL1xuICAvLyBSZXR1cm5zIHRoZSBiZXN0IGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YXRlbWVudFxuICBzcGFycWwucHJvdG90eXBlLl9zdGF0ZW1lbnRfY29udGV4dCA9IGZ1bmN0aW9uIChzdCkge1xuICAgIHZhciBibm9kZXMgPSB0aGlzLl9zdGF0ZW1lbnRfYm5vZGVzKHN0KTtcbiAgICByZXR1cm4gdGhpcy5fYm5vZGVfY29udGV4dChibm9kZXMsIHN0LndoeSk7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5fY29udGV4dF93aGVyZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIHNwYXJxbCA9IHRoaXM7XG4gICAgcmV0dXJuICFjb250ZXh0IHx8IGNvbnRleHQubGVuZ3RoID09PSAwID8gJycgOiAnV0hFUkUgeyAnICsgY29udGV4dC5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBzcGFycWwuYW5vbnltaXplTlQoeCk7XG4gICAgfSkuam9pbignXFxuJykgKyAnIH1cXG4nO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2ZpcmUgPSBmdW5jdGlvbiAodXJpLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXVyaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBVUkkgZ2l2ZW4gZm9yIHJlbW90ZSBlZGl0aW5nIG9wZXJhdGlvbjogJyArIHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3NwYXJxbDogc2VuZGluZyB1cGRhdGUgdG8gPCcgKyB1cmkgKyAnPicpO1xuICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgeGhyLm9wdGlvbnMgPSB7fTtcblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBkdW1wKFwiU1BBUlFMIHVwZGF0ZSByZWFkeSBzdGF0ZSBmb3IgPFwiK3VyaStcIj4gcmVhZHlTdGF0ZT1cIit4aHIucmVhZHlTdGF0ZStcIlxcblwiK3F1ZXJ5K1wiXFxuXCIpXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgdmFyIHN1Y2Nlc3MgPSAheGhyLnN0YXR1cyB8fCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwO1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnc3BhcnFsOiB1cGRhdGUgZmFpbGVkIGZvciA8JyArIHVyaSArICc+IHN0YXR1cz0nICsgeGhyLnN0YXR1cyArICcsICcgKyB4aHIuc3RhdHVzVGV4dCArICcsIGJvZHkgbGVuZ3RoPScgKyB4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCArICdcXG4gICBmb3IgcXVlcnk6ICcgKyBxdWVyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3NwYXJxbDogdXBkYXRlIE9rIGZvciA8JyArIHVyaSArICc+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sodXJpLCBzdWNjZXNzLCB4aHIucmVzcG9uc2VUZXh0LCB4aHIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub3BlbignUEFUQ0gnLCB1cmksIHRydWUpOyAvLyBhc3luYz10cnVlXG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9zcGFycWwtdXBkYXRlJyk7XG4gICAgeGhyLnNlbmQocXVlcnkpO1xuICB9O1xuXG4gIC8vIFRoaXMgZG9lcyBOT1QgdXBkYXRlIHRoZSBzdGF0ZW1lbnQuXG4gIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdoY2loIGluY2x1ZGVzXG4gIC8vICBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG9iamVjdCBvZiB0aGUgc3RhdGVtZW50LlxuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnVwZGF0ZV9zdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudCAmJiAhc3RhdGVtZW50LndoeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc3BhcnFsID0gdGhpcztcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX3N0YXRlbWVudF9jb250ZXh0KHN0YXRlbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQgPyBbc3RhdGVtZW50LnN1YmplY3QsIHN0YXRlbWVudC5wcmVkaWNhdGUsIHN0YXRlbWVudC5vYmplY3QsIHN0YXRlbWVudC53aHldIDogdW5kZWZpbmVkLFxuICAgICAgc3RhdGVtZW50TlQ6IHN0YXRlbWVudCA/IHRoaXMuYW5vbnltaXplTlQoc3RhdGVtZW50KSA6IHVuZGVmaW5lZCxcbiAgICAgIHdoZXJlOiBzcGFycWwuX2NvbnRleHRfd2hlcmUoY29udGV4dCksXG5cbiAgICAgIHNldF9vYmplY3Q6IGZ1bmN0aW9uIHNldF9vYmplY3Qob2JqLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcXVlcnkgPSB0aGlzLndoZXJlO1xuICAgICAgICBxdWVyeSArPSAnREVMRVRFIERBVEEgeyAnICsgdGhpcy5zdGF0ZW1lbnROVCArICcgfSA7XFxuJztcbiAgICAgICAgcXVlcnkgKz0gJ0lOU0VSVCBEQVRBIHsgJyArIHRoaXMuYW5vbnltaXplKHRoaXMuc3RhdGVtZW50WzBdKSArICcgJyArIHRoaXMuYW5vbnltaXplKHRoaXMuc3RhdGVtZW50WzFdKSArICcgJyArIHRoaXMuYW5vbnltaXplKG9iaikgKyAnICcgKyAnIC4gfVxcbic7XG5cbiAgICAgICAgc3BhcnFsLl9maXJlKHRoaXMuc3RhdGVtZW50WzNdLnVyaSwgcXVlcnksIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuaW5zZXJ0X3N0YXRlbWVudCA9IGZ1bmN0aW9uIChzdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc3QwID0gc3QgaW5zdGFuY2VvZiBBcnJheSA/IHN0WzBdIDogc3Q7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fY29udGV4dF93aGVyZSh0aGlzLl9zdGF0ZW1lbnRfY29udGV4dChzdDApKTtcblxuICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgc3RUZXh0ID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0VGV4dCArPSBzdFtpXSArICdcXG4nO1xuICAgICAgfXF1ZXJ5ICs9ICdJTlNFUlQgREFUQSB7ICcgKyBzdFRleHQgKyAnIH1cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSArPSAnSU5TRVJUIERBVEEgeyAnICsgdGhpcy5hbm9ueW1pemUoc3Quc3ViamVjdCkgKyAnICcgKyB0aGlzLmFub255bWl6ZShzdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3Qub2JqZWN0KSArICcgJyArICcgLiB9XFxuJztcbiAgICB9XG5cbiAgICB0aGlzLl9maXJlKHN0MC53aHkudXJpLCBxdWVyeSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuZGVsZXRlX3N0YXRlbWVudCA9IGZ1bmN0aW9uIChzdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc3QwID0gc3QgaW5zdGFuY2VvZiBBcnJheSA/IHN0WzBdIDogc3Q7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fY29udGV4dF93aGVyZSh0aGlzLl9zdGF0ZW1lbnRfY29udGV4dChzdDApKTtcblxuICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgc3RUZXh0ID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0VGV4dCArPSBzdFtpXSArICdcXG4nO1xuICAgICAgfXF1ZXJ5ICs9ICdERUxFVEUgREFUQSB7ICcgKyBzdFRleHQgKyAnIH1cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSArPSAnREVMRVRFIERBVEEgeyAnICsgdGhpcy5hbm9ueW1pemUoc3Quc3ViamVjdCkgKyAnICcgKyB0aGlzLmFub255bWl6ZShzdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3Qub2JqZWN0KSArICcgJyArICcgLiB9XFxuJztcbiAgICB9XG5cbiAgICB0aGlzLl9maXJlKHN0MC53aHkudXJpLCBxdWVyeSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIC8vICBSZXF1ZXN0IGEgbm93IG9yIGZ1dHVyZSBhY3Rpb24gdG8gcmVmcmVzaCBjaGFuZ2VzIGNvbWluZyBkb3duc3RyZWFtXG4gIC8vXG4gIC8vIFRoaXMgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byByZS1yZXF1ZXN0IHRoZSBzZXJ2ZXIgdmVyc2lvbixcbiAgLy8gd2hlbiBhIHdlYnNvY2tldCBoYXMgcGluZ2VkIHRvIHNheSB0aGVyZSBhcmUgY2hhbmdlcy5cbiAgLy8gSWYgdGhld2Vic29ja2V0LCBieSBjb250cmFzdCwgaGFzIHNlbnQgYSBwYXRjaCwgdGhlbiB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LlxuICAvLyBUaGlzIG1heSBiZSBjYWxsZWQgb3V0IG9mIGNvbnRleHQgc28gKnRoaXMqIGNhbm5vdCBiZSB1c2VkLlxuXG4gIHNwYXJxbC5wcm90b3R5cGUucmVxdWVzdERvd25zdHJlYW1BY3Rpb24gPSBmdW5jdGlvbiAoZG9jLCBhY3Rpb24pIHtcbiAgICB2YXIgY29udHJvbCA9IHRoaXMucGF0Y2hDb250cm9sRm9yKGRvYyk7XG4gICAgaWYgKCFjb250cm9sLnBlbmRpbmdVcHN0cmVhbSkge1xuICAgICAgYWN0aW9uKGRvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250cm9sLmRvd25zdHJlYW1BY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbiA9PT0gYWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHdhaXQgZm9yID4gMSBkaWZmZXJudCBkb3duc3RyZWFtIGFjdGlvbnNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbiA9IGFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gV2Ugd2FudCB0byBzdGFydCBjb3VudGluZyB3ZWJzb2NrdCBub3RpZmljYXRpb25zXG4gIC8vIHRvIGRpc3Rpbmd1aXNoIHRoZSBvbmVzIGZyb20gb3RoZXJzIGZyb20gb3VyIG93bi5cbiAgc3BhcnFsLnByb3RvdHlwZS5jbGVhclVwc3RyZWFtQ291bnQgPSBmdW5jdGlvbiAoZG9jKSB7XG4gICAgdmFyIGNvbnRyb2wgPSB0aGlzLnBhdGNoQ29udHJvbEZvcihkb2MpO1xuICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5nZXRVcGRhdGVzVmlhID0gZnVuY3Rpb24gKGRvYykge1xuICAgIHZhciBsaW5rSGVhZGVycyA9IHRoaXMuc3RvcmUuZmV0Y2hlci5nZXRIZWFkZXIoZG9jLCAndXBkYXRlcy12aWEnKTtcbiAgICBpZiAoIWxpbmtIZWFkZXJzIHx8ICFsaW5rSGVhZGVycy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsaW5rSGVhZGVyc1swXS50cmltKCk7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5hZGREb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZG9jLCBsaXN0ZW5lcikge1xuICAgIHZhciBjb250cm9sID0gdGhpcy5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICBpZiAoIWNvbnRyb2wuZG93bnN0cmVhbUNoYW5nZUxpc3RlbmVycykgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzID0gW107XG4gICAgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNldFJlZnJlc2hIYW5kbGVyKGRvYywgZnVuY3Rpb24gKGRvYykge1xuICAgICAgLy8gYSBmdW5jdGlvbiBub3QgYSBtZXRob2RcbiAgICAgIHNlbGYucmVsb2FkQW5kU3luYyhkb2MpO1xuICAgIH0pO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUucmVsb2FkQW5kU3luYyA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICB2YXIgY29udHJvbCA9IHRoaXMucGF0Y2hDb250cm9sRm9yKGRvYyk7XG4gICAgdmFyIHVwZGF0ZXIgPSB0aGlzO1xuXG4gICAgaWYgKGNvbnRyb2wucmVsb2FkaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAgQWxyZWFkeSByZWxvYWRpbmcgLSBzdG9wJyk7XG4gICAgICByZXR1cm47IC8vIG9uY2Ugb25seSBuZWVkZWRcbiAgICB9XG4gICAgY29udHJvbC5yZWxvYWRpbmcgPSB0cnVlO1xuICAgIHZhciByZXRyeVRpbWVvdXQgPSAxMDAwOyAvLyBtc1xuICAgIHZhciB0cnlSZWxvYWQgPSBmdW5jdGlvbiB0cnlSZWxvYWQoKSB7XG4gICAgICBjb25zb2xlLmxvZygndHJ5IHJlbG9hZCAtIHRpbWVvdXQgPSAnICsgcmV0cnlUaW1lb3V0KTtcbiAgICAgIHVwZGF0ZXIucmVsb2FkKHVwZGF0ZXIuc3RvcmUsIGRvYywgZnVuY3Rpb24gKG9rLCBtZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgY29udHJvbC5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgaWYgKGNvbnRyb2wuZG93bnN0cmVhbUNoYW5nZUxpc3RlbmVycykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cm9sLmRvd25zdHJlYW1DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgICAgQ2FsbGluZyBkb3duc3RyZWFtIGxpc3RlbmVyICcgKyBpKTtcbiAgICAgICAgICAgICAgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzW2ldKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTmV0d29yayBlcnJvciByZWZyZXNoaW5nIHRoZSBkYXRhLiBSZXRyeWluZyBpbiAnICsgcmV0cnlUaW1lb3V0IC8gMTAwMCk7XG4gICAgICAgICAgICBjb250cm9sLnJlbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXRyeVRpbWVvdXQgPSByZXRyeVRpbWVvdXQgKiAyO1xuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlSZWxvYWQsIHJldHJ5VGltZW91dCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciAnICsgeGhyLnN0YXR1cyArICdyZWZyZXNoaW5nIHRoZSBkYXRhOicgKyBtZXNzYWdlICsgJy4gU3RvcHBlZCcgKyBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0cnlSZWxvYWQoKTtcbiAgfTtcblxuICAvLyBTZXQgdXAgd2Vic29ja2V0IHRvIGxpc3RlbiBvblxuICAvL1xuICAvLyBUaGVyZSBpcyBjb29yZGluYXRpb24gYmV0d2VlbiB1cHN0cmVhbSBjaGFuZ2VzIGFuZCBkb3duc3RyZWFtIG9uZXNcbiAgLy8gc28gdGhhdCBhIHJlbG9hZCBpcyBub3QgZG9uZSBpbiB0aGUgbWlkZGxlIG9mIGFuIHVwc3RlZWFtIHBhdGNoLlxuICAvLyBJZiB5b3UgdXNpZSB0aGlzIEFQSSB0aGVuIHlvdSBnZXQgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgaGFwcGVucywgYW5kIHlvdVxuICAvLyBoYXZlIHRvIHJlbG9hZCB0aGUgZmlsZSB5b3Vyc2VsZiwgYW5kIHRoZW4gcmVmcmVzaCB0aGUgVUkuXG4gIC8vIEFsdGVybmF0aXZlIGlzIGFkZERvd25zdHJlYW1DaGFuZ2VMaXN0ZW5lcigpLCB3aGVyZSB5b3UgZG8gbm90XG4gIC8vIGhhdmUgdG8gZG8gdGhlIHJlbG9hZCB5b3Vyc2xmLiBEbyBtb3QgbWl4IHRoZW0uXG4gIC8vXG4gIC8vICBrYiBjb250YWlucyB0aGUgSFRUUCAgbWV0YWRhdGEgZnJvbSBwcmVmdmlvdXMgb3BlcmF0aW9uc1xuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGRvYywgaGFuZGxlcikge1xuICAgIHZhciB3c3NVUkkgPSB0aGlzLmdldFVwZGF0ZXNWaWEoZG9jKTsgLy8gcmVsYXRpdmVcbiAgICAvLyB2YXIga2IgPSB0aGlzLnN0b3JlXG4gICAgdmFyIHRoZUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdXBkYXRlciA9IHRoaXM7XG4gICAgdmFyIHJldHJ5VGltZW91dCA9IDE1MDA7IC8vICoyIHdpbGwgYmUgMyBTZWNvbmRzLCA2LCAxMiwgZXRjXG4gICAgdmFyIHJldHJpZXMgPSAwO1xuXG4gICAgaWYgKCF3c3NVUkkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdTZXJ2ZXIgZG9pZXMgbm90IHN1cHBvcnQgbGl2ZSB1cGRhdGVzIHRob3VnaFVwZGF0ZXMtVmlhIDotKCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdzc1VSSSA9IHVyaUpvaW4od3NzVVJJLCBkb2MudXJpKTtcbiAgICB3c3NVUkkgPSB3c3NVUkkucmVwbGFjZSgvXmh0dHA6LywgJ3dzOicpLnJlcGxhY2UoL15odHRwczovLCAnd3NzOicpO1xuICAgIGNvbnNvbGUubG9nKCdXZWIgc29ja2V0IFVSSSAnICsgd3NzVVJJKTtcblxuICAgIHZhciBvcGVuV2Vic29ja2V0ID0gZnVuY3Rpb24gb3BlbldlYnNvY2tldCgpIHtcbiAgICAgIC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NvbGlkL3NvbGlkLXNwZWMjbGl2ZS11cGRhdGVzXG4gICAgICB2YXIgc29ja2V0O1xuICAgICAgaWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQod3NzVVJJKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFNlcnZpY2VzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGaXJlZm94IGFkZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0MjQ0ODg2L2lzLXdlYnNvY2tldC1zdXBwb3J0ZWQtaW4tZmlyZWZveC1mb3ItYW5kcm9pZC1hZGRvbnNcbiAgICAgICAgc29ja2V0ID0gU2VydmljZXMud20uZ2V0TW9zdFJlY2VudFdpbmRvdygnbmF2aWdhdG9yOmJyb3dzZXInKS5XZWJTb2NrZXQod3NzVVJJKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LldlYlNvY2tldCkge1xuICAgICAgICBzb2NrZXQgPSB3aW5kb3cuV2ViU29ja2V0KHdzc1VSSSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnTGl2ZSB1cGRhdGUgZGlzYWJsZWQsIGFzIFdlYlNvY2tldCBub3Qgc3VwcG9ydGVkIGJ5IHBsYXRmb3JtIDotKCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIHdlYnNvY2tldCBvcGVuJyk7XG4gICAgICAgIHJldHJ5VGltZW91dCA9IDE1MDA7IC8vIHJlc2V0IHRpbWVvdXQgdG8gZmFzdCBvbiBzdWNjZXNzXG4gICAgICAgIHRoaXMuc2VuZCgnc3ViICcgKyBkb2MudXJpKTtcbiAgICAgICAgaWYgKHJldHJpZXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnV2ViIHNvY2tldCBoYXMgYmVlbiBkb3duLCBiZXR0ZXIgY2hlY2sgZm9yIGFueSBuZXdzLicpO1xuICAgICAgICAgIHVwZGF0ZXIucmVxdWVzdERvd25zdHJlYW1BY3Rpb24oZG9jLCB0aGVIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjb250cm9sID0gc2VsZi5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG5cbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50XG4gICAgICAvL1xuICAgICAgLy8gMTAwMFx0Q0xPU0VfTk9STUFMXHROb3JtYWwgY2xvc3VyZTsgdGhlIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB3aGF0ZXZlciBwdXJwb3NlIGZvciB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgICAgIC8vIDEwMDFcdENMT1NFX0dPSU5HX0FXQVlcdFRoZSBlbmRwb2ludCBpcyBnb2luZyBhd2F5LCBlaXRoZXJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSBzZXJ2ZXIgZmFpbHVyZSBvciBiZWNhdXNlIHRoZSBicm93c2VyIGlzIG5hdmlnYXRpbmcgYXdheSBmcm9tIHRoZSBwYWdlIHRoYXQgb3BlbmVkIHRoZSBjb25uZWN0aW9uLlxuICAgICAgLy8gMTAwMlx0Q0xPU0VfUFJPVE9DT0xfRVJST1JcdFRoZSBlbmRwb2ludCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSBwcm90b2NvbCBlcnJvci5cbiAgICAgIC8vIDEwMDNcdENMT1NFX1VOU1VQUE9SVEVEXHRUaGUgY29ubmVjdGlvbiBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50XG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBkYXRhIG9mIGEgdHlwZSBpdCBjYW5ub3QgYWNjZXB0IChmb3IgZXhhbXBsZSwgYSB0ZXh0LW9ubHkgZW5kcG9pbnQgcmVjZWl2ZWQgYmluYXJ5IGRhdGEpLlxuICAgICAgLy8gMTAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQuIEEgbWVhbmluZyBtaWdodCBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuXG4gICAgICAvLyAxMDA1XHRDTE9TRV9OT19TVEFUVVNcdFJlc2VydmVkLiAgSW5kaWNhdGVzIHRoYXQgbm8gc3RhdHVzIGNvZGUgd2FzIHByb3ZpZGVkIGV2ZW4gdGhvdWdoIG9uZSB3YXMgZXhwZWN0ZWQuXG4gICAgICAvLyAxMDA2XHRDTE9TRV9BQk5PUk1BTFx0UmVzZXJ2ZWQuIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhYm5vcm1hbGx5IChcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgc29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJyoqKiBXZWJzb2NrZXQgY2xvc2VkIHdpdGggY29kZSAnICsgZXZlbnQuY29kZSArIFwiLCByZWFzb24gJ1wiICsgZXZlbnQucmVhc29uICsgXCInIGNsZWFuID0gXCIgKyBldmVudC5jbGVhbik7XG4gICAgICAgIHJldHJ5VGltZW91dCAqPSAyO1xuICAgICAgICByZXRyaWVzICs9IDE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXRyeWluZyBpbiAnICsgcmV0cnlUaW1lb3V0ICsgJ21zJyk7IC8vIChhc2sgdXNlcj8pXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUcnlpbmcgd2Vic29ja2V0IGFnYWluJyk7XG4gICAgICAgICAgb3BlbldlYnNvY2tldCgpO1xuICAgICAgICB9LCByZXRyeVRpbWVvdXQpO1xuICAgICAgfTtcbiAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgIGlmIChtc2cuZGF0YSAmJiBtc2cuZGF0YS5zbGljZSgwLCAzKSA9PT0gJ3B1YicpIHtcbiAgICAgICAgICBpZiAoJ3Vwc3RyZWFtQ291bnQnIGluIGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCAtPSAxO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wudXBzdHJlYW1Db3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdqdXN0IGFuIGVjaG86ICcgKyBjb250cm9sLnVwc3RyZWFtQ291bnQpO1xuICAgICAgICAgICAgICByZXR1cm47IC8vIEp1c3QgYW4gZWNob1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZygnQXNzdW1lIGEgcmVhbCBkb3duc3RyZWFtIGNoYW5nZTogJyArIGNvbnRyb2wudXBzdHJlYW1Db3VudCArICcgLT4gMCcpO1xuICAgICAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG4gICAgICAgICAgc2VsZi5yZXF1ZXN0RG93bnN0cmVhbUFjdGlvbihkb2MsIHRoZUhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07IC8vIG9wZW5XZWJzb2NrZXRcbiAgICBvcGVuV2Vic29ja2V0KCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBUaGlzIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbG9jYWwgc3RvcmUgaWZmIHRoZSB3ZWIgaXMgY2hhbmdlZCBzdWNjZXNzZnVsbHkuXG4gIC8vXG4gIC8vICAtIGRlbGV0aW9ucywgaW5zZXJ0aW9ucyBtYXkgYmUgdW5kZWZpbmVkIG9yIHNpbmdsZSBzdGF0ZW1lbnRzIG9yIGxpc3RzIG9yIGZvcm11bGFlLlxuICAvLyAgICAgIChtYXkgY29udGFpbiBibm9kZXMgd2hpY2ggY2FuIGJlIGluZGlyZWN0bHkgaWRlbnRpZmllZCBieSBhIHdoZXJlIGNsYXVzZSlcbiAgLy9cbiAgLy8gIC0gY2FsbGJhY2sgaXMgY2FsbGVkIGFzIGNhbGxiYWNrKHVyaSwgc3VjY2VzcywgZXJyb3Jib2R5KVxuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkZWxldGlvbnMsIGluc2VydGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG4gICAgICB2YXIgZHMgPSAhZGVsZXRpb25zID8gW10gOiBkZWxldGlvbnMgaW5zdGFuY2VvZiBfaW5kZXhlZEZvcm11bGEyLmRlZmF1bHQgPyBkZWxldGlvbnMuc3RhdGVtZW50cyA6IGRlbGV0aW9ucyBpbnN0YW5jZW9mIEFycmF5ID8gZGVsZXRpb25zIDogW2RlbGV0aW9uc107XG4gICAgICB2YXIgaXMgPSAhaW5zZXJ0aW9ucyA/IFtdIDogaW5zZXJ0aW9ucyBpbnN0YW5jZW9mIF9pbmRleGVkRm9ybXVsYTIuZGVmYXVsdCA/IGluc2VydGlvbnMuc3RhdGVtZW50cyA6IGluc2VydGlvbnMgaW5zdGFuY2VvZiBBcnJheSA/IGluc2VydGlvbnMgOiBbaW5zZXJ0aW9uc107XG4gICAgICBpZiAoIShkcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgRXJyb3IgJyArICh0eXBlb2YgZHMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGRzKSkgKyAnOiAnICsgZHMpO1xuICAgICAgfVxuICAgICAgaWYgKCEoaXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlIEVycm9yICcgKyAodHlwZW9mIGlzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihpcykpICsgJzogJyArIGlzKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcy5sZW5ndGggPT09IDAgJiYgaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTsgLy8gc3VjY2VzcyAtLSBub3RoaW5nIG5lZWRlZCB0byBiZSBkb25lLlxuICAgICAgfVxuICAgICAgdmFyIGRvYyA9IGRzLmxlbmd0aCA/IGRzWzBdLndoeSA6IGlzWzBdLndoeTtcbiAgICAgIHZhciBjb250cm9sID0gdGhpcy5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsICd3aHknXTtcbiAgICAgIHZhciB2ZXJicyA9IFsnaW5zZXJ0JywgJ2RlbGV0ZSddO1xuICAgICAgdmFyIGNsYXVzZXMgPSB7ICdkZWxldGUnOiBkcywgJ2luc2VydCc6IGlzIH07XG4gICAgICB2ZXJicy5tYXAoZnVuY3Rpb24gKHZlcmIpIHtcbiAgICAgICAgY2xhdXNlc1t2ZXJiXS5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgaWYgKCFkb2Muc2FtZVRlcm0oc3Qud2h5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cGRhdGU6IGRlc3RpbmF0aW9uICcgKyBkb2MgKyAnIGluY29uc2lzdGVudCB3aXRoIGRlbGV0ZSBxdWFkICcgKyBzdC53aHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RbcHJvcF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXBkYXRlOiB1bmRlZmluZWQgJyArIHByb3AgKyAnIG9mIHN0YXRlbWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIHByb3RvY29sID0gdGhpcy5lZGl0YWJsZShkb2MudXJpLCBrYik7XG4gICAgICBpZiAoIXByb3RvY29sKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IG1ha2UgY2hhbmdlcyBpbiB1bmVkaXRhYmxlIFwiICsgZG9jKTtcbiAgICAgIH1cbiAgICAgIHZhciBpO1xuICAgICAgdmFyIG5ld1N0cztcbiAgICAgIHZhciBkb2N1bWVudFN0cmluZztcbiAgICAgIHZhciBzejtcbiAgICAgIGlmIChwcm90b2NvbC5pbmRleE9mKCdTUEFSUUwnKSA+PSAwKSB7XG4gICAgICAgIHZhciBibm9kZXMgPSBbXTtcbiAgICAgICAgaWYgKGRzLmxlbmd0aCkgYm5vZGVzID0gdGhpcy5fc3RhdGVtZW50X2FycmF5X2Jub2Rlcyhkcyk7XG4gICAgICAgIGlmIChpcy5sZW5ndGgpIGJub2RlcyA9IGJub2Rlcy5jb25jYXQodGhpcy5fc3RhdGVtZW50X2FycmF5X2Jub2RlcyhpcykpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX2Jub2RlX2NvbnRleHQoYm5vZGVzLCBkb2MpO1xuICAgICAgICB2YXIgd2hlcmVDbGF1c2UgPSB0aGlzLl9jb250ZXh0X3doZXJlKGNvbnRleHQpO1xuICAgICAgICB2YXIgcXVlcnkgPSAnJztcbiAgICAgICAgaWYgKHdoZXJlQ2xhdXNlLmxlbmd0aCkge1xuICAgICAgICAgIC8vIElzIHRoZXJlIGEgV0hFUkUgY2xhdXNlP1xuICAgICAgICAgIGlmIChkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9ICdERUxFVEUgeyAnO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5ICs9IHRoaXMuYW5vbnltaXplTlQoZHNbaV0pICsgJ1xcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeSArPSAnIH1cXG4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBxdWVyeSArPSAnSU5TRVJUIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGlzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9XFxuJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcnkgKz0gd2hlcmVDbGF1c2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm8gd2hlcmUgY2xhdXNlXG4gICAgICAgICAgaWYgKGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcXVlcnkgKz0gJ0RFTEVURSBEQVRBIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGRzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9IFxcbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChkcy5sZW5ndGgpIHF1ZXJ5ICs9ICcgOyAnO1xuICAgICAgICAgICAgcXVlcnkgKz0gJ0lOU0VSVCBEQVRBIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGlzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9XFxuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgcGVuZGluZyB1cHN0cmVhbSBwYXRjaGVzIHVudGlsIHRoZXkgaGF2ZSBmbmlzaGVkIHRoZWlyIGNhbGxiYWNrXG4gICAgICAgIGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtID0gY29udHJvbC5wZW5kaW5nVXBzdHJlYW0gPyBjb250cm9sLnBlbmRpbmdVcHN0cmVhbSArIDEgOiAxO1xuICAgICAgICBpZiAoJ3Vwc3RyZWFtQ291bnQnIGluIGNvbnRyb2wpIHtcbiAgICAgICAgICBjb250cm9sLnVwc3RyZWFtQ291bnQgKz0gMTsgLy8gY291bnQgY2hhbmdlcyB3ZSBvcmlnaW5hdGVkIG91cnNlbHZlc1xuICAgICAgICAgIGNvbnNvbGUubG9nKCd1cHN0cmVhbSBjb3VudCB1cCB0byA6ICcgKyBjb250cm9sLnVwc3RyZWFtQ291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlyZShkb2MudXJpLCBxdWVyeSwgZnVuY3Rpb24gKHVyaSwgc3VjY2VzcywgYm9keSwgeGhyKSB7XG4gICAgICAgICAgeGhyLmVsYXBzZWRUaW1lX21zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnICAgIHNwYXJxbDogUmV0dXJuICcgKyAoc3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdGQUlMVVJFICcgKyB4aHIuc3RhdHVzKSArICcgZWxhcHNlZCAnICsgeGhyLmVsYXBzZWRUaW1lX21zICsgJ21zJyk7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtiLnJlbW92ZShkcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYm9keSA9ICdSZW1vdGUgT2sgQlVUIGVycm9yIGRlbGV0aW5nICcgKyBkcy5sZW5ndGggKyAnIGZyb20gc3RvcmUhISEgJyArIGU7XG4gICAgICAgICAgICB9IC8vIEFkZCBpbiBhbnkgY2FzZSAtLSBoZWxwIHJlY292ZXIgZnJvbSB3ZWlyZG5lc3M/P1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBrYi5hZGQoaXNbaV0uc3ViamVjdCwgaXNbaV0ucHJlZGljYXRlLCBpc1tpXS5vYmplY3QsIGRvYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FsbGJhY2sodXJpLCBzdWNjZXNzLCBib2R5LCB4aHIpO1xuICAgICAgICAgIGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtIC09IDE7XG4gICAgICAgICAgLy8gV2hlbiB1cHN0cmVhbSBwYXRjaGVzIGhhdmUgYmVlbiBzZW50LCByZWxvYWQgc3RhdGUgaWYgZG93bnN0cmVhbSB3YWl0aW5nXG4gICAgICAgICAgaWYgKGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtID09PSAwICYmIGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbikge1xuICAgICAgICAgICAgdmFyIGRvd25zdHJlYW1BY3Rpb24gPSBjb250cm9sLmRvd25zdHJlYW1BY3Rpb247XG4gICAgICAgICAgICBkZWxldGUgY29udHJvbC5kb3duc3RyZWFtQWN0aW9uO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2RlbGF5ZWQgZG93bnN0cmVhbSBhY3Rpb246Jyk7XG4gICAgICAgICAgICBkb3duc3RyZWFtQWN0aW9uKGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuaW5kZXhPZignREFWJykgPj0gMCkge1xuICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBkZXJpdmVkIGZyb20gS2VubnkncyBVcGRhdGVDZW50ZXIuanNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmc7XG4gICAgICAgIHZhciByZXF1ZXN0ID0ga2IuYW55KGRvYywgdGhpcy5ucy5saW5rKCdyZXF1ZXN0JykpO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlY29yZCBvZiBvdXIgSFRUUCBHRVQgcmVxdWVzdCBmb3IgZG9jdW1lbnQ6ICcgKyBkb2MpO1xuICAgICAgICB9IC8vIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShyZXF1ZXN0LCB0aGlzLm5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRocm93IFwiTm8gcmVjb3JkIEhUVFAgR0VUIHJlc3BvbnNlIGZvciBkb2N1bWVudDogXCIrZG9jXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRfdHlwZSA9IGtiLnRoZShyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnY29udGVudC10eXBlJykpLnZhbHVlO1xuXG4gICAgICAgIC8vIHByZXBhcmUgY29udGVudHMgb2YgcmV2aXNlZCBkb2N1bWVudFxuICAgICAgICBuZXdTdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZG9jKS5zbGljZSgpOyAvLyBjb3B5IVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBVdGlsLlJERkFycmF5UmVtb3ZlKG5ld1N0cywgZHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG5ld1N0cy5wdXNoKGlzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlcmlhbGl6ZSB0byB0ZSBhcHByb3ByaWF0ZSBmb3JtYXRcbiAgICAgICAgc3ogPSBTZXJpYWxpemVyKGtiKTtcbiAgICAgICAgc3ouc3VnZ2VzdE5hbWVzcGFjZXMoa2IubmFtZXNwYWNlcyk7XG4gICAgICAgIHN6LnNldEJhc2UoZG9jLnVyaSk7IC8vID8/IGJld2FyZSBvZiB0aGlzIC0ga2VubnkgKHdoeT8gdGltKVxuICAgICAgICBzd2l0Y2ggKGNvbnRlbnRfdHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOlxuICAgICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9YTUwobmV3U3RzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgICAgIGNhc2UgJ3RleHQvdHVydGxlJzpcbiAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXR1cnRsZSc6IC8vIExlZ2FjeVxuICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL24zJzpcbiAgICAgICAgICAgIC8vIExlZ2FjeVxuICAgICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OMyhuZXdTdHMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudC10eXBlICcgKyBjb250ZW50X3R5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGEgd3JpdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBuZXcgdmVyc2lvbiBiYWNrXG5cbiAgICAgICAgdmFyIGNhbmRpZGF0ZVRhcmdldCA9IGtiLnRoZShyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnY29udGVudC1sb2NhdGlvbicpKTtcbiAgICAgICAgdmFyIHRhcmdldFVSSTtcbiAgICAgICAgaWYgKGNhbmRpZGF0ZVRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFVSSSA9IHVyaUpvaW4oY2FuZGlkYXRlVGFyZ2V0LnZhbHVlLCB0YXJnZXRVUkkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgICAgIHhoci5vcHRpb25zID0ge307XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICAvLyBmb3JtdWxhIGZyb20gc3BhcnFsVXBkYXRlLmpzLCB3aGF0IGFib3V0IHJlZGlyZWN0cz9cbiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gIXhoci5zdGF0dXMgfHwgeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMDtcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBrYi5yZW1vdmUoZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGtiLmFkZChpc1tpXS5zdWJqZWN0LCBpc1tpXS5wcmVkaWNhdGUsIGlzW2ldLm9iamVjdCwgZG9jKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soZG9jLnVyaSwgc3VjY2VzcywgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIub3BlbignUFVUJywgdGFyZ2V0VVJJLCB0cnVlKTtcbiAgICAgICAgLy8gYXNzdW1lIHRoZSBzZXJ2ZXIgZG9lcyBQVVQgY29udGVudC1uZWdvdGlhdGlvbi5cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsIGNvbnRlbnRfdHlwZSk7IC8vIE9LP1xuICAgICAgICB4aHIuc2VuZChkb2N1bWVudFN0cmluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvdG9jb2wuaW5kZXhPZignTE9DQUxGSUxFJykgPj0gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBiYWNrIHRvIGxvY2FsIGZpbGVcXG4nKTtcbiAgICAgICAgICAgIC8vIFNlZSBodHRwOi8vc2ltb24tanVuZy5ibG9nc3BvdC5jb20vMjAwNy8xMC9maXJlZm94LWV4dGVuc2lvbi1maWxlLWlvLmh0bWxcbiAgICAgICAgICAgIC8vIHByZXBhcmUgY29udGVudHMgb2YgcmV2aXNlZCBkb2N1bWVudFxuICAgICAgICAgICAgbmV3U3RzID0ga2Iuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRvYykuc2xpY2UoKTsgLy8gY29weSFcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBVdGlsLlJERkFycmF5UmVtb3ZlKG5ld1N0cywgZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIG5ld1N0cy5wdXNoKGlzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XG4gICAgICAgICAgICBkb2N1bWVudFN0cmluZztcbiAgICAgICAgICAgIHN6ID0gU2VyaWFsaXplcihrYik7XG4gICAgICAgICAgICBzei5zdWdnZXN0TmFtZXNwYWNlcyhrYi5uYW1lc3BhY2VzKTtcbiAgICAgICAgICAgIHN6LnNldEJhc2UoZG9jLnVyaSk7IC8vID8/IGJld2FyZSBvZiB0aGlzIC0ga2VubnkgKHdoeT8gdGltKVxuICAgICAgICAgICAgdmFyIGRvdCA9IGRvYy51cmkubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgIGlmIChkb3QgPCAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmV3cml0aW5nIGZpbGU6IE5vIGZpbGVuYW1lIGV4dGVuc2lvbjogJyArIGRvYy51cmkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4dCA9IGRvYy51cmkuc2xpY2UoZG90ICsgMSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGV4dCkge1xuICAgICAgICAgICAgICBjYXNlICdyZGYnOlxuICAgICAgICAgICAgICBjYXNlICdvd2wnOiAvLyBKdXN0IG15IGV4cGVyZW5jZSAgIC4uLkBAIHdlIHNob3VsZCBrZWVwIHRoZSBmb3JtYXQgaW4gd2hpY2ggaXQgd2FzIHBhcnNlZFxuICAgICAgICAgICAgICBjYXNlICd4bWwnOlxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvWE1MKG5ld1N0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ24zJzpcbiAgICAgICAgICAgICAgY2FzZSAnbnQnOlxuICAgICAgICAgICAgICBjYXNlICd0dGwnOlxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgZXh0ZW5zaW9uIC4nICsgZXh0ICsgJyBub3Qgc3VwcG9ydGVkIGZvciBkYXRhIHdyaXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgbmV3IHZlcnNpb24gYmFja1xuICAgICAgICAgICAgLy8gY3JlYXRlIGNvbXBvbmVudCBmb3IgZmlsZSB3cml0aW5nXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBiYWNrOiA8PDwnICsgZG9jdW1lbnRTdHJpbmcgKyAnPj4+Jyk7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBkb2MudXJpLnNsaWNlKDcpOyAvLyBjaG9wIG9mZiAgIGZpbGU6Ly8gIGxlYXZpbmcgL3BhdGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiV3JpdGViYWNrOiBGaWxlbmFtZTogXCIrZmlsZW5hbWUrXCJcXG5cIilcbiAgICAgICAgICAgIHZhciBmaWxlID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcvZmlsZS9sb2NhbDsxJ10uY3JlYXRlSW5zdGFuY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUxvY2FsRmlsZSk7XG4gICAgICAgICAgICBmaWxlLmluaXRXaXRoUGF0aChmaWxlbmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXdyaXRpbmcgZmlsZSA8JyArIGRvYy51cmkgKyAnPiBidXQgaXQgZG9lcyBub3QgZXhpc3QhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyBmaWxlLmNyZWF0ZSggQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUZpbGUuTk9STUFMX0ZJTEVfVFlQRSwgNDIwKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gY3JlYXRlIGZpbGUgb3V0cHV0IHN0cmVhbSBhbmQgdXNlIHdyaXRlL2NyZWF0ZS90cnVuY2F0ZSBtb2RlXG4gICAgICAgICAgICAvLyAweDAyIHdyaXRpbmcsIDB4MDggY3JlYXRlIGZpbGUsIDB4MjAgdHJ1bmNhdGUgbGVuZ3RoIGlmIGV4aXN0XG4gICAgICAgICAgICB2YXIgc3RyZWFtID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcvbmV0d29yay9maWxlLW91dHB1dC1zdHJlYW07MSddLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lGaWxlT3V0cHV0U3RyZWFtKTtcblxuICAgICAgICAgICAgLy8gVmFyaW91cyBKUyBzeXN0ZW1zIG9iamVjdCB0byAwNjY2IGluIHN0cnVjdCBtb2RlIGFzIGRhbmdlcm91c1xuICAgICAgICAgICAgc3RyZWFtLmluaXQoZmlsZSwgMHgwMiB8IDB4MDggfCAweDIwLCBwYXJzZUludCgnMDY2NicsIDgpLCAwKTtcblxuICAgICAgICAgICAgLy8gd3JpdGUgZGF0YSB0byBmaWxlIHRoZW4gY2xvc2Ugb3V0cHV0IHN0cmVhbVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGRvY3VtZW50U3RyaW5nLCBkb2N1bWVudFN0cmluZy5sZW5ndGgpO1xuICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBrYi5yZW1vdmUoZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGtiLmFkZChpc1tpXS5zdWJqZWN0LCBpc1tpXS5wcmVkaWNhdGUsIGlzW2ldLm9iamVjdCwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGRvYy51cmksIHRydWUsICcnKTsgLy8gc3VjY2VzcyFcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhkb2MudXJpLCBmYWxzZSwgJ0V4Y2VwdGlvbiB0cnlpbmcgdG8gd3JpdGUgYmFjayBmaWxlIDwnICsgZG9jLnVyaSArICc+XFxuJ1xuICAgICAgICAgICAgLy8gKyB0YWJ1bGF0b3IuVXRpbC5zdGFja1N0cmluZyhlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBlZGl0IG1ldGhvZDogJ1wiICsgcHJvdG9jb2wgKyBcIicgZm9yIFwiICsgZG9jKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgZmFsc2UsICdFeGNlcHRpb24gaW4gdXBkYXRlOiAnICsgZSArICdcXG4nICsgJHJkZi5VdGlsLnN0YWNrU3RyaW5nKGUpKTtcbiAgICB9XG4gIH07IC8vIHduZCB1cGRhdGVcblxuICAvLyBUaGlzIHN1aXRhYmxlIGZvciBhbiBpbml0YWwgY3JlYXRpb24gb2YgYSBkb2N1bWVudFxuICAvL1xuICAvLyBkYXRhOiAgICBzdHJpbmcsIG9yIGFycmF5IG9mIHN0YXRlbWVudHNcbiAgLy9cbiAgc3BhcnFsLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoZG9jLCBkYXRhLCBjb250ZW50X3R5cGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY3VtZW50U3RyaW5nO1xuICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG5cbiAgICBpZiAoKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihkYXRhKSkgPT09IF90eXBlb2YoJycpKSB7XG4gICAgICBkb2N1bWVudFN0cmluZyA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNlcmlhbGl6ZSB0byB0ZSBhcHByb3ByaWF0ZSBmb3JtYXRcbiAgICAgIHZhciBzeiA9IFNlcmlhbGl6ZXIoa2IpO1xuICAgICAgc3ouc3VnZ2VzdE5hbWVzcGFjZXMoa2IubmFtZXNwYWNlcyk7XG4gICAgICBzei5zZXRCYXNlKGRvYy51cmkpO1xuICAgICAgc3dpdGNoIChjb250ZW50X3R5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vcmRmK3htbCc6XG4gICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9YTUwoZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgICBjYXNlICd0ZXh0L3R1cnRsZSc6XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtdHVydGxlJzogLy8gTGVnYWN5XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL24zJzpcbiAgICAgICAgICAvLyBMZWdhY3lcbiAgICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb04zKGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudC10eXBlICcgKyBjb250ZW50X3R5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGEgUFVUJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgeGhyLm9wdGlvbnMgPSB7fTtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgIC8vIGZvcm11bGEgZnJvbSBzcGFycWxVcGRhdGUuanMsIHdoYXQgYWJvdXQgcmVkaXJlY3RzP1xuICAgICAgICB2YXIgc3VjY2VzcyA9ICF4aHIuc3RhdHVzIHx8IHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDA7XG4gICAgICAgIGlmIChzdWNjZXNzICYmIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRhdGEubWFwKGZ1bmN0aW9uIChzdCkge1xuICAgICAgICAgICAga2IuYWRkU3RhdGVtZW50KHN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBrYi5mZXRjaGVyLnJlcXVlc3RlZFtkb2MudXJpXSA9IHRydWUgLy8gYXMgdGhvdWdoIGZldGNoZWRcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBrYi5mZXRjaGVyLm5vbmV4aXN0YW50W2RvYy51cmldO1xuICAgICAgICAgIGRlbGV0ZSBrYi5mZXRjaGVyLnJlcXVlc3RlZFtkb2MudXJpXTtcbiAgICAgICAgICAvLyBAQCBsYXRlciB3ZSBjYW4gZmFrZSBpdCBoYXMgYmVlbiByZXF1ZXN0ZCBpZiBwdXQgZ2l2ZXMgdXMgdGhlIGhlYWRlciBzYW5kIHdlIHNhdmUgdGhlbS5cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhkb2MudXJpLCBzdWNjZXNzLCB4aHIucmVzcG9uc2VUZXh0LCB4aHIpO1xuICAgICAgfVxuICAgIH07XG4gICAgeGhyLm9wZW4oJ1BVVCcsIGRvYy51cmksIHRydWUpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LXR5cGUnLCBjb250ZW50X3R5cGUpO1xuICAgIHhoci5zZW5kKGRvY3VtZW50U3RyaW5nKTtcbiAgfTtcblxuICAvLyBSZWxvYWQgYSBkb2N1bWVudC5cbiAgLy9cbiAgLy8gRmFzdCBhbmQgY2hlYXAsIG5vIG1ldGFhdGFcbiAgLy8gTWVhc3VyZSB0aW1lcyBmb3IgdGhlIGRvY3VtZW50XG4gIC8vIExvYWQgaXQgcHJvdmlzaW9uYWxseVxuICAvLyBEb24ndCBkZWxldGUgdGhlIHN0YXRlbWVuc3QgYmVmb3JlIHRoZSBsb2FkLCBvciBpdCB3aWxsIGxlYXZlIGEgYnJva2VuIGRvY3VtZW50XG4gIC8vIGluIHRoZSBtZWFudGltZS5cblxuICBzcGFycWwucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uIChrYiwgZG9jLCBjYWxsYmFjaykge1xuICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIGZvcmNlIHNldHMgbm8tY2FjaGUgYW5kXG4gICAga2IuZmV0Y2hlci5ub3dPcldoZW5GZXRjaGVkKGRvYy51cmksIHsgZm9yY2U6IHRydWUsIG5vTWV0YTogdHJ1ZSwgY2xlYXJQcmV2aW91c0RhdGE6IHRydWUgfSwgZnVuY3Rpb24gKG9rLCBib2R5LCB4aHIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBFUlJPUiByZWxvYWRpbmcgZGF0YTogJyArIGJvZHkpO1xuICAgICAgICBjYWxsYmFjayhmYWxzZSwgJ0Vycm9yIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSwgeGhyKTtcbiAgICAgIH0gZWxzZSBpZiAoeGhyLm9uRXJyb3JXYXNDYWxsZWQgfHwgeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgTm9uLUhUVFAgZXJyb3IgcmVsb2FkaW5nIGRhdGEhIG9uRXJyb3JXYXNDYWxsZWQ9JyArIHhoci5vbkVycm9yV2FzQ2FsbGVkICsgJyBzdGF0dXM6ICcgKyB4aHIuc3RhdHVzKTtcbiAgICAgICAgY2FsbGJhY2soZmFsc2UsICdOb24tSFRUUCBlcnJvciByZWxvYWRpbmcgZGF0YTogJyArIGJvZHksIHhocik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWxhcHNlZFRpbWVfbXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBpZiAoIWRvYy5yZWxvYWRUaW1lX3RvdGFsKSBkb2MucmVsb2FkVGltZV90b3RhbCA9IDA7XG4gICAgICAgIGlmICghZG9jLnJlbG9hZFRpbWVfY291bnQpIGRvYy5yZWxvYWRUaW1lX2NvdW50ID0gMDtcbiAgICAgICAgZG9jLnJlbG9hZFRpbWVfdG90YWwgKz0gZWxhcHNlZFRpbWVfbXM7XG4gICAgICAgIGRvYy5yZWxvYWRUaW1lX2NvdW50ICs9IDE7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgRmV0Y2ggdG9vayAnICsgZWxhcHNlZFRpbWVfbXMgKyAnbXMsIGF2LiBvZiAnICsgZG9jLnJlbG9hZFRpbWVfY291bnQgKyAnID0gJyArIGRvYy5yZWxvYWRUaW1lX3RvdGFsIC8gZG9jLnJlbG9hZFRpbWVfY291bnQgKyAnbXMuJyk7XG4gICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUub2xkUmVsb2FkID0gZnVuY3Rpb24gKGtiLCBkb2MsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGcyID0gZ3JhcGgoKTsgLy8gQSBzZXBhcmF0ZSBzdG9yZSB0byBob2xkIHRoZSBkYXRhIGFzIHdlIGxvYWQgaXRcbiAgICB2YXIgZjIgPSBmZXRjaGVyKGcyKTtcbiAgICB2YXIgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBmb3JjZSBzZXRzIG5vLWNhY2hlIGFuZFxuICAgIGYyLm5vd09yV2hlbkZldGNoZWQoZG9jLnVyaSwgeyBmb3JjZTogdHJ1ZSwgbm9NZXRhOiB0cnVlLCBjbGVhclByZXZpb3VzRGF0YTogdHJ1ZSB9LCBmdW5jdGlvbiAob2ssIGJvZHksIHhocikge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIEVSUk9SIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSk7XG4gICAgICAgIGNhbGxiYWNrKGZhbHNlLCAnRXJyb3IgcmVsb2FkaW5nIGRhdGE6ICcgKyBib2R5LCB4aHIpO1xuICAgICAgfSBlbHNlIGlmICh4aHIub25FcnJvcldhc0NhbGxlZCB8fCB4aHIuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBOb24tSFRUUCBlcnJvciByZWxvYWRpbmcgZGF0YSEgb25FcnJvcldhc0NhbGxlZD0nICsgeGhyLm9uRXJyb3JXYXNDYWxsZWQgKyAnIHN0YXR1czogJyArIHhoci5zdGF0dXMpO1xuICAgICAgICBjYWxsYmFjayhmYWxzZSwgJ05vbi1IVFRQIGVycm9yIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSwgeGhyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzdHMxID0ga2Iuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRvYykuc2xpY2UoKTsgLy8gVGFrZSBhIGNvcHkhIVxuICAgICAgICB2YXIgc3RzMiA9IGcyLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkb2MpLnNsaWNlKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgcmVwbGFjaW5nICcgKyBzdHMxLmxlbmd0aCArICcgd2l0aCAnICsgc3RzMi5sZW5ndGggKyAnIG91dCBvZiB0b3RhbCBzdGF0ZW1lbnRzICcgKyBrYi5zdGF0ZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGtiLnJlbW92ZShzdHMxKTtcbiAgICAgICAga2IuYWRkKHN0czIpO1xuICAgICAgICB2YXIgZWxhcHNlZFRpbWVfbXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBpZiAoc3RzMi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPz8/Pz8/Pz8/Pz8/Pz8/Pz8gMDAwMDAwMCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9jLnJlbG9hZFRpbWVfdG90YWwpIGRvYy5yZWxvYWRUaW1lX3RvdGFsID0gMDtcbiAgICAgICAgaWYgKCFkb2MucmVsb2FkVGltZV9jb3VudCkgZG9jLnJlbG9hZFRpbWVfY291bnQgPSAwO1xuICAgICAgICBkb2MucmVsb2FkVGltZV90b3RhbCArPSBlbGFwc2VkVGltZV9tcztcbiAgICAgICAgZG9jLnJlbG9hZFRpbWVfY291bnQgKz0gMTtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBmZXRjaCB0b29rICcgKyBlbGFwc2VkVGltZV9tcyArICdtcywgYXYuIG9mICcgKyBkb2MucmVsb2FkVGltZV9jb3VudCArICcgPSAnICsgZG9jLnJlbG9hZFRpbWVfdG90YWwgLyBkb2MucmVsb2FkVGltZV9jb3VudCArICdtcy4nKTtcbiAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBzcGFycWw7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBkYXRlTWFuYWdlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qXG4gKiBVcGRhdGVzLVZpYVxuICovXG52YXIgbmFtZWROb2RlID0gcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKS5uYW1lZE5vZGU7XG5cbnZhciBVcGRhdGVzU29ja2V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVcGRhdGVzU29ja2V0KHBhcmVudCwgdmlhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVwZGF0ZXNTb2NrZXQpO1xuXG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy52aWEgPSB2aWE7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmcgPSB7fTtcbiAgICB0aGlzLnN1YnNjcmliZWQgPSB7fTtcbiAgICB0aGlzLnNvY2tldCA9IHt9O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodmlhKTtcbiAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMub25PcGVuO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMub25DbG9zZTtcbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlO1xuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMub25FcnJvcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVXBkYXRlc1NvY2tldCwgW3tcbiAgICBrZXk6ICdfZGVjb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlY29kZShxKSB7XG4gICAgICB2YXIgZWx0O1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgaztcbiAgICAgIHZhciByO1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHZhciByZWYxO1xuICAgICAgdmFyIHY7XG4gICAgICByID0ge307XG4gICAgICByZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgICAgcmVmID0gcS5zcGxpdCgnJicpO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGVsdCA9IHJlZltqXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goZWx0LnNwbGl0KCc9JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSgpO1xuICAgICAgZm9yIChpIGluIHJlZikge1xuICAgICAgICBlbHQgPSByZWZbaV07XG4gICAgICAgIHJlZjEgPSBbZGVjb2RlVVJJQ29tcG9uZW50KGVsdFswXSksIGRlY29kZVVSSUNvbXBvbmVudChlbHRbMV0pXTtcbiAgICAgICAgayA9IHJlZjFbMF07XG4gICAgICAgIHYgPSByZWYxWzFdO1xuICAgICAgICBpZiAocltrXSA9PSBudWxsKSB7XG4gICAgICAgICAgcltrXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJba10ucHVzaCh2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19zZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3NlbmQobWV0aG9kLCB1cmksIGRhdGEpIHtcbiAgICAgIHZhciBiYXNlLCBtZXNzYWdlO1xuICAgICAgbWVzc2FnZSA9IFttZXRob2QsIHVyaSwgZGF0YV0uam9pbignICcpO1xuICAgICAgcmV0dXJuIHR5cGVvZiAoYmFzZSA9IHRoaXMuc29ja2V0KS5zZW5kID09PSAnZnVuY3Rpb24nID8gYmFzZS5zZW5kKG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19zdWJzY3JpYmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc3Vic2NyaWJlKHVyaSkge1xuICAgICAgdGhpcy5fc2VuZCgnc3ViJywgdXJpLCAnJyk7XG4gICAgICB0aGlzLnN1YnNjcmliZWRbdXJpXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkW3VyaV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25DbG9zZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xvc2UoZSkge1xuICAgICAgdmFyIHVyaTtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHVyaSBpbiB0aGlzLnN1YnNjcmliZWQpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nW3VyaV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpYmVkID0ge307XG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVycm9yKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb25FcnJvcicgKyBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbk1lc3NhZ2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbk1lc3NhZ2UoZSkge1xuICAgICAgdmFyIGJhc2UsIG1lc3NhZ2U7XG4gICAgICBtZXNzYWdlID0gZS5kYXRhLnNwbGl0KCcgJyk7XG4gICAgICBpZiAobWVzc2FnZVswXSA9PT0gJ3BpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSB0aGlzLnNvY2tldCkuc2VuZCA9PT0gJ2Z1bmN0aW9uJyA/IGJhc2Uuc2VuZCgncG9uZyAnICsgbWVzc2FnZS5zbGljZSgxKS5qb2luKCcgJykpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlWzBdID09PSAncHViJykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQub25VcGRhdGUobWVzc2FnZVsxXSwgdGhpcy5fZGVjb2RlKG1lc3NhZ2VbMl0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbk9wZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbk9wZW4oZSkge1xuICAgICAgdmFyIHJlc3VsdHMsIHVyaTtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAodXJpIGluIHRoaXMucGVuZGluZykge1xuICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nW3VyaV07XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9zdWJzY3JpYmUodXJpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzY3JpYmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJzY3JpYmUodXJpKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZSh1cmkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nW3VyaV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nW3VyaV07XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFVwZGF0ZXNTb2NrZXQ7XG59KCk7XG5cbnZhciBVcGRhdGVzVmlhID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVcGRhdGVzVmlhKGZldGNoZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVXBkYXRlc1ZpYSk7XG5cbiAgICB0aGlzLmZldGNoZXIgPSBmZXRjaGVyO1xuICAgIHRoaXMuZ3JhcGggPSB7fTtcbiAgICB0aGlzLnZpYSA9IHt9O1xuICAgIHRoaXMuZmV0Y2hlci5hZGRDYWxsYmFjaygnaGVhZGVycycsIHRoaXMub25IZWFkZXJzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVcGRhdGVzVmlhLCBbe1xuICAgIGtleTogJ29uSGVhZGVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGVhZGVycyhkKSB7XG4gICAgICB2YXIgZXRhZywgdXJpLCB2aWE7XG4gICAgICBpZiAoZC5oZWFkZXJzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIFdlYlNvY2tldCA9PT0gJ3VuZGVmaW5lZCcgfHwgV2ViU29ja2V0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZXRhZyA9IGQuaGVhZGVyc1snZXRhZyddO1xuICAgICAgdmlhID0gZC5oZWFkZXJzWyd1cGRhdGVzLXZpYSddO1xuICAgICAgdXJpID0gZC51cmk7XG4gICAgICBpZiAoZXRhZyAmJiB2aWEpIHtcbiAgICAgICAgdGhpcy5ncmFwaFt1cmldID0ge1xuICAgICAgICAgIGV0YWc6IGV0YWcsXG4gICAgICAgICAgdmlhOiB2aWFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZWdpc3Rlcih2aWEsIHVyaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVXBkYXRlKHVyaSwgZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hlci5yZWZyZXNoKG5hbWVkTm9kZSh1cmkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZWdpc3RlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKHZpYSwgdXJpKSB7XG4gICAgICBpZiAodGhpcy52aWFbdmlhXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudmlhW3ZpYV0gPSBuZXcgVXBkYXRlc1NvY2tldCh0aGlzLCB2aWEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmlhW3ZpYV0uc3Vic2NyaWJlKHVyaSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFVwZGF0ZXNWaWE7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzLlVwZGF0ZXNTb2NrZXQgPSBVcGRhdGVzU29ja2V0O1xubW9kdWxlLmV4cG9ydHMuVXBkYXRlc1ZpYSA9IFVwZGF0ZXNWaWE7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKlxuICogSW1wbGVtZW50cyBVUkktc3BlY2lmaWMgZnVuY3Rpb25zXG4gKlxuICogU2VlIFJGQyAyMzg2XG4gKlxuICogU2VlIGFsc286XG4gKiAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMTAvYWphdy91cmkuanNcbiAqICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL3VyaXBhdGgucHlcbiAqXG4gKi9cbnZhciBhbGVydCA9IGFsZXJ0IHx8IGNvbnNvbGUubG9nO1xuXG5tb2R1bGUuZXhwb3J0cy5kb2NwYXJ0ID0gZG9jcGFydDtcbm1vZHVsZS5leHBvcnRzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cy5ob3N0cGFydCA9IGhvc3RwYXJ0O1xubW9kdWxlLmV4cG9ydHMuam9pbiA9IGpvaW47XG5tb2R1bGUuZXhwb3J0cy5wcm90b2NvbCA9IHByb3RvY29sO1xubW9kdWxlLmV4cG9ydHMucmVmVG8gPSByZWZUbztcblxudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuXG5mdW5jdGlvbiBkb2NwYXJ0KHVyaSkge1xuICB2YXIgaTtcbiAgaSA9IHVyaS5pbmRleE9mKCcjJyk7XG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB1cmk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZSgwLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkb2N1bWVudCh4KSB7XG4gIHJldHVybiBuZXcgTmFtZWROb2RlKGRvY3BhcnQoeC51cmkpKTtcbn1cblxuZnVuY3Rpb24gaG9zdHBhcnQodSkge1xuICB2YXIgbSA9IC9bXlxcL10qXFwvXFwvKFteXFwvXSopXFwvLy5leGVjKHUpO1xuICBpZiAobSkge1xuICAgIHJldHVybiBtWzFdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBqb2luKGdpdmVuLCBiYXNlKSB7XG4gIHZhciBiYXNlQ29sb24sIGJhc2VTY2hlbWUsIGJhc2VTaW5nbGU7XG4gIHZhciBjb2xvbiwgbGFzdFNsYXNoLCBwYXRoO1xuICB2YXIgYmFzZUhhc2ggPSBiYXNlLmluZGV4T2YoJyMnKTtcbiAgaWYgKGJhc2VIYXNoID4gMCkge1xuICAgIGJhc2UgPSBiYXNlLnNsaWNlKDAsIGJhc2VIYXNoKTtcbiAgfVxuICBpZiAoZ2l2ZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbiAgaWYgKGdpdmVuLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgIHJldHVybiBiYXNlICsgZ2l2ZW47XG4gIH1cbiAgY29sb24gPSBnaXZlbi5pbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbiA+PSAwKSB7XG4gICAgcmV0dXJuIGdpdmVuO1xuICB9XG4gIGJhc2VDb2xvbiA9IGJhc2UuaW5kZXhPZignOicpO1xuICBpZiAoYmFzZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZ2l2ZW47XG4gIH1cbiAgaWYgKGJhc2VDb2xvbiA8IDApIHtcbiAgICBhbGVydCgnSW52YWxpZCBiYXNlOiAnICsgYmFzZSArICcgaW4gam9pbiB3aXRoIGdpdmVuOiAnICsgZ2l2ZW4pO1xuICAgIHJldHVybiBnaXZlbjtcbiAgfVxuICBiYXNlU2NoZW1lID0gYmFzZS5zbGljZSgwLCArYmFzZUNvbG9uICsgMSB8fCA5ZTkpO1xuICBpZiAoZ2l2ZW4uaW5kZXhPZignLy8nKSA9PT0gMCkge1xuICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gIH1cbiAgaWYgKGJhc2UuaW5kZXhPZignLy8nLCBiYXNlQ29sb24pID09PSBiYXNlQ29sb24gKyAxKSB7XG4gICAgYmFzZVNpbmdsZSA9IGJhc2UuaW5kZXhPZignLycsIGJhc2VDb2xvbiArIDMpO1xuICAgIGlmIChiYXNlU2luZ2xlIDwgMCkge1xuICAgICAgaWYgKGJhc2UubGVuZ3RoIC0gYmFzZUNvbG9uIC0gMyA+IDApIHtcbiAgICAgICAgcmV0dXJuIGJhc2UgKyAnLycgKyBnaXZlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJhc2VTaW5nbGUgPSBiYXNlLmluZGV4T2YoJy8nLCBiYXNlQ29sb24gKyAxKTtcbiAgICBpZiAoYmFzZVNpbmdsZSA8IDApIHtcbiAgICAgIGlmIChiYXNlLmxlbmd0aCAtIGJhc2VDb2xvbiAtIDEgPiAwKSB7XG4gICAgICAgIHJldHVybiBiYXNlICsgJy8nICsgZ2l2ZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYmFzZVNjaGVtZSArIGdpdmVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZ2l2ZW4uaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgcmV0dXJuIGJhc2Uuc2xpY2UoMCwgYmFzZVNpbmdsZSkgKyBnaXZlbjtcbiAgfVxuICBwYXRoID0gYmFzZS5zbGljZShiYXNlU2luZ2xlKTtcbiAgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoIDwgMCkge1xuICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gIH1cbiAgaWYgKGxhc3RTbGFzaCA+PSAwICYmIGxhc3RTbGFzaCA8IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsICtsYXN0U2xhc2ggKyAxIHx8IDllOSk7XG4gIH1cbiAgcGF0aCArPSBnaXZlbjtcbiAgd2hpbGUgKHBhdGgubWF0Y2goL1teXFwvXSpcXC9cXC5cXC5cXC8vKSkge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1teXFwvXSpcXC9cXC5cXC5cXC8vLCAnJyk7XG4gIH1cbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuXFwvL2csICcnKTtcbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvXFwuJC8sICcvJyk7XG4gIHJldHVybiBiYXNlLnNsaWNlKDAsIGJhc2VTaW5nbGUpICsgcGF0aDtcbn1cblxuZnVuY3Rpb24gcHJvdG9jb2wodXJpKSB7XG4gIHZhciBpO1xuICBpID0gdXJpLmluZGV4T2YoJzonKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZSgwLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZUbyhiYXNlLCB1cmkpIHtcbiAgdmFyIGMsIGksIGssIGwsIGxlbiwgbGVuMSwgbiwgbywgcCwgcSwgcmVmLCByZWYxLCBzO1xuICB2YXIgY29tbW9uSG9zdCA9IG5ldyBSZWdFeHAoJ15bLV9hLXpBLVowLTkuXSs6KC8vW14vXSopPy9bXi9dKiQnKTtcbiAgaWYgKCFiYXNlKSB7XG4gICAgcmV0dXJuIHVyaTtcbiAgfVxuICBpZiAoYmFzZSA9PT0gdXJpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGZvciAoaSA9IG8gPSAwLCBsZW4gPSB1cmkubGVuZ3RoOyBvIDwgbGVuOyBpID0gKytvKSB7XG4gICAgYyA9IHVyaVtpXTtcbiAgICBpZiAoYyAhPT0gYmFzZVtpXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiYXNlLnNsaWNlKDAsIGkpLm1hdGNoKGNvbW1vbkhvc3QpKSB7XG4gICAgayA9IHVyaS5pbmRleE9mKCcvLycpO1xuICAgIGlmIChrIDwgMCkge1xuICAgICAgayA9IC0yO1xuICAgIH1cbiAgICBsID0gdXJpLmluZGV4T2YoJy8nLCBrICsgMik7XG4gICAgaWYgKHVyaVtsICsgMV0gIT09ICcvJyAmJiBiYXNlW2wgKyAxXSAhPT0gJy8nICYmIHVyaS5zbGljZSgwLCBsKSA9PT0gYmFzZS5zbGljZSgwLCBsKSkge1xuICAgICAgcmV0dXJuIHVyaS5zbGljZShsKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVyaVtpXSA9PT0gJyMnICYmIGJhc2UubGVuZ3RoID09PSBpKSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZShpKTtcbiAgfVxuICB3aGlsZSAoaSA+IDAgJiYgdXJpW2kgLSAxXSAhPT0gJy8nKSB7XG4gICAgaS0tO1xuICB9XG4gIGlmIChpIDwgMykge1xuICAgIHJldHVybiB1cmk7XG4gIH1cbiAgaWYgKGJhc2UuaW5kZXhPZignLy8nLCBpIC0gMikgPiAwIHx8IHVyaS5pbmRleE9mKCcvLycsIGkgLSAyKSA+IDApIHtcbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIGlmIChiYXNlLmluZGV4T2YoJzonLCBpKSA+IDApIHtcbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIG4gPSAwO1xuICByZWYgPSBiYXNlLnNsaWNlKGkpO1xuICBmb3IgKHAgPSAwLCBsZW4xID0gcmVmLmxlbmd0aDsgcCA8IGxlbjE7IHArKykge1xuICAgIGMgPSByZWZbcF07XG4gICAgaWYgKGMgPT09ICcvJykge1xuICAgICAgbisrO1xuICAgIH1cbiAgfVxuICBpZiAobiA9PT0gMCAmJiBpIDwgdXJpLmxlbmd0aCAmJiB1cmlbaV0gPT09ICcjJykge1xuICAgIHJldHVybiAnLi8nICsgdXJpLnNsaWNlKGkpO1xuICB9XG4gIGlmIChuID09PSAwICYmIGkgPT09IHVyaS5sZW5ndGgpIHtcbiAgICByZXR1cm4gJy4vJztcbiAgfVxuICBzID0gJyc7XG4gIGlmIChuID4gMCkge1xuICAgIGZvciAocSA9IDEsIHJlZjEgPSBuOyByZWYxID49IDEgPyBxIDw9IHJlZjEgOiBxID49IHJlZjE7IHJlZjEgPj0gMSA/ICsrcSA6IC0tcSkge1xuICAgICAgcyArPSAnLi4vJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHMgKyB1cmkuc2xpY2UoaSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciAkcmRmXG4gKiBAbW9kdWxlIHV0aWxcbiAqL1xudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG52YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTtcbnZhciBOYW1lZE5vZGUgPSByZXF1aXJlKCcuL25hbWVkLW5vZGUnKTtcblxubW9kdWxlLmV4cG9ydHMuQUpBUl9oYW5kbGVOZXdUZXJtID0gYWphckhhbmRsZU5ld1Rlcm07XG5tb2R1bGUuZXhwb3J0cy5BcnJheUluZGV4T2YgPSBhcnJheUluZGV4T2Y7XG5tb2R1bGUuZXhwb3J0cy5jYWxsYmFja2lmeSA9IGNhbGxiYWNraWZ5O1xubW9kdWxlLmV4cG9ydHMuZHRzdGFtcCA9IGR0c3RhbXA7XG5tb2R1bGUuZXhwb3J0cy5ET01QYXJzZXJGYWN0b3J5ID0gZG9tUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMuZG9tVG9TdHJpbmcgPSBkb21Ub1N0cmluZztcbm1vZHVsZS5leHBvcnRzLmR1bXBOb2RlID0gZHVtcE5vZGU7XG5tb2R1bGUuZXhwb3J0cy5nZXRIVFRQSGVhZGVycyA9IGdldEhUVFBIZWFkZXJzO1xubW9kdWxlLmV4cG9ydHMuaGVhdnlDb21wYXJlID0gaGVhdnlDb21wYXJlO1xubW9kdWxlLmV4cG9ydHMuaGVhdnlDb21wYXJlU1BPID0gaGVhdnlDb21wYXJlU1BPO1xubW9kdWxlLmV4cG9ydHMub3V0cHV0ID0gb3V0cHV0O1xubW9kdWxlLmV4cG9ydHMucGFyc2VYTUwgPSBwYXJzZVhNTDtcbm1vZHVsZS5leHBvcnRzLlJERkFycmF5UmVtb3ZlID0gcmRmQXJyYXlSZW1vdmU7XG5tb2R1bGUuZXhwb3J0cy5zdGFja1N0cmluZyA9IHN0YWNrU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMuc3RyaW5nX3N0YXJ0c3dpdGggPSBzdHJpbmdTdGFydHNXaXRoO1xubW9kdWxlLmV4cG9ydHMuc3RyaW5nID0ge307XG5tb2R1bGUuZXhwb3J0cy5zdHJpbmcudGVtcGxhdGUgPSBzdHJpbmdUZW1wbGF0ZTtcbm1vZHVsZS5leHBvcnRzLnVyaSA9IHJlcXVpcmUoJy4vdXJpJyk7IC8vIFRPRE86IFJlbW92ZSB0aGlzIG1peGVkIHVzYWdlXG4vLyBtb2R1bGUuZXhwb3J0cy52YXJpYWJsZXNJbiA9IHZhcmlhYmxlc0luXG5tb2R1bGUuZXhwb3J0cy5YTUxIVFRQRmFjdG9yeSA9IHhocjtcbm1vZHVsZS5leHBvcnRzLmxvZyA9IGxvZztcblxubW9kdWxlLmV4cG9ydHMubWVkaWFUeXBlQ2xhc3MgPSBmdW5jdGlvbiAobWVkaWFUeXBlKSB7XG4gIG1lZGlhVHlwZSA9IG1lZGlhVHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKTsgLy8gcmVtb3ZlIG1lZGlhIHR5cGUgcGFyYW1ldGVyc1xuICByZXR1cm4gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvbnMvaWFuYS9tZWRpYS10eXBlcy8nICsgbWVkaWFUeXBlICsgJyNSZXNvdXJjZScpO1xufTtcblxuLyoqXG4gKiBMb2FkcyBvbnRvbG9naWVzIG9mIHRoZSBkYXRhIHdlIGxvYWQgKHRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGtiIHRvXG4gKiB0aGUgZmV0Y2hlcikuIEV4cG9ydHMgYXMgYEFKQVJfaGFuZGxlTmV3VGVybWBcbiAqL1xuZnVuY3Rpb24gYWphckhhbmRsZU5ld1Rlcm0oa2IsIHAsIHJlcXVlc3RlZEJ5KSB7XG4gIHZhciBzZiA9IG51bGw7XG4gIGlmICh0eXBlb2Yga2IuZmV0Y2hlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzZiA9IGtiLmZldGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwLnRlcm1UeXBlICE9PSAnTmFtZWROb2RlJykgcmV0dXJuO1xuICB2YXIgZG9jdXJpID0gZG9jcGFydChwLnVyaSk7XG4gIHZhciBmaXh1cmk7XG4gIGlmIChwLnVyaS5pbmRleE9mKCcjJykgPCAwKSB7XG4gICAgLy8gTm8gaGFzaFxuICAgIC8vIEBAIG1ham9yIGhhY2sgZm9yIGRicGVkaWEgQ2F0ZWdvcmllcywgd2hpY2ggc3ByZWFkIGluZGVmaW5pdGVseVxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoKHAudXJpLCAnaHR0cDovL2RicGVkaWEub3JnL3Jlc291cmNlL0NhdGVnb3J5OicpKSByZXR1cm47XG5cbiAgICAvKlxuICAgICAgaWYgKHN0cmluZ19zdGFydHN3aXRoKHAudXJpLCAnaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8nKSkge1xuICAgICAgZml4dXJpID0gXCJodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvMjAwNS9hamFyL2FqYXcvdGVzdC9mb2FmXCJcbiAgICAgIC8vIHNob3VsZCBnaXZlIEhUVFAgMzAzIHRvIG9udG9sb2d5IC0tIG5vdyBpcyA6LSlcbiAgICAgIH0gZWxzZVxuICAgICovXG4gICAgaWYgKHN0cmluZ1N0YXJ0c1dpdGgocC51cmksICdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpIHx8IHN0cmluZ1N0YXJ0c1dpdGgocC51cmksICdodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvJykpIHtcbiAgICAgIGZpeHVyaSA9ICdodHRwOi8vZHVibGluY29yZS5vcmcvMjAwNS8wNi8xMy9kY3EnO1xuICAgICAgLy8gZGMgZmV0Y2hlZCBtdWx0aXBsZSB0aW1lc1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nU3RhcnRzV2l0aChwLnVyaSwgJ2h0dHA6Ly94bWxucy5jb20vd290LzAuMS8nKSkge1xuICAgICAgZml4dXJpID0gJ2h0dHA6Ly94bWxucy5jb20vd290LzAuMS9pbmRleC5yZGYnO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nU3RhcnRzV2l0aChwLnVyaSwgJ2h0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLycpKSB7XG4gICAgICAvLyAgICAgICAgICAgIGxvZy53YXJuKFwiY3JlYXRpdmUgY29tbW9ucyBsaW5rcyB0byBodG1sIGluc3RlYWQgb2YgcmRmLiBkb2Vzbid0IHNlZW0gdG8gY29udGVudC1uZWdvdGlhdGUuXCIpXG4gICAgICBmaXh1cmkgPSAnaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2Mvc2NoZW1hLnJkZic7XG4gICAgfVxuICB9XG4gIGlmIChmaXh1cmkpIHtcbiAgICBkb2N1cmkgPSBmaXh1cmk7XG4gIH1cbiAgaWYgKHNmICYmIHNmLmdldFN0YXRlKGRvY3VyaSkgIT09ICd1bnJlcXVlc3RlZCcpIHJldHVybjtcblxuICBpZiAoZml4dXJpKSB7XG4gICAgLy8gb25seSBnaXZlIHdhcm5pbmcgb25jZTogZWxzZSBoYXBwZW5zIHRvbyBvZnRlblxuICAgIGxvZy53YXJuKCdBc3N1bWluZyBzZXJ2ZXIgc3RpbGwgYnJva2VuLCBmYWtpbmcgcmVkaXJlY3Qgb2YgPCcgKyBwLnVyaSArICc+IHRvIDwnICsgZG9jdXJpICsgJz4nKTtcbiAgfVxuICBzZi5yZXF1ZXN0VVJJKGRvY3VyaSwgcmVxdWVzdGVkQnkpO1xufVxuXG4vKipcbiAqIEV4cG9ydHMgYXMgYEFycmF5SW5kZXhPZmAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnIsIGl0ZW0sIGkpIHtcbiAgaSB8fCAoaSA9IDApO1xuICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgaWYgKGkgPCAwKSBpID0gbGVuZ3RoICsgaTtcbiAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQWRkcyBjYWxsYmFjayBmdW5jdGlvbmFsaXR5IHRvIGFuIG9iamVjdC5cbiAqIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgaW5kZXhlZCBieSBhICdob29rJyBzdHJpbmcuXG4gKiBUaGV5IHJldHVybiB0cnVlIGlmIHRoZXkgd2FudCB0byBiZSBjYWxsZWQgYWdhaW4uXG4gKiBAbWV0aG9kIGNhbGxiYWNraWZ5XG4gKiBAcGFyYW0gb2JqIHtPYmplY3R9XG4gKiBAcGFyYW0gY2FsbGJhY2tzIHtBcnJheTxGdW5jdGlvbj59XG4gKi9cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5KG9iaiwgY2FsbGJhY2tzKSB7XG4gIG9iai5jYWxsYmFja3MgPSB7fTtcbiAgZm9yICh2YXIgeCA9IGNhbGxiYWNrcy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgIG9iai5jYWxsYmFja3NbY2FsbGJhY2tzW3hdXSA9IFtdO1xuICB9XG5cbiAgb2JqLmFkZEhvb2sgPSBmdW5jdGlvbiAoaG9vaykge1xuICAgIGlmICghb2JqLmNhbGxiYWNrc1tob29rXSkge1xuICAgICAgb2JqLmNhbGxiYWNrc1tob29rXSA9IFtdO1xuICAgIH1cbiAgfTtcblxuICBvYmouYWRkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaG9vaywgZnVuYykge1xuICAgIG9iai5jYWxsYmFja3NbaG9va10ucHVzaChmdW5jKTtcbiAgfTtcblxuICBvYmoucmVtb3ZlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaG9vaywgZnVuY05hbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5jYWxsYmFja3NbaG9va10ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmouY2FsbGJhY2tzW2hvb2tdW2ldLm5hbWUgPT09IGZ1bmNOYW1lKSB7XG4gICAgICAgIG9iai5jYWxsYmFja3NbaG9va10uc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIG9iai5pbnNlcnRDYWxsYmFjayA9IGZ1bmN0aW9uIChob29rLCBmdW5jKSB7XG4gICAgb2JqLmNhbGxiYWNrc1tob29rXS51bnNoaWZ0KGZ1bmMpO1xuICB9O1xuXG4gIG9iai5maXJlQ2FsbGJhY2tzID0gZnVuY3Rpb24gKGhvb2ssIGFyZ3MpIHtcbiAgICB2YXIgbmV3Q2FsbGJhY2tzID0gW107XG4gICAgdmFyIHJlcGxhY2VDYWxsYmFja3MgPSBbXTtcbiAgICB2YXIgbGVuID0gb2JqLmNhbGxiYWNrc1tob29rXS5sZW5ndGg7XG4gICAgdmFyIHg7XG4gICAgLy8gbG9nLmluZm8oJyFAJCBGaXJpbmcgJytob29rKycgY2FsbCBiYWNrIHdpdGggbGVuZ3RoJytsZW4pXG4gICAgZm9yICh4ID0gbGVuIC0gMTsgeCA+PSAwOyB4LS0pIHtcbiAgICAgIC8vIGxvZy5pbmZvKCdAQCBGaXJpbmcgJytob29rKycgY2FsbGJhY2sgJysgb2JqLmNhbGxiYWNrc1tob29rXVt4XSlcbiAgICAgIGlmIChvYmouY2FsbGJhY2tzW2hvb2tdW3hdLmFwcGx5KG9iaiwgYXJncykpIHtcbiAgICAgICAgbmV3Q2FsbGJhY2tzLnB1c2gob2JqLmNhbGxiYWNrc1tob29rXVt4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh4ID0gbmV3Q2FsbGJhY2tzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICByZXBsYWNlQ2FsbGJhY2tzLnB1c2gobmV3Q2FsbGJhY2tzW3hdKTtcbiAgICB9XG5cbiAgICBmb3IgKHggPSBsZW47IHggPCBvYmouY2FsbGJhY2tzW2hvb2tdLmxlbmd0aDsgeCsrKSB7XG4gICAgICByZXBsYWNlQ2FsbGJhY2tzLnB1c2gob2JqLmNhbGxiYWNrc1tob29rXVt4XSk7XG4gICAgfVxuXG4gICAgb2JqLmNhbGxiYWNrc1tob29rXSA9IHJlcGxhY2VDYWxsYmFja3M7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIERPTSBwYXJzZXIgYmFzZWQgb24gY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICogRXhwb3J0cyBhcyBgRE9NUGFyc2VyRmFjdG9yeWBcbiAqL1xuZnVuY3Rpb24gZG9tUGFyc2VyKCkge1xuICBpZiAodGFidWxhdG9yICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbikge1xuICAgIHJldHVybiBDb21wb25lbnRzLmNsYXNzZXNbJ0Btb3ppbGxhLm9yZy94bWxleHRyYXMvZG9tcGFyc2VyOzEnXS5nZXRTZXJ2aWNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lET01QYXJzZXIpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5ET01QYXJzZXIpIHtcbiAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xpbmtlZGRhdGEvZG9raWVsaVxuZnVuY3Rpb24gZG9tVG9TdHJpbmcobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNlbGZDbG9zaW5nID0gW107XG4gIGlmICgnc2VsZkNsb3NpbmcnIGluIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnNlbGZDbG9zaW5nLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgc2VsZkNsb3Npbmdbbl0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIHZhciBza2lwQXR0cmlidXRlcyA9IFtdO1xuICBpZiAoJ3NraXBBdHRyaWJ1dGVzJyBpbiBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5za2lwQXR0cmlidXRlcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHNraXBBdHRyaWJ1dGVzW25dID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHVtcE5vZGUobm9kZSwgb3B0aW9ucywgc2VsZkNsb3NpbmcsIHNraXBBdHRyaWJ1dGVzKTtcbn1cblxuZnVuY3Rpb24gZHVtcE5vZGUobm9kZSwgb3B0aW9ucywgc2VsZkNsb3NpbmcsIHNraXBBdHRyaWJ1dGVzKSB7XG4gIHZhciBpO1xuICB2YXIgb3V0ID0gJyc7XG4gIHZhciBub0VzYyA9IFtmYWxzZV07XG4gIGlmICh0eXBlb2Ygbm9kZS5ub2RlVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBvdXQ7XG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCdjbGFzcycpICYmICdjbGFzc1dpdGhDaGlsZFRleHQnIGluIG9wdGlvbnMgJiYgbm9kZS5tYXRjaGVzKG9wdGlvbnMuY2xhc3NXaXRoQ2hpbGRUZXh0LmNsYXNzKSkge1xuICAgICAgb3V0ICs9IG5vZGUucXVlcnlTZWxlY3RvcihvcHRpb25zLmNsYXNzV2l0aENoaWxkVGV4dC5lbGVtZW50KS50ZXh0Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKCEoJ3NraXBOb2RlV2l0aENsYXNzJyBpbiBvcHRpb25zICYmIG5vZGUubWF0Y2hlcygnLicgKyBvcHRpb25zLnNraXBOb2RlV2l0aENsYXNzKSkpIHtcbiAgICAgIHZhciBlbmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIG91dCArPSAnPCcgKyBlbmFtZTtcblxuICAgICAgdmFyIGF0dHJMaXN0ID0gW107XG4gICAgICBmb3IgKGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGF0biA9IG5vZGUuYXR0cmlidXRlc1tpXTtcbiAgICAgICAgaWYgKHNraXBBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgc2tpcEF0dHJpYnV0ZXNbYXRuLm5hbWVdKSBjb250aW51ZTtcbiAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QoYXRuLm5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGF0bi5uYW1lID09PSAnY2xhc3MnICYmICdyZXBsYWNlQ2xhc3NJdGVtV2l0aCcgaW4gb3B0aW9ucyAmJiBhdG4udmFsdWUuc3BsaXQoJyAnKS5pbmRleE9mKG9wdGlvbnMucmVwbGFjZUNsYXNzSXRlbVdpdGguc291cmNlKSA+IC0xKSB7XG4gICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChvcHRpb25zLnJlcGxhY2VDbGFzc0l0ZW1XaXRoLnNvdXJjZSwgJ2cnKTtcbiAgICAgICAgICBhdG4udmFsdWUgPSBhdG4udmFsdWUucmVwbGFjZShyZSwgb3B0aW9ucy5yZXBsYWNlQ2xhc3NJdGVtV2l0aC50YXJnZXQpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhdG4ubmFtZSA9PT0gJ2NsYXNzJyAmJiAnc2tpcENsYXNzV2l0aFZhbHVlJyBpbiBvcHRpb25zICYmIG9wdGlvbnMuc2tpcENsYXNzV2l0aFZhbHVlID09PSBhdG4udmFsdWUpKSB7XG4gICAgICAgICAgYXR0ckxpc3QucHVzaChhdG4ubmFtZSArICc9XFwnJyArIGF0bi52YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvJy9nLCAnJnF1b3Q7JykgKyAnXFwnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgnc29ydEF0dHJpYnV0ZXMnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5zb3J0QXR0cmlidXRlcykge1xuICAgICAgICAgIGF0dHJMaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICcgKyBhdHRyTGlzdC5qb2luKCcgJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZkNsb3NpbmdbZW5hbWVdKSB7XG4gICAgICAgIG91dCArPSAnIC8+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnPic7XG4gICAgICAgIG91dCArPSBlbmFtZSA9PT0gJ2h0bWwnID8gJ1xcbiAgJyA6ICcnO1xuICAgICAgICBub0VzYy5wdXNoKGVuYW1lID09PSAnc3R5bGUnIHx8IGVuYW1lID09PSAnc2NyaXB0Jyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBvdXQgKz0gZHVtcE5vZGUobm9kZS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgfW5vRXNjLnBvcCgpO1xuICAgICAgICBvdXQgKz0gZW5hbWUgPT09ICdib2R5JyA/ICc8LycgKyBlbmFtZSArICc+JyArICdcXG4nIDogJzwvJyArIGVuYW1lICsgJz4nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgLy8gRklYTUU6IElmIGNvbW1lbnRzIGFyZSBub3QgdGFiYmVkIGluIHNvdXJjZSwgYSBuZXcgbGluZSBpcyBub3QgcHJlcGVuZGVkXG4gICAgb3V0ICs9ICc8IS0tJyArIG5vZGUubm9kZVZhbHVlICsgJy0tPic7XG4gIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyB8fCBub2RlLm5vZGVUeXBlID09PSA0KSB7XG4gICAgLy8gWFhYOiBSZW1vdmUgbmV3IGxpbmVzIHdoaWNoIHdlcmUgYWRkZWQgYWZ0ZXIgRE9NIHJlYWR5XG4gICAgdmFyIG5sID0gbm9kZS5ub2RlVmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgb3V0ICs9IG5vRXNjW25vRXNjLmxlbmd0aCAtIDFdID8gbmwgOiBubC5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ1dhcm5pbmc7IENhbm5vdCBoYW5kbGUgc2VyaWFsaXNpbmcgbm9kZXMgb2YgdHlwZTogJyArIG5vZGUubm9kZVR5cGUpO1xuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGR0c3RhbXAoKSB7XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICB2YXIgeWVhciA9IG5vdy5nZXRZZWFyKCkgKyAxOTAwO1xuICB2YXIgbW9udGggPSBub3cuZ2V0TW9udGgoKSArIDE7XG4gIHZhciBkYXkgPSBub3cuZ2V0RGF0ZSgpO1xuICB2YXIgaG91ciA9IG5vdy5nZXRVVENIb3VycygpO1xuICB2YXIgbWludXRlID0gbm93LmdldFVUQ01pbnV0ZXMoKTtcbiAgdmFyIHNlY29uZCA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gIGlmIChtb250aCA8IDEwKSBtb250aCA9ICcwJyArIG1vbnRoO1xuICBpZiAoZGF5IDwgMTApIGRheSA9ICcwJyArIGRheTtcbiAgaWYgKGhvdXIgPCAxMCkgaG91ciA9ICcwJyArIGhvdXI7XG4gIGlmIChtaW51dGUgPCAxMCkgbWludXRlID0gJzAnICsgbWludXRlO1xuICBpZiAoc2Vjb25kIDwgMTApIHNlY29uZCA9ICcwJyArIHNlY29uZDtcbiAgcmV0dXJuIHllYXIgKyAnLScgKyBtb250aCArICctJyArIGRheSArICdUJyArIGhvdXIgKyAnOicgKyBtaW51dGUgKyAnOicgKyBzZWNvbmQgKyAnWic7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGhhc2htYXAgb2YgSFRUUCBoZWFkZXJzIGFuZCB0aGVpciB2YWx1ZXMuXG4gKiBAQCBCdWc6IEFzc3VtZXMgdGhhdCBlYWNoIGhlYWRlciBvbmx5IG9jY3VycyBvbmNlLlxuICogQWxzbyBub3RlIHRoYXQgYSAsIGluIGEgaGVhZGVyIHZhbHVlIGlzIGp1c3QgdGhlIHNhbWUgYXMgaGF2aW5nIHR3byBoZWFkZXJzLlxuICovXG5mdW5jdGlvbiBnZXRIVFRQSGVhZGVycyh4aHIpIHtcbiAgdmFyIGxpbmVzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KCdcXG4nKTtcbiAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgdmFyIGxhc3Q7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyB4KyspIHtcbiAgICBpZiAobGluZXNbeF0ubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHBhaXIgPSBsaW5lc1t4XS5zcGxpdCgnOiAnKTtcbiAgICAgIGlmICh0eXBlb2YgcGFpclsxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gY29udGludWF0aW9uXG4gICAgICAgIGhlYWRlcnNbbGFzdF0gKz0gJ1xcbicgKyBwYWlyWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdCA9IHBhaXJbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaGVhZGVyc1tsYXN0XSA9IHBhaXJbMV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHN0YXRlbWVudHMgKGhlYXZ5IGNvbXBhcmlzb24gZm9yIHJlcGVhdGFibGUgY2Fub25pY2FsIG9yZGVyaW5nKVxuICovXG5mdW5jdGlvbiBoZWF2eUNvbXBhcmUoeCwgeSwgZywgdXJpTWFwKSB7XG4gIHZhciBub25CbGFuayA9IGZ1bmN0aW9uIG5vbkJsYW5rKHgpIHtcbiAgICByZXR1cm4geC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScgPyBudWxsIDogeDtcbiAgfTtcbiAgdmFyIHNpZ25hdHVyZSA9IGZ1bmN0aW9uIHNpZ25hdHVyZSh4KSB7XG4gICAgdmFyIGxpcyA9IGcuc3RhdGVtZW50c01hdGNoaW5nKHgpLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgIHJldHVybiAnJyArIG5vbkJsYW5rKHN0LnN1YmplY3QpICsgJyAnICsgbm9uQmxhbmsoc3QucHJlZGljYXRlKSArICcgJyArIG5vbkJsYW5rKHN0Lm9iamVjdCk7XG4gICAgfSkuY29uY2F0KGcuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB4KS5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICByZXR1cm4gJycgKyBub25CbGFuayhzdC5zdWJqZWN0KSArICcgJyArIG5vbkJsYW5rKHN0LnByZWRpY2F0ZSkgKyAnICcgKyBub25CbGFuayhzdC5vYmplY3QpO1xuICAgIH0pKTtcbiAgICBsaXMuc29ydCgpO1xuICAgIHJldHVybiBsaXMuam9pbignXFxuJyk7XG4gIH07XG4gIGlmICh4LnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJyAmJiB5LnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJykge1xuICAgIGlmICh4LmNvbXBhcmVUZXJtKHkpID09PSAwKSByZXR1cm4gMDsgLy8gU2FtZVxuICAgIGlmIChzaWduYXR1cmUoeCkgPiBzaWduYXR1cmUoeSkpIHJldHVybiArMTtcbiAgICBpZiAoc2lnbmF0dXJlKHgpIDwgc2lnbmF0dXJlKHkpKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIHguY29tcGFyZVRlcm0oeSk7IC8vIFRvbyBiYWQgLS0gdGhpcyBvcmRlciBub3QgY2Fub25pY2FsLlxuICAgIC8vIHRocm93IFwiZGlmZmVyZW50IGJub2RlcyBpbmRpc3RpbnF1aXNoYWJsZSBmb3Igc29ydGluZ1wiXG4gIH0gZWxzZSB7XG4gICAgaWYgKHVyaU1hcCAmJiB4LnVyaSAmJiB5LnVyaSkge1xuICAgICAgcmV0dXJuICh1cmlNYXBbeC51cmldIHx8IHgudXJpKS5sb2NhbGVDb21wYXJlKHVyaU1hcFt5LnVyaV0gfHwgeS51cmkpO1xuICAgIH1cbiAgICByZXR1cm4geC5jb21wYXJlVGVybSh5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoZWF2eUNvbXBhcmVTUE8oeCwgeSwgZywgdXJpTWFwKSB7XG4gIHJldHVybiBoZWF2eUNvbXBhcmUoeC5zdWJqZWN0LCB5LnN1YmplY3QsIGcsIHVyaU1hcCkgfHwgaGVhdnlDb21wYXJlKHgucHJlZGljYXRlLCB5LnByZWRpY2F0ZSwgZywgdXJpTWFwKSB8fCBoZWF2eUNvbXBhcmUoeC5vYmplY3QsIHkub2JqZWN0LCBnLCB1cmlNYXApO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBzaW1wbGUgZGVidWdnaW5nIGZ1bmN0aW9uXG4gKiBAbWV0aG9kIG91dHB1dFxuICogQHBhcmFtIG8ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gb3V0cHV0KG8pIHtcbiAgdmFyIGsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgay50ZXh0Q29udGVudCA9IG87XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIERPTSBmcm9tIHBhcnNleCBYTUwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlWE1MKHN0ciwgb3B0aW9ucykge1xuICB2YXIgZHBhcnNlcjtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICh0eXBlb2YgdGFidWxhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0YWJ1bGF0b3IuaXNFeHRlbnNpb24pIHtcbiAgICBkcGFyc2VyID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcveG1sZXh0cmFzL2RvbXBhcnNlcjsxJ10uZ2V0U2VydmljZShDb21wb25lbnRzLmludGVyZmFjZXMubnNJRE9NUGFyc2VyKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAvLyBOb2RlLmpzXG4gICAgLy8gdmFyIGxpYnhtbGpzID0gcmVxdWlyZSgnbGlieG1sanMnKTsgLy8gV2FzIGpzZG9tIGJlZm9yZSAyMDEyLTAxIHRoZW4gbGlieG1sanMgYnV0IHRoYXQgbm9uc3RhbmRhcmRcbiAgICAvLyByZXR1cm4gbGlieG1sanMucGFyc2VYbWxTdHJpbmcoc3RyKVxuXG4gICAgLy8gdmFyIGpzZG9tID0gcmVxdWlyZSgnanNkb20nKTsgICAyMDEyLTAxIHRob3VnaCAyMDE1LTA4IG5vIHdvcmt5IHdpdGggbmV3IE5vZGVcbiAgICAvLyB2YXIgZG9tID0ganNkb20uanNkb20oc3RyLCB1bmRlZmluZWQsIHt9ICk7Ly8gaHRtbCwgbGV2ZWwsIG9wdGlvbnNcblxuICAgIHZhciBET01QYXJzZXIgPSByZXF1aXJlKCd4bWxkb20nKS5ET01QYXJzZXI7IC8vIDIwMTUtMDggb24gaHR0cHM6Ly9naXRodWIuY29tL2ppbmR3L3htbGRvbVxuICAgIHZhciBkb20gPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgb3B0aW9ucy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24veGh0bWwreG1sJyk7XG4gICAgcmV0dXJuIGRvbTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LkRPTVBhcnNlcikge1xuICAgICAgZHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7IC8vIHNlZW1zIHRvIGFjdHVhbGx5IHdvcmtcbiAgICB9IGVsc2Uge1xuICAgICAgZHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsgLy8gRG9jIHNheXMgdGhpcyB3b3Jrc1xuICAgIH1cbiAgfVxuICByZXR1cm4gZHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3RyLCAnYXBwbGljYXRpb24veG1sJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgc3RhdGVtZW50cyBlcXVhbCB0byB4IGZyb20gYVxuICogRXhwb3J0cyBhcyBgUkRGQXJyYXlSZW1vdmVgXG4gKi9cbmZ1bmN0aW9uIHJkZkFycmF5UmVtb3ZlKGEsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gVE9ETzogVGhpcyB1c2VkIHRvIGJlIHRoZSBmb2xsb3dpbmcsIHdoaWNoIGRpZG50IGFsd2F5cyB3b3JrLi53aHlcbiAgICAvLyBpZihhW2ldID09PSB4KVxuICAgIGlmIChhW2ldLnN1YmplY3Quc2FtZVRlcm0oeC5zdWJqZWN0KSAmJiBhW2ldLnByZWRpY2F0ZS5zYW1lVGVybSh4LnByZWRpY2F0ZSkgJiYgYVtpXS5vYmplY3Quc2FtZVRlcm0oeC5vYmplY3QpICYmIGFbaV0ud2h5LnNhbWVUZXJtKHgud2h5KSkge1xuICAgICAgYS5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignUkRGQXJyYXlSZW1vdmU6IEFycmF5IGRpZCBub3QgY29udGFpbiAnICsgeCArICcgJyArIHgud2h5KTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nU3RhcnRzV2l0aChzdHIsIHByZWYpIHtcbiAgLy8gbWlzc2luZyBsaWJyYXJ5IHJvdXRpbmVzXG4gIHJldHVybiBzdHIuc2xpY2UoMCwgcHJlZi5sZW5ndGgpID09PSBwcmVmO1xufVxuXG4vKipcbiAqIEMrKywgcHl0aG9uIHN0eWxlICVzIC0+IHN1YnNcbiAqL1xuZnVuY3Rpb24gc3RyaW5nVGVtcGxhdGUoYmFzZSwgc3Vicykge1xuICB2YXIgYmFzZUEgPSBiYXNlLnNwbGl0KCclcycpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykge1xuICAgIHN1YnNbaV0gKz0gJyc7XG4gICAgcmVzdWx0ICs9IGJhc2VBW2ldICsgc3Vic1tpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgYmFzZUEuc2xpY2Uoc3Vicy5sZW5ndGgpLmpvaW4oKTtcbn1cblxuLy8gU3RhY2sgZHVtcCBvbiBlcnJvcnMgLSB0byBwYXNzIGVycm9ycyBiYWNrXG5cbmZ1bmN0aW9uIHN0YWNrU3RyaW5nKGUpIHtcbiAgdmFyIHN0ciA9ICcnICsgZSArICdcXG4nO1xuICBpZiAoIWUuc3RhY2spIHtcbiAgICByZXR1cm4gc3RyICsgJ05vIHN0YWNrIGF2YWlsYWJsZS5cXG4nO1xuICB9XG4gIHZhciBsaW5lcyA9IGUuc3RhY2sudG9TdHJpbmcoKS5zcGxpdCgnXFxuJyk7XG4gIHZhciB0b3ByaW50ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuICAgIGlmIChsaW5lLmluZGV4T2YoJ2VjbWF1bml0LmpzJykgPiAtMSkge1xuICAgICAgLy8gcmVtb3ZlIHVzZWxlc3MgYml0IG9mIHRyYWNlYmFja1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PSAnKCcpIHtcbiAgICAgIGxpbmUgPSAnZnVuY3Rpb24nICsgbGluZTtcbiAgICB9XG4gICAgdmFyIGNodW5rcyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICB0b3ByaW50LnB1c2goY2h1bmtzKTtcbiAgfVxuICAvLyB0b3ByaW50LnJldmVyc2UoKTsgIE5vIC0gSSBwcmVmZXIgdGhlIGxhdGVzdCBhdCB0aGUgdG9wIGJ5IHRoZSBlcnJvciBtZXNzYWdlIC10YmxcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcHJpbnQubGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJyAgJyArIHRvcHJpbnRbaV1bMV0gKyAnXFxuICAgICcgKyB0b3ByaW50W2ldWzBdO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHZhcmlhYmxlcyBpbiBhIGdyYXBoIChzaGFsbG93KS5cbiAqIE5vdGU6IFVOVVNFRC5cbiAqL1xuLy8gZnVuY3Rpb24gdmFyaWFibGVzSW4gKGcpIHtcbi8vICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnLnN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICB2YXIgc3QgPSBnLnN0YXRhdGVtZW50c1tpXVxuLy8gICAgIHZhciB2YXJzID0ge31cbi8vICAgICBpZiAoc3Quc3ViamVjdCBpbnN0YW5jZW9mICRyZGYuVmFyaWFibGUpIHtcbi8vICAgICAgIHZhcnNbc3Quc3ViamVjdC50b05UKCldID0gdHJ1ZVxuLy8gICAgIH1cbi8vICAgICBpZiAoc3QucHJlZGljYXRlIGluc3RhbmNlb2YgJHJkZi5WYXJpYWJsZSkge1xuLy8gICAgICAgdmFyc1tzdC5wcmVkaWNhdGUudG9OVCgpXSA9IHRydWVcbi8vICAgICB9XG4vLyAgICAgaWYgKHN0Lm9iamVjdCBpbnN0YW5jZW9mICRyZGYuVmFyaWFibGUpIHtcbi8vICAgICAgIHZhcnNbc3Qub2JqZWN0LnRvTlQoKV0gPSB0cnVlXG4vLyAgICAgfVxuLy8gICB9XG4vLyAgIHJldHVybiB2YXJzXG4vLyB9XG5cbi8qKlxuICogUmV0dXJucyBhbiBYTUxIdHRwUmVxdWVzdCBvYmplY3QgZm9yIHRoZSBhcHByb3ByaWF0ZSBjdXJyZW50IHJ1bnRpbWVcbiAqIGVudmlyb25tZW50LiBFeHBvcnRzIGFzIGBYTUxIVFRQRmFjdG9yeWBcbiAqL1xuZnVuY3Rpb24geGhyKCkge1xuICB2YXIgWE1MSHR0cFJlcXVlc3Q7XG4gIC8vIFJ1bm5pbmcgaW5zaWRlIHRoZSBUYWJ1bGF0b3IgRmlyZWZveCBleHRlbnNpb25cbiAgaWYgKHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbikge1xuICAgIC8vIENhbm5vdCB1c2UgWE1MSHR0cFJlcXVlc3QgbmF0aXZlbHksIG11c3QgcmVxdWVzdCBpdCB0aHJvdWdoIFNES1xuICAgIHJldHVybiBDb21wb25lbnRzLmNsYXNzZXNbJ0Btb3ppbGxhLm9yZy94bWxleHRyYXMveG1saHR0cHJlcXVlc3Q7MSddLmNyZWF0ZUluc3RhbmNlKCkuUXVlcnlJbnRlcmZhY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSVhNTEh0dHBSZXF1ZXN0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnWE1MSHR0cFJlcXVlc3QnIGluIHdpbmRvdykge1xuICAgIC8vIFJ1bm5pbmcgaW5zaWRlIHRoZSBicm93c2VyXG4gICAgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q7XG4gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIC8vIFJ1bm5pbmcgaW4gTm9kZS5qc1xuICAgIFhNTEh0dHBSZXF1ZXN0ID0gcmVxdWlyZSgneG1saHR0cHJlcXVlc3QnKS5YTUxIdHRwUmVxdWVzdDtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIH0gZWxzZSBpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBDbGFzc09yZGVyID0gcmVxdWlyZSgnLi9jbGFzcy1vcmRlcicpO1xudmFyIE5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbnZhciBVcmkgPSByZXF1aXJlKCcuL3VyaScpO1xuXG4vKipcbiAqIFZhcmlhYmxlcyBhcmUgcGxhY2Vob2xkZXJzIHVzZWQgaW4gcGF0dGVybnMgdG8gYmUgbWF0Y2hlZC5cbiAqIEluIGN3bSB0aGV5IGFyZSBzeW1ib2xzIHdoaWNoIGFyZSB0aGUgZm9ybXVsYSdzIGxpc3Qgb2YgcXVhbnRpZmllZCB2YXJpYWJsZXMuXG4gKiBJbiBzcGFycWwgdGhleSBhcmUgbm90IHZpc2libHkgVVJJcy4gIEhlcmUgd2UgY29tcHJvbWlzZSwgYnkgaGF2aW5nXG4gKiBhIGNvbW1vbiBzcGVjaWFsIGJhc2UgVVJJIGZvciB2YXJpYWJsZXMuIFRoZWlyIG5hbWVzIGFyZSB1cmlzLFxuICogYnV0IHRoZSA/IG5vdGF0aW9uIGhhcyBhbiBpbXBsaWNpdCBiYXNlIHVyaSBvZiAndmFyaWQ6J1xuICogQGNsYXNzIFZhcmlhYmxlXG4gKi9cblxudmFyIFZhcmlhYmxlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhWYXJpYWJsZSwgX05vZGUpO1xuXG4gIGZ1bmN0aW9uIFZhcmlhYmxlKCkge1xuICAgIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWYXJpYWJsZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmFyaWFibGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWYXJpYWJsZSkpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBWYXJpYWJsZS50ZXJtVHlwZTtcbiAgICBfdGhpcy52YWx1ZSA9IG5hbWU7XG4gICAgX3RoaXMuYmFzZSA9ICd2YXJpZDonO1xuICAgIF90aGlzLnVyaSA9IFVyaS5qb2luKG5hbWUsIF90aGlzLmJhc2UpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWYXJpYWJsZSwgW3tcbiAgICBrZXk6ICdlcXVhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICAgIGlmICghb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGVybVR5cGUgPT09IG90aGVyLnRlcm1UeXBlICYmIHRoaXMudmFsdWUgPT09IG90aGVyLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhc2hTdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNoU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHJldHVybiAocmVmID0gYmluZGluZ3NbdGhpcy50b05UKCldKSAhPSBudWxsID8gcmVmIDogdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgaWYgKHRoaXMudXJpLnNsaWNlKDAsIHRoaXMuYmFzZS5sZW5ndGgpID09PSB0aGlzLmJhc2UpIHtcbiAgICAgICAgcmV0dXJuICc/JyArIHRoaXMudXJpLnNsaWNlKHRoaXMuYmFzZS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc/JyArIHRoaXMudXJpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWYXJpYWJsZTtcbn0oTm9kZSk7XG5cblZhcmlhYmxlLnRlcm1UeXBlID0gJ1ZhcmlhYmxlJztcblZhcmlhYmxlLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnVmFyaWFibGUnXTtcblZhcmlhYmxlLnByb3RvdHlwZS5pc1ZhciA9IDE7XG5cbm1vZHVsZS5leHBvcnRzID0gVmFyaWFibGU7IiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG5cbnZhciBYU0QgPSBmdW5jdGlvbiBYU0QoKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBYU0QpO1xufTtcblxuWFNELmJvb2xlYW4gPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJyk7XG5YU0QuZGF0ZVRpbWUgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZScpO1xuWFNELmRlY2ltYWwgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsJyk7XG5YU0QuZG91YmxlID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZG91YmxlJyk7XG5YU0QuaW50ZWdlciA9IG5ldyBOYW1lZE5vZGUoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludGVnZXInKTtcblhTRC5sYW5nU3RyaW5nID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnKTtcblhTRC5zdHJpbmcgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBYU0Q7IiwiLy8gKipOM0xleGVyKiogdG9rZW5pemVzIE4zIGRvY3VtZW50cy5cbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIGltbWVkaWF0ZWx5ID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHNldEltbWVkaWF0ZSA6XG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZnVuYykgeyBzZXRUaW1lb3V0KGZ1bmMsIDApOyB9O1xuXG4vLyBSZWd1bGFyIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VtZW50IHN0cmluZyB0byBlc2NhcGUgTjMgc3RyaW5ncy5cbi8vIE5vdGUgaG93IHdlIGNhdGNoIGludmFsaWQgdW5pY29kZSBzZXF1ZW5jZXMgc2VwYXJhdGVseSAodGhleSB3aWxsIHRyaWdnZXIgYW4gZXJyb3IpLlxudmFyIGVzY2FwZVNlcXVlbmNlID0gL1xcXFx1KFthLWZBLUYwLTldezR9KXxcXFxcVShbYS1mQS1GMC05XXs4fSl8XFxcXFt1VV18XFxcXCguKS9nO1xudmFyIGVzY2FwZVJlcGxhY2VtZW50cyA9IHsgJ1xcXFwnOiAnXFxcXCcsIFwiJ1wiOiBcIidcIiwgJ1wiJzogJ1wiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICduJzogJ1xcbicsICdyJzogJ1xccicsICd0JzogJ1xcdCcsICdmJzogJ1xcZicsICdiJzogJ1xcYicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAnXyc6ICdfJywgJ34nOiAnficsICcuJzogJy4nLCAnLSc6ICctJywgJyEnOiAnIScsICckJzogJyQnLCAnJic6ICcmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJzogJygnLCAnKSc6ICcpJywgJyonOiAnKicsICcrJzogJysnLCAnLCc6ICcsJywgJzsnOiAnOycsICc9JzogJz0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nOiAnLycsICc/JzogJz8nLCAnIyc6ICcjJywgJ0AnOiAnQCcsICclJzogJyUnIH07XG52YXIgaWxsZWdhbElyaUNoYXJzID0gL1tcXHgwMC1cXHgyMDw+XFxcXFwiXFx7XFx9XFx8XFxeXFxgXS87XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM0xleGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zTGV4ZXIpKVxuICAgIHJldHVybiBuZXcgTjNMZXhlcihvcHRpb25zKTtcblxuICAvLyBJbiBsaW5lIG1vZGUgKE4tVHJpcGxlcyBvciBOLVF1YWRzKSwgb25seSBzaW1wbGUgZmVhdHVyZXMgbWF5IGJlIHBhcnNlZFxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxpbmVNb2RlKSB7XG4gICAgLy8gRG9uJ3QgdG9rZW5pemUgc3BlY2lhbCBsaXRlcmFsc1xuICAgIHRoaXMuX3RyaXBsZVF1b3RlZFN0cmluZyA9IHRoaXMuX251bWJlciA9IHRoaXMuX2Jvb2xlYW4gPSAvJDBeLztcbiAgICAvLyBTd2FwIHRoZSB0b2tlbml6ZSBtZXRob2QgZm9yIGEgcmVzdHJpY3RlZCB2ZXJzaW9uXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3Rva2VuaXplID0gdGhpcy50b2tlbml6ZTtcbiAgICB0aGlzLnRva2VuaXplID0gZnVuY3Rpb24gKGlucHV0LCBjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdG9rZW5pemUoaW5wdXQsIGZ1bmN0aW9uIChlcnJvciwgdG9rZW4pIHtcbiAgICAgICAgaWYgKCFlcnJvciAmJiAvXig/OklSSXxwcmVmaXhlZHxsaXRlcmFsfGxhbmdjb2RlfHR5cGV8XFwufGVvZikkLy50ZXN0KHRva2VuLnR5cGUpKVxuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVycm9yLCB0b2tlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvciB8fCBzZWxmLl9zeW50YXhFcnJvcih0b2tlbi50eXBlLCBjYWxsYmFjayA9IG51bGwpKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuTjNMZXhlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgLy8gSXQncyBzbGlnaHRseSBmYXN0ZXIgdG8gaGF2ZSB0aGVzZSBhcyBwcm9wZXJ0aWVzIHRoYW4gYXMgaW4tc2NvcGUgdmFyaWFibGVzLlxuXG4gIF9pcmk6IC9ePCgoPzpbXj5cXFxcXXxcXFxcW3VVXSkrKT4vLCAvLyBJUkkgd2l0aCBlc2NhcGUgc2VxdWVuY2VzOyBuZWVkcyBzYW5pdHkgY2hlY2sgYWZ0ZXIgdW5lc2NhcGluZ1xuICBfdW5lc2NhcGVkSXJpOiAvXjwoW15cXHgwMC1cXHgyMDw+XFxcXFwiXFx7XFx9XFx8XFxeXFxgXSopPi8sIC8vIElSSSB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXM7IG5vIHVuZXNjYXBpbmdcbiAgX3VuZXNjYXBlZFN0cmluZzogL15cIlteXCJcXFxcXStcIig/PVteXCJcXFxcXSkvLCAvLyBub24tZW1wdHkgc3RyaW5nIHdpdGhvdXQgZXNjYXBlIHNlcXVlbmNlc1xuICBfc2luZ2xlUXVvdGVkU3RyaW5nOiAvXlwiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIoPz1bXlwiXFxcXF0pfF4nW14nXFxcXF0qKD86XFxcXC5bXidcXFxcXSopKicoPz1bXidcXFxcXSkvLFxuICBfdHJpcGxlUXVvdGVkU3RyaW5nOiAvXlwiXCIoXCJbXlwiXFxcXF0qKD86KD86XFxcXC58XCIoPyFcIlwiKSlbXlwiXFxcXF0qKSpcIilcIlwifF4nJygnW14nXFxcXF0qKD86KD86XFxcXC58Jyg/IScnKSlbXidcXFxcXSopKicpJycvLFxuICBfbGFuZ2NvZGU6IC9eQChbYS16XSsoPzotW2EtejAtOV0rKSopKD89W15hLXowLTlcXC1dKS9pLFxuICBfcHJlZml4OiAvXigoPzpbQS1aYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpcXC4/W1xcLTAtOUEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkqKT86KD89WyNcXHM8XSkvLFxuICBfcHJlZml4ZWQ6IC9eKCg/OltBLVphLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopPzooKD86KD86WzAtOkEtWl9hLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKD86KD86W1xcLlxcLTAtOkEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXXwlWzAtOWEtZkEtRl17Mn18XFxcXFshIy1cXC87PT9cXC1AX35dKSooPzpbXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKT8pPykoPz1cXC4/Wyw7XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX2JsYW5rOiAvXl86KCg/OlswLTlBLVpfYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpcXC4/W1xcLTAtOUEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkqKSg/PVxcLj9bLDs6XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX251bWJlcjogL15bXFwtK10/KD86XFxkK1xcLj9cXGQqKFtlRV0oPzpbXFwtXFwrXSk/XFxkKyl8XFxkKlxcLj9cXGQrKSg/PVsuLDs6XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX2Jvb2xlYW46IC9eKD86dHJ1ZXxmYWxzZSkoPz1bLiw7OlxccyMoKVxcW1xcXVxce1xcfVwiJzxdKS8sXG4gIF9rZXl3b3JkOiAvXkBbYS16XSsoPz1bXFxzIzw6XSkvLFxuICBfc3BhcnFsS2V5d29yZDogL14oPzpQUkVGSVh8QkFTRXxHUkFQSCkoPz1bXFxzIzw6XSkvaSxcbiAgX3Nob3J0UHJlZGljYXRlczogL15hKD89XFxzK3w8KS8sXG4gIF9uZXdsaW5lOiAvXlsgXFx0XSooPzojW15cXG5cXHJdKik/KD86XFxyXFxufFxcbnxcXHIpWyBcXHRdKi8sXG4gIF93aGl0ZXNwYWNlOiAvXlsgXFx0XSsvLFxuICBfZW5kT2ZGaWxlOiAvXig/OiNbXlxcblxccl0qKT8kLyxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF90b2tlbml6ZVRvRW5kYCB0b2tlbml6ZXMgYXMgZm9yIGFzIHBvc3NpYmxlLCBlbWl0dGluZyB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2suXG4gIF90b2tlbml6ZVRvRW5kOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGlucHV0RmluaXNoZWQpIHtcbiAgICAvLyBDb250aW51ZSBwYXJzaW5nIGFzIGZhciBhcyBwb3NzaWJsZTsgdGhlIGxvb3Agd2lsbCByZXR1cm4gZXZlbnR1YWxseS5cbiAgICB2YXIgaW5wdXQgPSB0aGlzLl9pbnB1dDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ291bnQgYW5kIHNraXAgd2hpdGVzcGFjZSBsaW5lcy5cbiAgICAgIHZhciB3aGl0ZVNwYWNlTWF0Y2g7XG4gICAgICB3aGlsZSAod2hpdGVTcGFjZU1hdGNoID0gdGhpcy5fbmV3bGluZS5leGVjKGlucHV0KSlcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHIod2hpdGVTcGFjZU1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKSwgdGhpcy5fbGluZSsrO1xuICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlIG9uIGN1cnJlbnQgbGluZS5cbiAgICAgIGlmICh3aGl0ZVNwYWNlTWF0Y2ggPSB0aGlzLl93aGl0ZXNwYWNlLmV4ZWMoaW5wdXQpKVxuICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cih3aGl0ZVNwYWNlTWF0Y2hbMF0ubGVuZ3RoLCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyBTdG9wIGZvciBub3cgaWYgd2UncmUgYXQgdGhlIGVuZC5cbiAgICAgIGlmICh0aGlzLl9lbmRPZkZpbGUudGVzdChpbnB1dCkpIHtcbiAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGZpbmlzaGVkLCBlbWl0IEVPRi5cbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQpXG4gICAgICAgICAgY2FsbGJhY2soaW5wdXQgPSBudWxsLCB7IGxpbmU6IHRoaXMuX2xpbmUsIHR5cGU6ICdlb2YnLCB2YWx1ZTogJycsIHByZWZpeDogJycgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciBzcGVjaWZpYyB0b2tlbiB0eXBlcyBiYXNlZCBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyLlxuICAgICAgdmFyIGxpbmUgPSB0aGlzLl9saW5lLCB0eXBlID0gJycsIHZhbHVlID0gJycsIHByZWZpeCA9ICcnLFxuICAgICAgICAgIGZpcnN0Q2hhciA9IGlucHV0WzBdLCBtYXRjaCA9IG51bGwsIG1hdGNoTGVuZ3RoID0gMCwgdW5lc2NhcGVkLCBpbmNvbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICdeJzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgdHlwZS5cbiAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMSkgYnJlYWs7XG4gICAgICAgIGVsc2UgaWYgKGlucHV0WzFdICE9PSAnXicpIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgdGhpcy5fcHJldlRva2VuVHlwZSA9ICdeJztcbiAgICAgICAgLy8gTW92ZSB0byB0eXBlIElSSSBvciBwcmVmaXhlZCBuYW1lLlxuICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cigyKTtcbiAgICAgICAgaWYgKGlucHV0WzBdICE9PSAnPCcpIHtcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCBpbiBjYXNlIHRoZSB0eXBlIGlzIGFuIElSSS5cblxuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZnVsbCBJUkkgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzLlxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl91bmVzY2FwZWRJcmkuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9ICdJUkknLCB2YWx1ZSA9IG1hdGNoWzFdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGZ1bGwgSVJJIHdpdGggZXNjYXBlIHNlcXVlbmNlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9pcmkuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCB8fCBpbGxlZ2FsSXJpQ2hhcnMudGVzdCh1bmVzY2FwZWQpKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSB1bmVzY2FwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ18nOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGJsYW5rIG5vZGUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgaWYgKChtYXRjaCA9IHRoaXMuX2JsYW5rLmV4ZWMoaW5wdXQpKSB8fFxuICAgICAgICAgICAgaW5wdXRGaW5pc2hlZCAmJiAobWF0Y2ggPSB0aGlzLl9ibGFuay5leGVjKGlucHV0ICsgJyAnKSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXhlZCcsIHByZWZpeCA9ICdfJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1wiJzpcbiAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbm9uLWVtcHR5IGRvdWJsZS1xdW90ZWQgbGl0ZXJhbCB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXMuXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3VuZXNjYXBlZFN0cmluZy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhbnkgb3RoZXIgbGl0ZXJhbCB3cmFwcGVkIGluIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9zaW5nbGVRdW90ZWRTdHJpbmcuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFswXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IHVuZXNjYXBlZC5yZXBsYWNlKC9eJ3wnJC9nLCAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGxpdGVyYWwgd3JhcHBlZCBpbiB0aHJlZSBwYWlycyBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl90cmlwbGVRdW90ZWRTdHJpbmcuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSBtYXRjaFsxXSB8fCBtYXRjaFsyXTtcbiAgICAgICAgICAvLyBDb3VudCB0aGUgbmV3bGluZXMgYW5kIGFkdmFuY2UgbGluZSBjb3VudGVyLlxuICAgICAgICAgIHRoaXMuX2xpbmUgKz0gdW5lc2NhcGVkLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdW5lc2NhcGVkID0gdGhpcy5fdW5lc2NhcGUodW5lc2NhcGVkKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdAJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBsYW5ndWFnZSBjb2RlLlxuICAgICAgICBpZiAodGhpcy5fcHJldlRva2VuVHlwZSA9PT0gJ2xpdGVyYWwnICYmIChtYXRjaCA9IHRoaXMuX2xhbmdjb2RlLmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICB0eXBlID0gJ2xhbmdjb2RlJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBrZXl3b3JkLlxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHRoaXMuX2tleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnLic6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZG90IGFzIHB1bmN0dWF0aW9uLlxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAxID8gaW5wdXRGaW5pc2hlZCA6IChpbnB1dFsxXSA8ICcwJyB8fCBpbnB1dFsxXSA+ICc5JykpIHtcbiAgICAgICAgICB0eXBlID0gJy4nO1xuICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gbnVtZXJpY2FsIGNhc2UgKGNvdWxkIGJlIGEgZGVjaW1hbCBkb3QpLlxuXG4gICAgICBjYXNlICcwJzpcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgY2FzZSAnMic6XG4gICAgICBjYXNlICczJzpcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgY2FzZSAnNSc6XG4gICAgICBjYXNlICc2JzpcbiAgICAgIGNhc2UgJzcnOlxuICAgICAgY2FzZSAnOCc6XG4gICAgICBjYXNlICc5JzpcbiAgICAgIGNhc2UgJysnOlxuICAgICAgY2FzZSAnLSc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbnVtYmVyLlxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl9udW1iZXIuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnO1xuICAgICAgICAgIHZhbHVlID0gJ1wiJyArIG1hdGNoWzBdICsgJ1wiXl5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSMnICtcbiAgICAgICAgICAgICAgICAgIChtYXRjaFsxXSA/ICdkb3VibGUnIDogKC9eWytcXC1dP1xcZCskLy50ZXN0KG1hdGNoWzBdKSA/ICdpbnRlZ2VyJyA6ICdkZWNpbWFsJykpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdCJzpcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdQJzpcbiAgICAgIGNhc2UgJ0cnOlxuICAgICAgY2FzZSAnZyc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgU1BBUlFMLXN0eWxlIGtleXdvcmQuXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3NwYXJxbEtleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZic6XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgYm9vbGVhbi5cbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fYm9vbGVhbi5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9ICdcIicgKyBtYXRjaFswXSArICdcIl5eaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhbic7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGFiYnJldmlhdGVkIHByZWRpY2F0ZS5cbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fc2hvcnRQcmVkaWNhdGVzLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnYWJicmV2aWF0aW9uJywgdmFsdWUgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGUnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaW5jb25jbHVzaXZlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJywnOlxuICAgICAgY2FzZSAnOyc6XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ10nOlxuICAgICAgY2FzZSAnKCc6XG4gICAgICBjYXNlICcpJzpcbiAgICAgIGNhc2UgJ3snOlxuICAgICAgY2FzZSAnfSc6XG4gICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIHB1bmN0dWF0aW9uXG4gICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgdHlwZSA9IGZpcnN0Q2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvbWUgZmlyc3QgY2hhcmFjdGVycyBkbyBub3QgYWxsb3cgYW4gaW1tZWRpYXRlIGRlY2lzaW9uLCBzbyBpbnNwZWN0IG1vcmUuXG4gICAgICBpZiAoaW5jb25jbHVzaXZlKSB7XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgcHJlZml4LlxuICAgICAgICBpZiAoKHRoaXMuX3ByZXZUb2tlblR5cGUgPT09ICdAcHJlZml4JyB8fCB0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnUFJFRklYJykgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHRoaXMuX3ByZWZpeC5leGVjKGlucHV0KSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXgnLCB2YWx1ZSA9IG1hdGNoWzFdIHx8ICcnO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeGVkIG5hbWUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAncHJlZml4ZWQnLCBwcmVmaXggPSBtYXRjaFsxXSB8fCAnJywgdmFsdWUgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHlwZSB0b2tlbiBpcyBzcGVjaWFsOiBpdCBjYW4gb25seSBiZSBlbWl0dGVkIGFmdGVyIGFuIElSSSBvciBwcmVmaXhlZCBuYW1lIGlzIHJlYWQuXG4gICAgICBpZiAodGhpcy5fcHJldlRva2VuVHlwZSA9PT0gJ14nKVxuICAgICAgICB0eXBlID0gKHR5cGUgPT09ICdJUkknIHx8IHR5cGUgPT09ICdwcmVmaXhlZCcpID8gJ3R5cGUnIDogJyc7XG5cbiAgICAgIC8vIFdoYXQgaWYgbm90aGluZyBvZiB0aGUgYWJvdmUgd2FzIGZvdW5kP1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIC8vIFdlIGNvdWxkIGJlIGluIHN0cmVhbWluZyBtb2RlLCBhbmQgdGhlbiB3ZSBqdXN0IHdhaXQgZm9yIG1vcmUgaW5wdXQgdG8gYXJyaXZlLlxuICAgICAgICAvLyBPdGhlcndpc2UsIGEgc3ludGF4IGVycm9yIGhhcyBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuXG4gICAgICAgIC8vIE9uZSBleGNlcHRpb246IGVycm9yIG9uIGFuIHVuYWNjb3VudGVkIGxpbmVicmVhayAoPSBub3QgaW5zaWRlIGEgdHJpcGxlLXF1b3RlZCBsaXRlcmFsKS5cbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQgfHwgKCEvXicnJ3xeXCJcIlwiLy50ZXN0KGlucHV0KSAmJiAvXFxufFxcci8udGVzdChpbnB1dCkpKVxuICAgICAgICAgIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHRoZSBwYXJzZWQgdG9rZW4uXG4gICAgICBjYWxsYmFjayhudWxsLCB7IGxpbmU6IGxpbmUsIHR5cGU6IHR5cGUsIHZhbHVlOiB2YWx1ZSwgcHJlZml4OiBwcmVmaXggfSk7XG4gICAgICB0aGlzLl9wcmV2VG9rZW5UeXBlID0gdHlwZTtcblxuICAgICAgLy8gQWR2YW5jZSB0byBuZXh0IHBhcnQgdG8gdG9rZW5pemUuXG4gICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cihtYXRjaExlbmd0aCB8fCBtYXRjaFswXS5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gU2lnbmFscyB0aGUgc3ludGF4IGVycm9yIHRocm91Z2ggdGhlIGNhbGxiYWNrXG4gICAgZnVuY3Rpb24gcmVwb3J0U3ludGF4RXJyb3Ioc2VsZikgeyBjYWxsYmFjayhzZWxmLl9zeW50YXhFcnJvcigvXlxcUyovLmV4ZWMoaW5wdXQpWzBdKSk7IH1cbiAgfSxcblxuICAvLyAjIyMgYF91bmVzY2FwZWAgcmVwbGFjZXMgTjMgZXNjYXBlIGNvZGVzIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgX3VuZXNjYXBlOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gaXRlbS5yZXBsYWNlKGVzY2FwZVNlcXVlbmNlLCBmdW5jdGlvbiAoc2VxdWVuY2UsIHVuaWNvZGU0LCB1bmljb2RlOCwgZXNjYXBlZENoYXIpIHtcbiAgICAgICAgdmFyIGNoYXJDb2RlO1xuICAgICAgICBpZiAodW5pY29kZTQpIHtcbiAgICAgICAgICBjaGFyQ29kZSA9IHBhcnNlSW50KHVuaWNvZGU0LCAxNik7XG4gICAgICAgICAgaWYgKGlzTmFOKGNoYXJDb2RlKSkgdGhyb3cgbmV3IEVycm9yKCk7IC8vIGNhbiBuZXZlciBoYXBwZW4gKHJlZ2V4KSwgYnV0IGhlbHBzIHBlcmZvcm1hbmNlXG4gICAgICAgICAgcmV0dXJuIGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5pY29kZTgpIHtcbiAgICAgICAgICBjaGFyQ29kZSA9IHBhcnNlSW50KHVuaWNvZGU4LCAxNik7XG4gICAgICAgICAgaWYgKGlzTmFOKGNoYXJDb2RlKSkgdGhyb3cgbmV3IEVycm9yKCk7IC8vIGNhbiBuZXZlciBoYXBwZW4gKHJlZ2V4KSwgYnV0IGhlbHBzIHBlcmZvcm1hbmNlXG4gICAgICAgICAgaWYgKGNoYXJDb2RlIDw9IDB4RkZGRikgcmV0dXJuIGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgICAgcmV0dXJuIGZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKGNoYXJDb2RlIC09IDB4MTAwMDApIC8gMHg0MDApLCAweERDMDAgKyAoY2hhckNvZGUgJiAweDNGRikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVzY2FwZVJlcGxhY2VtZW50c1tlc2NhcGVkQ2hhcl07XG4gICAgICAgICAgaWYgKCFyZXBsYWNlbWVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyByZXR1cm4gbnVsbDsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3N5bnRheEVycm9yYCBjcmVhdGVzIGEgc3ludGF4IGVycm9yIGZvciB0aGUgZ2l2ZW4gaXNzdWVcbiAgX3N5bnRheEVycm9yOiBmdW5jdGlvbiAoaXNzdWUpIHtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignU3ludGF4IGVycm9yOiB1bmV4cGVjdGVkIFwiJyArIGlzc3VlICsgJ1wiIG9uIGxpbmUgJyArIHRoaXMuX2xpbmUgKyAnLicpO1xuICB9LFxuXG5cbiAgLy8gIyMgUHVibGljIG1ldGhvZHNcblxuICAvLyAjIyMgYHRva2VuaXplYCBzdGFydHMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGFuIE4zIGRvY3VtZW50IGludG8gYW4gYXJyYXkgb2YgdG9rZW5zLlxuICAvLyBUaGUgaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgc3RyZWFtLlxuICB0b2tlbml6ZTogZnVuY3Rpb24gKGlucHV0LCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9saW5lID0gMTtcblxuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIHN0cmluZywgY29udGludW91c2x5IGVtaXQgdG9rZW5zIHRocm91Z2ggdGhlIGNhbGxiYWNrIHVudGlsIHRoZSBlbmQuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICBpbW1lZGlhdGVseShmdW5jdGlvbiAoKSB7IHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpOyB9KTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgd2lsbCBiZSBzdHJlYW1lZC5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2lucHV0ID0gJyc7XG5cbiAgICAgIC8vIElmIG5vIGlucHV0IHdhcyBnaXZlbiwgaXQgd2lsbCBiZSBzdHJlYW1lZCB0aHJvdWdoIGBhZGRDaHVua2AgYW5kIGVuZGVkIHdpdGggYGVuZGBcbiAgICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2h1bmsgPSBhZGRDaHVuaztcbiAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgICAgIGlmICghY2FsbGJhY2spXG4gICAgICAgICAgY2FsbGJhY2sgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGlucHV0IGl0c2VsZiBtdXN0IGJlIGEgc3RyZWFtXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5zZXRFbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICBpbnB1dC5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBpbnB1dC5vbignZGF0YScsIGFkZENodW5rKTtcbiAgICAgICAgaW5wdXQub24oJ2VuZCcsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkcyB0aGUgZGF0YSBjaHVuayB0byB0aGUgYnVmZmVyIGFuZCBwYXJzZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgZnVuY3Rpb24gYWRkQ2h1bmsoZGF0YSkge1xuICAgICAgaWYgKHNlbGYuX2lucHV0ICE9PSBudWxsKSB7XG4gICAgICAgIHNlbGYuX2lucHV0ICs9IGRhdGE7XG4gICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgdW50aWwgdGhlIGVuZFxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgIGlmIChzZWxmLl9pbnB1dCAhPT0gbnVsbClcbiAgICAgICAgc2VsZi5fdG9rZW5pemVUb0VuZChjYWxsYmFjaywgdHJ1ZSk7XG4gICAgfVxuICB9LFxufTtcblxuLy8gIyMgRXhwb3J0c1xuXG4vLyBFeHBvcnQgdGhlIGBOM0xleGVyYCBjbGFzcyBhcyBhIHdob2xlLlxubW9kdWxlLmV4cG9ydHMgPSBOM0xleGVyO1xuIiwiLy8gKipOM1BhcnNlcioqIHBhcnNlcyBOMyBkb2N1bWVudHMuXG52YXIgTjNMZXhlciA9IHJlcXVpcmUoJy4vTjNMZXhlcicpO1xuXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfTklMICAgID0gUkRGX1BSRUZJWCArICduaWwnLFxuICAgIFJERl9GSVJTVCAgPSBSREZfUFJFRklYICsgJ2ZpcnN0JyxcbiAgICBSREZfUkVTVCAgID0gUkRGX1BSRUZJWCArICdyZXN0JztcblxudmFyIGFic29sdXRlSVJJID0gL15bYS16XVthLXowLTkrLi1dKjovaSxcbiAgICBzY2hlbWVBdXRob3JpdHkgPSAvXig/OihbYS16XVthLXowLTkrLi1dKjopKT8oPzpcXC9cXC9bXlxcL10qKT8vaSxcbiAgICBkb3RTZWdtZW50cyA9IC8oPzpefFxcLylcXC5cXC4/KD86JHxbXFwvIz9dKS87XG5cbi8vIFRoZSBuZXh0IElEIGZvciBuZXcgYmxhbmsgbm9kZXNcbnZhciBibGFua05vZGVQcmVmaXggPSAwLCBibGFua05vZGVDb3VudCA9IDA7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1BhcnNlcihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOM1BhcnNlcikpXG4gICAgcmV0dXJuIG5ldyBOM1BhcnNlcihvcHRpb25zKTtcbiAgdGhpcy5fdHJpcGxlU3RhY2sgPSBbXTtcbiAgdGhpcy5fZ3JhcGggPSBudWxsO1xuXG4gIC8vIFNldCB0aGUgZG9jdW1lbnQgSVJJLlxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5fc2V0QmFzZShvcHRpb25zLmRvY3VtZW50SVJJKTtcblxuICAvLyBTZXQgc3VwcG9ydGVkIGZlYXR1cmVzIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LlxuICB2YXIgZm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3N0cmluZycpICYmIG9wdGlvbnMuZm9ybWF0Lm1hdGNoKC9cXHcqJC8pWzBdLnRvTG93ZXJDYXNlKCksXG4gICAgICBpc1R1cnRsZSA9IGZvcm1hdCA9PT0gJ3R1cnRsZScsIGlzVHJpRyA9IGZvcm1hdCA9PT0gJ3RyaWcnLFxuICAgICAgaXNOVHJpcGxlcyA9IC90cmlwbGUvLnRlc3QoZm9ybWF0KSwgaXNOUXVhZHMgPSAvcXVhZC8udGVzdChmb3JtYXQpLFxuICAgICAgaXNMaW5lTW9kZSA9IGlzTlRyaXBsZXMgfHwgaXNOUXVhZHM7XG4gIGlmICghKHRoaXMuX3N1cHBvcnRzTmFtZWRHcmFwaHMgPSAhaXNUdXJ0bGUpKVxuICAgIHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGggPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICB0aGlzLl9zdXBwb3J0c1F1YWRzID0gIShpc1R1cnRsZSB8fCBpc1RyaUcgfHwgaXNOVHJpcGxlcyk7XG4gIC8vIERpc2FibGUgcmVsYXRpdmUgSVJJcyBpbiBOLVRyaXBsZXMgb3IgTi1RdWFkcyBtb2RlXG4gIGlmIChpc0xpbmVNb2RlKSB7XG4gICAgdGhpcy5fYmFzZSA9ICcnO1xuICAgIHRoaXMuX3Jlc29sdmVJUkkgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIHRoaXMuX2Vycm9yKCdEaXNhbGxvd2VkIHJlbGF0aXZlIElSSScsIHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFjayA9IG5vb3AsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgdGhpcy5fYmxhbmtOb2RlUHJlZml4ID0gdHlwZW9mIG9wdGlvbnMuYmxhbmtOb2RlUHJlZml4ICE9PSAnc3RyaW5nJyA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXzonICsgb3B0aW9ucy5ibGFua05vZGVQcmVmaXgucmVwbGFjZSgvXl86LywgJycpO1xuICB0aGlzLl9sZXhlciA9IG9wdGlvbnMubGV4ZXIgfHwgbmV3IE4zTGV4ZXIoeyBsaW5lTW9kZTogaXNMaW5lTW9kZSB9KTtcbn1cblxuLy8gIyMgUHJpdmF0ZSBjbGFzcyBtZXRob2RzXG5cbi8vICMjIyBgX3Jlc2V0QmxhbmtOb2RlSWRzYCByZXN0YXJ0cyBibGFuayBub2RlIGlkZW50aWZpY2F0aW9uLlxuTjNQYXJzZXIuX3Jlc2V0QmxhbmtOb2RlSWRzID0gZnVuY3Rpb24gKCkge1xuICBibGFua05vZGVQcmVmaXggPSBibGFua05vZGVDb3VudCA9IDA7XG59O1xuXG5OM1BhcnNlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFByaXZhdGUgbWV0aG9kc1xuXG4gIC8vICMjIyBgX3NldEJhc2VgIHNldHMgdGhlIGJhc2UgSVJJIHRvIHJlc29sdmUgcmVsYXRpdmUgSVJJcy5cbiAgX3NldEJhc2U6IGZ1bmN0aW9uIChiYXNlSVJJKSB7XG4gICAgaWYgKCFiYXNlSVJJKVxuICAgICAgYmFzZUlSSSA9IG51bGw7XG4gICAgZWxzZSBpZiAoYmFzZUlSSS5pbmRleE9mKCcjJykgPj0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIElSSSAnICsgYmFzZUlSSSk7XG4gICAgLy8gU2V0IGJhc2UgSVJJIGFuZCBpdHMgY29tcG9uZW50c1xuICAgIGlmICh0aGlzLl9iYXNlID0gYmFzZUlSSSkge1xuICAgICAgdGhpcy5fYmFzZVBhdGggICA9IGJhc2VJUkkucmVwbGFjZSgvW15cXC8/XSooPzpcXD8uKik/JC8sICcnKTtcbiAgICAgIGJhc2VJUkkgPSBiYXNlSVJJLm1hdGNoKHNjaGVtZUF1dGhvcml0eSk7XG4gICAgICB0aGlzLl9iYXNlUm9vdCAgID0gYmFzZUlSSVswXTtcbiAgICAgIHRoaXMuX2Jhc2VTY2hlbWUgPSBiYXNlSVJJWzFdO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkSW5Ub3BDb250ZXh0YCByZWFkcyBhIHRva2VuIHdoZW4gaW4gdGhlIHRvcCBjb250ZXh0LlxuICBfcmVhZEluVG9wQ29udGV4dDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gSWYgYW4gRU9GIHRva2VuIGFycml2ZXMgaW4gdGhlIHRvcCBjb250ZXh0LCBzaWduYWwgdGhhdCB3ZSdyZSBkb25lLlxuICAgIGNhc2UgJ2VvZic6XG4gICAgICBpZiAodGhpcy5fZ3JhcGggIT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5jbG9zZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICBkZWxldGUgdGhpcy5fcHJlZml4ZXMuXztcbiAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFjayhudWxsLCBudWxsLCB0aGlzLl9wcmVmaXhlcyk7XG4gICAgLy8gSXQgY291bGQgYmUgYSBwcmVmaXggZGVjbGFyYXRpb24uXG4gICAgY2FzZSAnQHByZWZpeCc6XG4gICAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVmaXg7XG4gICAgY2FzZSAnUFJFRklYJzpcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4O1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAgICBjYXNlICdAYmFzZSc6XG4gICAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCYXNlSVJJO1xuICAgIGNhc2UgJ0JBU0UnOlxuICAgICAgdGhpcy5fc3BhcnFsU3R5bGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCYXNlSVJJO1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgZ3JhcGguXG4gICAgY2FzZSAneyc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocykge1xuICAgICAgICB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgICAgfVxuICAgIGNhc2UgJ0dSQVBIJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c05hbWVkR3JhcGhzKVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhMYWJlbDtcbiAgICAvLyBPdGhlcndpc2UsIHRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBzdWJqZWN0LlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3QodG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkU3ViamVjdGAgcmVhZHMgYSB0cmlwbGUncyBzdWJqZWN0LlxuICBfcmVhZFN1YmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICAgIGlmICh0aGlzLl9iYXNlID09PSBudWxsIHx8IGFic29sdXRlSVJJLnRlc3QodG9rZW4udmFsdWUpKVxuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIHZhciBwcmVmaXggPSB0aGlzLl9wcmVmaXhlc1t0b2tlbi5wcmVmaXhdO1xuICAgICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZGVmaW5lZCBwcmVmaXggXCInICsgdG9rZW4ucHJlZml4ICsgJzpcIicsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1snOlxuICAgICAgLy8gU3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBuZXcgYmxhbmsgbm9kZSBhcyBzdWJqZWN0LlxuICAgICAgdGhpcy5fc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IG51bGwsIG9iamVjdDogbnVsbCwgdHlwZTogJ2JsYW5rJyB9KTtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlSGVhZDtcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGxpc3RcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiBSREZfTklMLCBwcmVkaWNhdGU6IG51bGwsIG9iamVjdDogbnVsbCwgdHlwZTogJ2xpc3QnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZExpc3RJdGVtO1xuICAgIGNhc2UgJ30nOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgc3ViamVjdCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgfVxuICAgIC8vIFRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBwcmVkaWNhdGUsXG4gICAgLy8gb3IsIGlmIHRoZSBzdWJqZWN0IHdhcyBhY3R1YWxseSBhIGdyYXBoIElSSSwgYSBuYW1lZCBncmFwaC5cbiAgICByZXR1cm4gdGhpcy5fcmVhZFByZWRpY2F0ZU9yTmFtZWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHJlZGljYXRlYCByZWFkcyBhIHRyaXBsZSdzIHByZWRpY2F0ZS5cbiAgX3JlYWRQcmVkaWNhdGU6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciB0eXBlID0gdG9rZW4udHlwZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgIGNhc2UgJ2FiYnJldmlhdGlvbic6XG4gICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgaWYgKHRva2VuLnByZWZpeCA9PT0gJ18nKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0Rpc2FsbG93ZWQgYmxhbmsgbm9kZSBhcyBwcmVkaWNhdGUnLCB0b2tlbik7XG4gICAgICB2YXIgcHJlZml4ID0gdGhpcy5fcHJlZml4ZXNbdG9rZW4ucHJlZml4XTtcbiAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmRlZmluZWQgcHJlZml4IFwiJyArIHRva2VuLnByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJy4nOlxuICAgIGNhc2UgJ10nOlxuICAgIGNhc2UgJ30nOlxuICAgICAgLy8gRXhwZWN0ZWQgcHJlZGljYXRlIGRpZG4ndCBjb21lLCBtdXN0IGhhdmUgYmVlbiB0cmFpbGluZyBzZW1pY29sb24uXG4gICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHR5cGUsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICddJyA/IHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKSA6IHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnOyc6XG4gICAgICAvLyBFeHRyYSBzZW1pY29sb25zIGNhbiBiZSBzYWZlbHkgaWdub3JlZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHJlZGljYXRlIHRvIGZvbGxvdyBcIicgKyB0aGlzLl9zdWJqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBtdXN0IGJlIGFuIG9iamVjdC5cbiAgICByZXR1cm4gdGhpcy5fcmVhZE9iamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkT2JqZWN0YCByZWFkcyBhIHRyaXBsZSdzIG9iamVjdC5cbiAgX3JlYWRPYmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgIGNhc2UgJ0lSSSc6XG4gICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgdGhpcy5fb2JqZWN0ID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX29iamVjdCA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgdGhpcy5fb2JqZWN0ID0gcHJlZml4ICsgdG9rZW4udmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsaXRlcmFsJzpcbiAgICAgIHRoaXMuX29iamVjdCA9IHRva2VuLnZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWREYXRhVHlwZU9yTGFuZztcbiAgICBjYXNlICdbJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IHRyaXBsZSB3aXRoIGEgbmV3IGJsYW5rIG5vZGUgYXMgc3ViamVjdC5cbiAgICAgIHZhciBibGFuayA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSwgb2JqZWN0OiBibGFuaywgdHlwZTogJ2JsYW5rJyB9KTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBibGFuaztcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlSGVhZDtcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGxpc3RcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSwgb2JqZWN0OiBSREZfTklMLCB0eXBlOiAnbGlzdCcgfSk7XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkTGlzdEl0ZW07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgb2JqZWN0IHRvIGZvbGxvdyBcIicgKyB0aGlzLl9wcmVkaWNhdGUgKyAnXCInLCB0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoYCByZWFkcyBhIHRyaXBsZSdzIHByZWRpY2F0ZSwgb3IgYSBuYW1lZCBncmFwaC5cbiAgX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlbi50eXBlID09PSAneycgPyB0aGlzLl9yZWFkR3JhcGgodG9rZW4pIDogdGhpcy5fcmVhZFByZWRpY2F0ZSh0b2tlbik7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEdyYXBoYCByZWFkcyBhIGdyYXBoLlxuICBfcmVhZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3snKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBncmFwaCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgLy8gVGhlIFwic3ViamVjdFwiIHdlIHJlYWQgaXMgYWN0dWFsbHkgdGhlIEdSQVBIJ3MgbGFiZWxcbiAgICB0aGlzLl9ncmFwaCA9IHRoaXMuX3N1YmplY3QsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlSGVhZGAgcmVhZHMgdGhlIGhlYWQgb2YgYSBibGFuayBub2RlLlxuICBfcmVhZEJsYW5rTm9kZUhlYWQ6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnXScpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlVGFpbGAgcmVhZHMgdGhlIGVuZCBvZiBhIGJsYW5rIG5vZGUuXG4gIF9yZWFkQmxhbmtOb2RlVGFpbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICddJylcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlUHVuY3R1YXRpb24odG9rZW4pO1xuXG4gICAgLy8gU3RvcmUgYmxhbmsgbm9kZSB0cmlwbGUuXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgdGhpcy5fc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBwYXJlbnQgdHJpcGxlIHRoYXQgY29udGFpbnMgdGhlIGJsYW5rIG5vZGUuXG4gICAgdmFyIHRyaXBsZSA9IHRoaXMuX3RyaXBsZVN0YWNrLnBvcCgpO1xuICAgIHRoaXMuX3N1YmplY3QgPSB0cmlwbGUuc3ViamVjdDtcbiAgICAvLyBXYXMgdGhlIGJsYW5rIG5vZGUgdGhlIG9iamVjdD9cbiAgICBpZiAodHJpcGxlLm9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgLy8gUmVzdG9yZSBwcmVkaWNhdGUgYW5kIG9iamVjdCBhcyB3ZWxsLCBhbmQgY29udGludWUgYnkgcmVhZGluZyBwdW5jdHVhdGlvbi5cbiAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHRyaXBsZS5wcmVkaWNhdGU7XG4gICAgICB0aGlzLl9vYmplY3QgPSB0cmlwbGUub2JqZWN0O1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFRyaXBsZUVuZFJlYWRlcigpO1xuICAgIH1cbiAgICAvLyBUaGUgYmxhbmsgbm9kZSB3YXMgdGhlIHN1YmplY3QsIHNvIGNvbnRpbnVlIHJlYWRpbmcgdGhlIHByZWRpY2F0ZS5cbiAgICAvLyBJZiB0aGUgYmxhbmsgbm9kZSBkaWRuJ3QgY29udGFpbiBhbnkgcHJlZGljYXRlcywgaXQgY291bGQgYWxzbyBiZSB0aGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaC5cbiAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlICE9PSBudWxsID8gdGhpcy5fcmVhZFByZWRpY2F0ZSA6IHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGg7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZERhdGFUeXBlT3JMYW5nYCByZWFkcyBhbiBfb3B0aW9uYWxfIGRhdGEgdHlwZSBvciBsYW5ndWFnZS5cbiAgX3JlYWREYXRhVHlwZU9yTGFuZzogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAodG9rZW4ucHJlZml4ID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5fcHJlZml4ZXNbdG9rZW4ucHJlZml4XTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgICB2YWx1ZSA9IHByZWZpeCArIHRva2VuLnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fb2JqZWN0ICs9ICdeXicgKyB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICBjYXNlICdsYW5nY29kZSc6XG4gICAgICB0aGlzLl9vYmplY3QgKz0gJ0AnICsgdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2dldFRyaXBsZUVuZFJlYWRlcigpLmNhbGwodGhpcywgdG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTGlzdEl0ZW1gIHJlYWRzIGl0ZW1zIGZyb20gYSBsaXN0LlxuICBfcmVhZExpc3RJdGVtOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgaXRlbSA9IG51bGwsICAgICAgICAgICAgICAgICAgLy8gVGhlIGFjdHVhbCBsaXN0IGl0ZW0uXG4gICAgICAgIGl0ZW1IZWFkID0gbnVsbCwgICAgICAgICAgICAgIC8vIFRoZSBoZWFkIG9mIHRoZSByZGY6Zmlyc3QgcHJlZGljYXRlLlxuICAgICAgICBwcmV2SXRlbUhlYWQgPSB0aGlzLl9zdWJqZWN0LCAvLyBUaGUgaGVhZCBvZiB0aGUgcHJldmlvdXMgcmRmOmZpcnN0IHByZWRpY2F0ZS5cbiAgICAgICAgc3RhY2sgPSB0aGlzLl90cmlwbGVTdGFjaywgICAgLy8gVGhlIHN0YWNrIG9mIHRyaXBsZXMgcGFydCBvZiByZWN1cnNpb24gKGxpc3RzLCBibGFua3MsIGV0Yy4pLlxuICAgICAgICBwYXJlbnRUcmlwbGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSwgLy8gVGhlIHRyaXBsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QuXG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkTGlzdEl0ZW07ICAgIC8vIFRoZSBuZXh0IGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgICAgaWYgKHRoaXMuX2Jhc2UgPT09IG51bGwgfHwgYWJzb2x1dGVJUkkudGVzdCh0b2tlbi52YWx1ZSkpXG4gICAgICAgIGl0ZW0gPSB0b2tlbi52YWx1ZTtcbiAgICAgIGVsc2VcbiAgICAgICAgaXRlbSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgaXRlbSA9IHByZWZpeCArIHRva2VuLnZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGl0ZXJhbCc6XG4gICAgICBpdGVtID0gdG9rZW4udmFsdWU7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZERhdGFUeXBlT3JMYW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFjayB0aGUgY3VycmVudCBsaXN0IHRyaXBsZSBhbmQgc3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBibGFuayBub2RlIGFzIHN1YmplY3QuXG4gICAgICBpdGVtSGVhZCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIGl0ZW0gICAgID0gJ186YicgKyBibGFua05vZGVDb3VudCsrO1xuICAgICAgc3RhY2sucHVzaCh7IHN1YmplY3Q6IGl0ZW1IZWFkLCBwcmVkaWNhdGU6IFJERl9GSVJTVCwgb2JqZWN0OiBpdGVtLCB0eXBlOiAnYmxhbmsnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IGl0ZW07XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YWNrIHRoZSBjdXJyZW50IGxpc3QgdHJpcGxlIGFuZCBzdGFydCBhIG5ldyBsaXN0XG4gICAgICBpdGVtSGVhZCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHN0YWNrLnB1c2goeyBzdWJqZWN0OiBpdGVtSGVhZCwgcHJlZGljYXRlOiBSREZfRklSU1QsIG9iamVjdDogUkRGX05JTCwgdHlwZTogJ2xpc3QnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZExpc3RJdGVtO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnKSc6XG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJlbnQgdHJpcGxlLlxuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAvLyBJZiB0aGlzIGxpc3QgaXMgY29udGFpbmVkIHdpdGhpbiBhIHBhcmVudCBsaXN0LCByZXR1cm4gdGhlIG1lbWJlcnNoaXAgdHJpcGxlIGhlcmUuXG4gICAgICAvLyBUaGlzIHdpbGwgYmUgYDxwYXJlbnQgbGlzdCBlbGVtZW50PiByZGY6Zmlyc3QgPHRoaXMgbGlzdD4uYC5cbiAgICAgIGlmIChzdGFjay5sZW5ndGggIT09IDAgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2xpc3QnKVxuICAgICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgcGFyZW50VHJpcGxlLnN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiBwYXJlbnRUcmlwbGUucHJlZGljYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgcGFyZW50VHJpcGxlLm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuICAgICAgLy8gUmVzdG9yZSB0aGUgcGFyZW50IHRyaXBsZSdzIHN1YmplY3QuXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gcGFyZW50VHJpcGxlLnN1YmplY3Q7XG4gICAgICAvLyBXYXMgdGhpcyBsaXN0IGluIHRoZSBwYXJlbnQgdHJpcGxlJ3Mgc3ViamVjdD9cbiAgICAgIGlmIChwYXJlbnRUcmlwbGUucHJlZGljYXRlID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIHRoZSBwcmVkaWNhdGUuXG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgICAvLyBTa2lwIHdyaXRpbmcgdGhlIGxpc3QgdGFpbCBpZiB0aGlzIHdhcyBhbiBlbXB0eSBsaXN0LlxuICAgICAgICBpZiAocGFyZW50VHJpcGxlLnN1YmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBUaGUgbGlzdCB3YXMgaW4gdGhlIHBhcmVudCB0cmlwbGUncyBvYmplY3QuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcGFyZW50IHRyaXBsZSdzIHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFzIHdlbGwuXG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHBhcmVudFRyaXBsZS5wcmVkaWNhdGU7XG4gICAgICAgIHRoaXMuX29iamVjdCA9IHBhcmVudFRyaXBsZS5vYmplY3Q7XG4gICAgICAgIG5leHQgPSB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICAgICAgLy8gU2tpcCB3cml0aW5nIHRoZSBsaXN0IHRhaWwgaWYgdGhpcyB3YXMgYW4gZW1wdHkgbGlzdC5cbiAgICAgICAgaWYgKHBhcmVudFRyaXBsZS5vYmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBDbG9zZSB0aGUgbGlzdCBieSBtYWtpbmcgdGhlIGl0ZW0gaGVhZCBuaWwuXG4gICAgICBpdGVtSGVhZCA9IFJERl9OSUw7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBsaXN0IGl0ZW0gaW5zdGVhZCBvZiBcIicgKyB0b2tlbi50eXBlICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cblxuICAgICAvLyBDcmVhdGUgYSBuZXcgYmxhbmsgbm9kZSBpZiBubyBpdGVtIGhlYWQgd2FzIGFzc2lnbmVkIHlldC5cbiAgICBpZiAoaXRlbUhlYWQgPT09IG51bGwpXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gaXRlbUhlYWQgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG5cbiAgICAvLyBJcyB0aGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0P1xuICAgIGlmIChwcmV2SXRlbUhlYWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbGlzdCBpcyBlaXRoZXIgdGhlIG9iamVjdCBvciB0aGUgc3ViamVjdC5cbiAgICAgIGlmIChwYXJlbnRUcmlwbGUub2JqZWN0ID09PSBSREZfTklMKVxuICAgICAgICBwYXJlbnRUcmlwbGUub2JqZWN0ID0gaXRlbUhlYWQ7XG4gICAgICBlbHNlXG4gICAgICAgIHBhcmVudFRyaXBsZS5zdWJqZWN0ID0gaXRlbUhlYWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGxpc3QgaXMgaW4gdGhlIGN1cnJlbnQgaGVhZC5cbiAgICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHsgc3ViamVjdDogICBwcmV2SXRlbUhlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogUkRGX1JFU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgaXRlbUhlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoOiAgICAgdGhpcy5fZ3JhcGggfHwgJycgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgaXRlbSdzIHZhbHVlLlxuICAgIGlmIChpdGVtICE9PSBudWxsKVxuICAgICAgdGhpcy5fY2FsbGJhY2sobnVsbCwgeyBzdWJqZWN0OiAgIGl0ZW1IZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IFJERl9GSVJTVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQdW5jdHVhdGlvbmAgcmVhZHMgcHVuY3R1YXRpb24gYmV0d2VlbiB0cmlwbGVzIG9yIHRyaXBsZSBwYXJ0cy5cbiAgX3JlYWRQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQsIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCBncmFwaCA9IHRoaXMuX2dyYXBoO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgIC8vIEEgY2xvc2luZyBicmFjZSBlbmRzIGEgZ3JhcGhcbiAgICBjYXNlICd9JzpcbiAgICAgIGlmICh0aGlzLl9ncmFwaCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmV4cGVjdGVkIGdyYXBoIGNsb3NpbmcnLCB0b2tlbik7XG4gICAgICB0aGlzLl9ncmFwaCA9IG51bGw7XG4gICAgLy8gQSBkb3QganVzdCBlbmRzIHRoZSBzdGF0ZW1lbnQsIHdpdGhvdXQgc2hhcmluZyBhbnl0aGluZyB3aXRoIHRoZSBuZXh0LlxuICAgIGNhc2UgJy4nOlxuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEluVG9wQ29udGV4dDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFNlbWljb2xvbiBtZWFucyB0aGUgc3ViamVjdCBpcyBzaGFyZWQ7IHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFyZSBkaWZmZXJlbnQuXG4gICAgY2FzZSAnOyc6XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZFByZWRpY2F0ZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENvbW1hIG1lYW5zIGJvdGggdGhlIHN1YmplY3QgYW5kIHByZWRpY2F0ZSBhcmUgc2hhcmVkOyB0aGUgb2JqZWN0IGlzIGRpZmZlcmVudC5cbiAgICBjYXNlICcsJzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkT2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgLy8gQW4gSVJJIG1lYW5zIHRoaXMgaXMgYSBxdWFkIChvbmx5IGFsbG93ZWQgaWYgbm90IGFscmVhZHkgaW5zaWRlIGEgZ3JhcGgpLlxuICAgIGNhc2UgJ0lSSSc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNRdWFkcyAmJiB0aGlzLl9ncmFwaCA9PT0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgICBncmFwaCA9IHRva2VuLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgZ3JhcGggPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgICAgc3ViamVjdCA9IHRoaXMuX3N1YmplY3Q7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBBbiBwcmVmaXhlZCBuYW1lIG1lYW5zIHRoaXMgaXMgYSBxdWFkIChvbmx5IGFsbG93ZWQgaWYgbm90IGFscmVhZHkgaW5zaWRlIGEgZ3JhcGgpLlxuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c1F1YWRzICYmIHRoaXMuX2dyYXBoID09PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmVmaXggPSB0aGlzLl9wcmVmaXhlc1t0b2tlbi5wcmVmaXhdO1xuICAgICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmRlZmluZWQgcHJlZml4IFwiJyArIHRva2VuLnByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgICAgIGdyYXBoID0gcHJlZml4ICsgdG9rZW4udmFsdWU7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwdW5jdHVhdGlvbiB0byBmb2xsb3cgXCInICsgdGhpcy5fb2JqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBBIHRyaXBsZSBoYXMgYmVlbiBjb21wbGV0ZWQgbm93LCBzbyByZXR1cm4gaXQuXG4gICAgaWYgKHN1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIGdyYXBoIHx8ICcnIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gICAgLy8gIyMjIGBfcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBpbiBhIGJsYW5rIG5vZGVcbiAgX3JlYWRCbGFua05vZGVQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQ7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gU2VtaWNvbG9uIG1lYW5zIHRoZSBzdWJqZWN0IGlzIHNoYXJlZDsgcHJlZGljYXRlIGFuZCBvYmplY3QgYXJlIGRpZmZlcmVudC5cbiAgICBjYXNlICc7JzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ29tbWEgbWVhbnMgYm90aCB0aGUgc3ViamVjdCBhbmQgcHJlZGljYXRlIGFyZSBzaGFyZWQ7IHRoZSBvYmplY3QgaXMgZGlmZmVyZW50LlxuICAgIGNhc2UgJywnOlxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRPYmplY3Q7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwdW5jdHVhdGlvbiB0byBmb2xsb3cgXCInICsgdGhpcy5fb2JqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBBIHRyaXBsZSBoYXMgYmVlbiBjb21wbGV0ZWQgbm93LCBzbyByZXR1cm4gaXQuXG4gICAgdGhpcy5fY2FsbGJhY2sobnVsbCwgeyBzdWJqZWN0OiAgIHRoaXMuX3N1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGg6ICAgICB0aGlzLl9ncmFwaCB8fCAnJyB9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUXVhZFB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBhZnRlciBhIHF1YWQuXG4gIF9yZWFkUXVhZFB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJy4nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBkb3QgdG8gZm9sbG93IHF1YWQnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeGAgcmVhZHMgdGhlIHByZWZpeCBvZiBhIHByZWZpeCBkZWNsYXJhdGlvbi5cbiAgX3JlYWRQcmVmaXg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlICE9PSAncHJlZml4JylcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHJlZml4IHRvIGZvbGxvdyBAcHJlZml4JywgdG9rZW4pO1xuICAgIHRoaXMuX3ByZWZpeCA9IHRva2VuLnZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4SVJJO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVmaXhJUklgIHJlYWRzIHRoZSBJUkkgb2YgYSBwcmVmaXggZGVjbGFyYXRpb24uXG4gIF9yZWFkUHJlZml4SVJJOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ0lSSScpXG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0V4cGVjdGVkIElSSSB0byBmb2xsb3cgcHJlZml4IFwiJyArIHRoaXMuX3ByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgdmFyIHByZWZpeElSSTtcbiAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgIHByZWZpeElSSSA9IHRva2VuLnZhbHVlO1xuICAgIGVsc2VcbiAgICAgIHByZWZpeElSSSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgIHRoaXMuX3ByZWZpeGVzW3RoaXMuX3ByZWZpeF0gPSBwcmVmaXhJUkk7XG4gICAgdGhpcy5fcHJlZml4Q2FsbGJhY2sodGhpcy5fcHJlZml4LCBwcmVmaXhJUkkpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmFzZUlSSWAgcmVhZHMgdGhlIElSSSBvZiBhIGJhc2UgZGVjbGFyYXRpb24uXG4gIF9yZWFkQmFzZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IGJhc2UgZGVjbGFyYXRpb24nLCB0b2tlbik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3NldEJhc2UodGhpcy5fYmFzZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSA/IHRva2VuLnZhbHVlIDogdGhpcy5fcmVzb2x2ZUlSSSh0b2tlbikpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgdGhpcy5fZXJyb3IoZXJyb3IubWVzc2FnZSwgdG9rZW4pOyB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWREZWNsYXJhdGlvblB1bmN0dWF0aW9uO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWROYW1lZEdyYXBoTGFiZWxgIHJlYWRzIHRoZSBsYWJlbCBvZiBhIG5hbWVkIGdyYXBoLlxuICBfcmVhZE5hbWVkR3JhcGhMYWJlbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICdwcmVmaXhlZCc6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3QodG9rZW4pLCB0aGlzLl9yZWFkR3JhcGg7XG4gICAgY2FzZSAnWyc6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0ludmFsaWQgZ3JhcGggbGFiZWwnLCB0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWROYW1lZEdyYXBoTGFiZWxgIHJlYWRzIGEgYmxhbmsgbm9kZSBsYWJlbCBvZiBhIG5hbWVkIGdyYXBoLlxuICBfcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ10nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbmAgcmVhZHMgdGhlIHB1bmN0dWF0aW9uIG9mIGEgZGVjbGFyYXRpb24uXG4gIF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgLy8gU1BBUlFMLXN0eWxlIGRlY2xhcmF0aW9ucyBkb24ndCBoYXZlIHB1bmN0dWF0aW9uLlxuICAgIGlmICh0aGlzLl9zcGFycWxTdHlsZSlcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0KHRva2VuKTtcblxuICAgIGlmICh0b2tlbi50eXBlICE9PSAnLicpXG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0V4cGVjdGVkIGRlY2xhcmF0aW9uIHRvIGVuZCB3aXRoIGEgZG90JywgdG9rZW4pO1xuICAgIHJldHVybiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICB9LFxuXG4gIC8vICMjIyBgX2dldFRyaXBsZUVuZFJlYWRlcmAgZ2V0cyB0aGUgbmV4dCByZWFkZXIgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiBhIHRyaXBsZS5cbiAgX2dldFRyaXBsZUVuZFJlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9IHRoaXMuX3RyaXBsZVN0YWNrO1xuICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFB1bmN0dWF0aW9uO1xuXG4gICAgc3dpdGNoIChzdGFja1tzdGFjay5sZW5ndGggLSAxXS50eXBlKSB7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsO1xuICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfZXJyb3JgIGVtaXRzIGFuIGVycm9yIG1lc3NhZ2UgdGhyb3VnaCB0aGUgY2FsbGJhY2suXG4gIF9lcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sobmV3IEVycm9yKG1lc3NhZ2UgKyAnIGF0IGxpbmUgJyArIHRva2VuLmxpbmUgKyAnLicpKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZXNvbHZlSVJJYCByZXNvbHZlcyBhIHJlbGF0aXZlIElSSSB0b2tlbiBhZ2FpbnN0IHRoZSBiYXNlIHBhdGgsXG4gIC8vIGFzc3VtaW5nIHRoYXQgYSBiYXNlIHBhdGggaGFzIGJlZW4gc2V0IGFuZCB0aGF0IHRoZSBJUkkgaXMgaW5kZWVkIHJlbGF0aXZlLlxuICBfcmVzb2x2ZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGlyaSA9IHRva2VuLnZhbHVlO1xuICAgIHN3aXRjaCAoaXJpWzBdKSB7XG4gICAgLy8gQW4gZW1wdHkgcmVsYXRpdmUgSVJJIGluZGljYXRlcyB0aGUgYmFzZSBJUklcbiAgICBjYXNlIHVuZGVmaW5lZDogcmV0dXJuIHRoaXMuX2Jhc2U7XG4gICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBmcmFnbWVudCBJUklzIGFnYWluc3QgdGhlIGJhc2UgSVJJXG4gICAgY2FzZSAnIyc6IHJldHVybiB0aGlzLl9iYXNlICsgaXJpO1xuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcXVlcnkgc3RyaW5nIElSSXMgYnkgcmVwbGFjaW5nIHRoZSBxdWVyeSBzdHJpbmdcbiAgICBjYXNlICc/JzogcmV0dXJuIHRoaXMuX2Jhc2UucmVwbGFjZSgvKD86XFw/LiopPyQvLCBpcmkpO1xuICAgIC8vIFJlc29sdmUgcm9vdC1yZWxhdGl2ZSBJUklzIGF0IHRoZSByb290IG9mIHRoZSBiYXNlIElSSVxuICAgIGNhc2UgJy8nOlxuICAgICAgLy8gUmVzb2x2ZSBzY2hlbWUtcmVsYXRpdmUgSVJJcyB0byB0aGUgc2NoZW1lXG4gICAgICByZXR1cm4gKGlyaVsxXSA9PT0gJy8nID8gdGhpcy5fYmFzZVNjaGVtZSA6IHRoaXMuX2Jhc2VSb290KSArIHRoaXMuX3JlbW92ZURvdFNlZ21lbnRzKGlyaSk7XG4gICAgLy8gUmVzb2x2ZSBhbGwgb3RoZXIgSVJJcyBhdCB0aGUgYmFzZSBJUkkncyBwYXRoXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9yZW1vdmVEb3RTZWdtZW50cyh0aGlzLl9iYXNlUGF0aCArIGlyaSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlbW92ZURvdFNlZ21lbnRzYCByZXNvbHZlcyAnLi8nIGFuZCAnLi4vJyBwYXRoIHNlZ21lbnRzIGluIGFuIElSSSBhcyBwZXIgUkZDMzk4Ni5cbiAgX3JlbW92ZURvdFNlZ21lbnRzOiBmdW5jdGlvbiAoaXJpKSB7XG4gICAgLy8gRG9uJ3QgbW9kaWZ5IHRoZSBJUkkgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgZG90IHNlZ21lbnRzXG4gICAgaWYgKCFkb3RTZWdtZW50cy50ZXN0KGlyaSkpXG4gICAgICByZXR1cm4gaXJpO1xuXG4gICAgLy8gU3RhcnQgd2l0aCBhbiBpbWFnaW5hcnkgc2xhc2ggYmVmb3JlIHRoZSBJUkkgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0cmFpbGluZyAnLi8nIGFuZCAnLi4vJ1xuICAgIHZhciByZXN1bHQgPSAnJywgbGVuZ3RoID0gaXJpLmxlbmd0aCwgaSA9IC0xLCBwYXRoU3RhcnQgPSAtMSwgc2VnbWVudFN0YXJ0ID0gMCwgbmV4dCA9ICcvJztcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKG5leHQpIHtcbiAgICAgIC8vIFRoZSBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBzbGFzaCBhZnRlciB0aGUgYXV0aG9yaXR5XG4gICAgICBjYXNlICc6JzpcbiAgICAgICAgaWYgKHBhdGhTdGFydCA8IDApIHtcbiAgICAgICAgICAvLyBTa2lwIHR3byBzbGFzaGVzIGJlZm9yZSB0aGUgYXV0aG9yaXR5XG4gICAgICAgICAgaWYgKGlyaVsrK2ldID09PSAnLycgJiYgaXJpWysraV0gPT09ICcvJylcbiAgICAgICAgICAgIC8vIFNraXAgdG8gc2xhc2ggYWZ0ZXIgdGhlIGF1dGhvcml0eVxuICAgICAgICAgICAgd2hpbGUgKChwYXRoU3RhcnQgPSBpICsgMSkgPCBsZW5ndGggJiYgaXJpW3BhdGhTdGFydF0gIT09ICcvJylcbiAgICAgICAgICAgICAgaSA9IHBhdGhTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvbid0IG1vZGlmeSBhIHF1ZXJ5IHN0cmluZyBvciBmcmFnbWVudFxuICAgICAgY2FzZSAnPyc6XG4gICAgICBjYXNlICcjJzpcbiAgICAgICAgaSA9IGxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBIYW5kbGUgJy8uJyBvciAnLy4uJyBwYXRoIHNlZ21lbnRzXG4gICAgICBjYXNlICcvJzpcbiAgICAgICAgaWYgKGlyaVtpICsgMV0gPT09ICcuJykge1xuICAgICAgICAgIG5leHQgPSBpcmlbKytpICsgMV07XG4gICAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgJy8uJyBzZWdtZW50XG4gICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICByZXN1bHQgKz0gaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkgLSAxKTtcbiAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgdHJhaWxpbmcgJy8uJyBzZWdtZW50XG4gICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkpICsgaXJpLnN1YnN0cihpICsgMSk7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgJy8uLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgICAgbmV4dCA9IGlyaVsrK2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQgfHwgbmV4dCA9PT0gJy8nIHx8IG5leHQgPT09ICc/JyB8fCBuZXh0ID09PSAnIycpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ICs9IGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpIC0gMik7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byByZW1vdmUgdGhlIHBhcmVudCBwYXRoIGZyb20gcmVzdWx0XG4gICAgICAgICAgICAgIGlmICgoc2VnbWVudFN0YXJ0ID0gcmVzdWx0Lmxhc3RJbmRleE9mKCcvJykpID49IHBhdGhTdGFydClcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHNlZ21lbnRTdGFydCk7XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBhIHRyYWlsaW5nICcvLi4nIHNlZ21lbnRcbiAgICAgICAgICAgICAgaWYgKG5leHQgIT09ICcvJylcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJy8nICsgaXJpLnN1YnN0cihpICsgMSk7XG4gICAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dCA9IGlyaVsrK2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQpO1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBwYXJzZWAgcGFyc2VzIHRoZSBOMyBpbnB1dCBhbmQgZW1pdHMgZWFjaCBwYXJzZWQgdHJpcGxlIHRocm91Z2ggdGhlIGNhbGxiYWNrLlxuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCB0cmlwbGVDYWxsYmFjaywgcHJlZml4Q2FsbGJhY2spIHtcbiAgICAvLyBUaGUgcmVhZCBjYWxsYmFjayBpcyB0aGUgbmV4dCBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIGEgdG9rZW4gYXJyaXZlcy5cbiAgICAvLyBXZSBzdGFydCByZWFkaW5nIGluIHRoZSB0b3AgY29udGV4dC5cbiAgICB0aGlzLl9yZWFkQ2FsbGJhY2sgPSB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICAgIHRoaXMuX3ByZWZpeGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9wcmVmaXhlcy5fID0gdGhpcy5fYmxhbmtOb2RlUHJlZml4IHx8ICdfOmInICsgYmxhbmtOb2RlUHJlZml4KysgKyAnXyc7XG5cbiAgICAvLyBJZiB0aGUgaW5wdXQgYXJndW1lbnQgaXMgbm90IGdpdmVuLCBzaGlmdCBwYXJhbWV0ZXJzXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHByZWZpeENhbGxiYWNrID0gdHJpcGxlQ2FsbGJhY2ssIHRyaXBsZUNhbGxiYWNrID0gaW5wdXQsIGlucHV0ID0gbnVsbDtcblxuICAgIC8vIFNldCB0aGUgdHJpcGxlIGFuZCBwcmVmaXggY2FsbGJhY2tzLlxuICAgIHRoaXMuX2NhbGxiYWNrID0gdHJpcGxlQ2FsbGJhY2sgfHwgbm9vcDtcbiAgICB0aGlzLl9wcmVmaXhDYWxsYmFjayA9IHByZWZpeENhbGxiYWNrIHx8IG5vb3A7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSByZWFkIGNhbGxiYWNrIHdoZW4gYSB0b2tlbiBhcnJpdmVzLlxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9sZXhlci50b2tlbml6ZShpbnB1dCwgZnVuY3Rpb24gKGVycm9yLCB0b2tlbikge1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxuICAgICAgICBzZWxmLl9jYWxsYmFjayhlcnJvciksIHNlbGYuX2NhbGxiYWNrID0gbm9vcDtcbiAgICAgIGVsc2UgaWYgKHNlbGYuX3JlYWRDYWxsYmFjayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBzZWxmLl9yZWFkQ2FsbGJhY2sgPSBzZWxmLl9yZWFkQ2FsbGJhY2sodG9rZW4pO1xuICAgIH0pO1xuXG4gICAgLy8gSWYgbm8gaW5wdXQgd2FzIGdpdmVuLCBpdCBjYW4gYmUgYWRkZWQgd2l0aCBgYWRkQ2h1bmtgIGFuZCBlbmRlZCB3aXRoIGBlbmRgXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgdGhpcy5hZGRDaHVuayA9IHRoaXMuX2xleGVyLmFkZENodW5rO1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLl9sZXhlci5lbmQ7XG4gICAgfVxuICB9LFxufTtcblxuLy8gVGhlIGVtcHR5IGZ1bmN0aW9uXG5mdW5jdGlvbiBub29wKCkge31cblxuLy8gIyMgRXhwb3J0c1xuXG4vLyBFeHBvcnQgdGhlIGBOM1BhcnNlcmAgY2xhc3MgYXMgYSB3aG9sZS5cbm1vZHVsZS5leHBvcnRzID0gTjNQYXJzZXI7XG4iLCIvLyAqKk4zU3RvcmUqKiBvYmplY3RzIHN0b3JlIE4zIHRyaXBsZXMgYnkgZ3JhcGggaW4gbWVtb3J5LlxuXG52YXIgZXhwYW5kUHJlZml4ZWROYW1lID0gcmVxdWlyZSgnLi9OM1V0aWwnKS5leHBhbmRQcmVmaXhlZE5hbWU7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0b3JlKHRyaXBsZXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RvcmUpKVxuICAgIHJldHVybiBuZXcgTjNTdG9yZSh0cmlwbGVzLCBvcHRpb25zKTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHRyaXBsZXMgaXMgaW5pdGlhbGx5IHplcm8uXG4gIHRoaXMuX3NpemUgPSAwO1xuICAvLyBgX2dyYXBoc2AgY29udGFpbnMgc3ViamVjdCwgcHJlZGljYXRlLCBhbmQgb2JqZWN0IGluZGV4ZXMgcGVyIGdyYXBoLlxuICB0aGlzLl9ncmFwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBgX2VudGl0aWVzYCBtYXBzIGVudGl0aWVzIHN1Y2ggYXMgYGh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvbmFtZWAgdG8gbnVtYmVycy5cbiAgLy8gVGhpcyBzYXZlcyBtZW1vcnksIHNpbmNlIG9ubHkgdGhlIG51bWJlcnMgaGF2ZSB0byBiZSBzdG9yZWQgaW4gYF9ncmFwaHNgLlxuICB0aGlzLl9lbnRpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2VudGl0aWVzWyc+PCddID0gMDsgLy8gRHVtbXkgZW50cnksIHNvIHRoZSBmaXJzdCBhY3R1YWwga2V5IGlzIG5vbi16ZXJvXG4gIHRoaXMuX2VudGl0eUNvdW50ID0gMDtcbiAgLy8gYF9ibGFua05vZGVJbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNyZWF0ZWQgYmxhbmsgbm9kZSB0aGF0IHdhcyBhdXRvbWF0aWNhbGx5IG5hbWVkXG4gIHRoaXMuX2JsYW5rTm9kZUluZGV4ID0gMDtcblxuICAvLyBTaGlmdCBwYXJhbWV0ZXJzIGlmIGB0cmlwbGVzYCBpcyBub3QgZ2l2ZW5cbiAgaWYgKCFvcHRpb25zICYmIHRyaXBsZXMgJiYgIXRyaXBsZXNbMF0pXG4gICAgb3B0aW9ucyA9IHRyaXBsZXMsIHRyaXBsZXMgPSBudWxsO1xuXG4gIC8vIEFkZCB0cmlwbGVzIGFuZCBwcmVmaXhlcyBpZiBwYXNzZWRcbiAgdGhpcy5fcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByZWZpeGVzKVxuICAgIHRoaXMuYWRkUHJlZml4ZXMob3B0aW9ucy5wcmVmaXhlcyk7XG4gIGlmICh0cmlwbGVzKVxuICAgIHRoaXMuYWRkVHJpcGxlcyh0cmlwbGVzKTtcbn1cblxuTjNTdG9yZS5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFB1YmxpYyBwcm9wZXJ0aWVzXG5cbiAgLy8gIyMjIGBzaXplYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBpbiB0aGUgc3RvcmUuXG4gIGdldCBzaXplKCkge1xuICAgIC8vIFJldHVybiB0aGUgdHJpcGxlIGNvdW50IGlmIGlmIHdhcyBjYWNoZWQuXG4gICAgdmFyIHNpemUgPSB0aGlzLl9zaXplO1xuICAgIGlmIChzaXplICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHNpemU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0cmlwbGVzIGJ5IGNvdW50aW5nIHRvIHRoZSBkZWVwZXN0IGxldmVsLlxuICAgIHZhciBncmFwaHMgPSB0aGlzLl9ncmFwaHMsIHN1YmplY3RzLCBzdWJqZWN0O1xuICAgIGZvciAodmFyIGdyYXBoS2V5IGluIGdyYXBocylcbiAgICAgIGZvciAodmFyIHN1YmplY3RLZXkgaW4gKHN1YmplY3RzID0gZ3JhcGhzW2dyYXBoS2V5XS5zdWJqZWN0cykpXG4gICAgICAgIGZvciAodmFyIHByZWRpY2F0ZUtleSBpbiAoc3ViamVjdCA9IHN1YmplY3RzW3N1YmplY3RLZXldKSlcbiAgICAgICAgICBzaXplICs9IE9iamVjdC5rZXlzKHN1YmplY3RbcHJlZGljYXRlS2V5XSkubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9zaXplID0gc2l6ZTtcbiAgfSxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF9hZGRUb0luZGV4YCBhZGRzIGEgdHJpcGxlIHRvIGEgdGhyZWUtbGF5ZXJlZCBpbmRleC5cbiAgX2FkZFRvSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICAvLyBDcmVhdGUgbGF5ZXJzIGFzIG5lY2Vzc2FyeS5cbiAgICB2YXIgaW5kZXgxID0gaW5kZXgwW2tleTBdIHx8IChpbmRleDBba2V5MF0gPSB7fSk7XG4gICAgdmFyIGluZGV4MiA9IGluZGV4MVtrZXkxXSB8fCAoaW5kZXgxW2tleTFdID0ge30pO1xuICAgIC8vIFNldHRpbmcgdGhlIGtleSB0byBfYW55XyB2YWx1ZSBzaWduYWxpemVzIHRoZSBwcmVzZW5jZSBvZiB0aGUgdHJpcGxlLlxuICAgIGluZGV4MltrZXkyXSA9IG51bGw7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRnJvbUluZGV4YCByZW1vdmVzIGEgdHJpcGxlIGZyb20gYSB0aHJlZS1sYXllcmVkIGluZGV4LlxuICBfcmVtb3ZlRnJvbUluZGV4OiBmdW5jdGlvbiAoaW5kZXgwLCBrZXkwLCBrZXkxLCBrZXkyKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSB0cmlwbGUgZnJvbSB0aGUgaW5kZXguXG4gICAgdmFyIGluZGV4MSA9IGluZGV4MFtrZXkwXSwgaW5kZXgyID0gaW5kZXgxW2tleTFdLCBrZXk7XG4gICAgZGVsZXRlIGluZGV4MltrZXkyXTtcblxuICAgIC8vIFJlbW92ZSBpbnRlcm1lZGlhcnkgaW5kZXggbGF5ZXJzIGlmIHRoZXkgYXJlIGVtcHR5LlxuICAgIGZvciAoa2V5IGluIGluZGV4MikgcmV0dXJuO1xuICAgIGRlbGV0ZSBpbmRleDFba2V5MV07XG4gICAgZm9yIChrZXkgaW4gaW5kZXgxKSByZXR1cm47XG4gICAgZGVsZXRlIGluZGV4MFtrZXkwXTtcbiAgfSxcblxuICAvLyAjIyMgYF9maW5kSW5JbmRleGAgZmluZHMgYSBzZXQgb2YgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIGBudWxsYCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgLy8gYG5hbWUwYCwgYG5hbWUxYCwgYW5kIGBuYW1lMmAgYXJlIHRoZSBuYW1lcyBvZiB0aGUga2V5cyBhdCBlYWNoIGxldmVsLFxuICAvLyB1c2VkIHdoZW4gcmVjb25zdHJ1Y3RpbmcgdGhlIHJlc3VsdGluZyB0cmlwbGVcbiAgLy8gKGZvciBpbnN0YW5jZTogX3N1YmplY3RfLCBfcHJlZGljYXRlXywgYW5kIF9vYmplY3RfKS5cbiAgLy8gRmluYWxseSwgYGdyYXBoYCB3aWxsIGJlIHRoZSBncmFwaCBvZiB0aGUgY3JlYXRlZCB0cmlwbGVzLlxuICBfZmluZEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIsIG5hbWUwLCBuYW1lMSwgbmFtZTIsIGdyYXBoKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSwgZW50aXR5S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2VudGl0aWVzKSwgdG1wLCBpbmRleDEsIGluZGV4MjtcblxuICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDAuXG4gICAgaWYgKGtleTApICh0bXAgPSBpbmRleDAsIGluZGV4MCA9IHt9KVtrZXkwXSA9IHRtcFtrZXkwXTtcbiAgICBmb3IgKHZhciB2YWx1ZTAgaW4gaW5kZXgwKSB7XG4gICAgICB2YXIgZW50aXR5MCA9IGVudGl0eUtleXNbdmFsdWUwXTtcblxuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDEuXG4gICAgICAgIGlmIChrZXkxKSAodG1wID0gaW5kZXgxLCBpbmRleDEgPSB7fSlba2V5MV0gPSB0bXBba2V5MV07XG4gICAgICAgIGZvciAodmFyIHZhbHVlMSBpbiBpbmRleDEpIHtcbiAgICAgICAgICB2YXIgZW50aXR5MSA9IGVudGl0eUtleXNbdmFsdWUxXTtcblxuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCB1c2Ugb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMiwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGtleTIgPyAoa2V5MiBpbiBpbmRleDIgPyBba2V5Ml0gOiBbXSkgOiBPYmplY3Qua2V5cyhpbmRleDIpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRyaXBsZXMgZm9yIGFsbCBpdGVtcyBmb3VuZCBpbiBpbmRleCAyLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IHZhbHVlcy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0geyBzdWJqZWN0OiAnJywgcHJlZGljYXRlOiAnJywgb2JqZWN0OiAnJywgZ3JhcGg6IGdyYXBoIH07XG4gICAgICAgICAgICAgIHJlc3VsdFtuYW1lMF0gPSBlbnRpdHkwO1xuICAgICAgICAgICAgICByZXN1bHRbbmFtZTFdID0gZW50aXR5MTtcbiAgICAgICAgICAgICAgcmVzdWx0W25hbWUyXSA9IGVudGl0eUtleXNbdmFsdWVzW2xdXTtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LFxuXG4gIC8vICMjIyBgX2NvdW50SW5JbmRleGAgY291bnRzIG1hdGNoaW5nIHRyaXBsZXMgaW4gYSB0aHJlZS1sYXllcmVkIGluZGV4LlxuICAvLyBUaGUgaW5kZXggYmFzZSBpcyBgaW5kZXgwYCBhbmQgdGhlIGtleXMgYXQgZWFjaCBsZXZlbCBhcmUgYGtleTBgLCBga2V5MWAsIGFuZCBga2V5MmAuXG4gIC8vIEFueSBvZiB0aGVzZSBrZXlzIGNhbiBiZSBgbnVsbGAsIHdoaWNoIGlzIGludGVycHJldGVkIGFzIGEgd2lsZGNhcmQuXG4gIF9jb3VudEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICB2YXIgY291bnQgPSAwLCB0bXAsIGluZGV4MSwgaW5kZXgyO1xuXG4gICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCBvbmx5IHRoYXQgcGFydCBvZiBpbmRleCAwLlxuICAgIGlmIChrZXkwKSAodG1wID0gaW5kZXgwLCBpbmRleDAgPSB7fSlba2V5MF0gPSB0bXBba2V5MF07XG4gICAgZm9yICh2YXIgdmFsdWUwIGluIGluZGV4MCkge1xuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgY291bnQgb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMS5cbiAgICAgICAgaWYgKGtleTEpICh0bXAgPSBpbmRleDEsIGluZGV4MSA9IHt9KVtrZXkxXSA9IHRtcFtrZXkxXTtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUxIGluIGluZGV4MSkge1xuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCB0aGUgdHJpcGxlIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICAgIGlmIChrZXkyKSAoa2V5MiBpbiBpbmRleDIpICYmIGNvdW50Kys7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvdW50IGFsbCB0cmlwbGVzLlxuICAgICAgICAgICAgZWxzZSBjb3VudCArPSBPYmplY3Qua2V5cyhpbmRleDIpLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgYSBuZXcgTjMgdHJpcGxlIHRvIHRoZSBzdG9yZS5cbiAgYWRkVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuXG4gICAgLy8gRmluZCB0aGUgZ3JhcGggdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyaXBsZS5cbiAgICBncmFwaCA9IGdyYXBoIHx8ICcnO1xuICAgIHZhciBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdO1xuICAgIC8vIENyZWF0ZSB0aGUgZ3JhcGggaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuXG4gICAgaWYgKCFncmFwaEl0ZW0pIHtcbiAgICAgIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF0gPSB7IHN1YmplY3RzOiB7fSwgcHJlZGljYXRlczoge30sIG9iamVjdHM6IHt9IH07XG4gICAgICAvLyBGcmVlemluZyBhIGdyYXBoIGhlbHBzIHN1YnNlcXVlbnQgYGFkZGAgcGVyZm9ybWFuY2UsXG4gICAgICAvLyBhbmQgcHJvcGVydGllcyB3aWxsIG5ldmVyIGJlIG1vZGlmaWVkIGFueXdheS5cbiAgICAgIE9iamVjdC5mcmVlemUoZ3JhcGhJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBlbnRpdGllcyBjYW4gb2Z0ZW4gYmUgbG9uZyBJUklzLCB3ZSBhdm9pZCBzdG9yaW5nIHRoZW0gaW4gZXZlcnkgaW5kZXguXG4gICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSBhIHNlcGFyYXRlIGluZGV4IHRoYXQgbWFwcyBlbnRpdGllcyB0byBudW1iZXJzLFxuICAgIC8vIHdoaWNoIGFyZSB0aGVuIHVzZWQgYXMga2V5cyBpbiB0aGUgb3RoZXIgaW5kZXhlcy5cbiAgICB2YXIgZW50aXRpZXMgPSB0aGlzLl9lbnRpdGllcztcbiAgICBzdWJqZWN0ICAgPSBlbnRpdGllc1tzdWJqZWN0XSAgIHx8IChlbnRpdGllc1tzdWJqZWN0XSAgID0gKyt0aGlzLl9lbnRpdHlDb3VudCk7XG4gICAgcHJlZGljYXRlID0gZW50aXRpZXNbcHJlZGljYXRlXSB8fCAoZW50aXRpZXNbcHJlZGljYXRlXSA9ICsrdGhpcy5fZW50aXR5Q291bnQpO1xuICAgIG9iamVjdCAgICA9IGVudGl0aWVzW29iamVjdF0gICAgfHwgKGVudGl0aWVzW29iamVjdF0gICAgPSArK3RoaXMuX2VudGl0eUNvdW50KTtcblxuICAgIHRoaXMuX2FkZFRvSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCAgIHN1YmplY3QsICAgcHJlZGljYXRlLCBvYmplY3QpO1xuICAgIHRoaXMuX2FkZFRvSW5kZXgoZ3JhcGhJdGVtLnByZWRpY2F0ZXMsIHByZWRpY2F0ZSwgb2JqZWN0LCAgICBzdWJqZWN0KTtcbiAgICB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5vYmplY3RzLCAgICBvYmplY3QsICAgIHN1YmplY3QsICAgcHJlZGljYXRlKTtcblxuICAgIC8vIFRoZSBjYWNoZWQgdHJpcGxlIGNvdW50IGlzIG5vdyBpbnZhbGlkLlxuICAgIHRoaXMuX3NpemUgPSBudWxsO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkVHJpcGxlc2AgYWRkcyBtdWx0aXBsZSBOMyB0cmlwbGVzIHRvIHRoZSBzdG9yZS5cbiAgYWRkVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gdHJpcGxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHRoaXMuYWRkVHJpcGxlKHRyaXBsZXNbaV0pO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkUHJlZml4YCBhZGRzIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIHdpdGggdGhlIGdpdmVuIHByZWZpeFxuICBhZGRQcmVmaXg6IGZ1bmN0aW9uIChwcmVmaXgsIGlyaSkge1xuICAgIHRoaXMuX3ByZWZpeGVzW3ByZWZpeF0gPSBpcmk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhlc2AgYWRkcyBzdXBwb3J0IGZvciBxdWVyeWluZyB3aXRoIHRoZSBnaXZlbiBwcmVmaXhlc1xuICBhZGRQcmVmaXhlczogZnVuY3Rpb24gKHByZWZpeGVzKSB7XG4gICAgZm9yICh2YXIgcHJlZml4IGluIHByZWZpeGVzKVxuICAgICAgdGhpcy5hZGRQcmVmaXgocHJlZml4LCBwcmVmaXhlc1twcmVmaXhdKTtcbiAgfSxcblxuICAvLyAjIyMgYHJlbW92ZVRyaXBsZWAgcmVtb3ZlcyBhbiBOMyB0cmlwbGUgZnJvbSB0aGUgc3RvcmUgaWYgaXQgZXhpc3RzLlxuICByZW1vdmVUcmlwbGU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgYSB0cmlwbGUgb2JqZWN0IGlzIGdpdmVuIGluc3RlYWQgb2YgY29tcG9uZW50cy5cbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG5cbiAgICAvLyBGaW5kIGludGVybmFsIGlkZW50aWZpZXJzIGZvciBhbGwgY29tcG9uZW50cy5cbiAgICB2YXIgZ3JhcGhJdGVtLCBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzLCBncmFwaHMgPSB0aGlzLl9ncmFwaHM7XG4gICAgaWYgKCEoc3ViamVjdCAgICAgPSBlbnRpdGllc1tzdWJqZWN0XSkpICAgcmV0dXJuO1xuICAgIGlmICghKHByZWRpY2F0ZSAgID0gZW50aXRpZXNbcHJlZGljYXRlXSkpIHJldHVybjtcbiAgICBpZiAoIShvYmplY3QgICAgICA9IGVudGl0aWVzW29iamVjdF0pKSAgICByZXR1cm47XG4gICAgaWYgKCEoZ3JhcGhJdGVtICAgPSBncmFwaHNbZ3JhcGhdKSkgICAgICAgcmV0dXJuO1xuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRyaXBsZSBleGlzdHMuXG4gICAgdmFyIHN1YmplY3RzLCBwcmVkaWNhdGVzO1xuICAgIGlmICghKHN1YmplY3RzICAgPSBncmFwaEl0ZW0uc3ViamVjdHNbc3ViamVjdF0pKSByZXR1cm47XG4gICAgaWYgKCEocHJlZGljYXRlcyA9IHN1YmplY3RzW3ByZWRpY2F0ZV0pKSByZXR1cm47XG4gICAgaWYgKCEob2JqZWN0IGluIHByZWRpY2F0ZXMpKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgaXQgZnJvbSBhbGwgaW5kZXhlcy5cbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCAgIHN1YmplY3QsICAgcHJlZGljYXRlLCBvYmplY3QpO1xuICAgIHRoaXMuX3JlbW92ZUZyb21JbmRleChncmFwaEl0ZW0ucHJlZGljYXRlcywgcHJlZGljYXRlLCBvYmplY3QsICAgIHN1YmplY3QpO1xuICAgIHRoaXMuX3JlbW92ZUZyb21JbmRleChncmFwaEl0ZW0ub2JqZWN0cywgICAgb2JqZWN0LCAgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSk7XG4gICAgaWYgKHRoaXMuX3NpemUgIT09IG51bGwpIHRoaXMuX3NpemUtLTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZ3JhcGggaWYgaXQgaXMgZW1wdHkuXG4gICAgZm9yIChzdWJqZWN0IGluIGdyYXBoSXRlbS5zdWJqZWN0cykgcmV0dXJuO1xuICAgIGRlbGV0ZSBncmFwaHNbZ3JhcGhdO1xuICB9LFxuXG4gIC8vICMjIyBgcmVtb3ZlVHJpcGxlc2AgcmVtb3ZlcyBtdWx0aXBsZSBOMyB0cmlwbGVzIGZyb20gdGhlIHN0b3JlLlxuICByZW1vdmVUcmlwbGVzOiBmdW5jdGlvbiAodHJpcGxlcykge1xuICAgIGZvciAodmFyIGkgPSB0cmlwbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgdGhpcy5yZW1vdmVUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmaW5kYCBmaW5kcyBhIHNldCBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybiwgZXhwYW5kaW5nIHByZWZpeGVzIGFzIG5lY2Vzc2FyeS5cbiAgLy8gU2V0dGluZyBgc3ViamVjdGAsIGBwcmVkaWNhdGVgLCBvciBgb2JqZWN0YCB0byBgbnVsbGAgbWVhbnMgYW4gX2FueXRoaW5nXyB3aWxkY2FyZC5cbiAgLy8gU2V0dGluZyBgZ3JhcGhgIHRvIGBudWxsYCBtZWFucyB0aGUgZGVmYXVsdCBncmFwaC5cbiAgZmluZDogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHJldHVybiB0aGlzLmZpbmRCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShvYmplY3QsICAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmaW5kQnlJUklgIGZpbmRzIGEgc2V0IG9mIHRyaXBsZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGBzdWJqZWN0YCwgYHByZWRpY2F0ZWAsIG9yIGBvYmplY3RgIHRvIGEgZmFsc3kgdmFsdWUgbWVhbnMgYW4gX2FueXRoaW5nXyB3aWxkY2FyZC5cbiAgLy8gU2V0dGluZyBgZ3JhcGhgIHRvIGEgZmFsc3kgdmFsdWUgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGZpbmRCeUlSSTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG4gICAgdmFyIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF0sIGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXM7XG5cbiAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW4gbm8gdHJpcGxlcywgdGhlcmUgYXJlIG5vIHJlc3VsdHMuXG4gICAgaWYgKCFncmFwaEl0ZW0pIHJldHVybiBbXTtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgLy8gT3B0aW1pemF0aW9uOiBpZiB0aGUgZW50aXR5IGRvZXNuJ3QgZXhpc3QsIG5vIHRyaXBsZXMgd2l0aCBpdCBleGlzdC5cbiAgICBpZiAoc3ViamVjdCAgICYmICEoc3ViamVjdCAgID0gZW50aXRpZXNbc3ViamVjdF0pKSAgIHJldHVybiBbXTtcbiAgICBpZiAocHJlZGljYXRlICYmICEocHJlZGljYXRlID0gZW50aXRpZXNbcHJlZGljYXRlXSkpIHJldHVybiBbXTtcbiAgICBpZiAob2JqZWN0ICAgICYmICEob2JqZWN0ICAgID0gZW50aXRpZXNbb2JqZWN0XSkpICAgIHJldHVybiBbXTtcblxuICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgaWYgKG9iamVjdClcbiAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsIG9iamVjdCwgc3ViamVjdCwgcHJlZGljYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoKTtcbiAgICAgIGVsc2VcbiAgICAgICAgLy8gSWYgb25seSBzdWJqZWN0IGFuZCBwb3NzaWJseSBwcmVkaWNhdGUgYXJlIGdpdmVuLCB0aGUgc3ViamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCBzdWJqZWN0LCBwcmVkaWNhdGUsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcmVkaWNhdGUpXG4gICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRJbkluZGV4KGdyYXBoSXRlbS5wcmVkaWNhdGVzLCBwcmVkaWNhdGUsIG9iamVjdCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGgpO1xuICAgIGVsc2UgaWYgKG9iamVjdClcbiAgICAgIC8vIElmIG9ubHkgb2JqZWN0IGlzIGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3QuXG4gICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsIG9iamVjdCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JywgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgZ3JhcGgpO1xuICAgIGVsc2VcbiAgICAgIC8vIElmIG5vdGhpbmcgaXMgZ2l2ZW4sIGl0ZXJhdGUgc3ViamVjdHMgYW5kIHByZWRpY2F0ZXMgZmlyc3RcbiAgICAgIHJldHVybiB0aGlzLl9maW5kSW5JbmRleChncmFwaEl0ZW0uc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoKTtcbiAgfSxcblxuICAvLyAjIyMgYGNvdW50YCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4sIGV4cGFuZGluZyBwcmVmaXhlcyBhcyBuZWNlc3NhcnkuXG4gIC8vIFNldHRpbmcgYHN1YmplY3RgLCBgcHJlZGljYXRlYCwgb3IgYG9iamVjdGAgdG8gYG51bGxgIG1lYW5zIGFuIF9hbnl0aGluZ18gd2lsZGNhcmQuXG4gIC8vIFNldHRpbmcgYGdyYXBoYCB0byBgbnVsbGAgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGNvdW50OiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShvYmplY3QsICAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBjb3VudEJ5SVJJYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYHN1YmplY3RgLCBgcHJlZGljYXRlYCwgb3IgYG9iamVjdGAgdG8gYG51bGxgIG1lYW5zIGFuIF9hbnl0aGluZ18gd2lsZGNhcmQuXG4gIC8vIFNldHRpbmcgYGdyYXBoYCB0byBgbnVsbGAgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGNvdW50QnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICBncmFwaCA9IGdyYXBoIHx8ICcnO1xuICAgIHZhciBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdLCBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzO1xuXG4gICAgLy8gSWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWluIG5vIHRyaXBsZXMsIHRoZXJlIGFyZSBubyByZXN1bHRzLlxuICAgIGlmICghZ3JhcGhJdGVtKSByZXR1cm4gMDtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgLy8gT3B0aW1pemF0aW9uOiBpZiB0aGUgZW50aXR5IGRvZXNuJ3QgZXhpc3QsIG5vIHRyaXBsZXMgd2l0aCBpdCBleGlzdC5cbiAgICBpZiAoc3ViamVjdCAgICYmICEoc3ViamVjdCAgID0gZW50aXRpZXNbc3ViamVjdF0pKSAgIHJldHVybiAwO1xuICAgIGlmIChwcmVkaWNhdGUgJiYgIShwcmVkaWNhdGUgPSBlbnRpdGllc1twcmVkaWNhdGVdKSkgcmV0dXJuIDA7XG4gICAgaWYgKG9iamVjdCAgICAmJiAhKG9iamVjdCAgICA9IGVudGl0aWVzW29iamVjdF0pKSAgICByZXR1cm4gMDtcblxuICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgaWYgKG9iamVjdClcbiAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRJbkluZGV4KGdyYXBoSXRlbS5vYmplY3RzLCBvYmplY3QsIHN1YmplY3QsIHByZWRpY2F0ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBhbmQgcG9zc2libHkgcHJlZGljYXRlIGFyZSBnaXZlbiwgdGhlIHN1YmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50SW5JbmRleChncmFwaEl0ZW0uc3ViamVjdHMsIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgcmV0dXJuIHRoaXMuX2NvdW50SW5JbmRleChncmFwaEl0ZW0ucHJlZGljYXRlcywgcHJlZGljYXRlLCBvYmplY3QsIHN1YmplY3QpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIElmIG9ubHkgb2JqZWN0IGlzIHBvc3NpYmx5IGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3QuXG4gICAgICByZXR1cm4gdGhpcy5fY291bnRJbkluZGV4KGdyYXBoSXRlbS5vYmplY3RzLCBvYmplY3QsIHN1YmplY3QsIHByZWRpY2F0ZSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgY3JlYXRlQmxhbmtOb2RlYCBjcmVhdGVzIGEgbmV3IGJsYW5rIG5vZGUsIHJldHVybmluZyBpdHMgbmFtZS5cbiAgY3JlYXRlQmxhbmtOb2RlOiBmdW5jdGlvbiAoc3VnZ2VzdGVkTmFtZSkge1xuICAgIHZhciBuYW1lLCBpbmRleDtcbiAgICAvLyBHZW5lcmF0ZSBhIG5hbWUgYmFzZWQgb24gdGhlIHN1Z2dlc3RlZCBuYW1lXG4gICAgaWYgKHN1Z2dlc3RlZE5hbWUpIHtcbiAgICAgIG5hbWUgPSBzdWdnZXN0ZWROYW1lID0gJ186JyArIHN1Z2dlc3RlZE5hbWUsIGluZGV4ID0gMTtcbiAgICAgIHdoaWxlICh0aGlzLl9lbnRpdGllc1tuYW1lXSlcbiAgICAgICAgbmFtZSA9IHN1Z2dlc3RlZE5hbWUgKyBpbmRleCsrO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSBhIGdlbmVyaWMgYmxhbmsgbm9kZSBuYW1lXG4gICAgZWxzZSB7XG4gICAgICBkbyB7IG5hbWUgPSAnXzpiJyArIHRoaXMuX2JsYW5rTm9kZUluZGV4Kys7IH1cbiAgICAgIHdoaWxlICh0aGlzLl9lbnRpdGllc1tuYW1lXSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgYmxhbmsgbm9kZSB0byB0aGUgZW50aXRpZXMsIGF2b2lkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9lbnRpdGllc1tuYW1lXSA9ICsrdGhpcy5fZW50aXR5Q291bnQ7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0sXG59O1xuXG4vLyAjIyBFeHBvcnRzXG5cbi8vIEV4cG9ydCB0aGUgYE4zU3RvcmVgIGNsYXNzIGFzIGEgd2hvbGUuXG5tb2R1bGUuZXhwb3J0cyA9IE4zU3RvcmU7XG4iLCIvLyAqKk4zU3RyZWFtUGFyc2VyKiogcGFyc2VzIGFuIE4zIHN0cmVhbSBpbnRvIGEgdHJpcGxlIHN0cmVhbVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybSxcbiAgICB1dGlsID0gcmVxdWlyZSgndXRpbCcpLFxuICAgIE4zUGFyc2VyID0gcmVxdWlyZSgnLi9OM1BhcnNlci5qcycpO1xuXG4vLyAjIyBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gTjNTdHJlYW1QYXJzZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNTdHJlYW1QYXJzZXIpKVxuICAgIHJldHVybiBuZXcgTjNTdHJlYW1QYXJzZXIob3B0aW9ucyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBUcmFuc2Zvcm0gYmFzZSBjbGFzc1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCB7IGRlY29kZVN0cmluZ3M6IHRydWUgfSk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA9IHRydWU7XG5cbiAgLy8gU2V0IHVwIHBhcnNlclxuICB2YXIgc2VsZiA9IHRoaXMsIHBhcnNlciA9IG5ldyBOM1BhcnNlcihvcHRpb25zKTtcbiAgcGFyc2VyLnBhcnNlKFxuICAgIC8vIEhhbmRsZSB0cmlwbGVzIGJ5IHB1c2hpbmcgdGhlbSBkb3duIHRoZSBwaXBlbGluZVxuICAgIGZ1bmN0aW9uIChlcnJvciwgdHJpcGxlKSB7XG4gICAgICB0cmlwbGUgJiYgc2VsZi5wdXNoKHRyaXBsZSkgfHxcbiAgICAgIGVycm9yICAmJiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH0sXG4gICAgLy8gRW1pdCBwcmVmaXhlcyB0aHJvdWdoIHRoZSBgcHJlZml4YCBldmVudFxuICAgIHRoaXMuZW1pdC5iaW5kKHRoaXMsICdwcmVmaXgnKSk7XG5cbiAgLy8gSW1wbGVtZW50IFRyYW5zZm9ybSBtZXRob2RzIG9uIHRvcCBvZiBwYXJzZXJcbiAgdGhpcy5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkgeyBwYXJzZXIuYWRkQ2h1bmsoY2h1bmspOyBkb25lKCk7IH07XG4gIHRoaXMuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHsgcGFyc2VyLmVuZCgpOyBkb25lKCk7IH07XG59XG51dGlsLmluaGVyaXRzKE4zU3RyZWFtUGFyc2VyLCBUcmFuc2Zvcm0pO1xuXG4vLyAjIyBFeHBvcnRzXG4vLyBFeHBvcnQgdGhlIGBOM1N0cmVhbVBhcnNlcmAgY2xhc3MgYXMgYSB3aG9sZS5cbm1vZHVsZS5leHBvcnRzID0gTjNTdHJlYW1QYXJzZXI7XG4iLCIvLyAqKk4zU3RyZWFtV3JpdGVyKiogc2VyaWFsaXplcyBhIHRyaXBsZSBzdHJlYW0gaW50byBhbiBOMyBzdHJlYW1cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm0sXG4gICAgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSxcbiAgICBOM1dyaXRlciA9IHJlcXVpcmUoJy4vTjNXcml0ZXIuanMnKTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RyZWFtV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpO1xuXG4gIC8vIEluaXRpYWxpemUgVHJhbnNmb3JtIGJhc2UgY2xhc3NcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLm9iamVjdE1vZGUgPSB0cnVlO1xuXG4gIC8vIFNldCB1cCB3cml0ZXIgd2l0aCBhIGR1bW15IHN0cmVhbSBvYmplY3RcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd3JpdGVyID0gbmV3IE4zV3JpdGVyKHtcbiAgICB3cml0ZTogZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHsgc2VsZi5wdXNoKGNodW5rKTsgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTsgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaykgeyBzZWxmLnB1c2gobnVsbCk7IGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7IH0sXG4gIH0sIG9wdGlvbnMpO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyBvbiB0b3Agb2Ygd3JpdGVyXG4gIHRoaXMuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uICh0cmlwbGUsIGVuY29kaW5nLCBkb25lKSB7IHdyaXRlci5hZGRUcmlwbGUodHJpcGxlLCBkb25lKTsgfTtcbiAgdGhpcy5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkgeyB3cml0ZXIuZW5kKGRvbmUpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVdyaXRlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xuLy8gRXhwb3J0IHRoZSBgTjNTdHJlYW1Xcml0ZXJgIGNsYXNzIGFzIGEgd2hvbGUuXG5tb2R1bGUuZXhwb3J0cyA9IE4zU3RyZWFtV3JpdGVyO1xuIiwiLy8gKipOM1V0aWwqKiBwcm92aWRlcyBOMyB1dGlsaXR5IGZ1bmN0aW9uc1xuXG52YXIgWHNkID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIyc7XG52YXIgWHNkU3RyaW5nICA9IFhzZCArICdzdHJpbmcnO1xudmFyIFhzZEludGVnZXIgPSBYc2QgKyAnaW50ZWdlcic7XG52YXIgWHNkRGVjaW1hbCA9IFhzZCArICdkZWNpbWFsJztcbnZhciBYc2RCb29sZWFuID0gWHNkICsgJ2Jvb2xlYW4nO1xudmFyIFJkZkxhbmdTdHJpbmcgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnO1xuXG52YXIgTjNVdGlsID0ge1xuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYW4gSVJJIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzSVJJOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgaWYgKCFlbnRpdHkpXG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIHZhciBmaXJzdENoYXIgPSBlbnRpdHlbMF07XG4gICAgcmV0dXJuIGZpcnN0Q2hhciAhPT0gJ1wiJyAmJiBmaXJzdENoYXIgIT09ICdfJztcbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzTGl0ZXJhbDogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5WzBdID09PSAnXCInO1xuICB9LFxuXG4gIC8vIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIGVudGl0eSAodHJpcGxlIG9iamVjdCkgcmVwcmVzZW50cyBhIGJsYW5rIG5vZGUgaW4gdGhlIE4zIGxpYnJhcnlcbiAgaXNCbGFuazogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5LnN1YnN0cigwLCAyKSA9PT0gJ186JztcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxWYWx1ZTogZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICB2YXIgbWF0Y2ggPSAvXlwiKFteXSopXCIvLmV4ZWMobGl0ZXJhbCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgIHRocm93IG5ldyBFcnJvcihsaXRlcmFsICsgJyBpcyBub3QgYSBsaXRlcmFsJyk7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9LFxuXG4gIC8vIEdldHMgdGhlIHR5cGUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxUeXBlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpcXF5cXF4oW15cIl0rKXwoQClbXkBcIl0rKT8kLy5leGVjKGxpdGVyYWwpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobGl0ZXJhbCArICcgaXMgbm90IGEgbGl0ZXJhbCcpO1xuICAgIHJldHVybiBtYXRjaFsxXSB8fCAobWF0Y2hbMl0gPyBSZGZMYW5nU3RyaW5nIDogWHNkU3RyaW5nKTtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBsYW5ndWFnZSBvZiBhIGxpdGVyYWwgaW4gdGhlIE4zIGxpYnJhcnlcbiAgZ2V0TGl0ZXJhbExhbmd1YWdlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpAKFteQFwiXSspfFxcXlxcXlteXCJdKyk/JC8uZXhlYyhsaXRlcmFsKTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxpdGVyYWwgKyAnIGlzIG5vdCBhIGxpdGVyYWwnKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgcHJlZml4ZWQgbmFtZVxuICBpc1ByZWZpeGVkTmFtZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgL15bXjpcXC9cIiddKjpbXjpcXC9cIiddKyQvLnRlc3QoZW50aXR5KTtcbiAgfSxcblxuICAvLyBFeHBhbmRzIHRoZSBwcmVmaXhlZCBuYW1lIHRvIGEgZnVsbCBJUkkgKGFsc28gd2hlbiBpdCBvY2N1cnMgYXMgYSBsaXRlcmFsJ3MgdHlwZSlcbiAgZXhwYW5kUHJlZml4ZWROYW1lOiBmdW5jdGlvbiAocHJlZml4ZWROYW1lLCBwcmVmaXhlcykge1xuICAgIHZhciBtYXRjaCA9IC8oPzpefFwiXFxeXFxeKShbXjpcXC8jXCInXFxeX10qKTpbXlxcL10qJC8uZXhlYyhwcmVmaXhlZE5hbWUpLCBwcmVmaXgsIGJhc2UsIGluZGV4O1xuICAgIGlmIChtYXRjaClcbiAgICAgIHByZWZpeCA9IG1hdGNoWzFdLCBiYXNlID0gcHJlZml4ZXNbcHJlZml4XSwgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHByZWZpeGVkTmFtZTtcblxuICAgIC8vIFRoZSBtYXRjaCBpbmRleCBpcyBub24temVybyB3aGVuIGV4cGFuZGluZyBhIGxpdGVyYWwncyB0eXBlLlxuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IGJhc2UgKyBwcmVmaXhlZE5hbWUuc3Vic3RyKHByZWZpeC5sZW5ndGggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICA6IHByZWZpeGVkTmFtZS5zdWJzdHIoMCwgaW5kZXggKyAzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHByZWZpeGVkTmFtZS5zdWJzdHIoaW5kZXggKyBwcmVmaXgubGVuZ3RoICsgNCk7XG4gIH0sXG5cbiAgLy8gQ3JlYXRlcyBhbiBJUkkgaW4gTjMuanMgcmVwcmVzZW50YXRpb25cbiAgY3JlYXRlSVJJOiBmdW5jdGlvbiAoaXJpKSB7XG4gICAgcmV0dXJuIGlyaSAmJiBpcmlbMF0gPT09ICdcIicgPyBOM1V0aWwuZ2V0TGl0ZXJhbFZhbHVlKGlyaSkgOiBpcmk7XG4gIH0sXG5cbiAgLy8gQ3JlYXRlcyBhIGxpdGVyYWwgaW4gTjMuanMgcmVwcmVzZW50YXRpb25cbiAgY3JlYXRlTGl0ZXJhbDogZnVuY3Rpb24gKHZhbHVlLCBtb2RpZmllcikge1xuICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgbW9kaWZpZXIgPSBYc2RCb29sZWFuO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGlmIChpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBtb2RpZmllciA9IHZhbHVlICUgMSA9PT0gMCA/IFhzZEludGVnZXIgOiBYc2REZWNpbWFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdcIicgKyB2YWx1ZSArXG4gICAgICAgICAgICgvXlthLXpdKygtW2EtejAtOV0rKSokL2kudGVzdChtb2RpZmllcikgPyAnXCJAJyAgKyBtb2RpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnXCJeXicgKyBtb2RpZmllcik7XG4gIH0sXG59O1xuXG4vLyBBZGQgdGhlIE4zVXRpbCBmdW5jdGlvbnMgdG8gdGhlIGdpdmVuIG9iamVjdCBvciBpdHMgcHJvdG90eXBlXG5mdW5jdGlvbiBhZGROM1V0aWwocGFyZW50LCB0b1Byb3RvdHlwZSkge1xuICBmb3IgKHZhciBuYW1lIGluIE4zVXRpbClcbiAgICBpZiAoIXRvUHJvdG90eXBlKVxuICAgICAgcGFyZW50W25hbWVdID0gTjNVdGlsW25hbWVdO1xuICAgIGVsc2VcbiAgICAgIHBhcmVudC5wcm90b3R5cGVbbmFtZV0gPSBhcHBseVRvVGhpcyhOM1V0aWxbbmFtZV0pO1xuXG4gIHJldHVybiBwYXJlbnQ7XG59XG5cbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYGZgIHRvIHRoZSBgdGhpc2Agb2JqZWN0XG5mdW5jdGlvbiBhcHBseVRvVGhpcyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gZih0aGlzLCBhKTsgfTtcbn1cblxuLy8gRXhwb3NlIE4zVXRpbCwgYXR0YWNoaW5nIGFsbCBmdW5jdGlvbnMgdG8gaXRcbm1vZHVsZS5leHBvcnRzID0gYWRkTjNVdGlsKGFkZE4zVXRpbCk7XG4iLCIvLyAqKk4zV3JpdGVyKiogd3JpdGVzIE4zIGRvY3VtZW50cy5cblxuLy8gTWF0Y2hlcyBhIGxpdGVyYWwgYXMgcmVwcmVzZW50ZWQgaW4gbWVtb3J5IGJ5IHRoZSBOMyBsaWJyYXJ5XG52YXIgTjNMaXRlcmFsTWF0Y2hlciA9IC9eXCIoW15dKilcIig/OlxcXlxcXiguKyl8QChbXFwtYS16XSspKT8kL2k7XG5cbi8vIHJkZjp0eXBlIHByZWRpY2F0ZSAoZm9yICdhJyBhYmJyZXZpYXRpb24pXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfVFlQRSAgID0gUkRGX1BSRUZJWCArICd0eXBlJztcblxuLy8gQ2hhcmFjdGVycyBpbiBsaXRlcmFscyB0aGF0IHJlcXVpcmUgZXNjYXBpbmdcbnZhciBlc2NhcGUgICAgPSAvW1wiXFxcXFxcdFxcblxcclxcYlxcZlxcdTAwMDAtXFx1MDAxOVxcdWQ4MDAtXFx1ZGJmZl0vLFxuICAgIGVzY2FwZUFsbCA9IC9bXCJcXFxcXFx0XFxuXFxyXFxiXFxmXFx1MDAwMC1cXHUwMDE5XXxbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdL2csXG4gICAgZXNjYXBlUmVwbGFjZW1lbnRzID0geyAnXFxcXCc6ICdcXFxcXFxcXCcsICdcIic6ICdcXFxcXCInLCAnXFx0JzogJ1xcXFx0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nOiAnXFxcXG4nLCAnXFxyJzogJ1xcXFxyJywgJ1xcYic6ICdcXFxcYicsICdcXGYnOiAnXFxcXGYnIH07XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1dyaXRlcihvdXRwdXRTdHJlYW0sIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zV3JpdGVyKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7XG5cbiAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYSBzdHJlYW1cbiAgaWYgKG91dHB1dFN0cmVhbSAmJiB0eXBlb2Ygb3V0cHV0U3RyZWFtLndyaXRlICE9PSAnZnVuY3Rpb24nKVxuICAgIG9wdGlvbnMgPSBvdXRwdXRTdHJlYW0sIG91dHB1dFN0cmVhbSA9IG51bGw7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIElmIG5vIG91dHB1dCBzdHJlYW0gZ2l2ZW4sIHNlbmQgdGhlIG91dHB1dCBhcyBzdHJpbmcgdGhyb3VnaCB0aGUgZW5kIGNhbGxiYWNrXG4gIGlmICghb3V0cHV0U3RyZWFtKSB7XG4gICAgdmFyIG91dHB1dCA9ICcnO1xuICAgIHRoaXMuX291dHB1dFN0cmVhbSA9IHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBkb25lKSB7IG91dHB1dCArPSBjaHVuazsgZG9uZSAmJiBkb25lKCk7IH0sXG4gICAgICBlbmQ6ICAgZnVuY3Rpb24gKGRvbmUpIHsgZG9uZSAmJiBkb25lKG51bGwsIG91dHB1dCk7IH0sXG4gICAgfTtcbiAgICB0aGlzLl9lbmRTdHJlYW0gPSB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuX291dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTtcbiAgICB0aGlzLl9lbmRTdHJlYW0gPSBvcHRpb25zLmVuZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhb3B0aW9ucy5lbmQ7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdyaXRlciwgZGVwZW5kaW5nIG9uIHRoZSBmb3JtYXRcbiAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gIGlmICghKC90cmlwbGV8cXVhZC9pKS50ZXN0KG9wdGlvbnMuZm9ybWF0KSkge1xuICAgIHRoaXMuX2dyYXBoID0gJyc7XG4gICAgdGhpcy5fcHJlZml4SVJJcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgb3B0aW9ucy5wcmVmaXhlcyAmJiB0aGlzLmFkZFByZWZpeGVzKG9wdGlvbnMucHJlZml4ZXMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuX3dyaXRlVHJpcGxlID0gdGhpcy5fd3JpdGVUcmlwbGVMaW5lO1xuICB9XG59XG5cbk4zV3JpdGVyLnByb3RvdHlwZSA9IHtcbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfd3JpdGVgIHdyaXRlcyB0aGUgYXJndW1lbnQgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgX3dyaXRlOiBmdW5jdGlvbiAoc3RyaW5nLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX291dHB1dFN0cmVhbS53cml0ZShzdHJpbmcsICd1dGY4JywgY2FsbGJhY2spO1xuICB9LFxuXG4gICAgLy8gIyMjIGBfd3JpdGVUcmlwbGVgIHdyaXRlcyB0aGUgdHJpcGxlIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIF93cml0ZVRyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBXcml0ZSB0aGUgZ3JhcGgncyBsYWJlbCBpZiBpdCBoYXMgY2hhbmdlZFxuICAgICAgaWYgKHRoaXMuX2dyYXBoICE9PSBncmFwaCkge1xuICAgICAgICAvLyBDbG9zZSB0aGUgcHJldmlvdXMgZ3JhcGggYW5kIHN0YXJ0IHRoZSBuZXcgb25lXG4gICAgICAgIHRoaXMuX3dyaXRlKCh0aGlzLl9zdWJqZWN0ID09PSBudWxsID8gJycgOiAodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpKSArXG4gICAgICAgICAgICAgICAgICAgIChncmFwaCA/IHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcge1xcbicgOiAnJykpO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJlYXQgaWRlbnRpY2FsIGJsYW5rIG5vZGVzIGFzIHJlcGVhdGluZyBncmFwaHNcbiAgICAgICAgdGhpcy5fZ3JhcGggPSBncmFwaFswXSAhPT0gJ1snID8gZ3JhcGggOiAnXSc7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCByZXBlYXQgdGhlIHN1YmplY3QgaWYgaXQncyB0aGUgc2FtZVxuICAgICAgaWYgKHRoaXMuX3N1YmplY3QgPT09IHN1YmplY3QpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwZWF0IHRoZSBwcmVkaWNhdGUgaWYgaXQncyB0aGUgc2FtZVxuICAgICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBwcmVkaWNhdGUpXG4gICAgICAgICAgdGhpcy5fd3JpdGUoJywgJyArIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpLCBkb25lKTtcbiAgICAgICAgLy8gU2FtZSBzdWJqZWN0LCBkaWZmZXJlbnQgcHJlZGljYXRlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl93cml0ZSgnO1xcbiAgICAnICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVQcmVkaWNhdGUodGhpcy5fcHJlZGljYXRlID0gcHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgICAgfVxuICAgICAgLy8gRGlmZmVyZW50IHN1YmplY3Q7IHdyaXRlIHRoZSB3aG9sZSB0cmlwbGVcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fd3JpdGUoKHRoaXMuX3N1YmplY3QgPT09IG51bGwgPyAnJyA6ICcuXFxuJykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVTdWJqZWN0KHRoaXMuX3N1YmplY3QgPSBzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVByZWRpY2F0ZSh0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZG9uZSAmJiBkb25lKGVycm9yKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3dyaXRlVHJpcGxlTGluZWAgd3JpdGVzIHRoZSB0cmlwbGUgb3IgcXVhZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBhcyBhIHNpbmdsZSBsaW5lXG4gIF93cml0ZVRyaXBsZUxpbmU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgsIGRvbmUpIHtcbiAgICAvLyBEb24ndCB1c2UgcHJlZml4ZXNcbiAgICBkZWxldGUgdGhpcy5fcHJlZml4TWF0Y2g7XG4gICAgLy8gV3JpdGUgdGhlIHRyaXBsZVxuICAgIHRyeSB7XG4gICAgICB0aGlzLl93cml0ZSh0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpICtcbiAgICAgICAgICAgICAgICAgIChncmFwaCA/ICcgJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcuXFxuJyA6ICcuXFxuJyksIGRvbmUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZG9uZSAmJiBkb25lKGVycm9yKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZUlyaU9yQmxhbmtOb2RlYCByZXByZXNlbnRzIGFuIElSSSBvciBibGFuayBub2RlXG4gIF9lbmNvZGVJcmlPckJsYW5rTm9kZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIC8vIEEgYmxhbmsgbm9kZSBvciBsaXN0IGlzIHJlcHJlc2VudGVkIGFzLWlzXG4gICAgdmFyIGZpcnN0Q2hhciA9IGVudGl0eVswXTtcbiAgICBpZiAoZmlyc3RDaGFyID09PSAnWycgfHwgZmlyc3RDaGFyID09PSAnKCcgfHwgZmlyc3RDaGFyID09PSAnXycgJiYgZW50aXR5WzFdID09PSAnOicpXG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZXNjYXBlLnRlc3QoZW50aXR5KSlcbiAgICAgIGVudGl0eSA9IGVudGl0eS5yZXBsYWNlKGVzY2FwZUFsbCwgY2hhcmFjdGVyUmVwbGFjZXIpO1xuICAgIC8vIFRyeSB0byByZXByZXNlbnQgdGhlIElSSSBhcyBwcmVmaXhlZCBuYW1lXG4gICAgdmFyIHByZWZpeE1hdGNoID0gdGhpcy5fcHJlZml4UmVnZXguZXhlYyhlbnRpdHkpO1xuICAgIHJldHVybiAhcHJlZml4TWF0Y2ggPyAnPCcgKyBlbnRpdHkgKyAnPicgOlxuICAgICAgICAgICAoIXByZWZpeE1hdGNoWzFdID8gZW50aXR5IDogdGhpcy5fcHJlZml4SVJJc1twcmVmaXhNYXRjaFsxXV0gKyBwcmVmaXhNYXRjaFsyXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlTGl0ZXJhbGAgcmVwcmVzZW50cyBhIGxpdGVyYWxcbiAgX2VuY29kZUxpdGVyYWw6IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSwgbGFuZ3VhZ2UpIHtcbiAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGVzY2FwZS50ZXN0KHZhbHVlKSlcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShlc2NhcGVBbGwsIGNoYXJhY3RlclJlcGxhY2VyKTtcbiAgICAvLyBXcml0ZSB0aGUgbGl0ZXJhbCwgcG9zc2libHkgd2l0aCB0eXBlIG9yIGxhbmd1YWdlXG4gICAgaWYgKGxhbmd1YWdlKVxuICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIkAnICsgbGFuZ3VhZ2U7XG4gICAgZWxzZSBpZiAodHlwZSlcbiAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCJeXicgKyB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZSh0eXBlKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgfSxcblxuICAvLyAjIyMgYF9lbmNvZGVTdWJqZWN0YCByZXByZXNlbnRzIGEgc3ViamVjdFxuICBfZW5jb2RlU3ViamVjdDogZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICBpZiAoc3ViamVjdFswXSA9PT0gJ1wiJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBsaXRlcmFsIGFzIHN1YmplY3QgaXMgbm90IGFsbG93ZWQ6ICcgKyBzdWJqZWN0KTtcbiAgICAvLyBEb24ndCB0cmVhdCBpZGVudGljYWwgYmxhbmsgbm9kZXMgYXMgcmVwZWF0aW5nIHN1YmplY3RzXG4gICAgaWYgKHN1YmplY3RbMF0gPT09ICdbJylcbiAgICAgIHRoaXMuX3N1YmplY3QgPSAnXSc7XG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHN1YmplY3QpO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZVByZWRpY2F0ZWAgcmVwcmVzZW50cyBhIHByZWRpY2F0ZVxuICBfZW5jb2RlUHJlZGljYXRlOiBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgaWYgKHByZWRpY2F0ZVswXSA9PT0gJ1wiJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBsaXRlcmFsIGFzIHByZWRpY2F0ZSBpcyBub3QgYWxsb3dlZDogJyArIHByZWRpY2F0ZSk7XG4gICAgcmV0dXJuIHByZWRpY2F0ZSA9PT0gUkRGX1RZUEUgPyAnYScgOiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZU9iamVjdGAgcmVwcmVzZW50cyBhbiBvYmplY3RcbiAgX2VuY29kZU9iamVjdDogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIC8vIFJlcHJlc2VudCBhbiBJUkkgb3IgYmxhbmsgbm9kZVxuICAgIGlmIChvYmplY3RbMF0gIT09ICdcIicpXG4gICAgICByZXR1cm4gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUob2JqZWN0KTtcbiAgICAvLyBSZXByZXNlbnQgYSBsaXRlcmFsXG4gICAgdmFyIG1hdGNoID0gTjNMaXRlcmFsTWF0Y2hlci5leGVjKG9iamVjdCk7XG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpdGVyYWw6ICcgKyBvYmplY3QpO1xuICAgIHJldHVybiB0aGlzLl9lbmNvZGVMaXRlcmFsKG1hdGNoWzFdLCBtYXRjaFsyXSwgbWF0Y2hbM10pO1xuICB9LFxuXG4gIC8vICMjIyBgX2Jsb2NrZWRXcml0ZWAgcmVwbGFjZXMgYF93cml0ZWAgYWZ0ZXIgdGhlIHdyaXRlciBoYXMgYmVlbiBjbG9zZWRcbiAgX2Jsb2NrZWRXcml0ZTogZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHdyaXRlIGJlY2F1c2UgdGhlIHdyaXRlciBoYXMgYmVlbiBjbG9zZWQuJyk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgdGhlIHRyaXBsZSB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRUcmlwbGU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgsIGRvbmUpIHtcbiAgICAvLyBUaGUgdHJpcGxlIHdhcyBnaXZlbiBhcyBhIHRyaXBsZSBvYmplY3QsIHNvIHNoaWZ0IHBhcmFtZXRlcnNcbiAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLl93cml0ZVRyaXBsZShzdWJqZWN0LnN1YmplY3QsIHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0Lm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZ3JhcGggfHwgJycsIHByZWRpY2F0ZSk7XG4gICAgLy8gVGhlIG9wdGlvbmFsIGBncmFwaGAgcGFyYW1ldGVyIHdhcyBub3QgcHJvdmlkZWRcbiAgICBlbHNlIGlmICh0eXBlb2YgZ3JhcGggIT09ICdzdHJpbmcnKVxuICAgICAgdGhpcy5fd3JpdGVUcmlwbGUoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsICcnLCBncmFwaCk7XG4gICAgLy8gVGhlIGBncmFwaGAgcGFyYW1ldGVyIHdhcyBwcm92aWRlZFxuICAgIGVsc2VcbiAgICAgIHRoaXMuX3dyaXRlVHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVzYCBhZGRzIHRoZSB0cmlwbGVzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFRyaXBsZXM6IGZ1bmN0aW9uICh0cmlwbGVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlwbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5hZGRUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhgIGFkZHMgdGhlIHByZWZpeCB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRQcmVmaXg6IGZ1bmN0aW9uIChwcmVmaXgsIGlyaSwgZG9uZSkge1xuICAgIHZhciBwcmVmaXhlcyA9IHt9O1xuICAgIHByZWZpeGVzW3ByZWZpeF0gPSBpcmk7XG4gICAgdGhpcy5hZGRQcmVmaXhlcyhwcmVmaXhlcywgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhlc2AgYWRkcyB0aGUgcHJlZml4ZXMgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgYWRkUHJlZml4ZXM6IGZ1bmN0aW9uIChwcmVmaXhlcywgZG9uZSkge1xuICAgIC8vIEFkZCBhbGwgdXNlZnVsIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeElSSXMgPSB0aGlzLl9wcmVmaXhJUklzLCBoYXNQcmVmaXhlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIHByZWZpeCBpbiBwcmVmaXhlcykge1xuICAgICAgLy8gVmVyaWZ5IHdoZXRoZXIgdGhlIHByZWZpeCBjYW4gYmUgdXNlZCBhbmQgZG9lcyBub3QgZXhpc3QgeWV0XG4gICAgICB2YXIgaXJpID0gcHJlZml4ZXNbcHJlZml4XTtcbiAgICAgIGlmICgvWyNcXC9dJC8udGVzdChpcmkpICYmIHByZWZpeElSSXNbaXJpXSAhPT0gKHByZWZpeCArPSAnOicpKSB7XG4gICAgICAgIGhhc1ByZWZpeGVzID0gdHJ1ZTtcbiAgICAgICAgcHJlZml4SVJJc1tpcmldID0gcHJlZml4O1xuICAgICAgICAvLyBGaW5pc2ggYSBwb3NzaWJsZSBwZW5kaW5nIHRyaXBsZVxuICAgICAgICBpZiAodGhpcy5fc3ViamVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3dyaXRlKHRoaXMuX2dyYXBoID8gJ1xcbn1cXG4nIDogJy5cXG4nKTtcbiAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbCwgdGhpcy5fZ3JhcGggPSAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBwcmVmaXhcbiAgICAgICAgdGhpcy5fd3JpdGUoJ0BwcmVmaXggJyArIHByZWZpeCArICcgPCcgKyBpcmkgKyAnPi5cXG4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVjcmVhdGUgdGhlIHByZWZpeCBtYXRjaGVyXG4gICAgaWYgKGhhc1ByZWZpeGVzKSB7XG4gICAgICB2YXIgSVJJbGlzdCA9ICcnLCBwcmVmaXhMaXN0ID0gJyc7XG4gICAgICBmb3IgKHZhciBwcmVmaXhJUkkgaW4gcHJlZml4SVJJcykge1xuICAgICAgICBJUklsaXN0ICs9IElSSWxpc3QgPyAnfCcgKyBwcmVmaXhJUkkgOiBwcmVmaXhJUkk7XG4gICAgICAgIHByZWZpeExpc3QgKz0gKHByZWZpeExpc3QgPyAnfCcgOiAnJykgKyBwcmVmaXhJUklzW3ByZWZpeElSSV07XG4gICAgICB9XG4gICAgICBJUklsaXN0ID0gSVJJbGlzdC5yZXBsYWNlKC9bXFxdXFwvXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcJF0vZywgJ1xcXFwkJicpO1xuICAgICAgdGhpcy5fcHJlZml4UmVnZXggPSBuZXcgUmVnRXhwKCdeKD86JyArIHByZWZpeExpc3QgKyAnKVteXFwvXSokfCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeKCcgKyBJUklsaXN0ICsgJykoW2EtekEtWl1bXFxcXC1fYS16QS1aMC05XSopJCcpO1xuICAgIH1cbiAgICAvLyBFbmQgYSBwcmVmaXggYmxvY2sgd2l0aCBhIG5ld2xpbmVcbiAgICB0aGlzLl93cml0ZShoYXNQcmVmaXhlcyA/ICdcXG4nIDogJycsIGRvbmUpO1xuICB9LFxuXG4gIC8vICMjIyBgYmxhbmtgIGNyZWF0ZXMgYSBibGFuayBub2RlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRcbiAgYmxhbms6IGZ1bmN0aW9uIChwcmVkaWNhdGUsIG9iamVjdCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByZWRpY2F0ZSwgY2hpbGQsIGxlbmd0aDtcbiAgICAvLyBFbXB0eSBibGFuayBub2RlXG4gICAgaWYgKHByZWRpY2F0ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAvLyBCbGFuayBub2RlIHBhc3NlZCBhcyBibGFuayhcInByZWRpY2F0ZVwiLCBcIm9iamVjdFwiKVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgY2hpbGRyZW4gPSBbeyBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QgfV07XG4gICAgLy8gQmxhbmsgbm9kZSBwYXNzZWQgYXMgYmxhbmsoeyBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QgfSlcbiAgICBlbHNlIGlmICghKCdsZW5ndGgnIGluIHByZWRpY2F0ZSkpXG4gICAgICBjaGlsZHJlbiA9IFtwcmVkaWNhdGVdO1xuXG4gICAgc3dpdGNoIChsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAvLyBHZW5lcmF0ZSBhbiBlbXB0eSBibGFuayBub2RlXG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdbXSc7XG4gICAgLy8gR2VuZXJhdGUgYSBub24tbmVzdGVkIG9uZS10cmlwbGUgYmxhbmsgbm9kZVxuICAgIGNhc2UgMTpcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGQub2JqZWN0WzBdICE9PSAnWycpXG4gICAgICAgIHJldHVybiAnWyAnICsgdGhpcy5fZW5jb2RlUHJlZGljYXRlKGNoaWxkLnByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpICsgJyBdJztcbiAgICAvLyBHZW5lcmF0ZSBhIG11bHRpLXRyaXBsZSBvciBuZXN0ZWQgYmxhbmsgbm9kZVxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgY29udGVudHMgPSAnWyc7XG4gICAgICAvLyBXcml0ZSBhbGwgdHJpcGxlcyBpbiBvcmRlclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBXcml0ZSBvbmx5IHRoZSBvYmplY3QgaXMgdGhlIHByZWRpY2F0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXNcbiAgICAgICAgaWYgKGNoaWxkLnByZWRpY2F0ZSA9PT0gcHJlZGljYXRlKVxuICAgICAgICAgIGNvbnRlbnRzICs9ICcsICcgKyB0aGlzLl9lbmNvZGVPYmplY3QoY2hpbGQub2JqZWN0KTtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3cml0ZSB0aGUgcHJlZGljYXRlIGFuZCB0aGUgb2JqZWN0XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzICs9IChpID8gJztcXG4gICcgOiAnXFxuICAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlUHJlZGljYXRlKGNoaWxkLnByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGNoaWxkLnByZWRpY2F0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnRzICsgJ1xcbl0nO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYGxpc3RgIGNyZWF0ZXMgYSBsaXN0IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudFxuICBsaXN0OiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICB2YXIgbGVuZ3RoID0gZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoIHx8IDAsIGNvbnRlbnRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgIGNvbnRlbnRzW2ldID0gdGhpcy5fZW5jb2RlT2JqZWN0KGVsZW1lbnRzW2ldKTtcbiAgICByZXR1cm4gJygnICsgY29udGVudHMuam9pbignICcpICsgJyknO1xuICB9LFxuXG4gIC8vICMjIyBgX3ByZWZpeFJlZ2V4YCBtYXRjaGVzIGEgcHJlZml4ZWQgbmFtZSBvciBJUkkgdGhhdCBiZWdpbnMgd2l0aCBvbmUgb2YgdGhlIGFkZGVkIHByZWZpeGVzXG4gIF9wcmVmaXhSZWdleDogLyQwXi8sXG5cbiAgLy8gIyMjIGBlbmRgIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHN0cmVhbVxuICBlbmQ6IGZ1bmN0aW9uIChkb25lKSB7XG4gICAgLy8gRmluaXNoIGEgcG9zc2libGUgcGVuZGluZyB0cmlwbGVcbiAgICBpZiAodGhpcy5fc3ViamVjdCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fd3JpdGUodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgfVxuICAgIC8vIERpc2FsbG93IGZ1cnRoZXIgd3JpdGluZ1xuICAgIHRoaXMuX3dyaXRlID0gdGhpcy5fYmxvY2tlZFdyaXRlO1xuXG4gICAgLy8gVHJ5IHRvIGVuZCB0aGUgdW5kZXJseWluZyBzdHJlYW0sIGVuc3VyaW5nIGRvbmUgaXMgY2FsbGVkIGV4YWN0bHkgb25lIHRpbWVcbiAgICB2YXIgc2luZ2xlRG9uZSA9IGRvbmUgJiYgZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHsgc2luZ2xlRG9uZSA9IG51bGwsIGRvbmUoZXJyb3IsIHJlc3VsdCk7IH07XG4gICAgaWYgKHRoaXMuX2VuZFN0cmVhbSkge1xuICAgICAgdHJ5IHsgcmV0dXJuIHRoaXMuX291dHB1dFN0cmVhbS5lbmQoc2luZ2xlRG9uZSk7IH1cbiAgICAgIGNhdGNoIChlcnJvcikgeyAvKiBlcnJvciBjbG9zaW5nIHN0cmVhbSAqLyB9XG4gICAgfVxuICAgIHNpbmdsZURvbmUgJiYgc2luZ2xlRG9uZSgpO1xuICB9LFxufTtcblxuLy8gUmVwbGFjZXMgYSBjaGFyYWN0ZXIgYnkgaXRzIGVzY2FwZWQgdmVyc2lvblxuZnVuY3Rpb24gY2hhcmFjdGVyUmVwbGFjZXIoY2hhcmFjdGVyKSB7XG4gIC8vIFJlcGxhY2UgYSBzaW5nbGUgY2hhcmFjdGVyIGJ5IGl0cyBlc2NhcGVkIHZlcnNpb25cbiAgdmFyIHJlc3VsdCA9IGVzY2FwZVJlcGxhY2VtZW50c1tjaGFyYWN0ZXJdO1xuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBSZXBsYWNlIGEgc2luZ2xlIGNoYXJhY3RlciB3aXRoIGl0cyA0LWJpdCB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZVxuICAgIGlmIChjaGFyYWN0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXN1bHQgPSBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICByZXN1bHQgPSAnXFxcXHUwMDAwJy5zdWJzdHIoMCwgNiAtIHJlc3VsdC5sZW5ndGgpICsgcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXBsYWNlIGEgc3Vycm9nYXRlIHBhaXIgd2l0aCBpdHMgOC1iaXQgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VcbiAgICBlbHNlIHtcbiAgICAgIHJlc3VsdCA9ICgoY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgLSAweEQ4MDApICogMHg0MDAgK1xuICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgxKSArIDB4MjQwMCkudG9TdHJpbmcoMTYpO1xuICAgICAgcmVzdWx0ID0gJ1xcXFxVMDAwMDAwMDAnLnN1YnN0cigwLCAxMCAtIHJlc3VsdC5sZW5ndGgpICsgcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyAjIyBFeHBvcnRzXG5cbi8vIEV4cG9ydCB0aGUgYE4zV3JpdGVyYCBjbGFzcyBhcyBhIHdob2xlLlxubW9kdWxlLmV4cG9ydHMgPSBOM1dyaXRlcjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbnZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3NOZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbkR1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIHRoaXMuZW5kKCk7XG5cbiAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcnIpO1xufTtcblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gVE9ETyhibWV1cmVyKTogQ2hhbmdlIHRoaXMgYmFjayB0byBjb25zdCBvbmNlIGhvbGUgY2hlY2tzIGFyZVxuLy8gcHJvcGVybHkgb3B0aW1pemVkIGF3YXkgZWFybHkgaW4gSWduaXRpb24rVHVyYm9GYW4uXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCwgZm4pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gICAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICAgIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwcm9jZXNzTmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgc2VsZi5lbWl0LmJpbmQoc2VsZiwga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignd3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJykpO1xuICB9XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIHZhciBzdHJlYW0gPSB0aGlzO1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShzdHJlYW0sIGVyLCBkYXRhKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ190cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBhc3luY1dyaXRlID0gIXByb2Nlc3MuYnJvd3NlciAmJiBbJ3YwLjEwJywgJ3YwLjkuJ10uaW5kZXhPZihwcm9jZXNzLnZlcnNpb24uc2xpY2UoMCwgNSkpID4gLTEgPyBzZXRJbW1lZGlhdGUgOiBwcm9jZXNzTmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9IF9pc1VpbnQ4QXJyYXkoY2h1bmspICYmICFzdGF0ZS5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwcm9jZXNzTmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG4gIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gY29ya1JlcTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vLyB1bmRvY3VtZW50ZWQgY2IoKSBBUEksIG5lZWRlZCBmb3IgY29yZSwgbm90IGZvciBwdWJsaWMgQVBJXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgcmVhZGFibGVEZXN0cm95ZWQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB2YXIgd3JpdGFibGVEZXN0cm95ZWQgPSB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuXG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVyciAmJiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUgfHwgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSkge1xuICAgICAgcHJvY2Vzc05leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIC0xO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSkgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVycyAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCk7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnLnJlcGVhdChwICsgMSk7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCArIDIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGZvciBlYWNoIGJ1ZmZlcmVkIGJ5dGUgb2YgYSAocGFydGlhbClcbi8vIGNoYXJhY3RlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgb3V0cHV0LlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCcucmVwZWF0KHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlBhc3NUaHJvdWdoXG4iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuVHJhbnNmb3JtXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCI7KGZ1bmN0aW9uIChzYXgpIHsgLy8gd3JhcHBlciBmb3Igbm9uLW5vZGUgZW52c1xuICBzYXgucGFyc2VyID0gZnVuY3Rpb24gKHN0cmljdCwgb3B0KSB7IHJldHVybiBuZXcgU0FYUGFyc2VyKHN0cmljdCwgb3B0KSB9XG4gIHNheC5TQVhQYXJzZXIgPSBTQVhQYXJzZXJcbiAgc2F4LlNBWFN0cmVhbSA9IFNBWFN0cmVhbVxuICBzYXguY3JlYXRlU3RyZWFtID0gY3JlYXRlU3RyZWFtXG5cbiAgLy8gV2hlbiB3ZSBwYXNzIHRoZSBNQVhfQlVGRkVSX0xFTkdUSCBwb3NpdGlvbiwgc3RhcnQgY2hlY2tpbmcgZm9yIGJ1ZmZlciBvdmVycnVucy5cbiAgLy8gV2hlbiB3ZSBjaGVjaywgc2NoZWR1bGUgdGhlIG5leHQgY2hlY2sgZm9yIE1BWF9CVUZGRVJfTEVOR1RIIC0gKG1heChidWZmZXIgbGVuZ3RocykpLFxuICAvLyBzaW5jZSB0aGF0J3MgdGhlIGVhcmxpZXN0IHRoYXQgYSBidWZmZXIgb3ZlcnJ1biBjb3VsZCBvY2N1ci4gIFRoaXMgd2F5LCBjaGVja3MgYXJlXG4gIC8vIGFzIHJhcmUgYXMgcmVxdWlyZWQsIGJ1dCBhcyBvZnRlbiBhcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5ldmVyIGNyb3NzaW5nIHRoaXMgYm91bmQuXG4gIC8vIEZ1cnRoZXJtb3JlLCBidWZmZXJzIGFyZSBvbmx5IHRlc3RlZCBhdCBtb3N0IG9uY2UgcGVyIHdyaXRlKCksIHNvIHBhc3NpbmcgYSB2ZXJ5XG4gIC8vIGxhcmdlIHN0cmluZyBpbnRvIHdyaXRlKCkgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzLCBidXQgdGhpcyBpcyBtYW5hZ2VhYmxlIGJ5XG4gIC8vIHRoZSBjYWxsZXIsIHNvIGl0IGlzIGFzc3VtZWQgdG8gYmUgc2FmZS4gIFRodXMsIGEgY2FsbCB0byB3cml0ZSgpIG1heSwgaW4gdGhlIGV4dHJlbWVcbiAgLy8gZWRnZSBjYXNlLCByZXN1bHQgaW4gY3JlYXRpbmcgYXQgbW9zdCBvbmUgY29tcGxldGUgY29weSBvZiB0aGUgc3RyaW5nIHBhc3NlZCBpbi5cbiAgLy8gU2V0IHRvIEluZmluaXR5IHRvIGhhdmUgdW5saW1pdGVkIGJ1ZmZlcnMuXG4gIHNheC5NQVhfQlVGRkVSX0xFTkdUSCA9IDY0ICogMTAyNFxuXG4gIHZhciBidWZmZXJzID0gW1xuICAgICdjb21tZW50JywgJ3NnbWxEZWNsJywgJ3RleHROb2RlJywgJ3RhZ05hbWUnLCAnZG9jdHlwZScsXG4gICAgJ3Byb2NJbnN0TmFtZScsICdwcm9jSW5zdEJvZHknLCAnZW50aXR5JywgJ2F0dHJpYk5hbWUnLFxuICAgICdhdHRyaWJWYWx1ZScsICdjZGF0YScsICdzY3JpcHQnXG4gIF1cblxuICBzYXguRVZFTlRTID0gW1xuICAgICd0ZXh0JyxcbiAgICAncHJvY2Vzc2luZ2luc3RydWN0aW9uJyxcbiAgICAnc2dtbGRlY2xhcmF0aW9uJyxcbiAgICAnZG9jdHlwZScsXG4gICAgJ2NvbW1lbnQnLFxuICAgICdvcGVudGFnc3RhcnQnLFxuICAgICdhdHRyaWJ1dGUnLFxuICAgICdvcGVudGFnJyxcbiAgICAnY2xvc2V0YWcnLFxuICAgICdvcGVuY2RhdGEnLFxuICAgICdjZGF0YScsXG4gICAgJ2Nsb3NlY2RhdGEnLFxuICAgICdlcnJvcicsXG4gICAgJ2VuZCcsXG4gICAgJ3JlYWR5JyxcbiAgICAnc2NyaXB0JyxcbiAgICAnb3Blbm5hbWVzcGFjZScsXG4gICAgJ2Nsb3NlbmFtZXNwYWNlJ1xuICBdXG5cbiAgZnVuY3Rpb24gU0FYUGFyc2VyIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFBhcnNlcihzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICB2YXIgcGFyc2VyID0gdGhpc1xuICAgIGNsZWFyQnVmZmVycyhwYXJzZXIpXG4gICAgcGFyc2VyLnEgPSBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEhcbiAgICBwYXJzZXIub3B0ID0gb3B0IHx8IHt9XG4gICAgcGFyc2VyLm9wdC5sb3dlcmNhc2UgPSBwYXJzZXIub3B0Lmxvd2VyY2FzZSB8fCBwYXJzZXIub3B0Lmxvd2VyY2FzZXRhZ3NcbiAgICBwYXJzZXIubG9vc2VDYXNlID0gcGFyc2VyLm9wdC5sb3dlcmNhc2UgPyAndG9Mb3dlckNhc2UnIDogJ3RvVXBwZXJDYXNlJ1xuICAgIHBhcnNlci50YWdzID0gW11cbiAgICBwYXJzZXIuY2xvc2VkID0gcGFyc2VyLmNsb3NlZFJvb3QgPSBwYXJzZXIuc2F3Um9vdCA9IGZhbHNlXG4gICAgcGFyc2VyLnRhZyA9IHBhcnNlci5lcnJvciA9IG51bGxcbiAgICBwYXJzZXIuc3RyaWN0ID0gISFzdHJpY3RcbiAgICBwYXJzZXIubm9zY3JpcHQgPSAhIShzdHJpY3QgfHwgcGFyc2VyLm9wdC5ub3NjcmlwdClcbiAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOXG4gICAgcGFyc2VyLnN0cmljdEVudGl0aWVzID0gcGFyc2VyLm9wdC5zdHJpY3RFbnRpdGllc1xuICAgIHBhcnNlci5FTlRJVElFUyA9IHBhcnNlci5zdHJpY3RFbnRpdGllcyA/IE9iamVjdC5jcmVhdGUoc2F4LlhNTF9FTlRJVElFUykgOiBPYmplY3QuY3JlYXRlKHNheC5FTlRJVElFUylcbiAgICBwYXJzZXIuYXR0cmliTGlzdCA9IFtdXG5cbiAgICAvLyBuYW1lc3BhY2VzIGZvcm0gYSBwcm90b3R5cGUgY2hhaW4uXG4gICAgLy8gaXQgYWx3YXlzIHBvaW50cyBhdCB0aGUgY3VycmVudCB0YWcsXG4gICAgLy8gd2hpY2ggcHJvdG9zIHRvIGl0cyBwYXJlbnQgdGFnLlxuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICBwYXJzZXIubnMgPSBPYmplY3QuY3JlYXRlKHJvb3ROUylcbiAgICB9XG5cbiAgICAvLyBtb3N0bHkganVzdCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAgcGFyc2VyLnRyYWNrUG9zaXRpb24gPSBwYXJzZXIub3B0LnBvc2l0aW9uICE9PSBmYWxzZVxuICAgIGlmIChwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gcGFyc2VyLmxpbmUgPSBwYXJzZXIuY29sdW1uID0gMFxuICAgIH1cbiAgICBlbWl0KHBhcnNlciwgJ29ucmVhZHknKVxuICB9XG5cbiAgaWYgKCFPYmplY3QuY3JlYXRlKSB7XG4gICAgT2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICBmdW5jdGlvbiBGICgpIHt9XG4gICAgICBGLnByb3RvdHlwZSA9IG9cbiAgICAgIHZhciBuZXdmID0gbmV3IEYoKVxuICAgICAgcmV0dXJuIG5ld2ZcbiAgICB9XG4gIH1cblxuICBpZiAoIU9iamVjdC5rZXlzKSB7XG4gICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGEgPSBbXVxuICAgICAgZm9yICh2YXIgaSBpbiBvKSBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgYS5wdXNoKGkpXG4gICAgICByZXR1cm4gYVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQnVmZmVyTGVuZ3RoIChwYXJzZXIpIHtcbiAgICB2YXIgbWF4QWxsb3dlZCA9IE1hdGgubWF4KHNheC5NQVhfQlVGRkVSX0xFTkdUSCwgMTApXG4gICAgdmFyIG1heEFjdHVhbCA9IDBcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGJ1ZmZlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgbGVuID0gcGFyc2VyW2J1ZmZlcnNbaV1dLmxlbmd0aFxuICAgICAgaWYgKGxlbiA+IG1heEFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGV4dC9jZGF0YSBub2RlcyBjYW4gZ2V0IGJpZywgYW5kIHNpbmNlIHRoZXkncmUgYnVmZmVyZWQsXG4gICAgICAgIC8vIHdlIGNhbiBnZXQgaGVyZSB1bmRlciBub3JtYWwgY29uZGl0aW9ucy5cbiAgICAgICAgLy8gQXZvaWQgaXNzdWVzIGJ5IGVtaXR0aW5nIHRoZSB0ZXh0IG5vZGUgbm93LFxuICAgICAgICAvLyBzbyBhdCBsZWFzdCBpdCB3b24ndCBnZXQgYW55IGJpZ2dlci5cbiAgICAgICAgc3dpdGNoIChidWZmZXJzW2ldKSB7XG4gICAgICAgICAgY2FzZSAndGV4dE5vZGUnOlxuICAgICAgICAgICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdjZGF0YSc6XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNkYXRhJywgcGFyc2VyLmNkYXRhKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdzY3JpcHQnOlxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zY3JpcHQnLCBwYXJzZXIuc2NyaXB0KVxuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCA9ICcnXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKHBhcnNlciwgJ01heCBidWZmZXIgbGVuZ3RoIGV4Y2VlZGVkOiAnICsgYnVmZmVyc1tpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4QWN0dWFsID0gTWF0aC5tYXgobWF4QWN0dWFsLCBsZW4pXG4gICAgfVxuICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IGNoZWNrIGZvciB0aGUgZWFybGllc3QgcG9zc2libGUgYnVmZmVyIG92ZXJydW4uXG4gICAgdmFyIG0gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEggLSBtYXhBY3R1YWxcbiAgICBwYXJzZXIuYnVmZmVyQ2hlY2tQb3NpdGlvbiA9IG0gKyBwYXJzZXIucG9zaXRpb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQnVmZmVycyAocGFyc2VyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBidWZmZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcGFyc2VyW2J1ZmZlcnNbaV1dID0gJydcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaEJ1ZmZlcnMgKHBhcnNlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci5jZGF0YSAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgIH1cbiAgICBpZiAocGFyc2VyLnNjcmlwdCAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIFNBWFBhcnNlci5wcm90b3R5cGUgPSB7XG4gICAgZW5kOiBmdW5jdGlvbiAoKSB7IGVuZCh0aGlzKSB9LFxuICAgIHdyaXRlOiB3cml0ZSxcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpIHsgdGhpcy5lcnJvciA9IG51bGw7IHJldHVybiB0aGlzIH0sXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMud3JpdGUobnVsbCkgfSxcbiAgICBmbHVzaDogZnVuY3Rpb24gKCkgeyBmbHVzaEJ1ZmZlcnModGhpcykgfVxuICB9XG5cbiAgdmFyIFN0cmVhbVxuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuICB9IGNhdGNoIChleCkge1xuICAgIFN0cmVhbSA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICB2YXIgc3RyZWFtV3JhcHMgPSBzYXguRVZFTlRTLmZpbHRlcihmdW5jdGlvbiAoZXYpIHtcbiAgICByZXR1cm4gZXYgIT09ICdlcnJvcicgJiYgZXYgIT09ICdlbmQnXG4gIH0pXG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIHJldHVybiBuZXcgU0FYU3RyZWFtKHN0cmljdCwgb3B0KVxuICB9XG5cbiAgZnVuY3Rpb24gU0FYU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhTdHJlYW0pKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFN0cmVhbShzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICBTdHJlYW0uYXBwbHkodGhpcylcblxuICAgIHRoaXMuX3BhcnNlciA9IG5ldyBTQVhQYXJzZXIoc3RyaWN0LCBvcHQpXG4gICAgdGhpcy53cml0YWJsZSA9IHRydWVcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgdmFyIG1lID0gdGhpc1xuXG4gICAgdGhpcy5fcGFyc2VyLm9uZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuZW1pdCgnZW5kJylcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIub25lcnJvciA9IGZ1bmN0aW9uIChlcikge1xuICAgICAgbWUuZW1pdCgnZXJyb3InLCBlcilcblxuICAgICAgLy8gaWYgZGlkbid0IHRocm93LCB0aGVuIG1lYW5zIGVycm9yIHdhcyBoYW5kbGVkLlxuICAgICAgLy8gZ28gYWhlYWQgYW5kIGNsZWFyIGVycm9yLCBzbyB3ZSBjYW4gd3JpdGUgYWdhaW4uXG4gICAgICBtZS5fcGFyc2VyLmVycm9yID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX2RlY29kZXIgPSBudWxsXG5cbiAgICBzdHJlYW1XcmFwcy5mb3JFYWNoKGZ1bmN0aW9uIChldikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCAnb24nICsgZXYsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lLl9wYXJzZXJbJ29uJyArIGV2XVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChoKSB7XG4gICAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgICBtZS5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpXG4gICAgICAgICAgICBtZS5fcGFyc2VyWydvbicgKyBldl0gPSBoXG4gICAgICAgICAgICByZXR1cm4gaFxuICAgICAgICAgIH1cbiAgICAgICAgICBtZS5vbihldiwgaClcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogU0FYU3RyZWFtXG4gICAgfVxuICB9KVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgIGlmICghdGhpcy5fZGVjb2Rlcikge1xuICAgICAgICB2YXIgU0QgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcbiAgICAgICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTRCgndXRmOCcpXG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy5fZGVjb2Rlci53cml0ZShkYXRhKVxuICAgIH1cblxuICAgIHRoaXMuX3BhcnNlci53cml0ZShkYXRhLnRvU3RyaW5nKCkpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICB0aGlzLndyaXRlKGNodW5rKVxuICAgIH1cbiAgICB0aGlzLl9wYXJzZXIuZW5kKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgaGFuZGxlcikge1xuICAgIHZhciBtZSA9IHRoaXNcbiAgICBpZiAoIW1lLl9wYXJzZXJbJ29uJyArIGV2XSAmJiBzdHJlYW1XcmFwcy5pbmRleE9mKGV2KSAhPT0gLTEpIHtcbiAgICAgIG1lLl9wYXJzZXJbJ29uJyArIGV2XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gW2FyZ3VtZW50c1swXV0gOiBBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgICAgIGFyZ3Muc3BsaWNlKDAsIDAsIGV2KVxuICAgICAgICBtZS5lbWl0LmFwcGx5KG1lLCBhcmdzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwobWUsIGV2LCBoYW5kbGVyKVxuICB9XG5cbiAgLy8gdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBjaGFyYWN0ZXIgY2xhc3Nlcy5cbiAgLy8gWE1MIGFsbG93cyBhbGwgbWFubmVyIG9mIHJpZGljdWxvdXMgbnVtYmVycyBhbmQgZGlnaXRzLlxuICB2YXIgQ0RBVEEgPSAnW0NEQVRBWydcbiAgdmFyIERPQ1RZUEUgPSAnRE9DVFlQRSdcbiAgdmFyIFhNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJ1xuICB2YXIgWE1MTlNfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJ1xuICB2YXIgcm9vdE5TID0geyB4bWw6IFhNTF9OQU1FU1BBQ0UsIHhtbG5zOiBYTUxOU19OQU1FU1BBQ0UgfVxuXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI05ULU5hbWVTdGFydENoYXJcbiAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBvbiBzdHJpbmdzLCBhIHNpbmdsZSBjaGFyYWN0ZXIgYXQgYSB0aW1lXG4gIC8vIGFzIHN1Y2gsIGl0IGNhbm5vdCBldmVyIHN1cHBvcnQgYXN0cmFsLXBsYW5lIGNoYXJhY3RlcnMgKDEwMDAwLUVGRkZGKVxuICAvLyB3aXRob3V0IGEgc2lnbmlmaWNhbnQgYnJlYWtpbmcgY2hhbmdlIHRvIGVpdGhlciB0aGlzICBwYXJzZXIsIG9yIHRoZVxuICAvLyBKYXZhU2NyaXB0IGxhbmd1YWdlLiAgSW1wbGVtZW50YXRpb24gb2YgYW4gZW1vamktY2FwYWJsZSB4bWwgcGFyc2VyXG4gIC8vIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuXG4gIHZhciBuYW1lU3RhcnQgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS9cblxuICB2YXIgbmFtZUJvZHkgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MC5cXGQtXS9cblxuICB2YXIgZW50aXR5U3RhcnQgPSAvWyM6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF0vXG4gIHZhciBlbnRpdHlCb2R5ID0gL1sjOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwLlxcZC1dL1xuXG4gIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAoYykge1xuICAgIHJldHVybiBjID09PSAnICcgfHwgYyA9PT0gJ1xcbicgfHwgYyA9PT0gJ1xccicgfHwgYyA9PT0gJ1xcdCdcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUXVvdGUgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJ1wiJyB8fCBjID09PSAnXFwnJ1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBdHRyaWJFbmQgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJz4nIHx8IGlzV2hpdGVzcGFjZShjKVxuICB9XG5cbiAgZnVuY3Rpb24gaXNNYXRjaCAocmVnZXgsIGMpIHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChjKVxuICB9XG5cbiAgZnVuY3Rpb24gbm90TWF0Y2ggKHJlZ2V4LCBjKSB7XG4gICAgcmV0dXJuICFpc01hdGNoKHJlZ2V4LCBjKVxuICB9XG5cbiAgdmFyIFMgPSAwXG4gIHNheC5TVEFURSA9IHtcbiAgICBCRUdJTjogUysrLCAvLyBsZWFkaW5nIGJ5dGUgb3JkZXIgbWFyayBvciB3aGl0ZXNwYWNlXG4gICAgQkVHSU5fV0hJVEVTUEFDRTogUysrLCAvLyBsZWFkaW5nIHdoaXRlc3BhY2VcbiAgICBURVhUOiBTKyssIC8vIGdlbmVyYWwgc3R1ZmZcbiAgICBURVhUX0VOVElUWTogUysrLCAvLyAmYW1wIGFuZCBzdWNoLlxuICAgIE9QRU5fV0FLQTogUysrLCAvLyA8XG4gICAgU0dNTF9ERUNMOiBTKyssIC8vIDwhQkxBUkdcbiAgICBTR01MX0RFQ0xfUVVPVEVEOiBTKyssIC8vIDwhQkxBUkcgZm9vIFwiYmFyXG4gICAgRE9DVFlQRTogUysrLCAvLyA8IURPQ1RZUEVcbiAgICBET0NUWVBFX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcbiAgICBET0NUWVBFX0RURDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIC4uLlxuICAgIERPQ1RZUEVfRFREX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIFwiZm9vXG4gICAgQ09NTUVOVF9TVEFSVElORzogUysrLCAvLyA8IS1cbiAgICBDT01NRU5UOiBTKyssIC8vIDwhLS1cbiAgICBDT01NRU5UX0VORElORzogUysrLCAvLyA8IS0tIGJsYWggLVxuICAgIENPTU1FTlRfRU5ERUQ6IFMrKywgLy8gPCEtLSBibGFoIC0tXG4gICAgQ0RBVEE6IFMrKywgLy8gPCFbQ0RBVEFbIHNvbWV0aGluZ1xuICAgIENEQVRBX0VORElORzogUysrLCAvLyBdXG4gICAgQ0RBVEFfRU5ESU5HXzI6IFMrKywgLy8gXV1cbiAgICBQUk9DX0lOU1Q6IFMrKywgLy8gPD9oaVxuICAgIFBST0NfSU5TVF9CT0RZOiBTKyssIC8vIDw/aGkgdGhlcmVcbiAgICBQUk9DX0lOU1RfRU5ESU5HOiBTKyssIC8vIDw/aGkgXCJ0aGVyZVwiID9cbiAgICBPUEVOX1RBRzogUysrLCAvLyA8c3Ryb25nXG4gICAgT1BFTl9UQUdfU0xBU0g6IFMrKywgLy8gPHN0cm9uZyAvXG4gICAgQVRUUklCOiBTKyssIC8vIDxhXG4gICAgQVRUUklCX05BTUU6IFMrKywgLy8gPGEgZm9vXG4gICAgQVRUUklCX05BTUVfU0FXX1dISVRFOiBTKyssIC8vIDxhIGZvbyBfXG4gICAgQVRUUklCX1ZBTFVFOiBTKyssIC8vIDxhIGZvbz1cbiAgICBBVFRSSUJfVkFMVUVfUVVPVEVEOiBTKyssIC8vIDxhIGZvbz1cImJhclxuICAgIEFUVFJJQl9WQUxVRV9DTE9TRUQ6IFMrKywgLy8gPGEgZm9vPVwiYmFyXCJcbiAgICBBVFRSSUJfVkFMVUVfVU5RVU9URUQ6IFMrKywgLy8gPGEgZm9vPWJhclxuICAgIEFUVFJJQl9WQUxVRV9FTlRJVFlfUTogUysrLCAvLyA8Zm9vIGJhcj1cIiZxdW90O1wiXG4gICAgQVRUUklCX1ZBTFVFX0VOVElUWV9VOiBTKyssIC8vIDxmb28gYmFyPSZxdW90XG4gICAgQ0xPU0VfVEFHOiBTKyssIC8vIDwvYVxuICAgIENMT1NFX1RBR19TQVdfV0hJVEU6IFMrKywgLy8gPC9hICAgPlxuICAgIFNDUklQVDogUysrLCAvLyA8c2NyaXB0PiAuLi5cbiAgICBTQ1JJUFRfRU5ESU5HOiBTKysgLy8gPHNjcmlwdD4gLi4uIDxcbiAgfVxuXG4gIHNheC5YTUxfRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiXG4gIH1cblxuICBzYXguRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiLFxuICAgICdBRWxpZyc6IDE5OCxcbiAgICAnQWFjdXRlJzogMTkzLFxuICAgICdBY2lyYyc6IDE5NCxcbiAgICAnQWdyYXZlJzogMTkyLFxuICAgICdBcmluZyc6IDE5NyxcbiAgICAnQXRpbGRlJzogMTk1LFxuICAgICdBdW1sJzogMTk2LFxuICAgICdDY2VkaWwnOiAxOTksXG4gICAgJ0VUSCc6IDIwOCxcbiAgICAnRWFjdXRlJzogMjAxLFxuICAgICdFY2lyYyc6IDIwMixcbiAgICAnRWdyYXZlJzogMjAwLFxuICAgICdFdW1sJzogMjAzLFxuICAgICdJYWN1dGUnOiAyMDUsXG4gICAgJ0ljaXJjJzogMjA2LFxuICAgICdJZ3JhdmUnOiAyMDQsXG4gICAgJ0l1bWwnOiAyMDcsXG4gICAgJ050aWxkZSc6IDIwOSxcbiAgICAnT2FjdXRlJzogMjExLFxuICAgICdPY2lyYyc6IDIxMixcbiAgICAnT2dyYXZlJzogMjEwLFxuICAgICdPc2xhc2gnOiAyMTYsXG4gICAgJ090aWxkZSc6IDIxMyxcbiAgICAnT3VtbCc6IDIxNCxcbiAgICAnVEhPUk4nOiAyMjIsXG4gICAgJ1VhY3V0ZSc6IDIxOCxcbiAgICAnVWNpcmMnOiAyMTksXG4gICAgJ1VncmF2ZSc6IDIxNyxcbiAgICAnVXVtbCc6IDIyMCxcbiAgICAnWWFjdXRlJzogMjIxLFxuICAgICdhYWN1dGUnOiAyMjUsXG4gICAgJ2FjaXJjJzogMjI2LFxuICAgICdhZWxpZyc6IDIzMCxcbiAgICAnYWdyYXZlJzogMjI0LFxuICAgICdhcmluZyc6IDIyOSxcbiAgICAnYXRpbGRlJzogMjI3LFxuICAgICdhdW1sJzogMjI4LFxuICAgICdjY2VkaWwnOiAyMzEsXG4gICAgJ2VhY3V0ZSc6IDIzMyxcbiAgICAnZWNpcmMnOiAyMzQsXG4gICAgJ2VncmF2ZSc6IDIzMixcbiAgICAnZXRoJzogMjQwLFxuICAgICdldW1sJzogMjM1LFxuICAgICdpYWN1dGUnOiAyMzcsXG4gICAgJ2ljaXJjJzogMjM4LFxuICAgICdpZ3JhdmUnOiAyMzYsXG4gICAgJ2l1bWwnOiAyMzksXG4gICAgJ250aWxkZSc6IDI0MSxcbiAgICAnb2FjdXRlJzogMjQzLFxuICAgICdvY2lyYyc6IDI0NCxcbiAgICAnb2dyYXZlJzogMjQyLFxuICAgICdvc2xhc2gnOiAyNDgsXG4gICAgJ290aWxkZSc6IDI0NSxcbiAgICAnb3VtbCc6IDI0NixcbiAgICAnc3psaWcnOiAyMjMsXG4gICAgJ3Rob3JuJzogMjU0LFxuICAgICd1YWN1dGUnOiAyNTAsXG4gICAgJ3VjaXJjJzogMjUxLFxuICAgICd1Z3JhdmUnOiAyNDksXG4gICAgJ3V1bWwnOiAyNTIsXG4gICAgJ3lhY3V0ZSc6IDI1MyxcbiAgICAneXVtbCc6IDI1NSxcbiAgICAnY29weSc6IDE2OSxcbiAgICAncmVnJzogMTc0LFxuICAgICduYnNwJzogMTYwLFxuICAgICdpZXhjbCc6IDE2MSxcbiAgICAnY2VudCc6IDE2MixcbiAgICAncG91bmQnOiAxNjMsXG4gICAgJ2N1cnJlbic6IDE2NCxcbiAgICAneWVuJzogMTY1LFxuICAgICdicnZiYXInOiAxNjYsXG4gICAgJ3NlY3QnOiAxNjcsXG4gICAgJ3VtbCc6IDE2OCxcbiAgICAnb3JkZic6IDE3MCxcbiAgICAnbGFxdW8nOiAxNzEsXG4gICAgJ25vdCc6IDE3MixcbiAgICAnc2h5JzogMTczLFxuICAgICdtYWNyJzogMTc1LFxuICAgICdkZWcnOiAxNzYsXG4gICAgJ3BsdXNtbic6IDE3NyxcbiAgICAnc3VwMSc6IDE4NSxcbiAgICAnc3VwMic6IDE3OCxcbiAgICAnc3VwMyc6IDE3OSxcbiAgICAnYWN1dGUnOiAxODAsXG4gICAgJ21pY3JvJzogMTgxLFxuICAgICdwYXJhJzogMTgyLFxuICAgICdtaWRkb3QnOiAxODMsXG4gICAgJ2NlZGlsJzogMTg0LFxuICAgICdvcmRtJzogMTg2LFxuICAgICdyYXF1byc6IDE4NyxcbiAgICAnZnJhYzE0JzogMTg4LFxuICAgICdmcmFjMTInOiAxODksXG4gICAgJ2ZyYWMzNCc6IDE5MCxcbiAgICAnaXF1ZXN0JzogMTkxLFxuICAgICd0aW1lcyc6IDIxNSxcbiAgICAnZGl2aWRlJzogMjQ3LFxuICAgICdPRWxpZyc6IDMzOCxcbiAgICAnb2VsaWcnOiAzMzksXG4gICAgJ1NjYXJvbic6IDM1MixcbiAgICAnc2Nhcm9uJzogMzUzLFxuICAgICdZdW1sJzogMzc2LFxuICAgICdmbm9mJzogNDAyLFxuICAgICdjaXJjJzogNzEwLFxuICAgICd0aWxkZSc6IDczMixcbiAgICAnQWxwaGEnOiA5MTMsXG4gICAgJ0JldGEnOiA5MTQsXG4gICAgJ0dhbW1hJzogOTE1LFxuICAgICdEZWx0YSc6IDkxNixcbiAgICAnRXBzaWxvbic6IDkxNyxcbiAgICAnWmV0YSc6IDkxOCxcbiAgICAnRXRhJzogOTE5LFxuICAgICdUaGV0YSc6IDkyMCxcbiAgICAnSW90YSc6IDkyMSxcbiAgICAnS2FwcGEnOiA5MjIsXG4gICAgJ0xhbWJkYSc6IDkyMyxcbiAgICAnTXUnOiA5MjQsXG4gICAgJ051JzogOTI1LFxuICAgICdYaSc6IDkyNixcbiAgICAnT21pY3Jvbic6IDkyNyxcbiAgICAnUGknOiA5MjgsXG4gICAgJ1Jobyc6IDkyOSxcbiAgICAnU2lnbWEnOiA5MzEsXG4gICAgJ1RhdSc6IDkzMixcbiAgICAnVXBzaWxvbic6IDkzMyxcbiAgICAnUGhpJzogOTM0LFxuICAgICdDaGknOiA5MzUsXG4gICAgJ1BzaSc6IDkzNixcbiAgICAnT21lZ2EnOiA5MzcsXG4gICAgJ2FscGhhJzogOTQ1LFxuICAgICdiZXRhJzogOTQ2LFxuICAgICdnYW1tYSc6IDk0NyxcbiAgICAnZGVsdGEnOiA5NDgsXG4gICAgJ2Vwc2lsb24nOiA5NDksXG4gICAgJ3pldGEnOiA5NTAsXG4gICAgJ2V0YSc6IDk1MSxcbiAgICAndGhldGEnOiA5NTIsXG4gICAgJ2lvdGEnOiA5NTMsXG4gICAgJ2thcHBhJzogOTU0LFxuICAgICdsYW1iZGEnOiA5NTUsXG4gICAgJ211JzogOTU2LFxuICAgICdudSc6IDk1NyxcbiAgICAneGknOiA5NTgsXG4gICAgJ29taWNyb24nOiA5NTksXG4gICAgJ3BpJzogOTYwLFxuICAgICdyaG8nOiA5NjEsXG4gICAgJ3NpZ21hZic6IDk2MixcbiAgICAnc2lnbWEnOiA5NjMsXG4gICAgJ3RhdSc6IDk2NCxcbiAgICAndXBzaWxvbic6IDk2NSxcbiAgICAncGhpJzogOTY2LFxuICAgICdjaGknOiA5NjcsXG4gICAgJ3BzaSc6IDk2OCxcbiAgICAnb21lZ2EnOiA5NjksXG4gICAgJ3RoZXRhc3ltJzogOTc3LFxuICAgICd1cHNpaCc6IDk3OCxcbiAgICAncGl2JzogOTgyLFxuICAgICdlbnNwJzogODE5NCxcbiAgICAnZW1zcCc6IDgxOTUsXG4gICAgJ3RoaW5zcCc6IDgyMDEsXG4gICAgJ3p3bmonOiA4MjA0LFxuICAgICd6d2onOiA4MjA1LFxuICAgICdscm0nOiA4MjA2LFxuICAgICdybG0nOiA4MjA3LFxuICAgICduZGFzaCc6IDgyMTEsXG4gICAgJ21kYXNoJzogODIxMixcbiAgICAnbHNxdW8nOiA4MjE2LFxuICAgICdyc3F1byc6IDgyMTcsXG4gICAgJ3NicXVvJzogODIxOCxcbiAgICAnbGRxdW8nOiA4MjIwLFxuICAgICdyZHF1byc6IDgyMjEsXG4gICAgJ2JkcXVvJzogODIyMixcbiAgICAnZGFnZ2VyJzogODIyNCxcbiAgICAnRGFnZ2VyJzogODIyNSxcbiAgICAnYnVsbCc6IDgyMjYsXG4gICAgJ2hlbGxpcCc6IDgyMzAsXG4gICAgJ3Blcm1pbCc6IDgyNDAsXG4gICAgJ3ByaW1lJzogODI0MixcbiAgICAnUHJpbWUnOiA4MjQzLFxuICAgICdsc2FxdW8nOiA4MjQ5LFxuICAgICdyc2FxdW8nOiA4MjUwLFxuICAgICdvbGluZSc6IDgyNTQsXG4gICAgJ2ZyYXNsJzogODI2MCxcbiAgICAnZXVybyc6IDgzNjQsXG4gICAgJ2ltYWdlJzogODQ2NSxcbiAgICAnd2VpZXJwJzogODQ3MixcbiAgICAncmVhbCc6IDg0NzYsXG4gICAgJ3RyYWRlJzogODQ4MixcbiAgICAnYWxlZnN5bSc6IDg1MDEsXG4gICAgJ2xhcnInOiA4NTkyLFxuICAgICd1YXJyJzogODU5MyxcbiAgICAncmFycic6IDg1OTQsXG4gICAgJ2RhcnInOiA4NTk1LFxuICAgICdoYXJyJzogODU5NixcbiAgICAnY3JhcnInOiA4NjI5LFxuICAgICdsQXJyJzogODY1NixcbiAgICAndUFycic6IDg2NTcsXG4gICAgJ3JBcnInOiA4NjU4LFxuICAgICdkQXJyJzogODY1OSxcbiAgICAnaEFycic6IDg2NjAsXG4gICAgJ2ZvcmFsbCc6IDg3MDQsXG4gICAgJ3BhcnQnOiA4NzA2LFxuICAgICdleGlzdCc6IDg3MDcsXG4gICAgJ2VtcHR5JzogODcwOSxcbiAgICAnbmFibGEnOiA4NzExLFxuICAgICdpc2luJzogODcxMixcbiAgICAnbm90aW4nOiA4NzEzLFxuICAgICduaSc6IDg3MTUsXG4gICAgJ3Byb2QnOiA4NzE5LFxuICAgICdzdW0nOiA4NzIxLFxuICAgICdtaW51cyc6IDg3MjIsXG4gICAgJ2xvd2FzdCc6IDg3MjcsXG4gICAgJ3JhZGljJzogODczMCxcbiAgICAncHJvcCc6IDg3MzMsXG4gICAgJ2luZmluJzogODczNCxcbiAgICAnYW5nJzogODczNixcbiAgICAnYW5kJzogODc0MyxcbiAgICAnb3InOiA4NzQ0LFxuICAgICdjYXAnOiA4NzQ1LFxuICAgICdjdXAnOiA4NzQ2LFxuICAgICdpbnQnOiA4NzQ3LFxuICAgICd0aGVyZTQnOiA4NzU2LFxuICAgICdzaW0nOiA4NzY0LFxuICAgICdjb25nJzogODc3MyxcbiAgICAnYXN5bXAnOiA4Nzc2LFxuICAgICduZSc6IDg4MDAsXG4gICAgJ2VxdWl2JzogODgwMSxcbiAgICAnbGUnOiA4ODA0LFxuICAgICdnZSc6IDg4MDUsXG4gICAgJ3N1Yic6IDg4MzQsXG4gICAgJ3N1cCc6IDg4MzUsXG4gICAgJ25zdWInOiA4ODM2LFxuICAgICdzdWJlJzogODgzOCxcbiAgICAnc3VwZSc6IDg4MzksXG4gICAgJ29wbHVzJzogODg1MyxcbiAgICAnb3RpbWVzJzogODg1NSxcbiAgICAncGVycCc6IDg4NjksXG4gICAgJ3Nkb3QnOiA4OTAxLFxuICAgICdsY2VpbCc6IDg5NjgsXG4gICAgJ3JjZWlsJzogODk2OSxcbiAgICAnbGZsb29yJzogODk3MCxcbiAgICAncmZsb29yJzogODk3MSxcbiAgICAnbGFuZyc6IDkwMDEsXG4gICAgJ3JhbmcnOiA5MDAyLFxuICAgICdsb3onOiA5Njc0LFxuICAgICdzcGFkZXMnOiA5ODI0LFxuICAgICdjbHVicyc6IDk4MjcsXG4gICAgJ2hlYXJ0cyc6IDk4MjksXG4gICAgJ2RpYW1zJzogOTgzMFxuICB9XG5cbiAgT2JqZWN0LmtleXMoc2F4LkVOVElUSUVTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZSA9IHNheC5FTlRJVElFU1trZXldXG4gICAgdmFyIHMgPSB0eXBlb2YgZSA9PT0gJ251bWJlcicgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpIDogZVxuICAgIHNheC5FTlRJVElFU1trZXldID0gc1xuICB9KVxuXG4gIGZvciAodmFyIHMgaW4gc2F4LlNUQVRFKSB7XG4gICAgc2F4LlNUQVRFW3NheC5TVEFURVtzXV0gPSBzXG4gIH1cblxuICAvLyBzaG9ydGhhbmRcbiAgUyA9IHNheC5TVEFURVxuXG4gIGZ1bmN0aW9uIGVtaXQgKHBhcnNlciwgZXZlbnQsIGRhdGEpIHtcbiAgICBwYXJzZXJbZXZlbnRdICYmIHBhcnNlcltldmVudF0oZGF0YSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXROb2RlIChwYXJzZXIsIG5vZGVUeXBlLCBkYXRhKSB7XG4gICAgaWYgKHBhcnNlci50ZXh0Tm9kZSkgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBlbWl0KHBhcnNlciwgbm9kZVR5cGUsIGRhdGEpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVRleHQgKHBhcnNlcikge1xuICAgIHBhcnNlci50ZXh0Tm9kZSA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBpZiAocGFyc2VyLnRleHROb2RlKSBlbWl0KHBhcnNlciwgJ29udGV4dCcsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBwYXJzZXIudGV4dE5vZGUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dG9wdHMgKG9wdCwgdGV4dCkge1xuICAgIGlmIChvcHQudHJpbSkgdGV4dCA9IHRleHQudHJpbSgpXG4gICAgaWYgKG9wdC5ub3JtYWxpemUpIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgIHJldHVybiB0ZXh0XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciAocGFyc2VyLCBlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICBlciArPSAnXFxuTGluZTogJyArIHBhcnNlci5saW5lICtcbiAgICAgICAgJ1xcbkNvbHVtbjogJyArIHBhcnNlci5jb2x1bW4gK1xuICAgICAgICAnXFxuQ2hhcjogJyArIHBhcnNlci5jXG4gICAgfVxuICAgIGVyID0gbmV3IEVycm9yKGVyKVxuICAgIHBhcnNlci5lcnJvciA9IGVyXG4gICAgZW1pdChwYXJzZXIsICdvbmVycm9yJywgZXIpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gZW5kIChwYXJzZXIpIHtcbiAgICBpZiAocGFyc2VyLnNhd1Jvb3QgJiYgIXBhcnNlci5jbG9zZWRSb290KSBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuY2xvc2VkIHJvb3QgdGFnJylcbiAgICBpZiAoKHBhcnNlci5zdGF0ZSAhPT0gUy5CRUdJTikgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuQkVHSU5fV0hJVEVTUEFDRSkgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuVEVYVCkpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgJ1VuZXhwZWN0ZWQgZW5kJylcbiAgICB9XG4gICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmNsb3NlZCA9IHRydWVcbiAgICBlbWl0KHBhcnNlciwgJ29uZW5kJylcbiAgICBTQVhQYXJzZXIuY2FsbChwYXJzZXIsIHBhcnNlci5zdHJpY3QsIHBhcnNlci5vcHQpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaWN0RmFpbCAocGFyc2VyLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJzZXIgIT09ICdvYmplY3QnIHx8ICEocGFyc2VyIGluc3RhbmNlb2YgU0FYUGFyc2VyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2FsbCB0byBzdHJpY3RGYWlsJylcbiAgICB9XG4gICAgaWYgKHBhcnNlci5zdHJpY3QpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgbWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnN0cmljdCkgcGFyc2VyLnRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVtwYXJzZXIubG9vc2VDYXNlXSgpXG4gICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0geyBuYW1lOiBwYXJzZXIudGFnTmFtZSwgYXR0cmlidXRlczoge30gfVxuXG4gICAgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGlmIHRhZyBjb250YWlscyBhbiB4bWxucz1cImZvb1wiIG9yIHhtbG5zOmZvbz1cImJhclwiXG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIHRhZy5ucyA9IHBhcmVudC5uc1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVudGFnc3RhcnQnLCB0YWcpXG4gIH1cblxuICBmdW5jdGlvbiBxbmFtZSAobmFtZSwgYXR0cmlidXRlKSB7XG4gICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoJzonKVxuICAgIHZhciBxdWFsTmFtZSA9IGkgPCAwID8gWyAnJywgbmFtZSBdIDogbmFtZS5zcGxpdCgnOicpXG4gICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lWzBdXG4gICAgdmFyIGxvY2FsID0gcXVhbE5hbWVbMV1cblxuICAgIC8vIDx4IFwieG1sbnNcIj1cImh0dHA6Ly9mb29cIj5cbiAgICBpZiAoYXR0cmlidXRlICYmIG5hbWUgPT09ICd4bWxucycpIHtcbiAgICAgIHByZWZpeCA9ICd4bWxucydcbiAgICAgIGxvY2FsID0gJydcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcmVmaXg6IHByZWZpeCwgbG9jYWw6IGxvY2FsIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJpYiAocGFyc2VyKSB7XG4gICAgaWYgKCFwYXJzZXIuc3RyaWN0KSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJOYW1lW3BhcnNlci5sb29zZUNhc2VdKClcbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLmF0dHJpYkxpc3QuaW5kZXhPZihwYXJzZXIuYXR0cmliTmFtZSkgIT09IC0xIHx8XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocGFyc2VyLmF0dHJpYk5hbWUpKSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLmF0dHJpYk5hbWUsIHRydWUpXG4gICAgICB2YXIgcHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB2YXIgbG9jYWwgPSBxbi5sb2NhbFxuXG4gICAgICBpZiAocHJlZml4ID09PSAneG1sbnMnKSB7XG4gICAgICAgIC8vIG5hbWVzcGFjZSBiaW5kaW5nIGF0dHJpYnV0ZS4gcHVzaCB0aGUgYmluZGluZyBpbnRvIHNjb3BlXG4gICAgICAgIGlmIChsb2NhbCA9PT0gJ3htbCcgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsXG4gICAgICAgICAgICAneG1sOiBwcmVmaXggbXVzdCBiZSBib3VuZCB0byAnICsgWE1MX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWwgPT09ICd4bWxucycgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxOU19OQU1FU1BBQ0UpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlcixcbiAgICAgICAgICAgICd4bWxuczogcHJlZml4IG11c3QgYmUgYm91bmQgdG8gJyArIFhNTE5TX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgICAgICAgaWYgKHRhZy5ucyA9PT0gcGFyZW50Lm5zKSB7XG4gICAgICAgICAgICB0YWcubnMgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5ucylcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFnLm5zW2xvY2FsXSA9IHBhcnNlci5hdHRyaWJWYWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZmVyIG9uYXR0cmlidXRlIGV2ZW50cyB1bnRpbCBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2VlblxuICAgICAgLy8gc28gYW55IG5ldyBiaW5kaW5ncyBjYW4gdGFrZSBlZmZlY3QuIHByZXNlcnZlIGF0dHJpYnV0ZSBvcmRlclxuICAgICAgLy8gc28gZGVmZXJyZWQgZXZlbnRzIGNhbiBiZSBlbWl0dGVkIGluIGRvY3VtZW50IG9yZGVyXG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5wdXNoKFtwYXJzZXIuYXR0cmliTmFtZSwgcGFyc2VyLmF0dHJpYlZhbHVlXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gbm9uLXhtbG5zIG1vZGUsIHdlIGNhbiBlbWl0IHRoZSBldmVudCByaWdodCBhd2F5XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXNbcGFyc2VyLmF0dHJpYk5hbWVdID0gcGFyc2VyLmF0dHJpYlZhbHVlXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIHtcbiAgICAgICAgbmFtZTogcGFyc2VyLmF0dHJpYk5hbWUsXG4gICAgICAgIHZhbHVlOiBwYXJzZXIuYXR0cmliVmFsdWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblRhZyAocGFyc2VyLCBzZWxmQ2xvc2luZykge1xuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICAvLyBlbWl0IG5hbWVzcGFjZSBiaW5kaW5nIGV2ZW50c1xuICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcblxuICAgICAgLy8gYWRkIG5hbWVzcGFjZSBpbmZvIHRvIHRhZ1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLnRhZ05hbWUpXG4gICAgICB0YWcucHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB0YWcubG9jYWwgPSBxbi5sb2NhbFxuICAgICAgdGFnLnVyaSA9IHRhZy5uc1txbi5wcmVmaXhdIHx8ICcnXG5cbiAgICAgIGlmICh0YWcucHJlZml4ICYmICF0YWcudXJpKSB7XG4gICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5ib3VuZCBuYW1lc3BhY2UgcHJlZml4OiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJzZXIudGFnTmFtZSkpXG4gICAgICAgIHRhZy51cmkgPSBxbi5wcmVmaXhcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHRhZy5ucyAmJiBwYXJlbnQubnMgIT09IHRhZy5ucykge1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW5uYW1lc3BhY2UnLCB7XG4gICAgICAgICAgICBwcmVmaXg6IHAsXG4gICAgICAgICAgICB1cmk6IHRhZy5uc1twXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBkZWZlcnJlZCBvbmF0dHJpYnV0ZSBldmVudHNcbiAgICAgIC8vIE5vdGU6IGRvIG5vdCBhcHBseSBkZWZhdWx0IG5zIHRvIGF0dHJpYnV0ZXM6XG4gICAgICAvLyAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI2RlZmF1bHRpbmdcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBudiA9IHBhcnNlci5hdHRyaWJMaXN0W2ldXG4gICAgICAgIHZhciBuYW1lID0gbnZbMF1cbiAgICAgICAgdmFyIHZhbHVlID0gbnZbMV1cbiAgICAgICAgdmFyIHF1YWxOYW1lID0gcW5hbWUobmFtZSwgdHJ1ZSlcbiAgICAgICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lLnByZWZpeFxuICAgICAgICB2YXIgbG9jYWwgPSBxdWFsTmFtZS5sb2NhbFxuICAgICAgICB2YXIgdXJpID0gcHJlZml4ID09PSAnJyA/ICcnIDogKHRhZy5uc1twcmVmaXhdIHx8ICcnKVxuICAgICAgICB2YXIgYSA9IHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICBsb2NhbDogbG9jYWwsXG4gICAgICAgICAgdXJpOiB1cmlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGF0dHJpYnV0ZXMgd2l0aCBhbiB1bmRlZmluZWQgbmFtZXNwYWNlLFxuICAgICAgICAvLyB0aGVuIGZhaWwgb24gdGhlbSBub3cuXG4gICAgICAgIGlmIChwcmVmaXggJiYgcHJlZml4ICE9PSAneG1sbnMnICYmICF1cmkpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuYm91bmQgbmFtZXNwYWNlIHByZWZpeDogJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcmVmaXgpKVxuICAgICAgICAgIGEudXJpID0gcHJlZml4XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzW25hbWVdID0gYVxuICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIGEpXG4gICAgICB9XG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgfVxuXG4gICAgcGFyc2VyLnRhZy5pc1NlbGZDbG9zaW5nID0gISFzZWxmQ2xvc2luZ1xuXG4gICAgLy8gcHJvY2VzcyB0aGUgdGFnXG4gICAgcGFyc2VyLnNhd1Jvb3QgPSB0cnVlXG4gICAgcGFyc2VyLnRhZ3MucHVzaChwYXJzZXIudGFnKVxuICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbnRhZycsIHBhcnNlci50YWcpXG4gICAgaWYgKCFzZWxmQ2xvc2luZykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciA8c2NyaXB0PiBpbiBub24tc3RyaWN0IG1vZGUuXG4gICAgICBpZiAoIXBhcnNlci5ub3NjcmlwdCAmJiBwYXJzZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc2NyaXB0Jykge1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICB9XG4gICAgICBwYXJzZXIudGFnID0gbnVsbFxuICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnRhZ05hbWUpIHtcbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnV2VpcmQgZW1wdHkgY2xvc2UgdGFnLicpXG4gICAgICBwYXJzZXIudGV4dE5vZGUgKz0gJzwvPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcnNlci5zY3JpcHQpIHtcbiAgICAgIGlmIChwYXJzZXIudGFnTmFtZSAhPT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBjbG9zaW5nIHRhZyBhY3R1YWxseSBleGlzdHMuXG4gICAgLy8gPGE+PGI+PC9jPjwvYj48L2E+IHdpbGwgY2xvc2UgZXZlcnl0aGluZywgb3RoZXJ3aXNlLlxuICAgIHZhciB0ID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgdmFyIHRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVxuICAgIGlmICghcGFyc2VyLnN0cmljdCkge1xuICAgICAgdGFnTmFtZSA9IHRhZ05hbWVbcGFyc2VyLmxvb3NlQ2FzZV0oKVxuICAgIH1cbiAgICB2YXIgY2xvc2VUbyA9IHRhZ05hbWVcbiAgICB3aGlsZSAodC0tKSB7XG4gICAgICB2YXIgY2xvc2UgPSBwYXJzZXIudGFnc1t0XVxuICAgICAgaWYgKGNsb3NlLm5hbWUgIT09IGNsb3NlVG8pIHtcbiAgICAgICAgLy8gZmFpbCB0aGUgZmlyc3QgdGltZSBpbiBzdHJpY3QgbW9kZVxuICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuZXhwZWN0ZWQgY2xvc2UgdGFnJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGlkbid0IGZpbmQgaXQuICB3ZSBhbHJlYWR5IGZhaWxlZCBmb3Igc3RyaWN0LCBzbyBqdXN0IGFib3J0LlxuICAgIGlmICh0IDwgMCkge1xuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbm1hdGNoZWQgY2xvc2luZyB0YWc6ICcgKyBwYXJzZXIudGFnTmFtZSlcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHBhcnNlci50YWdOYW1lID0gdGFnTmFtZVxuICAgIHZhciBzID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgd2hpbGUgKHMtLSA+IHQpIHtcbiAgICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0gcGFyc2VyLnRhZ3MucG9wKClcbiAgICAgIHBhcnNlci50YWdOYW1lID0gcGFyc2VyLnRhZy5uYW1lXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NldGFnJywgcGFyc2VyLnRhZ05hbWUpXG5cbiAgICAgIHZhciB4ID0ge31cbiAgICAgIGZvciAodmFyIGkgaW4gdGFnLm5zKSB7XG4gICAgICAgIHhbaV0gPSB0YWcubnNbaV1cbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHBhcnNlci5vcHQueG1sbnMgJiYgdGFnLm5zICE9PSBwYXJlbnQubnMpIHtcbiAgICAgICAgLy8gcmVtb3ZlIG5hbWVzcGFjZSBiaW5kaW5ncyBpbnRyb2R1Y2VkIGJ5IHRhZ1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgbiA9IHRhZy5uc1twXVxuICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2xvc2VuYW1lc3BhY2UnLCB7IHByZWZpeDogcCwgdXJpOiBuIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ID09PSAwKSBwYXJzZXIuY2xvc2VkUm9vdCA9IHRydWVcbiAgICBwYXJzZXIudGFnTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9IHBhcnNlci5hdHRyaWJOYW1lID0gJydcbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUVudGl0eSAocGFyc2VyKSB7XG4gICAgdmFyIGVudGl0eSA9IHBhcnNlci5lbnRpdHlcbiAgICB2YXIgZW50aXR5TEMgPSBlbnRpdHkudG9Mb3dlckNhc2UoKVxuICAgIHZhciBudW1cbiAgICB2YXIgbnVtU3RyID0gJydcblxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5XSkge1xuICAgICAgcmV0dXJuIHBhcnNlci5FTlRJVElFU1tlbnRpdHldXG4gICAgfVxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5TENdKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLkVOVElUSUVTW2VudGl0eUxDXVxuICAgIH1cbiAgICBlbnRpdHkgPSBlbnRpdHlMQ1xuICAgIGlmIChlbnRpdHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGlmIChlbnRpdHkuY2hhckF0KDEpID09PSAneCcpIHtcbiAgICAgICAgZW50aXR5ID0gZW50aXR5LnNsaWNlKDIpXG4gICAgICAgIG51bSA9IHBhcnNlSW50KGVudGl0eSwgMTYpXG4gICAgICAgIG51bVN0ciA9IG51bS50b1N0cmluZygxNilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudGl0eSA9IGVudGl0eS5zbGljZSgxKVxuICAgICAgICBudW0gPSBwYXJzZUludChlbnRpdHksIDEwKVxuICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoMTApXG4gICAgICB9XG4gICAgfVxuICAgIGVudGl0eSA9IGVudGl0eS5yZXBsYWNlKC9eMCsvLCAnJylcbiAgICBpZiAoaXNOYU4obnVtKSB8fCBudW1TdHIudG9Mb3dlckNhc2UoKSAhPT0gZW50aXR5KSB7XG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGVudGl0eScpXG4gICAgICByZXR1cm4gJyYnICsgcGFyc2VyLmVudGl0eSArICc7J1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChudW0pXG4gIH1cblxuICBmdW5jdGlvbiBiZWdpbldoaXRlU3BhY2UgKHBhcnNlciwgYykge1xuICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9XQUtBXG4gICAgICBwYXJzZXIuc3RhcnRUYWdQb3NpdGlvbiA9IHBhcnNlci5wb3NpdGlvblxuICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgLy8gaGF2ZSB0byBwcm9jZXNzIHRoaXMgYXMgYSB0ZXh0IG5vZGUuXG4gICAgICAvLyB3ZWlyZCwgYnV0IGhhcHBlbnMuXG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vbi13aGl0ZXNwYWNlIGJlZm9yZSBmaXJzdCB0YWcuJylcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSA9IGNcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoYXJBdCAoY2h1bmssIGkpIHtcbiAgICB2YXIgcmVzdWx0ID0gJydcbiAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gY2h1bmsuY2hhckF0KGkpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlIChjaHVuaykge1xuICAgIHZhciBwYXJzZXIgPSB0aGlzXG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuZXJyb3JcbiAgICB9XG4gICAgaWYgKHBhcnNlci5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBlcnJvcihwYXJzZXIsXG4gICAgICAgICdDYW5ub3Qgd3JpdGUgYWZ0ZXIgY2xvc2UuIEFzc2lnbiBhbiBvbnJlYWR5IGhhbmRsZXIuJylcbiAgICB9XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5kKHBhcnNlcilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNodW5rID0gY2h1bmsudG9TdHJpbmcoKVxuICAgIH1cbiAgICB2YXIgaSA9IDBcbiAgICB2YXIgYyA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGMgPSBjaGFyQXQoY2h1bmssIGkrKylcbiAgICAgIHBhcnNlci5jID0gY1xuXG4gICAgICBpZiAoIWMpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbisrXG4gICAgICAgIGlmIChjID09PSAnXFxuJykge1xuICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICBwYXJzZXIuY29sdW1uID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocGFyc2VyLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgUy5CRUdJTjpcbiAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOX1dISVRFU1BBQ0VcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcdUZFRkYnKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBiZWdpbldoaXRlU3BhY2UocGFyc2VyLCBjKVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkJFR0lOX1dISVRFU1BBQ0U6XG4gICAgICAgICAgYmVnaW5XaGl0ZVNwYWNlKHBhcnNlciwgYylcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5URVhUOlxuICAgICAgICAgIGlmIChwYXJzZXIuc2F3Um9vdCAmJiAhcGFyc2VyLmNsb3NlZFJvb3QpIHtcbiAgICAgICAgICAgIHZhciBzdGFydGkgPSBpIC0gMVxuICAgICAgICAgICAgd2hpbGUgKGMgJiYgYyAhPT0gJzwnICYmIGMgIT09ICcmJykge1xuICAgICAgICAgICAgICBjID0gY2hhckF0KGNodW5rLCBpKyspXG4gICAgICAgICAgICAgIGlmIChjICYmIHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnBvc2l0aW9uKytcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4gPSAwXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNodW5rLnN1YnN0cmluZyhzdGFydGksIGkgLSAxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gJzwnICYmICEocGFyc2VyLnNhd1Jvb3QgJiYgcGFyc2VyLmNsb3NlZFJvb3QgJiYgIXBhcnNlci5zdHJpY3QpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fV0FLQVxuICAgICAgICAgICAgcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb24gPSBwYXJzZXIucG9zaXRpb25cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykgJiYgKCFwYXJzZXIuc2F3Um9vdCB8fCBwYXJzZXIuY2xvc2VkUm9vdCkpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdUZXh0IGRhdGEgb3V0c2lkZSBvZiByb290IG5vZGUuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUX0VOVElUWVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUOlxuICAgICAgICAgIC8vIG9ubHkgbm9uLXN0cmljdFxuICAgICAgICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNMT1NFX1RBR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLk9QRU5fV0FLQTpcbiAgICAgICAgICAvLyBlaXRoZXIgYSAvLCA/LCAhLCBvciB0ZXh0IGlzIGNvbWluZyBuZXh0LlxuICAgICAgICAgIGlmIChjID09PSAnIScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0dNTF9ERUNMXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciBpdC4uLlxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHXG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9IGNcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmVuY29kZWQgPCcpXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgc29tZSB3aGl0ZXNwYWNlLCB0aGVuIGFkZCB0aGF0IGluLlxuICAgICAgICAgICAgaWYgKHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uICsgMSA8IHBhcnNlci5wb3NpdGlvbikge1xuICAgICAgICAgICAgICB2YXIgcGFkID0gcGFyc2VyLnBvc2l0aW9uIC0gcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb25cbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheShwYWQpLmpvaW4oJyAnKSArIGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPCcgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0dNTF9ERUNMOlxuICAgICAgICAgIGlmICgocGFyc2VyLnNnbWxEZWNsICsgYykudG9VcHBlckNhc2UoKSA9PT0gQ0RBVEEpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbmNkYXRhJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLnNnbWxEZWNsICsgYyA9PT0gJy0tJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcnNlci5zZ21sRGVjbCArIGMpLnRvVXBwZXJDYXNlKCkgPT09IERPQ1RZUEUpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRVxuICAgICAgICAgICAgaWYgKHBhcnNlci5kb2N0eXBlIHx8IHBhcnNlci5zYXdSb290KSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLFxuICAgICAgICAgICAgICAgICdJbmFwcHJvcHJpYXRlbHkgbG9jYXRlZCBkb2N0eXBlIGRlY2xhcmF0aW9uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci5kb2N0eXBlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2dtbGRlY2xhcmF0aW9uJywgcGFyc2VyLnNnbWxEZWNsKVxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TR01MX0RFQ0xfUVVPVEVEOlxuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VyLnNnbWxEZWNsICs9IGNcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25kb2N0eXBlJywgcGFyc2VyLmRvY3R5cGUpXG4gICAgICAgICAgICBwYXJzZXIuZG9jdHlwZSA9IHRydWUgLy8ganVzdCByZW1lbWJlciB0aGF0IHdlIHNhdyBpdC5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgICAgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfRFREXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX1FVT1RFRFxuICAgICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9RVU9URUQ6XG4gICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEVfRFREOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9EVERfUVVPVEVEOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVDpcbiAgICAgICAgICBpZiAoYyA9PT0gJy0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICctJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UX0VOREVEXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgaWYgKHBhcnNlci5jb21tZW50KSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY29tbWVudCcsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgPSAnJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRFRDpcbiAgICAgICAgICBpZiAoYyAhPT0gJz4nKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ01hbGZvcm1lZCBjb21tZW50JylcbiAgICAgICAgICAgIC8vIGFsbG93IDwhLS0gYmxhaCAtLSBibG9vIC0tPiBpbiBub24tc3RyaWN0IG1vZGUsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyBhIGNvbW1lbnQgb2YgXCIgYmxhaCAtLSBibG9vIFwiXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLS0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQTpcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQV9FTkRJTkdfMlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkdfMjpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyLmNkYXRhKSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NlY2RhdGEnKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSAnXV0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5QUk9DX0lOU1Q6XG4gICAgICAgICAgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0TmFtZSArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlBST0NfSU5TVF9CT0RZOlxuICAgICAgICAgIGlmICghcGFyc2VyLnByb2NJbnN0Qm9keSAmJiBpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuUFJPQ19JTlNUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnByb2Nlc3NpbmdpbnN0cnVjdGlvbicsIHtcbiAgICAgICAgICAgICAgbmFtZTogcGFyc2VyLnByb2NJbnN0TmFtZSxcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VyLnByb2NJbnN0Qm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9ICc/JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuT1BFTl9UQUc6XG4gICAgICAgICAgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1RhZyhwYXJzZXIpXG4gICAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIHRhZyBuYW1lJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5PUEVOX1RBR19TTEFTSDpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlciwgdHJ1ZSlcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdGb3J3YXJkLXNsYXNoIGluIG9wZW5pbmcgdGFnIG5vdCBmb2xsb3dlZCBieSA+JylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQjpcbiAgICAgICAgICAvLyBoYXZlbid0IHJlYWQgdGhlIGF0dHJpYnV0ZSBuYW1lIHlldC5cbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IGNcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FOlxuICAgICAgICAgIGlmIChjID09PSAnPScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnQXR0cmlidXRlIHdpdGhvdXQgdmFsdWUnKVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gcGFyc2VyLmF0dHJpYk5hbWVcbiAgICAgICAgICAgIGF0dHJpYihwYXJzZXIpXG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRV9TQVdfV0hJVEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FX1NBV19XSElURTpcbiAgICAgICAgICBpZiAoYyA9PT0gJz0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0F0dHJpYnV0ZSB3aXRob3V0IHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlc1twYXJzZXIuYXR0cmliTmFtZV0gPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uYXR0cmlidXRlJywge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJzZXIuYXR0cmliTmFtZSxcbiAgICAgICAgICAgICAgdmFsdWU6ICcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSAnJ1xuICAgICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5xID0gY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9RVU9URUQ6XG4gICAgICAgICAgaWYgKGMgIT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX0VOVElUWV9RXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgKz0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgYXR0cmliKHBhcnNlcilcbiAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfQ0xPU0VEXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0NMT1NFRDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vIHdoaXRlc3BhY2UgYmV0d2VlbiBhdHRyaWJ1dGVzJylcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEOlxuICAgICAgICAgIGlmICghaXNBdHRyaWJFbmQoYykpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfRU5USVRZX1VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSArPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhdHRyaWIocGFyc2VyKVxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DTE9TRV9UQUc6XG4gICAgICAgICAgaWYgKCFwYXJzZXIudGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChub3RNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgY1xuICAgICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcuJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8LycgKyBwYXJzZXIudGFnTmFtZVxuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdfU0FXX1dISVRFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNMT1NFX1RBR19TQVdfV0hJVEU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgY2xvc2VUYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjbG9zaW5nIHRhZycpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9ROlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9VOlxuICAgICAgICAgIHZhciByZXR1cm5TdGF0ZVxuICAgICAgICAgIHZhciBidWZmZXJcbiAgICAgICAgICBzd2l0Y2ggKHBhcnNlci5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICAgICAgICByZXR1cm5TdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgICBidWZmZXIgPSAndGV4dE5vZGUnXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1E6XG4gICAgICAgICAgICAgIHJldHVyblN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICdhdHRyaWJWYWx1ZSdcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfVTpcbiAgICAgICAgICAgICAgcmV0dXJuU3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9VTlFVT1RFRFxuICAgICAgICAgICAgICBidWZmZXIgPSAnYXR0cmliVmFsdWUnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09ICc7Jykge1xuICAgICAgICAgICAgcGFyc2VyW2J1ZmZlcl0gKz0gcGFyc2VFbnRpdHkocGFyc2VyKVxuICAgICAgICAgICAgcGFyc2VyLmVudGl0eSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSByZXR1cm5TdGF0ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChwYXJzZXIuZW50aXR5Lmxlbmd0aCA/IGVudGl0eUJvZHkgOiBlbnRpdHlTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5lbnRpdHkgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIGVudGl0eSBuYW1lJylcbiAgICAgICAgICAgIHBhcnNlcltidWZmZXJdICs9ICcmJyArIHBhcnNlci5lbnRpdHkgKyBjXG4gICAgICAgICAgICBwYXJzZXIuZW50aXR5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IHJldHVyblN0YXRlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwYXJzZXIsICdVbmtub3duIHN0YXRlOiAnICsgcGFyc2VyLnN0YXRlKVxuICAgICAgfVxuICAgIH0gLy8gd2hpbGVcblxuICAgIGlmIChwYXJzZXIucG9zaXRpb24gPj0gcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24pIHtcbiAgICAgIGNoZWNrQnVmZmVyTGVuZ3RoKHBhcnNlcilcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLyohIGh0dHA6Ly9tdGhzLmJlL2Zyb21jb2RlcG9pbnQgdjAuMS4wIGJ5IEBtYXRoaWFzICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3JcbiAgICAgIHZhciBmcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUFYX1NJWkUgPSAweDQwMDBcbiAgICAgICAgdmFyIGNvZGVVbml0cyA9IFtdXG4gICAgICAgIHZhciBoaWdoU3Vycm9nYXRlXG4gICAgICAgIHZhciBsb3dTdXJyb2dhdGVcbiAgICAgICAgdmFyIGluZGV4ID0gLTFcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gJydcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRmluaXRlKGNvZGVQb2ludCkgfHwgLy8gYE5hTmAsIGArSW5maW5pdHlgLCBvciBgLUluZmluaXR5YFxuICAgICAgICAgICAgY29kZVBvaW50IDwgMCB8fCAvLyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGNvZGVQb2ludCA+IDB4MTBGRkZGIHx8IC8vIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludFxuICAgICAgICAgICAgZmxvb3IoY29kZVBvaW50KSAhPT0gY29kZVBvaW50IC8vIG5vdCBhbiBpbnRlZ2VyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQ6ICcgKyBjb2RlUG9pbnQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhGRkZGKSB7IC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpXG4gICAgICAgICAgfSBlbHNlIHsgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwXG4gICAgICAgICAgICBsb3dTdXJyb2dhdGUgPSAoY29kZVBvaW50ICUgMHg0MDApICsgMHhEQzAwXG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmdGcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKVxuICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZywgJ2Zyb21Db2RlUG9pbnQnLCB7XG4gICAgICAgICAgdmFsdWU6IGZyb21Db2RlUG9pbnQsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdHJpbmcuZnJvbUNvZGVQb2ludCA9IGZyb21Db2RlUG9pbnRcbiAgICAgIH1cbiAgICB9KCkpXG4gIH1cbn0pKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/IHRoaXMuc2F4ID0ge30gOiBleHBvcnRzKVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCJ2YXIgQ2xpZW50UmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL3JlcXVlc3QnKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJylcbnZhciBzdGF0dXNDb2RlcyA9IHJlcXVpcmUoJ2J1aWx0aW4tc3RhdHVzLWNvZGVzJylcbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKVxuXG52YXIgaHR0cCA9IGV4cG9ydHNcblxuaHR0cC5yZXF1ZXN0ID0gZnVuY3Rpb24gKG9wdHMsIGNiKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpXG5cdFx0b3B0cyA9IHVybC5wYXJzZShvcHRzKVxuXHRlbHNlXG5cdFx0b3B0cyA9IGV4dGVuZChvcHRzKVxuXG5cdHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgJydcblx0dmFyIGhvc3QgPSBvcHRzLmhvc3RuYW1lIHx8IG9wdHMuaG9zdFxuXHR2YXIgcG9ydCA9IG9wdHMucG9ydFxuXHR2YXIgcGF0aCA9IG9wdHMucGF0aCB8fCAnLydcblxuXHQvLyBOZWNlc3NhcnkgZm9yIElQdjYgYWRkcmVzc2VzXG5cdGlmIChob3N0ICYmIGhvc3QuaW5kZXhPZignOicpICE9PSAtMSlcblx0XHRob3N0ID0gJ1snICsgaG9zdCArICddJ1xuXG5cdC8vIFRoaXMgbWF5IGJlIGEgcmVsYXRpdmUgdXJsLiBUaGUgYnJvd3NlciBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gaW50ZXJwcmV0IGl0IGNvcnJlY3RseS5cblx0b3B0cy51cmwgPSAoaG9zdCA/IChwcm90b2NvbCArICcvLycgKyBob3N0KSA6ICcnKSArIChwb3J0ID8gJzonICsgcG9ydCA6ICcnKSArIHBhdGhcblx0b3B0cy5tZXRob2QgPSAob3B0cy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKClcblx0b3B0cy5oZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cblx0Ly8gQWxzbyB2YWxpZCBvcHRzLmF1dGgsIG9wdHMubW9kZVxuXG5cdHZhciByZXEgPSBuZXcgQ2xpZW50UmVxdWVzdChvcHRzKVxuXHRpZiAoY2IpXG5cdFx0cmVxLm9uKCdyZXNwb25zZScsIGNiKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvcHRzLCBjYikge1xuXHR2YXIgcmVxID0gaHR0cC5yZXF1ZXN0KG9wdHMsIGNiKVxuXHRyZXEuZW5kKClcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLkFnZW50ID0gZnVuY3Rpb24gKCkge31cbmh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHMgPSA0XG5cbmh0dHAuU1RBVFVTX0NPREVTID0gc3RhdHVzQ29kZXNcblxuaHR0cC5NRVRIT0RTID0gW1xuXHQnQ0hFQ0tPVVQnLFxuXHQnQ09OTkVDVCcsXG5cdCdDT1BZJyxcblx0J0RFTEVURScsXG5cdCdHRVQnLFxuXHQnSEVBRCcsXG5cdCdMT0NLJyxcblx0J00tU0VBUkNIJyxcblx0J01FUkdFJyxcblx0J01LQUNUSVZJVFknLFxuXHQnTUtDT0wnLFxuXHQnTU9WRScsXG5cdCdOT1RJRlknLFxuXHQnT1BUSU9OUycsXG5cdCdQQVRDSCcsXG5cdCdQT1NUJyxcblx0J1BST1BGSU5EJyxcblx0J1BST1BQQVRDSCcsXG5cdCdQVVJHRScsXG5cdCdQVVQnLFxuXHQnUkVQT1JUJyxcblx0J1NFQVJDSCcsXG5cdCdTVUJTQ1JJQkUnLFxuXHQnVFJBQ0UnLFxuXHQnVU5MT0NLJyxcblx0J1VOU1VCU0NSSUJFJ1xuXSIsImV4cG9ydHMuZmV0Y2ggPSBpc0Z1bmN0aW9uKGdsb2JhbC5mZXRjaCkgJiYgaXNGdW5jdGlvbihnbG9iYWwuUmVhZGFibGVCeXRlU3RyZWFtKVxuXG5leHBvcnRzLmJsb2JDb25zdHJ1Y3RvciA9IGZhbHNlXG50cnkge1xuXHRuZXcgQmxvYihbbmV3IEFycmF5QnVmZmVyKDEpXSlcblx0ZXhwb3J0cy5ibG9iQ29uc3RydWN0b3IgPSB0cnVlXG59IGNhdGNoIChlKSB7fVxuXG52YXIgeGhyID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpXG4vLyBJZiBsb2NhdGlvbi5ob3N0IGlzIGVtcHR5LCBlLmcuIGlmIHRoaXMgcGFnZS93b3JrZXIgd2FzIGxvYWRlZFxuLy8gZnJvbSBhIEJsb2IsIHRoZW4gdXNlIGV4YW1wbGUuY29tIHRvIGF2b2lkIGFuIGVycm9yXG54aHIub3BlbignR0VUJywgZ2xvYmFsLmxvY2F0aW9uLmhvc3QgPyAnLycgOiAnaHR0cHM6Ly9leGFtcGxlLmNvbScpXG5cbmZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQgKHR5cGUpIHtcblx0dHJ5IHtcblx0XHR4aHIucmVzcG9uc2VUeXBlID0gdHlwZVxuXHRcdHJldHVybiB4aHIucmVzcG9uc2VUeXBlID09PSB0eXBlXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZVxufVxuXG4vLyBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgU2FmYXJpIDcuMCByZXBvcnRzIHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdvYmplY3QnLlxuLy8gU2FmYXJpIDcuMSBhcHBlYXJzIHRvIGhhdmUgZml4ZWQgdGhpcyBidWcuXG52YXIgaGF2ZUFycmF5QnVmZmVyID0gdHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbnZhciBoYXZlU2xpY2UgPSBoYXZlQXJyYXlCdWZmZXIgJiYgaXNGdW5jdGlvbihnbG9iYWwuQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKVxuXG5leHBvcnRzLmFycmF5YnVmZmVyID0gaGF2ZUFycmF5QnVmZmVyICYmIGNoZWNrVHlwZVN1cHBvcnQoJ2FycmF5YnVmZmVyJylcbi8vIFRoZXNlIG5leHQgdHdvIHRlc3RzIHVuYXZvaWRhYmx5IHNob3cgd2FybmluZ3MgaW4gQ2hyb21lLiBTaW5jZSBmZXRjaCB3aWxsIGFsd2F5c1xuLy8gYmUgdXNlZCBpZiBpdCdzIGF2YWlsYWJsZSwganVzdCByZXR1cm4gZmFsc2UgZm9yIHRoZXNlIHRvIGF2b2lkIHRoZSB3YXJuaW5ncy5cbmV4cG9ydHMubXNzdHJlYW0gPSAhZXhwb3J0cy5mZXRjaCAmJiBoYXZlU2xpY2UgJiYgY2hlY2tUeXBlU3VwcG9ydCgnbXMtc3RyZWFtJylcbmV4cG9ydHMubW96Y2h1bmtlZGFycmF5YnVmZmVyID0gIWV4cG9ydHMuZmV0Y2ggJiYgaGF2ZUFycmF5QnVmZmVyICYmXG5cdGNoZWNrVHlwZVN1cHBvcnQoJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJylcbmV4cG9ydHMub3ZlcnJpZGVNaW1lVHlwZSA9IGlzRnVuY3Rpb24oeGhyLm92ZXJyaWRlTWltZVR5cGUpXG5leHBvcnRzLnZiQXJyYXkgPSBpc0Z1bmN0aW9uKGdsb2JhbC5WQkFycmF5KVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG5cbnhociA9IG51bGwgLy8gSGVscCBnY1xuIiwiLy8gdmFyIEJhc2U2NCA9IHJlcXVpcmUoJ0Jhc2U2NCcpXG52YXIgY2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2FwYWJpbGl0eScpXG52YXIgZm9yZWFjaCA9IHJlcXVpcmUoJ2ZvcmVhY2gnKVxudmFyIGluZGV4T2YgPSByZXF1aXJlKCdpbmRleG9mJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKVxudmFyIHJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxudmFyIEluY29taW5nTWVzc2FnZSA9IHJlc3BvbnNlLkluY29taW5nTWVzc2FnZVxudmFyIHJTdGF0ZXMgPSByZXNwb25zZS5yZWFkeVN0YXRlc1xuXG5mdW5jdGlvbiBkZWNpZGVNb2RlIChwcmVmZXJCaW5hcnkpIHtcblx0aWYgKGNhcGFiaWxpdHkuZmV0Y2gpIHtcblx0XHRyZXR1cm4gJ2ZldGNoJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkubW96Y2h1bmtlZGFycmF5YnVmZmVyKSB7XG5cdFx0cmV0dXJuICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcidcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5Lm1zc3RyZWFtKSB7XG5cdFx0cmV0dXJuICdtcy1zdHJlYW0nXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5hcnJheWJ1ZmZlciAmJiBwcmVmZXJCaW5hcnkpIHtcblx0XHRyZXR1cm4gJ2FycmF5YnVmZmVyJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkudmJBcnJheSAmJiBwcmVmZXJCaW5hcnkpIHtcblx0XHRyZXR1cm4gJ3RleHQ6dmJhcnJheSdcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gJ3RleHQnXG5cdH1cbn1cblxudmFyIENsaWVudFJlcXVlc3QgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRzdHJlYW0uV3JpdGFibGUuY2FsbChzZWxmKVxuXG5cdHNlbGYuX29wdHMgPSBvcHRzXG5cdHNlbGYuX2JvZHkgPSBbXVxuXHRzZWxmLl9oZWFkZXJzID0ge31cblx0aWYgKG9wdHMuYXV0aClcblx0XHRzZWxmLnNldEhlYWRlcignQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgbmV3IEJ1ZmZlcihvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKSlcblx0Zm9yZWFjaChrZXlzKG9wdHMuaGVhZGVycyksIGZ1bmN0aW9uIChuYW1lKSB7XG5cdFx0c2VsZi5zZXRIZWFkZXIobmFtZSwgb3B0cy5oZWFkZXJzW25hbWVdKVxuXHR9KVxuXG5cdHZhciBwcmVmZXJCaW5hcnlcblx0aWYgKG9wdHMubW9kZSA9PT0gJ3ByZWZlci1zdHJlYW1pbmcnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIGEgaGlnaCBwcmlvcml0eSBidXQgYmluYXJ5IGNvbXBhdGliaWxpdHkgYW5kXG5cdFx0Ly8gdGhlIGFjY3VyYWN5IG9mIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXIgYXJlbid0XG5cdFx0cHJlZmVyQmluYXJ5ID0gZmFsc2Vcblx0fSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdhbGxvdy13cm9uZy1jb250ZW50LXR5cGUnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJlc2VydmluZyB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyXG5cdFx0cHJlZmVyQmluYXJ5ID0gIWNhcGFiaWxpdHkub3ZlcnJpZGVNaW1lVHlwZVxuXHR9IGVsc2UgaWYgKCFvcHRzLm1vZGUgfHwgb3B0cy5tb2RlID09PSAnZGVmYXVsdCcgfHwgb3B0cy5tb2RlID09PSAncHJlZmVyLWZhc3QnKSB7XG5cdFx0Ly8gVXNlIGJpbmFyeSBpZiB0ZXh0IHN0cmVhbWluZyBtYXkgY29ycnVwdCBkYXRhIG9yIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyLCBvciBmb3Igc3BlZWRcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRzLm1vZGUnKVxuXHR9XG5cdHNlbGYuX21vZGUgPSBkZWNpZGVNb2RlKHByZWZlckJpbmFyeSlcblxuXHRzZWxmLm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5fb25GaW5pc2goKVxuXHR9KVxufVxuXG5pbmhlcml0cyhDbGllbnRSZXF1ZXN0LCBzdHJlYW0uV3JpdGFibGUpXG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0dmFyIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXHQvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGJyb3dzZXJzIGFib3V0IHNldHRpbmcgdW5zYWZlXG5cdC8vIGhlYWRlcnMuIFRvIGJlIGhvbmVzdCBJJ20gbm90IGVudGlyZWx5IHN1cmUgaGlkaW5nIHRoZXNlIHdhcm5pbmdzIGlzIGEgZ29vZCB0aGluZywgYnV0XG5cdC8vIGh0dHAtYnJvd3NlcmlmeSBkaWQgaXQsIHNvIEkgd2lsbCB0b28uXG5cdGlmIChpbmRleE9mKHVuc2FmZUhlYWRlcnMsIGxvd2VyTmFtZSkgIT09IC0xKVxuXHRcdHJldHVyblxuXG5cdHNlbGYuX2hlYWRlcnNbbG93ZXJOYW1lXSA9IHtcblx0XHRuYW1lOiBuYW1lLFxuXHRcdHZhbHVlOiB2YWx1ZVxuXHR9XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRyZXR1cm4gc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldLnZhbHVlXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRkZWxldGUgc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblx0dmFyIG9wdHMgPSBzZWxmLl9vcHRzXG5cblx0dmFyIGhlYWRlcnNPYmogPSBzZWxmLl9oZWFkZXJzXG5cdHZhciBib2R5XG5cdGlmIChvcHRzLm1ldGhvZCA9PT0gJ1BPU1QnIHx8IG9wdHMubWV0aG9kID09PSAnUFVUJykge1xuXHRcdGlmIChjYXBhYmlsaXR5LmJsb2JDb25zdHJ1Y3Rvcikge1xuXHRcdFx0Ym9keSA9IG5ldyBnbG9iYWwuQmxvYihzZWxmLl9ib2R5Lm1hcChmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdFx0XHRcdHJldHVybiBidWZmZXIudG9BcnJheUJ1ZmZlcigpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHR0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBnZXQgdXRmOCBzdHJpbmdcblx0XHRcdGJvZHkgPSBCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpLnRvU3RyaW5nKClcblx0XHR9XG5cdH1cblxuXHRpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHZhciBoZWFkZXJzID0ga2V5cyhoZWFkZXJzT2JqKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRcdHJldHVybiBbaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlXVxuXHRcdH0pXG5cblx0XHRnbG9iYWwuZmV0Y2goc2VsZi5fb3B0cy51cmwsIHtcblx0XHRcdG1ldGhvZDogc2VsZi5fb3B0cy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiBoZWFkZXJzLFxuXHRcdFx0Ym9keTogYm9keSxcblx0XHRcdG1vZGU6ICdjb3JzJyxcblx0XHRcdGNyZWRlbnRpYWxzOiBvcHRzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbidcblx0XHR9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHRcdFx0c2VsZi5fZmV0Y2hSZXNwb25zZSA9IHJlc3BvbnNlXG5cdFx0XHRzZWxmLl9jb25uZWN0KClcblx0XHR9KS50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIHJlYXNvbilcblx0XHR9KVxuXHR9IGVsc2Uge1xuXHRcdHZhciB4aHIgPSBzZWxmLl94aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oc2VsZi5fb3B0cy5tZXRob2QsIHNlbGYuX29wdHMudXJsLCB0cnVlKVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Ly8gQ2FuJ3Qgc2V0IHJlc3BvbnNlVHlwZSBvbiByZWFsbHkgb2xkIGJyb3dzZXJzXG5cdFx0aWYgKCdyZXNwb25zZVR5cGUnIGluIHhocilcblx0XHRcdHhoci5yZXNwb25zZVR5cGUgPSBzZWxmLl9tb2RlLnNwbGl0KCc6JylbMF1cblxuXHRcdGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpXG5cdFx0XHR4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRzLndpdGhDcmVkZW50aWFsc1xuXG5cdFx0aWYgKHNlbGYuX21vZGUgPT09ICd0ZXh0JyAmJiAnb3ZlcnJpZGVNaW1lVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKVxuXG5cdFx0Zm9yZWFjaChrZXlzKGhlYWRlcnNPYmopLCBmdW5jdGlvbiAobmFtZSkge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlKVxuXHRcdH0pXG5cblx0XHRzZWxmLl9yZXNwb25zZSA9IG51bGxcblx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0c3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuTE9BRElORzpcblx0XHRcdFx0Y2FzZSByU3RhdGVzLkRPTkU6XG5cdFx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTmVjZXNzYXJ5IGZvciBzdHJlYW1pbmcgaW4gRmlyZWZveCwgc2luY2UgeGhyLnJlc3BvbnNlIGlzIE9OTFkgZGVmaW5lZFxuXHRcdC8vIGluIG9ucHJvZ3Jlc3MsIG5vdCBpbiBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aCB4aHIucmVhZHlTdGF0ZSA9IDNcblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJykge1xuXHRcdFx0eGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuX29uWEhSUHJvZ3Jlc3MoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSlcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0eGhyLnNlbmQoYm9keSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB4aHIuc3RhdHVzIGlzIHJlYWRhYmxlLiBFdmVuIHRob3VnaCB0aGUgc3BlYyBzYXlzIGl0IHNob3VsZFxuICogYmUgYXZhaWxhYmxlIGluIHJlYWR5U3RhdGUgMywgYWNjZXNzaW5nIGl0IHRocm93cyBhbiBleGNlcHRpb24gaW4gSUU4XG4gKi9cbmZ1bmN0aW9uIHN0YXR1c1ZhbGlkICh4aHIpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gKHhoci5zdGF0dXMgIT09IG51bGwpXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKCFzdGF0dXNWYWxpZChzZWxmLl94aHIpIHx8IHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblxuXHRpZiAoIXNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX2Nvbm5lY3QoKVxuXG5cdHNlbGYuX3Jlc3BvbnNlLl9vblhIUlByb2dyZXNzKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5fcmVzcG9uc2UgPSBuZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hociwgc2VsZi5fZmV0Y2hSZXNwb25zZSwgc2VsZi5fbW9kZSlcblx0c2VsZi5lbWl0KCdyZXNwb25zZScsIHNlbGYuX3Jlc3BvbnNlKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRzZWxmLl9ib2R5LnB1c2goY2h1bmspXG5cdGNiKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c2VsZi5fZGVzdHJveWVkID0gdHJ1ZVxuXHRpZiAoc2VsZi5fcmVzcG9uc2UpXG5cdFx0c2VsZi5fcmVzcG9uc2UuX2Rlc3Ryb3llZCA9IHRydWVcblx0aWYgKHNlbGYuX3hocilcblx0XHRzZWxmLl94aHIuYWJvcnQoKVxuXHQvLyBDdXJyZW50bHksIHRoZXJlIGlzbid0IGEgd2F5IHRvIHRydWx5IGFib3J0IGEgZmV0Y2guXG5cdC8vIElmIHlvdSBsaWtlIGJpa2VzaGVkZGluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzI3XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGNiID0gZGF0YVxuXHRcdGRhdGEgPSB1bmRlZmluZWRcblx0fVxuXG5cdHN0cmVhbS5Xcml0YWJsZS5wcm90b3R5cGUuZW5kLmNhbGwoc2VsZiwgZGF0YSwgZW5jb2RpbmcsIGNiKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5mbHVzaEhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXROb0RlbGF5ID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFNvY2tldEtlZXBBbGl2ZSA9IGZ1bmN0aW9uICgpIHt9XG5cbi8vIFRha2VuIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvWE1MSHR0cFJlcXVlc3QvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyJTI4JTI5LW1ldGhvZFxudmFyIHVuc2FmZUhlYWRlcnMgPSBbXG5cdCdhY2NlcHQtY2hhcnNldCcsXG5cdCdhY2NlcHQtZW5jb2RpbmcnLFxuXHQnYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1oZWFkZXJzJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtbWV0aG9kJyxcblx0J2Nvbm5lY3Rpb24nLFxuXHQnY29udGVudC1sZW5ndGgnLFxuXHQnY29va2llJyxcblx0J2Nvb2tpZTInLFxuXHQnZGF0ZScsXG5cdCdkbnQnLFxuXHQnZXhwZWN0Jyxcblx0J2hvc3QnLFxuXHQna2VlcC1hbGl2ZScsXG5cdCdvcmlnaW4nLFxuXHQncmVmZXJlcicsXG5cdCd0ZScsXG5cdCd0cmFpbGVyJyxcblx0J3RyYW5zZmVyLWVuY29kaW5nJyxcblx0J3VwZ3JhZGUnLFxuXHQndXNlci1hZ2VudCcsXG5cdCd2aWEnXG5dXG4iLCJ2YXIgY2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2FwYWJpbGl0eScpXG52YXIgZm9yZWFjaCA9IHJlcXVpcmUoJ2ZvcmVhY2gnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dFxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgZm9yICg8aXRlbT4gb2YgPGl0ZXJhYmxlPik6XG5cdFx0Ly8gZm9yICh2YXIgPGl0ZW0+LF9pLF9pdCA9IDxpdGVyYWJsZT5bU3ltYm9sLml0ZXJhdG9yXSgpOyA8aXRlbT4gPSAoX2kgPSBfaXQubmV4dCgpKS52YWx1ZSwhX2kuZG9uZTspXG5cdFx0Zm9yICh2YXIgaGVhZGVyLCBfaSwgX2l0ID0gcmVzcG9uc2UuaGVhZGVyc1tTeW1ib2wuaXRlcmF0b3JdKCk7IGhlYWRlciA9IChfaSA9IF9pdC5uZXh0KCkpLnZhbHVlLCAhX2kuZG9uZTspIHtcblx0XHRcdHNlbGYuaGVhZGVyc1toZWFkZXJbMF0udG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJbMV1cblx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuXHRcdH1cblxuXHRcdC8vIFRPRE86IHRoaXMgZG9lc24ndCByZXNwZWN0IGJhY2twcmVzc3VyZS4gT25jZSBXcml0YWJsZVN0cmVhbSBpcyBhdmFpbGFibGUsIHRoaXMgY2FuIGJlIGZpeGVkXG5cdFx0dmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKClcblx0XHRmdW5jdGlvbiByZWFkICgpIHtcblx0XHRcdHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG5cdFx0XHRcdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGlmIChyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSlcblx0XHR9XG5cdFx0cmVhZCgpXG5cblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnN0YXR1c0NvZGUgPSB4aHIuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0geGhyLnN0YXR1c1RleHRcblx0XHR2YXIgaGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0Zm9yZWFjaChoZWFkZXJzLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyA9IGhlYWRlci5tYXRjaCgvXihbXjpdKyk6XFxzKiguKikvKVxuXHRcdFx0aWYgKG1hdGNoZXMpIHtcblx0XHRcdFx0dmFyIGtleSA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRpZiAoc2VsZi5oZWFkZXJzW2tleV0gIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0gPSBtYXRjaGVzWzJdXG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge31cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0dmFyIHhociA9IHNlbGYuX3hoclxuXG5cdHZhciByZXNwb25zZSA9IG51bGxcblx0c3dpdGNoIChzZWxmLl9tb2RlKSB7XG5cdFx0Y2FzZSAndGV4dDp2YmFycmF5JzogLy8gRm9yIElFOVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIGZhaWxzIGluIElFOFxuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBnbG9iYWwuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KClcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Ly8gRmFsbHMgdGhyb3VnaCBpbiBJRThcdFxuXHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0dHJ5IHsgLy8gVGhpcyB3aWxsIGZhaWwgd2hlbiByZWFkeVN0YXRlID0gMyBpbiBJRTkuIFN3aXRjaCBtb2RlIGFuZCB3YWl0IGZvciByZWFkeVN0YXRlID0gNFxuXHRcdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0c2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdHZhciBuZXdEYXRhID0gcmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcylcblx0XHRcdFx0aWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZXNwb25zZSkpKVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcic6IC8vIHRha2Ugd2hvbGVcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORyB8fCAhcmVzcG9uc2UpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZXNwb25zZSkpKVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdtcy1zdHJlYW0nOlxuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0dmFyIHJlYWRlciA9IG5ldyBnbG9iYWwuTVNTdHJlYW1SZWFkZXIoKVxuXHRcdFx0cmVhZGVyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChyZWFkZXIucmVzdWx0LmJ5dGVMZW5ndGggPiBzZWxmLl9wb3MpIHtcblx0XHRcdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZWFkZXIucmVzdWx0LnNsaWNlKHNlbGYuX3BvcykpKSlcblx0XHRcdFx0XHRzZWxmLl9wb3MgPSByZWFkZXIucmVzdWx0LmJ5dGVMZW5ndGhcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG51bGwpXG5cdFx0XHR9XG5cdFx0XHQvLyByZWFkZXIub25lcnJvciA9ID8/PyAvLyBUT0RPOiB0aGlzXG5cdFx0XHRyZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIocmVzcG9uc2UpXG5cdFx0XHRicmVha1xuXHR9XG5cblx0Ly8gVGhlIG1zLXN0cmVhbSBjYXNlIGhhbmRsZXMgZW5kIHNlcGFyYXRlbHkgaW4gcmVhZGVyLm9ubG9hZCgpXG5cdGlmIChzZWxmLl94aHIucmVhZHlTdGF0ZSA9PT0gclN0YXRlcy5ET05FICYmIHNlbGYuX21vZGUgIT09ICdtcy1zdHJlYW0nKSB7XG5cdFx0c2VsZi5wdXNoKG51bGwpXG5cdH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwidmFyIG5leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaW1tZWRpYXRlSWRzID0ge307XG52YXIgbmV4dEltbWVkaWF0ZUlkID0gMDtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsgdGltZW91dC5jbG9zZSgpOyB9O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIFRoYXQncyBub3QgaG93IG5vZGUuanMgaW1wbGVtZW50cyBpdCBidXQgdGhlIGV4cG9zZWQgYXBpIGlzIHRoZSBzYW1lLlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBzZXRJbW1lZGlhdGUgOiBmdW5jdGlvbihmbikge1xuICB2YXIgaWQgPSBuZXh0SW1tZWRpYXRlSWQrKztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGZhbHNlIDogc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGltbWVkaWF0ZUlkc1tpZF0gPSB0cnVlO1xuXG4gIG5leHRUaWNrKGZ1bmN0aW9uIG9uTmV4dFRpY2soKSB7XG4gICAgaWYgKGltbWVkaWF0ZUlkc1tpZF0pIHtcbiAgICAgIC8vIGZuLmNhbGwoKSBpcyBmYXN0ZXIgc28gd2Ugb3B0aW1pemUgZm9yIHRoZSBjb21tb24gdXNlLWNhc2VcbiAgICAgIC8vIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vY2FsbC1hcHBseS1zZWd1XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCk7XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IGlkcyBmcm9tIGxlYWtpbmdcbiAgICAgIGV4cG9ydHMuY2xlYXJJbW1lZGlhdGUoaWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlkO1xufTtcblxuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IHR5cGVvZiBjbGVhckltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY2xlYXJJbW1lZGlhdGUgOiBmdW5jdGlvbihpZCkge1xuICBkZWxldGUgaW1tZWRpYXRlSWRzW2lkXTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAgIC8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICAgIHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKSxcblxuICAgIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgICAvLyB0aGVtLlxuICAgIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICAgIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiBpc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIWlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnkgY29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgIC8vIEl0IG9ubHkgY29udmVydHMgdGhlIHBhcnQgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgIC8vIGhhcyBub24gQVNDSUkgY2hhcmFjdGVycy4gSS5lLiBpdCBkb3NlbnQgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBpbiBBU0NJSS5cbiAgICAgIHZhciBkb21haW5BcnJheSA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgIHZhciBuZXdPdXQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tYWluQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHMgPSBkb21haW5BcnJheVtpXTtcbiAgICAgICAgbmV3T3V0LnB1c2gocy5tYXRjaCgvW15BLVphLXowLTlfLV0vKSA/XG4gICAgICAgICAgICAneG4tLScgKyBwdW55Y29kZS5lbmNvZGUocykgOiBzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBuZXdPdXQuam9pbignLicpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAoaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgaXNPYmplY3QodGhpcy5xdWVyeSkgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHRoaXMucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHxcbiAgICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKGlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICBPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICByZXN1bHRba10gPSB0aGlzW2tdO1xuICB9LCB0aGlzKTtcblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIE9iamVjdC5rZXlzKHJlbGF0aXZlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgIGlmIChrICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICB9KTtcblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmXG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICBPYmplY3Qua2V5cyhyZWxhdGl2ZSkuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfSk7XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCFpc051bGxPclVuZGVmaW5lZChyZWxhdGl2ZS5zZWFyY2gpKSB7XG4gICAgLy8ganVzdCBwdWxsIG91dCB0aGUgc2VhcmNoLlxuICAgIC8vIGxpa2UgaHJlZj0nP2ZvbycuXG4gICAgLy8gUHV0IHRoaXMgYWZ0ZXIgdGhlIG90aGVyIHR3byBjYXNlcyBiZWNhdXNlIGl0IHNpbXBsaWZpZXMgdGhlIGJvb2xlYW5zXG4gICAgaWYgKHBzeWNob3RpYykge1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBzcmNQYXRoLnNoaWZ0KCk7XG4gICAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCFpc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0KSAmJiAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8XG4gICAgICBsYXN0ID09PSAnJyk7XG5cbiAgLy8gc3RyaXAgc2luZ2xlIGRvdHMsIHJlc29sdmUgZG91YmxlIGRvdHMgdG8gcGFyZW50IGRpclxuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCFpc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaG9zdCA9IHRoaXMuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiAgYXJnID09IG51bGw7XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIGV4cG9ydHMuc3RyaXBCT00gPSBmdW5jdGlvbihzdHIpIHtcbiAgICBpZiAoc3RyWzBdID09PSAnXFx1RkVGRicpIHtcbiAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgYnVpbGRlciwgZGVmYXVsdHMsIGVzY2FwZUNEQVRBLCByZXF1aXJlc0NEQVRBLCB3cmFwQ0RBVEEsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGJ1aWxkZXIgPSByZXF1aXJlKCd4bWxidWlsZGVyJyk7XG5cbiAgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJykuZGVmYXVsdHM7XG5cbiAgcmVxdWlyZXNDREFUQSA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiAoZW50cnkuaW5kZXhPZignJicpID49IDAgfHwgZW50cnkuaW5kZXhPZignPicpID49IDAgfHwgZW50cnkuaW5kZXhPZignPCcpID49IDApO1xuICB9O1xuXG4gIHdyYXBDREFUQSA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuIFwiPCFbQ0RBVEFbXCIgKyAoZXNjYXBlQ0RBVEEoZW50cnkpKSArIFwiXV0+XCI7XG4gIH07XG5cbiAgZXNjYXBlQ0RBVEEgPSBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeS5yZXBsYWNlKCddXT4nLCAnXV1dXT48IVtDREFUQVs+Jyk7XG4gIH07XG5cbiAgZXhwb3J0cy5CdWlsZGVyID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIEJ1aWxkZXIob3B0cykge1xuICAgICAgdmFyIGtleSwgcmVmLCB2YWx1ZTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgICAgcmVmID0gZGVmYXVsdHNbXCIwLjJcIl07XG4gICAgICBmb3IgKGtleSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSByZWZba2V5XTtcbiAgICAgICAgdGhpcy5vcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwob3B0cywga2V5KSkgY29udGludWU7XG4gICAgICAgIHZhbHVlID0gb3B0c1trZXldO1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkT2JqZWN0ID0gZnVuY3Rpb24ocm9vdE9iaikge1xuICAgICAgdmFyIGF0dHJrZXksIGNoYXJrZXksIHJlbmRlciwgcm9vdEVsZW1lbnQsIHJvb3ROYW1lO1xuICAgICAgYXR0cmtleSA9IHRoaXMub3B0aW9ucy5hdHRya2V5O1xuICAgICAgY2hhcmtleSA9IHRoaXMub3B0aW9ucy5jaGFya2V5O1xuICAgICAgaWYgKChPYmplY3Qua2V5cyhyb290T2JqKS5sZW5ndGggPT09IDEpICYmICh0aGlzLm9wdGlvbnMucm9vdE5hbWUgPT09IGRlZmF1bHRzWycwLjInXS5yb290TmFtZSkpIHtcbiAgICAgICAgcm9vdE5hbWUgPSBPYmplY3Qua2V5cyhyb290T2JqKVswXTtcbiAgICAgICAgcm9vdE9iaiA9IHJvb3RPYmpbcm9vdE5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdE5hbWUgPSB0aGlzLm9wdGlvbnMucm9vdE5hbWU7XG4gICAgICB9XG4gICAgICByZW5kZXIgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQsIG9iaikge1xuICAgICAgICAgIHZhciBhdHRyLCBjaGlsZCwgZW50cnksIGluZGV4LCBrZXksIHZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuY2RhdGEgJiYgcmVxdWlyZXNDREFUQShvYmopKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQucmF3KHdyYXBDREFUQShvYmopKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQudHh0KG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIGZvciAoaW5kZXggaW4gb2JqKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG9iaiwgaW5kZXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2hpbGQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gY2hpbGRba2V5XTtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyKGVsZW1lbnQuZWxlKGtleSksIGVudHJ5KS51cCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjaGlsZCA9IG9ialtrZXldO1xuICAgICAgICAgICAgICBpZiAoa2V5ID09PSBhdHRya2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgZm9yIChhdHRyIGluIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2hpbGRbYXR0cl07XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmF0dChhdHRyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gY2hhcmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNkYXRhICYmIHJlcXVpcmVzQ0RBVEEoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5yYXcod3JhcENEQVRBKGNoaWxkKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnR4dChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpbmRleCBpbiBjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwoY2hpbGQsIGluZGV4KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBlbnRyeSA9IGNoaWxkW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNkYXRhICYmIHJlcXVpcmVzQ0RBVEEoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSkucmF3KHdyYXBDREFUQShlbnRyeSkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSwgZW50cnkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSByZW5kZXIoZWxlbWVudC5lbGUoa2V5KSwgZW50cnkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSByZW5kZXIoZWxlbWVudC5lbGUoa2V5KSwgY2hpbGQpLnVwKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgX3RoaXMub3B0aW9ucy5jZGF0YSAmJiByZXF1aXJlc0NEQVRBKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSkucmF3KHdyYXBDREFUQShjaGlsZCkpLnVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5lbGUoa2V5LCBjaGlsZC50b1N0cmluZygpKS51cCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfTtcbiAgICAgIH0pKHRoaXMpO1xuICAgICAgcm9vdEVsZW1lbnQgPSBidWlsZGVyLmNyZWF0ZShyb290TmFtZSwgdGhpcy5vcHRpb25zLnhtbGRlYywgdGhpcy5vcHRpb25zLmRvY3R5cGUsIHtcbiAgICAgICAgaGVhZGxlc3M6IHRoaXMub3B0aW9ucy5oZWFkbGVzcyxcbiAgICAgICAgYWxsb3dTdXJyb2dhdGVDaGFyczogdGhpcy5vcHRpb25zLmFsbG93U3Vycm9nYXRlQ2hhcnNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlbmRlcihyb290RWxlbWVudCwgcm9vdE9iaikuZW5kKHRoaXMub3B0aW9ucy5yZW5kZXJPcHRzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEJ1aWxkZXI7XG5cbiAgfSkoKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIGV4cG9ydHMuZGVmYXVsdHMgPSB7XG4gICAgXCIwLjFcIjoge1xuICAgICAgZXhwbGljaXRDaGFya2V5OiBmYWxzZSxcbiAgICAgIHRyaW06IHRydWUsXG4gICAgICBub3JtYWxpemU6IHRydWUsXG4gICAgICBub3JtYWxpemVUYWdzOiBmYWxzZSxcbiAgICAgIGF0dHJrZXk6IFwiQFwiLFxuICAgICAgY2hhcmtleTogXCIjXCIsXG4gICAgICBleHBsaWNpdEFycmF5OiBmYWxzZSxcbiAgICAgIGlnbm9yZUF0dHJzOiBmYWxzZSxcbiAgICAgIG1lcmdlQXR0cnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRSb290OiBmYWxzZSxcbiAgICAgIHZhbGlkYXRvcjogbnVsbCxcbiAgICAgIHhtbG5zOiBmYWxzZSxcbiAgICAgIGV4cGxpY2l0Q2hpbGRyZW46IGZhbHNlLFxuICAgICAgY2hpbGRrZXk6ICdAQCcsXG4gICAgICBjaGFyc0FzQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgaW5jbHVkZVdoaXRlQ2hhcnM6IGZhbHNlLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgYXR0ck5hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgYXR0clZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHRhZ05hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgdmFsdWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgZW1wdHlUYWc6ICcnXG4gICAgfSxcbiAgICBcIjAuMlwiOiB7XG4gICAgICBleHBsaWNpdENoYXJrZXk6IGZhbHNlLFxuICAgICAgdHJpbTogZmFsc2UsXG4gICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgbm9ybWFsaXplVGFnczogZmFsc2UsXG4gICAgICBhdHRya2V5OiBcIiRcIixcbiAgICAgIGNoYXJrZXk6IFwiX1wiLFxuICAgICAgZXhwbGljaXRBcnJheTogdHJ1ZSxcbiAgICAgIGlnbm9yZUF0dHJzOiBmYWxzZSxcbiAgICAgIG1lcmdlQXR0cnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRSb290OiB0cnVlLFxuICAgICAgdmFsaWRhdG9yOiBudWxsLFxuICAgICAgeG1sbnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRDaGlsZHJlbjogZmFsc2UsXG4gICAgICBwcmVzZXJ2ZUNoaWxkcmVuT3JkZXI6IGZhbHNlLFxuICAgICAgY2hpbGRrZXk6ICckJCcsXG4gICAgICBjaGFyc0FzQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgaW5jbHVkZVdoaXRlQ2hhcnM6IGZhbHNlLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgYXR0ck5hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgYXR0clZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHRhZ05hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgdmFsdWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgcm9vdE5hbWU6ICdyb290JyxcbiAgICAgIHhtbGRlYzoge1xuICAgICAgICAndmVyc2lvbic6ICcxLjAnLFxuICAgICAgICAnZW5jb2RpbmcnOiAnVVRGLTgnLFxuICAgICAgICAnc3RhbmRhbG9uZSc6IHRydWVcbiAgICAgIH0sXG4gICAgICBkb2N0eXBlOiBudWxsLFxuICAgICAgcmVuZGVyT3B0czoge1xuICAgICAgICAncHJldHR5JzogdHJ1ZSxcbiAgICAgICAgJ2luZGVudCc6ICcgICcsXG4gICAgICAgICduZXdsaW5lJzogJ1xcbidcbiAgICAgIH0sXG4gICAgICBoZWFkbGVzczogZmFsc2UsXG4gICAgICBjaHVua1NpemU6IDEwMDAwLFxuICAgICAgZW1wdHlUYWc6ICcnLFxuICAgICAgY2RhdGE6IGZhbHNlXG4gICAgfVxuICB9O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBib20sIGRlZmF1bHRzLCBldmVudHMsIGlzRW1wdHksIHByb2Nlc3NJdGVtLCBwcm9jZXNzb3JzLCBzYXgsIHNldEltbWVkaWF0ZSxcbiAgICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHNheCA9IHJlcXVpcmUoJ3NheCcpO1xuXG4gIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4gIGJvbSA9IHJlcXVpcmUoJy4vYm9tJyk7XG5cbiAgcHJvY2Vzc29ycyA9IHJlcXVpcmUoJy4vcHJvY2Vzc29ycycpO1xuXG4gIHNldEltbWVkaWF0ZSA9IHJlcXVpcmUoJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcblxuICBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKS5kZWZhdWx0cztcblxuICBpc0VtcHR5ID0gZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmICh0aGluZyAhPSBudWxsKSAmJiBPYmplY3Qua2V5cyh0aGluZykubGVuZ3RoID09PSAwO1xuICB9O1xuXG4gIHByb2Nlc3NJdGVtID0gZnVuY3Rpb24ocHJvY2Vzc29ycywgaXRlbSwga2V5KSB7XG4gICAgdmFyIGksIGxlbiwgcHJvY2VzcztcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm9jZXNzb3JzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBwcm9jZXNzID0gcHJvY2Vzc29yc1tpXTtcbiAgICAgIGl0ZW0gPSBwcm9jZXNzKGl0ZW0sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG4gIGV4cG9ydHMuUGFyc2VyID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoUGFyc2VyLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFBhcnNlcihvcHRzKSB7XG4gICAgICB0aGlzLnBhcnNlU3RyaW5nID0gYmluZCh0aGlzLnBhcnNlU3RyaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMucmVzZXQgPSBiaW5kKHRoaXMucmVzZXQsIHRoaXMpO1xuICAgICAgdGhpcy5hc3NpZ25PclB1c2ggPSBiaW5kKHRoaXMuYXNzaWduT3JQdXNoLCB0aGlzKTtcbiAgICAgIHRoaXMucHJvY2Vzc0FzeW5jID0gYmluZCh0aGlzLnByb2Nlc3NBc3luYywgdGhpcyk7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGV4cG9ydHMuUGFyc2VyKSkge1xuICAgICAgICByZXR1cm4gbmV3IGV4cG9ydHMuUGFyc2VyKG9wdHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgICByZWYgPSBkZWZhdWx0c1tcIjAuMlwiXTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZm9yIChrZXkgaW4gb3B0cykge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvcHRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSBvcHRzW2tleV07XG4gICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnhtbG5zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy54bWxuc2tleSA9IHRoaXMub3B0aW9ucy5hdHRya2V5ICsgXCJuc1wiO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub3JtYWxpemVUYWdzKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzLnVuc2hpZnQocHJvY2Vzc29ycy5ub3JtYWxpemUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIFBhcnNlci5wcm90b3R5cGUucHJvY2Vzc0FzeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2h1bmssIGVycjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZy5sZW5ndGggPD0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZSkge1xuICAgICAgICAgIGNodW5rID0gdGhpcy5yZW1haW5pbmc7XG4gICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSAnJztcbiAgICAgICAgICB0aGlzLnNheFBhcnNlciA9IHRoaXMuc2F4UGFyc2VyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVuayA9IHRoaXMucmVtYWluaW5nLnN1YnN0cigwLCB0aGlzLm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnN1YnN0cih0aGlzLm9wdGlvbnMuY2h1bmtTaXplLCB0aGlzLnJlbWFpbmluZy5sZW5ndGgpO1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyID0gdGhpcy5zYXhQYXJzZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUodGhpcy5wcm9jZXNzQXN5bmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyID0gZXJyb3IxO1xuICAgICAgICBpZiAoIXRoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFBhcnNlci5wcm90b3R5cGUuYXNzaWduT3JQdXNoID0gZnVuY3Rpb24ob2JqLCBrZXksIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5leHBsaWNpdEFycmF5KSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gW25ld1ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEob2JqW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialtrZXldLnB1c2gobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBQYXJzZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXR0cmtleSwgY2hhcmtleSwgb250ZXh0LCBzdGFjaztcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLnNheFBhcnNlciA9IHNheC5wYXJzZXIodGhpcy5vcHRpb25zLnN0cmljdCwge1xuICAgICAgICB0cmltOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgeG1sbnM6IHRoaXMub3B0aW9ucy54bWxuc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lcnJUaHJvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZXJyb3IgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLnJlc3VtZSgpO1xuICAgICAgICAgIGlmICghX3RoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZW5kID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLnNheFBhcnNlci5lbmRlZCkge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbWl0KFwiZW5kXCIsIF90aGlzLnJlc3VsdE9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lbmRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5FWFBMSUNJVF9DSEFSS0VZID0gdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hhcmtleTtcbiAgICAgIHRoaXMucmVzdWx0T2JqZWN0ID0gbnVsbDtcbiAgICAgIHN0YWNrID0gW107XG4gICAgICBhdHRya2V5ID0gdGhpcy5vcHRpb25zLmF0dHJrZXk7XG4gICAgICBjaGFya2V5ID0gdGhpcy5vcHRpb25zLmNoYXJrZXk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbm9wZW50YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICB2YXIga2V5LCBuZXdWYWx1ZSwgb2JqLCBwcm9jZXNzZWRLZXksIHJlZjtcbiAgICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbY2hhcmtleV0gPSBcIlwiO1xuICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5pZ25vcmVBdHRycykge1xuICAgICAgICAgICAgcmVmID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gcmVmKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmICghKGF0dHJrZXkgaW4gb2JqKSAmJiAhX3RoaXMub3B0aW9ucy5tZXJnZUF0dHJzKSB7XG4gICAgICAgICAgICAgICAgb2JqW2F0dHJrZXldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3VmFsdWUgPSBfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMsIG5vZGUuYXR0cmlidXRlc1trZXldLCBrZXkpIDogbm9kZS5hdHRyaWJ1dGVzW2tleV07XG4gICAgICAgICAgICAgIHByb2Nlc3NlZEtleSA9IF90aGlzLm9wdGlvbnMuYXR0ck5hbWVQcm9jZXNzb3JzID8gcHJvY2Vzc0l0ZW0oX3RoaXMub3B0aW9ucy5hdHRyTmFtZVByb2Nlc3NvcnMsIGtleSkgOiBrZXk7XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm1lcmdlQXR0cnMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5hc3NpZ25PclB1c2gob2JqLCBwcm9jZXNzZWRLZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbYXR0cmtleV1bcHJvY2Vzc2VkS2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtcIiNuYW1lXCJdID0gX3RoaXMub3B0aW9ucy50YWdOYW1lUHJvY2Vzc29ycyA/IHByb2Nlc3NJdGVtKF90aGlzLm9wdGlvbnMudGFnTmFtZVByb2Nlc3NvcnMsIG5vZGUubmFtZSkgOiBub2RlLm5hbWU7XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMueG1sbnMpIHtcbiAgICAgICAgICAgIG9ialtfdGhpcy5vcHRpb25zLnhtbG5za2V5XSA9IHtcbiAgICAgICAgICAgICAgdXJpOiBub2RlLnVyaSxcbiAgICAgICAgICAgICAgbG9jYWw6IG5vZGUubG9jYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdGFjay5wdXNoKG9iaik7XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uY2xvc2V0YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBjZGF0YSwgZW1wdHlTdHIsIGtleSwgbm9kZSwgbm9kZU5hbWUsIG9iaiwgb2JqQ2xvbmUsIG9sZCwgcywgeHBhdGg7XG4gICAgICAgICAgb2JqID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgbm9kZU5hbWUgPSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZXhwbGljaXRDaGlsZHJlbiB8fCAhX3RoaXMub3B0aW9ucy5wcmVzZXJ2ZUNoaWxkcmVuT3JkZXIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9iai5jZGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2RhdGEgPSBvYmouY2RhdGE7XG4gICAgICAgICAgICBkZWxldGUgb2JqLmNkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKG9ialtjaGFya2V5XS5tYXRjaCgvXlxccyokLykgJiYgIWNkYXRhKSB7XG4gICAgICAgICAgICBlbXB0eVN0ciA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbY2hhcmtleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnRyaW0pIHtcbiAgICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gb2JqW2NoYXJrZXldLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICBvYmpbY2hhcmtleV0gPSBvYmpbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gX3RoaXMub3B0aW9ucy52YWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLnZhbHVlUHJvY2Vzc29ycywgb2JqW2NoYXJrZXldLCBub2RlTmFtZSkgOiBvYmpbY2hhcmtleV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDEgJiYgY2hhcmtleSBpbiBvYmogJiYgIV90aGlzLkVYUExJQ0lUX0NIQVJLRVkpIHtcbiAgICAgICAgICAgICAgb2JqID0gb2JqW2NoYXJrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNFbXB0eShvYmopKSB7XG4gICAgICAgICAgICBvYmogPSBfdGhpcy5vcHRpb25zLmVtcHR5VGFnICE9PSAnJyA/IF90aGlzLm9wdGlvbnMuZW1wdHlUYWcgOiBlbXB0eVN0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMudmFsaWRhdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIHhwYXRoID0gXCIvXCIgKyAoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgaSwgbGVuLCByZXN1bHRzO1xuICAgICAgICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0YWNrLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHN0YWNrW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlW1wiI25hbWVcIl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfSkoKSkuY29uY2F0KG5vZGVOYW1lKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqID0gX3RoaXMub3B0aW9ucy52YWxpZGF0b3IoeHBhdGgsIHMgJiYgc1tub2RlTmFtZV0sIG9iaik7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hpbGRyZW4gJiYgIV90aGlzLm9wdGlvbnMubWVyZ2VBdHRycyAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLnByZXNlcnZlQ2hpbGRyZW5PcmRlcikge1xuICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF0dHJrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmF0dHJrZXldID0gb2JqW190aGlzLm9wdGlvbnMuYXR0cmtleV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9ialtfdGhpcy5vcHRpb25zLmF0dHJrZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5jaGFyc0FzQ2hpbGRyZW4gJiYgX3RoaXMub3B0aW9ucy5jaGFya2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIG5vZGVbX3RoaXMub3B0aW9ucy5jaGFya2V5XSA9IG9ialtfdGhpcy5vcHRpb25zLmNoYXJrZXldO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbX3RoaXMub3B0aW9ucy5jaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmNoaWxka2V5XSA9IG9iajtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvYmogPSBub2RlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBvYmpDbG9uZSA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG9iakNsb25lW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldLnB1c2gob2JqQ2xvbmUpO1xuICAgICAgICAgICAgICBkZWxldGUgb2JqW1wiI25hbWVcIl07XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMSAmJiBjaGFya2V5IGluIG9iaiAmJiAhX3RoaXMuRVhQTElDSVRfQ0hBUktFWSkge1xuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFzc2lnbk9yUHVzaChzLCBub2RlTmFtZSwgb2JqKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuZXhwbGljaXRSb290KSB7XG4gICAgICAgICAgICAgIG9sZCA9IG9iajtcbiAgICAgICAgICAgICAgb2JqID0ge307XG4gICAgICAgICAgICAgIG9ialtub2RlTmFtZV0gPSBvbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5yZXN1bHRPYmplY3QgPSBvYmo7XG4gICAgICAgICAgICBfdGhpcy5zYXhQYXJzZXIuZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVtaXQoXCJlbmRcIiwgX3RoaXMucmVzdWx0T2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIG9udGV4dCA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBjaGFyQ2hpbGQsIHM7XG4gICAgICAgICAgcyA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzW2NoYXJrZXldICs9IHRleHQ7XG4gICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5leHBsaWNpdENoaWxkcmVuICYmIF90aGlzLm9wdGlvbnMucHJlc2VydmVDaGlsZHJlbk9yZGVyICYmIF90aGlzLm9wdGlvbnMuY2hhcnNBc0NoaWxkcmVuICYmIChfdGhpcy5vcHRpb25zLmluY2x1ZGVXaGl0ZUNoYXJzIHx8IHRleHQucmVwbGFjZSgvXFxcXG4vZywgJycpLnRyaW0oKSAhPT0gJycpKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBjaGFyQ2hpbGQgPSB7XG4gICAgICAgICAgICAgICAgJyNuYW1lJzogJ19fdGV4dF9fJ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSB0ZXh0O1xuICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSBjaGFyQ2hpbGRbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0ucHVzaChjaGFyQ2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbnRleHQgPSBvbnRleHQ7XG4gICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIub25jZGF0YSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBzO1xuICAgICAgICAgIHMgPSBvbnRleHQodGV4dCk7XG4gICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmNkYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICB9O1xuXG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgY2IpIHtcbiAgICAgIHZhciBlcnI7XG4gICAgICBpZiAoKGNiICE9IG51bGwpICYmIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub24oXCJlbmRcIiwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzdHIgPSBzdHIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHN0ci50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIkVtcHR5IHN0cmluZyBpcyBub3QgdmFsaWQgWE1MXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYm9tLnN0cmlwQk9NKHN0cik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMpIHtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHN0cjtcbiAgICAgICAgICBzZXRJbW1lZGlhdGUodGhpcy5wcm9jZXNzQXN5bmMpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNheFBhcnNlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIud3JpdGUoc3RyKS5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGVyciA9IGVycm9yMTtcbiAgICAgICAgaWYgKCEodGhpcy5zYXhQYXJzZXIuZXJyVGhyb3duIHx8IHRoaXMuc2F4UGFyc2VyLmVuZGVkKSkge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNheFBhcnNlci5lcnJUaHJvd24gPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2F4UGFyc2VyLmVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBQYXJzZXI7XG5cbiAgfSkoZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cbiAgZXhwb3J0cy5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgYSwgYikge1xuICAgIHZhciBjYiwgb3B0aW9ucywgcGFyc2VyO1xuICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IGI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBhO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBwYXJzZXIgPSBuZXcgZXhwb3J0cy5QYXJzZXIob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZVN0cmluZyhzdHIsIGNiKTtcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgcHJlZml4TWF0Y2g7XG5cbiAgcHJlZml4TWF0Y2ggPSBuZXcgUmVnRXhwKC8oPyF4bWxucyleLio6Lyk7XG5cbiAgZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG4gIH07XG5cbiAgZXhwb3J0cy5maXJzdENoYXJMb3dlckNhc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuICB9O1xuXG4gIGV4cG9ydHMuc3RyaXBQcmVmaXggPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocHJlZml4TWF0Y2gsICcnKTtcbiAgfTtcblxuICBleHBvcnRzLnBhcnNlTnVtYmVycyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmICghaXNOYU4oc3RyKSkge1xuICAgICAgc3RyID0gc3RyICUgMSA9PT0gMCA/IHBhcnNlSW50KHN0ciwgMTApIDogcGFyc2VGbG9hdChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIGV4cG9ydHMucGFyc2VCb29sZWFucyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmICgvXig/OnRydWV8ZmFsc2UpJC9pLnRlc3Qoc3RyKSkge1xuICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgYnVpbGRlciwgZGVmYXVsdHMsIHBhcnNlciwgcHJvY2Vzc29ycyxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG4gIGJ1aWxkZXIgPSByZXF1aXJlKCcuL2J1aWxkZXInKTtcblxuICBwYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xuXG4gIHByb2Nlc3NvcnMgPSByZXF1aXJlKCcuL3Byb2Nlc3NvcnMnKTtcblxuICBleHBvcnRzLmRlZmF1bHRzID0gZGVmYXVsdHMuZGVmYXVsdHM7XG5cbiAgZXhwb3J0cy5wcm9jZXNzb3JzID0gcHJvY2Vzc29ycztcblxuICBleHBvcnRzLlZhbGlkYXRpb25FcnJvciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFZhbGlkYXRpb25FcnJvciwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gVmFsaWRhdGlvbkVycm9yO1xuXG4gIH0pKEVycm9yKTtcblxuICBleHBvcnRzLkJ1aWxkZXIgPSBidWlsZGVyLkJ1aWxkZXI7XG5cbiAgZXhwb3J0cy5QYXJzZXIgPSBwYXJzZXIuUGFyc2VyO1xuXG4gIGV4cG9ydHMucGFyc2VTdHJpbmcgPSBwYXJzZXIucGFyc2VTdHJpbmc7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgYXNzaWduLCBpc0FycmF5LCBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNQbGFpbk9iamVjdCxcbiAgICBzbGljZSA9IFtdLnNsaWNlLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBhc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaSwga2V5LCBsZW4sIHNvdXJjZSwgc291cmNlcywgdGFyZ2V0O1xuICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSwgc291cmNlcyA9IDIgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IFtdO1xuICAgIGlmIChpc0Z1bmN0aW9uKE9iamVjdC5hc3NpZ24pKSB7XG4gICAgICBPYmplY3QuYXNzaWduLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc291cmNlID0gc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICBpc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsKSB7XG4gICAgcmV0dXJuICEhdmFsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xuXG4gIGlzT2JqZWN0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gISF2YWwgJiYgKChyZWYgPSB0eXBlb2YgdmFsKSA9PT0gJ2Z1bmN0aW9uJyB8fCByZWYgPT09ICdvYmplY3QnKTtcbiAgfTtcblxuICBpc0FycmF5ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oQXJyYXkuaXNBcnJheSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG4gIH07XG5cbiAgaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBrZXk7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuICF2YWwubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGtleSBpbiB2YWwpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwodmFsLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgY3RvciwgcHJvdG87XG4gICAgcmV0dXJuIGlzT2JqZWN0KHZhbCkgJiYgKHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCkpICYmIChjdG9yID0gcHJvdG8uY29uc3RydWN0b3IpICYmICh0eXBlb2YgY3RvciA9PT0gJ2Z1bmN0aW9uJykgJiYgKGN0b3IgaW5zdGFuY2VvZiBjdG9yKSAmJiAoRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY3RvcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdCkpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLmFzc2lnbiA9IGFzc2lnbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTEF0dHJpYnV0ZTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTEF0dHJpYnV0ZSA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxBdHRyaWJ1dGUocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgdGhpcy5vcHRpb25zID0gcGFyZW50Lm9wdGlvbnM7XG4gICAgICB0aGlzLnN0cmluZ2lmeSA9IHBhcmVudC5zdHJpbmdpZnk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXR0cmlidXRlIG5hbWUgb2YgZWxlbWVudCBcIiArIHBhcmVudC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXR0cmlidXRlIHZhbHVlIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lICsgXCIgb2YgZWxlbWVudCBcIiArIHBhcmVudC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5LmF0dE5hbWUobmFtZSk7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuYXR0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIFhNTEF0dHJpYnV0ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxBdHRyaWJ1dGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmF0dHJpYnV0ZSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTEF0dHJpYnV0ZTtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MQ0RhdGEgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxDRGF0YSwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDRGF0YShwYXJlbnQsIHRleHQpIHtcbiAgICAgIFhNTENEYXRhLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgQ0RBVEEgdGV4dFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGV4dCA9IHRoaXMuc3RyaW5naWZ5LmNkYXRhKHRleHQpO1xuICAgIH1cblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5jZGF0YSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTENEYXRhO1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENvbW1lbnQsIFhNTE5vZGUsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxDb21tZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MQ29tbWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDb21tZW50KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MQ29tbWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbW1lbnQgdGV4dFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGV4dCA9IHRoaXMuc3RyaW5naWZ5LmNvbW1lbnQodGV4dCk7XG4gICAgfVxuXG4gICAgWE1MQ29tbWVudC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxDb21tZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5jb21tZW50KHRoaXMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MQ29tbWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEVERBdHRMaXN0LCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFREQXR0TGlzdCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERUREF0dExpc3QsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFREQXR0TGlzdChwYXJlbnQsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIFhNTERUREF0dExpc3QuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGVsZW1lbnQgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWF0dHJpYnV0ZVR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIHR5cGVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZmF1bHRWYWx1ZVR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIGRlZmF1bHRcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlVHlwZS5pbmRleE9mKCcjJykgIT09IDApIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlVHlwZSA9ICcjJyArIGRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZmF1bHRWYWx1ZVR5cGUubWF0Y2goL14oI1JFUVVJUkVEfCNJTVBMSUVEfCNGSVhFRHwjREVGQVVMVCkkLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkZWZhdWx0IHZhbHVlIHR5cGU7IGV4cGVjdGVkOiAjUkVRVUlSRUQsICNJTVBMSUVELCAjRklYRUQgb3IgI0RFRkFVTFRcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICYmICFkZWZhdWx0VmFsdWVUeXBlLm1hdGNoKC9eKCNGSVhFRHwjREVGQVVMVCkkLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCB2YWx1ZSBvbmx5IGFwcGxpZXMgdG8gI0ZJWEVEIG9yICNERUZBVUxUXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IHRoaXMuc3RyaW5naWZ5LmVsZU5hbWUoZWxlbWVudE5hbWUpO1xuICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gdGhpcy5zdHJpbmdpZnkuYXR0TmFtZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEF0dFR5cGUoYXR0cmlidXRlVHlwZSk7XG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEF0dERlZmF1bHQoZGVmYXVsdFZhbHVlKTtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlVHlwZSA9IGRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgfVxuXG4gICAgWE1MRFREQXR0TGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkQXR0TGlzdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREF0dExpc3Q7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRFRERWxlbWVudCwgWE1MTm9kZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERUREVsZW1lbnQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxEVERFbGVtZW50LCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERUREVsZW1lbnQocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRERWxlbWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIERURCBlbGVtZW50IG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gJygjUENEQVRBKSc7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSAnKCcgKyB2YWx1ZS5qb2luKCcsJykgKyAnKSc7XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLnN0cmluZ2lmeS5lbGVOYW1lKG5hbWUpO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEVsZW1lbnRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgWE1MRFRERWxlbWVudC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkRWxlbWVudCh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREVsZW1lbnQ7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRFRERW50aXR5LCBYTUxOb2RlLCBpc09iamVjdCxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNPYmplY3Q7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFRERW50aXR5ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRERW50aXR5LCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERUREVudGl0eShwYXJlbnQsIHBlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRERW50aXR5Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgZW50aXR5IG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGVudGl0eSB2YWx1ZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGUgPSAhIXBlO1xuICAgICAgdGhpcy5uYW1lID0gdGhpcy5zdHJpbmdpZnkuZWxlTmFtZShuYW1lKTtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnN0cmluZ2lmeS5kdGRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXZhbHVlLnB1YklEICYmICF2YWx1ZS5zeXNJRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlB1YmxpYyBhbmQvb3Igc3lzdGVtIGlkZW50aWZpZXJzIGFyZSByZXF1aXJlZCBmb3IgYW4gZXh0ZXJuYWwgZW50aXR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5wdWJJRCAmJiAhdmFsdWUuc3lzSUQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeXN0ZW0gaWRlbnRpZmllciBpcyByZXF1aXJlZCBmb3IgYSBwdWJsaWMgZXh0ZXJuYWwgZW50aXR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5wdWJJRCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHZhbHVlLnB1YklEKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuc3lzSUQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRCh2YWx1ZS5zeXNJRCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLm5EYXRhICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm5EYXRhID0gdGhpcy5zdHJpbmdpZnkuZHRkTkRhdGEodmFsdWUubkRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlICYmIHRoaXMubkRhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3RhdGlvbiBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBhIHBhcmFtZXRlciBlbnRpdHlcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxEVERFbnRpdHkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmR0ZEVudGl0eSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREVudGl0eTtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEVEROb3RhdGlvbiwgWE1MTm9kZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERURE5vdGF0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRETm90YXRpb24sIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFRETm90YXRpb24ocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRETm90YXRpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBub3RhdGlvbiBuYW1lXCIpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZS5wdWJJRCAmJiAhdmFsdWUuc3lzSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHVibGljIG9yIHN5c3RlbSBpZGVudGlmaWVycyBhcmUgcmVxdWlyZWQgZm9yIGFuIGV4dGVybmFsIGVudGl0eVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5LmVsZU5hbWUobmFtZSk7XG4gICAgICBpZiAodmFsdWUucHViSUQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnB1YklEID0gdGhpcy5zdHJpbmdpZnkuZHRkUHViSUQodmFsdWUucHViSUQpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN5c0lEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zeXNJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFN5c0lEKHZhbHVlLnN5c0lEKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxEVEROb3RhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkTm90YXRpb24odGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEVEROb3RhdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEZWNsYXJhdGlvbiwgWE1MTm9kZSwgaXNPYmplY3QsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBpc09iamVjdCA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLmlzT2JqZWN0O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRGVjbGFyYXRpb24sIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRGVjbGFyYXRpb24ocGFyZW50LCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSkge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIFhNTERlY2xhcmF0aW9uLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAoaXNPYmplY3QodmVyc2lvbikpIHtcbiAgICAgICAgcmVmID0gdmVyc2lvbiwgdmVyc2lvbiA9IHJlZi52ZXJzaW9uLCBlbmNvZGluZyA9IHJlZi5lbmNvZGluZywgc3RhbmRhbG9uZSA9IHJlZi5zdGFuZGFsb25lO1xuICAgICAgfVxuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIHZlcnNpb24gPSAnMS4wJztcbiAgICAgIH1cbiAgICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuc3RyaW5naWZ5LnhtbFZlcnNpb24odmVyc2lvbik7XG4gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gdGhpcy5zdHJpbmdpZnkueG1sRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmUgPSB0aGlzLnN0cmluZ2lmeS54bWxTdGFuZGFsb25lKHN0YW5kYWxvbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTERlY2xhcmF0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5kZWNsYXJhdGlvbih0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERlY2xhcmF0aW9uO1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTERUREF0dExpc3QsIFhNTERUREVsZW1lbnQsIFhNTERUREVudGl0eSwgWE1MRFRETm90YXRpb24sIFhNTERvY1R5cGUsIFhNTE5vZGUsIGlzT2JqZWN0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgaXNPYmplY3QgPSByZXF1aXJlKCcuL1V0aWxpdHknKS5pc09iamVjdDtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgWE1MRFREQXR0TGlzdCA9IHJlcXVpcmUoJy4vWE1MRFREQXR0TGlzdCcpO1xuXG4gIFhNTERUREVudGl0eSA9IHJlcXVpcmUoJy4vWE1MRFRERW50aXR5Jyk7XG5cbiAgWE1MRFRERWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRFRERWxlbWVudCcpO1xuXG4gIFhNTERURE5vdGF0aW9uID0gcmVxdWlyZSgnLi9YTUxEVEROb3RhdGlvbicpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jVHlwZSA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERvY1R5cGUsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRG9jVHlwZShwYXJlbnQsIHB1YklELCBzeXNJRCkge1xuICAgICAgdmFyIHJlZiwgcmVmMTtcbiAgICAgIFhNTERvY1R5cGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIHRoaXMuZG9jdW1lbnRPYmplY3QgPSBwYXJlbnQ7XG4gICAgICBpZiAoaXNPYmplY3QocHViSUQpKSB7XG4gICAgICAgIHJlZiA9IHB1YklELCBwdWJJRCA9IHJlZi5wdWJJRCwgc3lzSUQgPSByZWYuc3lzSUQ7XG4gICAgICB9XG4gICAgICBpZiAoc3lzSUQgPT0gbnVsbCkge1xuICAgICAgICByZWYxID0gW3B1YklELCBzeXNJRF0sIHN5c0lEID0gcmVmMVswXSwgcHViSUQgPSByZWYxWzFdO1xuICAgICAgfVxuICAgICAgaWYgKHB1YklEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHB1YklEKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeXNJRCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRChzeXNJRCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbGVtZW50KHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuYXR0TGlzdCA9IGZ1bmN0aW9uKGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERUREF0dExpc3QodGhpcywgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLmVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbnRpdHkodGhpcywgZmFsc2UsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUucEVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbnRpdHkodGhpcywgdHJ1ZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2NUeXBlLnByb3RvdHlwZS5ub3RhdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVEROb3RhdGlvbih0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmRvY1R5cGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdChlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVHlwZSwgZGVmYXVsdFZhbHVlVHlwZSwgZGVmYXVsdFZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnBlbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucEVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RhdGlvbihuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290KCkgfHwgdGhpcy5kb2N1bWVudE9iamVjdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERvY1R5cGU7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRG9jdW1lbnQsIFhNTE5vZGUsIFhNTFN0cmluZ1dyaXRlciwgWE1MU3RyaW5naWZpZXIsIGlzUGxhaW5PYmplY3QsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNQbGFpbk9iamVjdDtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgWE1MU3RyaW5naWZpZXIgPSByZXF1aXJlKCcuL1hNTFN0cmluZ2lmaWVyJyk7XG5cbiAgWE1MU3RyaW5nV3JpdGVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdXcml0ZXInKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERvY3VtZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRG9jdW1lbnQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRG9jdW1lbnQob3B0aW9ucykge1xuICAgICAgWE1MRG9jdW1lbnQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbnVsbCk7XG4gICAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgICAgaWYgKCFvcHRpb25zLndyaXRlcikge1xuICAgICAgICBvcHRpb25zLndyaXRlciA9IG5ldyBYTUxTdHJpbmdXcml0ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLnN0cmluZ2lmeSA9IG5ldyBYTUxTdHJpbmdpZmllcihvcHRpb25zKTtcbiAgICAgIHRoaXMuaXNEb2N1bWVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHdyaXRlcikge1xuICAgICAgdmFyIHdyaXRlck9wdGlvbnM7XG4gICAgICBpZiAoIXdyaXRlcikge1xuICAgICAgICB3cml0ZXIgPSB0aGlzLm9wdGlvbnMud3JpdGVyO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHdyaXRlcikpIHtcbiAgICAgICAgd3JpdGVyT3B0aW9ucyA9IHdyaXRlcjtcbiAgICAgICAgd3JpdGVyID0gdGhpcy5vcHRpb25zLndyaXRlci5zZXQod3JpdGVyT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JpdGVyLmRvY3VtZW50KHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZG9jdW1lbnQodGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEb2N1bWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxBdHRyaWJ1dGUsIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEVERBdHRMaXN0LCBYTUxEVERFbGVtZW50LCBYTUxEVERFbnRpdHksIFhNTERURE5vdGF0aW9uLCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRG9jdW1lbnRDQiwgWE1MRWxlbWVudCwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFN0cmluZ1dyaXRlciwgWE1MU3RyaW5naWZpZXIsIFhNTFRleHQsIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1BsYWluT2JqZWN0LCByZWYsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uLCBpc1BsYWluT2JqZWN0ID0gcmVmLmlzUGxhaW5PYmplY3Q7XG5cbiAgWE1MRWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRWxlbWVudCcpO1xuXG4gIFhNTENEYXRhID0gcmVxdWlyZSgnLi9YTUxDRGF0YScpO1xuXG4gIFhNTENvbW1lbnQgPSByZXF1aXJlKCcuL1hNTENvbW1lbnQnKTtcblxuICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuXG4gIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcblxuICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSByZXF1aXJlKCcuL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbicpO1xuXG4gIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuXG4gIFhNTERvY1R5cGUgPSByZXF1aXJlKCcuL1hNTERvY1R5cGUnKTtcblxuICBYTUxEVERBdHRMaXN0ID0gcmVxdWlyZSgnLi9YTUxEVERBdHRMaXN0Jyk7XG5cbiAgWE1MRFRERW50aXR5ID0gcmVxdWlyZSgnLi9YTUxEVERFbnRpdHknKTtcblxuICBYTUxEVERFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxEVERFbGVtZW50Jyk7XG5cbiAgWE1MRFRETm90YXRpb24gPSByZXF1aXJlKCcuL1hNTERURE5vdGF0aW9uJyk7XG5cbiAgWE1MQXR0cmlidXRlID0gcmVxdWlyZSgnLi9YTUxBdHRyaWJ1dGUnKTtcblxuICBYTUxTdHJpbmdpZmllciA9IHJlcXVpcmUoJy4vWE1MU3RyaW5naWZpZXInKTtcblxuICBYTUxTdHJpbmdXcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmluZ1dyaXRlcicpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jdW1lbnRDQiA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxEb2N1bWVudENCKG9wdGlvbnMsIG9uRGF0YSwgb25FbmQpIHtcbiAgICAgIHZhciB3cml0ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIGlmICghb3B0aW9ucy53cml0ZXIpIHtcbiAgICAgICAgb3B0aW9ucy53cml0ZXIgPSBuZXcgWE1MU3RyaW5nV3JpdGVyKG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnMud3JpdGVyKSkge1xuICAgICAgICB3cml0ZXJPcHRpb25zID0gb3B0aW9ucy53cml0ZXI7XG4gICAgICAgIG9wdGlvbnMud3JpdGVyID0gbmV3IFhNTFN0cmluZ1dyaXRlcih3cml0ZXJPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLndyaXRlciA9IG9wdGlvbnMud3JpdGVyO1xuICAgICAgdGhpcy5zdHJpbmdpZnkgPSBuZXcgWE1MU3RyaW5naWZpZXIob3B0aW9ucyk7XG4gICAgICB0aGlzLm9uRGF0YUNhbGxiYWNrID0gb25EYXRhIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICB0aGlzLm9uRW5kQ2FsbGJhY2sgPSBvbkVuZCB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IC0xO1xuICAgICAgdGhpcy5vcGVuVGFncyA9IHt9O1xuICAgICAgdGhpcy5kb2N1bWVudFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZG9jdW1lbnRDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgfVxuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciByZWYxO1xuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG5vZGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvb3QgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvY3VtZW50IGNhbiBvbmx5IGhhdmUgb25lIHJvb3Qgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMudmFsdWVPZigpO1xuICAgICAgaWYgKCFpc09iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgICAgICByZWYxID0gW2F0dHJpYnV0ZXMsIHRleHRdLCB0ZXh0ID0gcmVmMVswXSwgYXR0cmlidXRlcyA9IHJlZjFbMV07XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnROb2RlID0gbmV3IFhNTEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCsrO1xuICAgICAgdGhpcy5vcGVuVGFnc1t0aGlzLmN1cnJlbnRMZXZlbF0gPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRleHQodGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlICYmIHRoaXMuY3VycmVudE5vZGUgaW5zdGFuY2VvZiBYTUxEb2NUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0ZEVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgYXR0TmFtZSwgYXR0VmFsdWU7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudE5vZGUgfHwgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHQoKSBjYW4gb25seSBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGVsZSgpIGNhbGwgaW4gY2FsbGJhY2sgbW9kZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICAgIGZvciAoYXR0TmFtZSBpbiBuYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwobmFtZSwgYXR0TmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGF0dFZhbHVlID0gbmFtZVthdHROYW1lXTtcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5za2lwTnVsbEF0dHJpYnV0ZXMgfHwgKHZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5hdHRyaWJ1dGVzW25hbWVdID0gbmV3IFhNTEF0dHJpYnV0ZSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxUZXh0KHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnRleHQobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTENEYXRhKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmNkYXRhKG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTENvbW1lbnQodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuY29tbWVudChub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTFJhdyh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5yYXcobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgaSwgaW5zVGFyZ2V0LCBpbnNWYWx1ZSwgbGVuLCBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gdGFyZ2V0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaW5zVGFyZ2V0ID0gdGFyZ2V0W2ldO1xuICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb24oaW5zVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIGZvciAoaW5zVGFyZ2V0IGluIHRhcmdldCkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHRhcmdldCwgaW5zVGFyZ2V0KSkgY29udGludWU7XG4gICAgICAgICAgaW5zVmFsdWUgPSB0YXJnZXRbaW5zVGFyZ2V0XTtcbiAgICAgICAgICB0aGlzLmluc3RydWN0aW9uKGluc1RhcmdldCwgaW5zVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmFwcGx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5ldyBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcywgdGFyZ2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIGlmICh0aGlzLmRvY3VtZW50U3RhcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWNsYXJhdGlvbigpIG11c3QgYmUgdGhlIGZpcnN0IG5vZGVcIik7XG4gICAgICB9XG4gICAgICBub2RlID0gbmV3IFhNTERlY2xhcmF0aW9uKHRoaXMsIHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmRlY2xhcmF0aW9uKG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRvY3R5cGUgPSBmdW5jdGlvbihyb290LCBwdWJJRCwgc3lzSUQpIHtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyByb290IG5vZGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZHRkKCkgbXVzdCBjb21lIGJlZm9yZSB0aGUgcm9vdCBub2RlXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG5ldyBYTUxEb2NUeXBlKHRoaXMsIHB1YklELCBzeXNJRCk7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLnJvb3ROb2RlTmFtZSA9IHJvb3Q7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCsrO1xuICAgICAgdGhpcy5vcGVuVGFnc1t0aGlzLmN1cnJlbnRMZXZlbF0gPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZEVsZW1lbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERUREVsZW1lbnQodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkRWxlbWVudChub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5hdHRMaXN0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERUREF0dExpc3QodGhpcywgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRBdHRMaXN0KG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRERW50aXR5KHRoaXMsIGZhbHNlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRFbnRpdHkobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUucEVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRERW50aXR5KHRoaXMsIHRydWUsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZEVudGl0eShub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub3RhdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRETm90YXRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkTm90YXRpb24obm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUudXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRvY3VtZW50IG5vZGUgaGFzIG5vIHBhcmVudFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU5vZGUodGhpcy5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTm9kZSh0aGlzLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VOb2RlKHRoaXMub3BlblRhZ3NbdGhpcy5jdXJyZW50TGV2ZWxdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXTtcbiAgICAgIHRoaXMuY3VycmVudExldmVsLS07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aGlsZSAodGhpcy5jdXJyZW50TGV2ZWwgPj0gMCkge1xuICAgICAgICB0aGlzLnVwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZCgpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuQ3VycmVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Ob2RlKHRoaXMuY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc09wZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IDAgJiYgbm9kZSBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLm9wZW5Ob2RlKG5vZGUsIHRoaXMuY3VycmVudExldmVsKSk7XG4gICAgICAgIHJldHVybiBub2RlLmlzT3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNsb3NlTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc0Nsb3NlZCkge1xuICAgICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5jbG9zZU5vZGUobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwpKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykge1xuICAgICAgdGhpcy5kb2N1bWVudFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMub25EYXRhQ2FsbGJhY2soY2h1bmspO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb2N1bWVudENvbXBsZXRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZENhbGxiYWNrKCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub2QgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50eHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRhdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZGF0YSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNvbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuaW5zID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRlYyA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNsYXJhdGlvbih2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZCA9IGZ1bmN0aW9uKHJvb3QsIHB1YklELCBzeXNJRCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdHlwZShyb290LCBwdWJJRCwgc3lzSUQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5lID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubiA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2RhdGEodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5jID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhdyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmkgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSAmJiB0aGlzLmN1cnJlbnROb2RlIGluc3RhbmNlb2YgWE1MRG9jVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRMaXN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUgJiYgdGhpcy5jdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFhNTERvY1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVudCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRpdHkobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5wZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBFbnRpdHkobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub3QgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90YXRpb24obmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRG9jdW1lbnRDQjtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTEF0dHJpYnV0ZSwgWE1MRWxlbWVudCwgWE1MTm9kZSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIHJlZixcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uO1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBYTUxBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL1hNTEF0dHJpYnV0ZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRWxlbWVudCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTEVsZW1lbnQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRWxlbWVudChwYXJlbnQsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIFhNTEVsZW1lbnQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBlbGVtZW50IG5hbWVcIik7XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLnN0cmluZ2lmeS5lbGVOYW1lKG5hbWUpO1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlKGF0dHJpYnV0ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudC5pc0RvY3VtZW50KSB7XG4gICAgICAgIHRoaXMuaXNSb290ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb2N1bWVudE9iamVjdCA9IHBhcmVudDtcbiAgICAgICAgcGFyZW50LnJvb3RPYmplY3QgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXR0LCBhdHROYW1lLCBjbG9uZWRTZWxmLCByZWYxO1xuICAgICAgY2xvbmVkU2VsZiA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICBpZiAoY2xvbmVkU2VsZi5pc1Jvb3QpIHtcbiAgICAgICAgY2xvbmVkU2VsZi5kb2N1bWVudE9iamVjdCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjbG9uZWRTZWxmLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgIHJlZjEgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKGF0dE5hbWUgaW4gcmVmMSkge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYxLCBhdHROYW1lKSkgY29udGludWU7XG4gICAgICAgIGF0dCA9IHJlZjFbYXR0TmFtZV07XG4gICAgICAgIGNsb25lZFNlbGYuYXR0cmlidXRlc1thdHROYW1lXSA9IGF0dC5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgY2xvbmVkU2VsZi5jaGlsZHJlbiA9IFtdO1xuICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHZhciBjbG9uZWRDaGlsZDtcbiAgICAgICAgY2xvbmVkQ2hpbGQgPSBjaGlsZC5jbG9uZSgpO1xuICAgICAgICBjbG9uZWRDaGlsZC5wYXJlbnQgPSBjbG9uZWRTZWxmO1xuICAgICAgICByZXR1cm4gY2xvbmVkU2VsZi5jaGlsZHJlbi5wdXNoKGNsb25lZENoaWxkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNsb25lZFNlbGY7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgYXR0TmFtZSwgYXR0VmFsdWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgICAgICBmb3IgKGF0dE5hbWUgaW4gbmFtZSkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG5hbWUsIGF0dE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICBhdHRWYWx1ZSA9IG5hbWVbYXR0TmFtZV07XG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmFwcGx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcE51bGxBdHRyaWJ1dGVzIHx8ICh2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IG5ldyBYTUxBdHRyaWJ1dGUodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGF0dE5hbWUsIGksIGxlbjtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBhdHROYW1lID0gbmFtZVtpXTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2F0dE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmVsZW1lbnQodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmF0dCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5hID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxFbGVtZW50O1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRWxlbWVudCwgWE1MTm9kZSwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFRleHQsIGlzRW1wdHksIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCByZWYsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uLCBpc0VtcHR5ID0gcmVmLmlzRW1wdHk7XG5cbiAgWE1MRWxlbWVudCA9IG51bGw7XG5cbiAgWE1MQ0RhdGEgPSBudWxsO1xuXG4gIFhNTENvbW1lbnQgPSBudWxsO1xuXG4gIFhNTERlY2xhcmF0aW9uID0gbnVsbDtcblxuICBYTUxEb2NUeXBlID0gbnVsbDtcblxuICBYTUxSYXcgPSBudWxsO1xuXG4gIFhNTFRleHQgPSBudWxsO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IG51bGw7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxOb2RlID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFhNTE5vZGUocGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnBhcmVudC5vcHRpb25zO1xuICAgICAgICB0aGlzLnN0cmluZ2lmeSA9IHRoaXMucGFyZW50LnN0cmluZ2lmeTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgIGlmICghWE1MRWxlbWVudCkge1xuICAgICAgICBYTUxFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxFbGVtZW50Jyk7XG4gICAgICAgIFhNTENEYXRhID0gcmVxdWlyZSgnLi9YTUxDRGF0YScpO1xuICAgICAgICBYTUxDb21tZW50ID0gcmVxdWlyZSgnLi9YTUxDb21tZW50Jyk7XG4gICAgICAgIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuICAgICAgICBYTUxEb2NUeXBlID0gcmVxdWlyZSgnLi9YTUxEb2NUeXBlJyk7XG4gICAgICAgIFhNTFJhdyA9IHJlcXVpcmUoJy4vWE1MUmF3Jyk7XG4gICAgICAgIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcbiAgICAgICAgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gcmVxdWlyZSgnLi9YTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgdmFyIGNoaWxkTm9kZSwgaXRlbSwgaiwgaywga2V5LCBsYXN0Q2hpbGQsIGxlbiwgbGVuMSwgcmVmMSwgdmFsO1xuICAgICAgbGFzdENoaWxkID0gbnVsbDtcbiAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMudmFsdWVPZigpO1xuICAgICAgaWYgKCFpc09iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgICAgICByZWYxID0gW2F0dHJpYnV0ZXMsIHRleHRdLCB0ZXh0ID0gcmVmMVswXSwgYXR0cmlidXRlcyA9IHJlZjFbMV07XG4gICAgICB9XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IG5hbWUubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpdGVtID0gbmFtZVtqXTtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihuYW1lKSkge1xuICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQobmFtZS5hcHBseSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICAgICAgZm9yIChrZXkgaW4gbmFtZSkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG5hbWUsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhbCA9IG5hbWVba2V5XTtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuYXBwbHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChpc09iamVjdCh2YWwpKSAmJiAoaXNFbXB0eSh2YWwpKSkge1xuICAgICAgICAgICAgdmFsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRGVjb3JhdG9ycyAmJiB0aGlzLnN0cmluZ2lmeS5jb252ZXJ0QXR0S2V5ICYmIGtleS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkpID09PSAwKSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmF0dHJpYnV0ZShrZXkuc3Vic3RyKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkubGVuZ3RoKSwgdmFsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdGVBcnJheUl0ZW1zICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHZhbC5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHtcbiAgICAgICAgICAgICAgaXRlbSA9IHZhbFtrXTtcbiAgICAgICAgICAgICAgY2hpbGROb2RlID0ge307XG4gICAgICAgICAgICAgIGNoaWxkTm9kZVtrZXldID0gaXRlbTtcbiAgICAgICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5lbGVtZW50KGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQoa2V5KTtcbiAgICAgICAgICAgIGxhc3RDaGlsZC5lbGVtZW50KHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChrZXksIHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRUZXh0S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0VGV4dEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLnRleHQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDRGF0YUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydENEYXRhS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuY2RhdGEodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDb21tZW50S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0Q29tbWVudEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmNvbW1lbnQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkgJiYgbmFtZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkpID09PSAwKSB7XG4gICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5yYXcodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRQSUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuaW5zdHJ1Y3Rpb24obmFtZS5zdWJzdHIodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5Lmxlbmd0aCksIHRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMubm9kZShuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBjcmVhdGUgYW55IGVsZW1lbnRzIHdpdGg6IFwiICsgbmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFzdENoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpZiAodGhpcy5pc1Jvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGluc2VydCBlbGVtZW50cyBhdCByb290IGxldmVsXCIpO1xuICAgICAgfVxuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5lbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgcmVtb3ZlZDtcbiAgICAgIGlmICh0aGlzLmlzUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zZXJ0IGVsZW1lbnRzIGF0IHJvb3QgbGV2ZWxcIik7XG4gICAgICB9XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSArIDEpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5lbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpLCByZWYxO1xuICAgICAgaWYgKHRoaXMuaXNSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZW1vdmUgdGhlIHJvb3QgZWxlbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgW10uc3BsaWNlLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCBbaSwgaSAtIGkgKyAxXS5jb25jYXQocmVmMSA9IFtdKSksIHJlZjE7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICB2YXIgY2hpbGQsIHJlZjE7XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMgfHwgKGF0dHJpYnV0ZXMgPSB7fSk7XG4gICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy52YWx1ZU9mKCk7XG4gICAgICBpZiAoIWlzT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHJlZjEgPSBbYXR0cmlidXRlcywgdGV4dF0sIHRleHQgPSByZWYxWzBdLCBhdHRyaWJ1dGVzID0gcmVmMVsxXTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gbmV3IFhNTEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGNoaWxkLnRleHQodGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTFRleHQodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxDRGF0YSh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkO1xuICAgICAgY2hpbGQgPSBuZXcgWE1MQ29tbWVudCh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbW1lbnRCZWZvcmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkLCBpLCByZW1vdmVkO1xuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5jb21tZW50KHZhbHVlKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jb21tZW50QWZ0ZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkLCBpLCByZW1vdmVkO1xuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkgKyAxKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJlbnQuY29tbWVudCh2YWx1ZSk7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbiwgcmVtb3ZlZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTFJhdyh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgdmFyIGluc1RhcmdldCwgaW5zVmFsdWUsIGluc3RydWN0aW9uLCBqLCBsZW47XG4gICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSB0YXJnZXQubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpbnNUYXJnZXQgPSB0YXJnZXRbal07XG4gICAgICAgICAgdGhpcy5pbnN0cnVjdGlvbihpbnNUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChpbnNUYXJnZXQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwodGFyZ2V0LCBpbnNUYXJnZXQpKSBjb250aW51ZTtcbiAgICAgICAgICBpbnNWYWx1ZSA9IHRhcmdldFtpbnNUYXJnZXRdO1xuICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb24oaW5zVGFyZ2V0LCBpbnNWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IG5ldyBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcywgdGFyZ2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChpbnN0cnVjdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW5zdHJ1Y3Rpb25CZWZvcmUgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyZW50Lmluc3RydWN0aW9uKHRhcmdldCwgdmFsdWUpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uQWZ0ZXIgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSArIDEpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgZG9jLCB4bWxkZWM7XG4gICAgICBkb2MgPSB0aGlzLmRvY3VtZW50KCk7XG4gICAgICB4bWxkZWMgPSBuZXcgWE1MRGVjbGFyYXRpb24oZG9jLCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgICBpZiAoZG9jLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgWE1MRGVjbGFyYXRpb24pIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuWzBdID0geG1sZGVjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuLnVuc2hpZnQoeG1sZGVjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2Mucm9vdCgpIHx8IGRvYztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZG9jdHlwZSA9IGZ1bmN0aW9uKHB1YklELCBzeXNJRCkge1xuICAgICAgdmFyIGNoaWxkLCBkb2MsIGRvY3R5cGUsIGksIGosIGssIGxlbiwgbGVuMSwgcmVmMSwgcmVmMjtcbiAgICAgIGRvYyA9IHRoaXMuZG9jdW1lbnQoKTtcbiAgICAgIGRvY3R5cGUgPSBuZXcgWE1MRG9jVHlwZShkb2MsIHB1YklELCBzeXNJRCk7XG4gICAgICByZWYxID0gZG9jLmNoaWxkcmVuO1xuICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHJlZjEubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMVtpXTtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWE1MRG9jVHlwZSkge1xuICAgICAgICAgIGRvYy5jaGlsZHJlbltpXSA9IGRvY3R5cGU7XG4gICAgICAgICAgcmV0dXJuIGRvY3R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZjIgPSBkb2MuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSBrID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykge1xuICAgICAgICBjaGlsZCA9IHJlZjJbaV07XG4gICAgICAgIGlmIChjaGlsZC5pc1Jvb3QpIHtcbiAgICAgICAgICBkb2MuY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRvY3R5cGUpO1xuICAgICAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb2MuY2hpbGRyZW4ucHVzaChkb2N0eXBlKTtcbiAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS51cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuaXNSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSByb290IG5vZGUgaGFzIG5vIHBhcmVudC4gVXNlIGRvYygpIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgZG9jdW1lbnQgb2JqZWN0LlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucm9vdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICBub2RlID0gdGhpcztcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmlzRG9jdW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5yb290T2JqZWN0O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuaXNSb290KSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmRvY3VtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIG5vZGUgPSB0aGlzO1xuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNEb2N1bWVudCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudCgpLmVuZChvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGk7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIGlmIChpIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbHJlYWR5IGF0IHRoZSBmaXJzdCBub2RlXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2kgLSAxXTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGk7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIGlmIChpID09PSAtMSB8fCBpID09PSB0aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFscmVhZHkgYXQgdGhlIGxhc3Qgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltpICsgMV07XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmltcG9ydERvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7XG4gICAgICB2YXIgY2xvbmVkUm9vdDtcbiAgICAgIGNsb25lZFJvb3QgPSBkb2Mucm9vdCgpLmNsb25lKCk7XG4gICAgICBjbG9uZWRSb290LnBhcmVudCA9IHRoaXM7XG4gICAgICBjbG9uZWRSb290LmlzUm9vdCA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNsb25lZFJvb3QpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm5vZCA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnR4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZGF0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNkYXRhKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuY29tID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnMgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZG9jID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudCgpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kZWMgPSBmdW5jdGlvbih2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24odmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kdGQgPSBmdW5jdGlvbihwdWJJRCwgc3lzSUQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3R5cGUocHViSUQsIHN5c0lEKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm4gPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNkYXRhKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuYyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXcodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwKCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmltcG9ydFhNTEJ1aWxkZXIgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydERvY3VtZW50KGRvYyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxOb2RlO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MTm9kZSwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJlbnQsIHRhcmdldCwgdmFsdWUpIHtcbiAgICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0XCIpO1xuICAgICAgfVxuICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnN0cmluZ2lmeS5pbnNUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuaW5zVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxOb2RlLCBYTUxSYXcsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxSYXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxSYXcsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MUmF3KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MUmF3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmF3IHRleHRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkucmF3KHRleHQpO1xuICAgIH1cblxuICAgIFhNTFJhdy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxSYXcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnJhdyh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFJhdztcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxDRGF0YSwgWE1MQ29tbWVudCwgWE1MRFREQXR0TGlzdCwgWE1MRFRERWxlbWVudCwgWE1MRFRERW50aXR5LCBYTUxEVEROb3RhdGlvbiwgWE1MRGVjbGFyYXRpb24sIFhNTERvY1R5cGUsIFhNTEVsZW1lbnQsIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwgWE1MUmF3LCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFRleHQsIFhNTFdyaXRlckJhc2UsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRGVjbGFyYXRpb24nKTtcblxuICBYTUxEb2NUeXBlID0gcmVxdWlyZSgnLi9YTUxEb2NUeXBlJyk7XG5cbiAgWE1MQ0RhdGEgPSByZXF1aXJlKCcuL1hNTENEYXRhJyk7XG5cbiAgWE1MQ29tbWVudCA9IHJlcXVpcmUoJy4vWE1MQ29tbWVudCcpO1xuXG4gIFhNTEVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTEVsZW1lbnQnKTtcblxuICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuXG4gIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcblxuICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSByZXF1aXJlKCcuL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbicpO1xuXG4gIFhNTERUREF0dExpc3QgPSByZXF1aXJlKCcuL1hNTERUREF0dExpc3QnKTtcblxuICBYTUxEVERFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxEVERFbGVtZW50Jyk7XG5cbiAgWE1MRFRERW50aXR5ID0gcmVxdWlyZSgnLi9YTUxEVERFbnRpdHknKTtcblxuICBYTUxEVEROb3RhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRFRETm90YXRpb24nKTtcblxuICBYTUxXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi9YTUxXcml0ZXJCYXNlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxTdHJlYW1Xcml0ZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxTdHJlYW1Xcml0ZXIsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucykge1xuICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICBYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykge1xuICAgICAgdmFyIGNoaWxkLCBpLCBqLCBsZW4sIGxlbjEsIHJlZiwgcmVmMSwgcmVzdWx0cztcbiAgICAgIHJlZiA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjaGlsZCA9IHJlZltpXTtcbiAgICAgICAgY2hpbGQuaXNMYXN0Um9vdE5vZGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRvYy5jaGlsZHJlbltkb2MuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uaXNMYXN0Um9vdE5vZGUgPSB0cnVlO1xuICAgICAgcmVmMSA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAoaiA9IDAsIGxlbjEgPSByZWYxLmxlbmd0aDsgaiA8IGxlbjE7IGorKykge1xuICAgICAgICBjaGlsZCA9IHJlZjFbal07XG4gICAgICAgIHN3aXRjaCAoZmFsc2UpIHtcbiAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEZWNsYXJhdGlvbik6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5kZWNsYXJhdGlvbihjaGlsZCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRG9jVHlwZSk6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5kb2NUeXBlKGNoaWxkKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDb21tZW50KTpcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmNvbW1lbnQoY2hpbGQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbik6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5lbGVtZW50KGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCcgJyArIGF0dC5uYW1lICsgJz1cIicgKyBhdHQudmFsdWUgKyAnXCInKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyAnPCFbQ0RBVEFbJyArIG5vZGUudGV4dCArICddXT4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IS0tICcgKyBub2RlLnRleHQgKyAnIC0tPicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmRlY2xhcmF0aW9uID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UobGV2ZWwpKTtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc8P3htbCB2ZXJzaW9uPVwiJyArIG5vZGUudmVyc2lvbiArICdcIicpO1xuICAgICAgaWYgKG5vZGUuZW5jb2RpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIGVuY29kaW5nPVwiJyArIG5vZGUuZW5jb2RpbmcgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIHN0YW5kYWxvbmU9XCInICsgbm9kZS5zdGFuZGFsb25lICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPz4nKTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmRvY1R5cGUgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGNoaWxkLCBpLCBsZW4sIHJlZjtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkpO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJzwhRE9DVFlQRSAnICsgbm9kZS5yb290KCkubmFtZSk7XG4gICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIicpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnN5c0lEKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBbJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgICAgIHJlZiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIHN3aXRjaCAoZmFsc2UpIHtcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTERUREF0dExpc3QpOlxuICAgICAgICAgICAgICB0aGlzLmR0ZEF0dExpc3QoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRFRERWxlbWVudCk6XG4gICAgICAgICAgICAgIHRoaXMuZHRkRWxlbWVudChjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbnRpdHkpOlxuICAgICAgICAgICAgICB0aGlzLmR0ZEVudGl0eShjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVEROb3RhdGlvbik6XG4gICAgICAgICAgICAgIHRoaXMuZHRkTm90YXRpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MQ0RhdGEpOlxuICAgICAgICAgICAgICB0aGlzLmNkYXRhKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKTpcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBEVEQgbm9kZSB0eXBlOiBcIiArIGNoaWxkLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnXScpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJz4nKTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGF0dCwgY2hpbGQsIGksIGxlbiwgbmFtZSwgcmVmLCByZWYxLCBzcGFjZTtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgc3BhY2UgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHNwYWNlICsgJzwnICsgbm9kZS5uYW1lKTtcbiAgICAgIHJlZiA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgIGZvciAobmFtZSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBuYW1lKSkgY29udGludWU7XG4gICAgICAgIGF0dCA9IHJlZltuYW1lXTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGUoYXR0KTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWUgPT09ICcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc+PC8nICsgbm9kZS5uYW1lICsgJz4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnLz4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXR0eSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiAobm9kZS5jaGlsZHJlblswXS52YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicpO1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShub2RlLmNoaWxkcmVuWzBdLnZhbHVlKTtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJzwvJyArIG5vZGUubmFtZSArICc+Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicgKyB0aGlzLm5ld2xpbmUpO1xuICAgICAgICByZWYxID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmMS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmMVtpXTtcbiAgICAgICAgICBzd2l0Y2ggKGZhbHNlKSB7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MQ29tbWVudCk6XG4gICAgICAgICAgICAgIHRoaXMuY29tbWVudChjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxFbGVtZW50KTpcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFJhdyk6XG4gICAgICAgICAgICAgIHRoaXMucmF3KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFRleHQpOlxuICAgICAgICAgICAgICB0aGlzLnRleHQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKTpcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBYTUwgbm9kZSB0eXBlOiBcIiArIGNoaWxkLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShzcGFjZSArICc8LycgKyBub2RlLm5hbWUgKyAnPicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUucHJvY2Vzc2luZ0luc3RydWN0aW9uID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UobGV2ZWwpICsgJzw/JyArIG5vZGUudGFyZ2V0KTtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgJyArIG5vZGUudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCc/PicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyBub2RlLnZhbHVlICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArIG5vZGUudmFsdWUgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmR0ZEF0dExpc3QgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyAnPCFBVFRMSVNUICcgKyBub2RlLmVsZW1lbnROYW1lICsgJyAnICsgbm9kZS5hdHRyaWJ1dGVOYW1lICsgJyAnICsgbm9kZS5hdHRyaWJ1dGVUeXBlKTtcbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZVR5cGUgIT09ICcjREVGQVVMVCcpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyAnICsgbm9kZS5kZWZhdWx0VmFsdWVUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFwiJyArIG5vZGUuZGVmYXVsdFZhbHVlICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kdGRFbGVtZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IUVMRU1FTlQgJyArIG5vZGUubmFtZSArICcgJyArIG5vZGUudmFsdWUgKyAnPicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmR0ZEVudGl0eSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IUVOVElUWScpO1xuICAgICAgaWYgKG5vZGUucGUpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyAlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSgnICcgKyBub2RlLm5hbWUpO1xuICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBcIicgKyBub2RlLnZhbHVlICsgJ1wiJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBQVUJMSUMgXCInICsgbm9kZS5wdWJJRCArICdcIiBcIicgKyBub2RlLnN5c0lEICsgJ1wiJyk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5uRGF0YSkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgTkRBVEEgJyArIG5vZGUubkRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kdGROb3RhdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IU5PVEFUSU9OICcgKyBub2RlLm5hbWUpO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5wdWJJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiJyk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuc3lzSUQpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCc+JyArIHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZW5kbGluZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc0xhc3RSb290Tm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdsaW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gWE1MU3RyZWFtV3JpdGVyO1xuXG4gIH0pKFhNTFdyaXRlckJhc2UpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEVERBdHRMaXN0LCBYTUxEVERFbGVtZW50LCBYTUxEVERFbnRpdHksIFhNTERURE5vdGF0aW9uLCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRWxlbWVudCwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFN0cmluZ1dyaXRlciwgWE1MVGV4dCwgWE1MV3JpdGVyQmFzZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuXG4gIFhNTERvY1R5cGUgPSByZXF1aXJlKCcuL1hNTERvY1R5cGUnKTtcblxuICBYTUxDRGF0YSA9IHJlcXVpcmUoJy4vWE1MQ0RhdGEnKTtcblxuICBYTUxDb21tZW50ID0gcmVxdWlyZSgnLi9YTUxDb21tZW50Jyk7XG5cbiAgWE1MRWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRWxlbWVudCcpO1xuXG4gIFhNTFJhdyA9IHJlcXVpcmUoJy4vWE1MUmF3Jyk7XG5cbiAgWE1MVGV4dCA9IHJlcXVpcmUoJy4vWE1MVGV4dCcpO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHJlcXVpcmUoJy4vWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uJyk7XG5cbiAgWE1MRFREQXR0TGlzdCA9IHJlcXVpcmUoJy4vWE1MRFREQXR0TGlzdCcpO1xuXG4gIFhNTERUREVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTERUREVsZW1lbnQnKTtcblxuICBYTUxEVERFbnRpdHkgPSByZXF1aXJlKCcuL1hNTERUREVudGl0eScpO1xuXG4gIFhNTERURE5vdGF0aW9uID0gcmVxdWlyZSgnLi9YTUxEVEROb3RhdGlvbicpO1xuXG4gIFhNTFdyaXRlckJhc2UgPSByZXF1aXJlKCcuL1hNTFdyaXRlckJhc2UnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTFN0cmluZ1dyaXRlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFN0cmluZ1dyaXRlciwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxTdHJpbmdXcml0ZXIob3B0aW9ucykge1xuICAgICAgWE1MU3RyaW5nV3JpdGVyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICB0aGlzLnRleHRpc3ByZXNlbnQgPSBmYWxzZTtcbiAgICAgIHIgPSAnJztcbiAgICAgIHJlZiA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjaGlsZCA9IHJlZltpXTtcbiAgICAgICAgciArPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRGVjbGFyYXRpb24pOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNsYXJhdGlvbihjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEb2NUeXBlKTpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jVHlwZShjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDb21tZW50KTpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudChjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChjaGlsZCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucHJldHR5ICYmIHIuc2xpY2UoLXRoaXMubmV3bGluZS5sZW5ndGgpID09PSB0aGlzLm5ld2xpbmUpIHtcbiAgICAgICAgciA9IHIuc2xpY2UoMCwgLXRoaXMubmV3bGluZS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuYXR0cmlidXRlID0gZnVuY3Rpb24oYXR0KSB7XG4gICAgICByZXR1cm4gJyAnICsgYXR0Lm5hbWUgKyAnPVwiJyArIGF0dC52YWx1ZSArICdcIic7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgJzwhW0NEQVRBWycgKyBub2RlLnRleHQgKyAnXV0+JyArIHRoaXMubmV3bGluZTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNlKGxldmVsKSArICc8IS0tICcgKyBub2RlLnRleHQgKyAnIC0tPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICByID0gdGhpcy5zcGFjZShsZXZlbCk7XG4gICAgICByICs9ICc8P3htbCB2ZXJzaW9uPVwiJyArIG5vZGUudmVyc2lvbiArICdcIic7XG4gICAgICBpZiAobm9kZS5lbmNvZGluZyAhPSBudWxsKSB7XG4gICAgICAgIHIgKz0gJyBlbmNvZGluZz1cIicgKyBub2RlLmVuY29kaW5nICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICByICs9ICcgc3RhbmRhbG9uZT1cIicgKyBub2RlLnN0YW5kYWxvbmUgKyAnXCInO1xuICAgICAgfVxuICAgICAgciArPSAnPz4nO1xuICAgICAgciArPSB0aGlzLm5ld2xpbmU7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5kb2NUeXBlID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICBsZXZlbCB8fCAobGV2ZWwgPSAwKTtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHIgKz0gJzwhRE9DVFlQRSAnICsgbm9kZS5yb290KCkubmFtZTtcbiAgICAgIGlmIChub2RlLnB1YklEICYmIG5vZGUuc3lzSUQpIHtcbiAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnN5c0lEKSB7XG4gICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHIgKz0gJyBbJztcbiAgICAgICAgciArPSB0aGlzLm5ld2xpbmU7XG4gICAgICAgIHJlZiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIHIgKz0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERBdHRMaXN0KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kdGRBdHRMaXN0KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbGVtZW50KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kdGRFbGVtZW50KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbnRpdHkpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmR0ZEVudGl0eShjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRFRETm90YXRpb24pOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmR0ZE5vdGF0aW9uKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbik6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gRFREIG5vZGUgdHlwZTogXCIgKyBjaGlsZC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gJ10nO1xuICAgICAgfVxuICAgICAgciArPSAnPic7XG4gICAgICByICs9IHRoaXMubmV3bGluZTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLmVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGF0dCwgY2hpbGQsIGksIGosIGxlbiwgbGVuMSwgbmFtZSwgciwgcmVmLCByZWYxLCByZWYyLCBzcGFjZSwgdGV4dGlzcHJlc2VudHdhc3NldDtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgdGV4dGlzcHJlc2VudHdhc3NldCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMudGV4dGlzcHJlc2VudCkge1xuICAgICAgICB0aGlzLm5ld2xpbmUgPSAnJztcbiAgICAgICAgdGhpcy5wcmV0dHkgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmV3bGluZSA9IHRoaXMubmV3bGluZWRlZmF1bHQ7XG4gICAgICAgIHRoaXMucHJldHR5ID0gdGhpcy5wcmV0dHlkZWZhdWx0O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHIgPSAnJztcbiAgICAgIHIgKz0gc3BhY2UgKyAnPCcgKyBub2RlLm5hbWU7XG4gICAgICByZWYgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKG5hbWUgaW4gcmVmKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBhdHQgPSByZWZbbmFtZV07XG4gICAgICAgIHIgKz0gdGhpcy5hdHRyaWJ1dGUoYXR0KTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWUgPT09ICcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgICAgIHIgKz0gJz48LycgKyBub2RlLm5hbWUgKyAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgciArPSAnLz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJldHR5ICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIChub2RlLmNoaWxkcmVuWzBdLnZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgIHIgKz0gJz4nO1xuICAgICAgICByICs9IG5vZGUuY2hpbGRyZW5bMF0udmFsdWU7XG4gICAgICAgIHIgKz0gJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMpIHtcbiAgICAgICAgICByZWYxID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHJlZjFbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnRleHRpc3ByZXNlbnQrKztcbiAgICAgICAgICAgICAgdGV4dGlzcHJlc2VudHdhc3NldCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0aXNwcmVzZW50KSB7XG4gICAgICAgICAgdGhpcy5uZXdsaW5lID0gJyc7XG4gICAgICAgICAgdGhpcy5wcmV0dHkgPSBmYWxzZTtcbiAgICAgICAgICBzcGFjZSA9IHRoaXMuc3BhY2UobGV2ZWwpO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICByZWYyID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBqIDwgbGVuMTsgaisrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWYyW2pdO1xuICAgICAgICAgIHIgKz0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFJhdyk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxUZXh0KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFhNTCBub2RlIHR5cGU6IFwiICsgY2hpbGQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dGlzcHJlc2VudHdhc3NldCkge1xuICAgICAgICAgIHRoaXMudGV4dGlzcHJlc2VudC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50ZXh0aXNwcmVzZW50KSB7XG4gICAgICAgICAgdGhpcy5uZXdsaW5lID0gdGhpcy5uZXdsaW5lZGVmYXVsdDtcbiAgICAgICAgICB0aGlzLnByZXR0eSA9IHRoaXMucHJldHR5ZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICByICs9IHNwYWNlICsgJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8PycgKyBub2RlLnRhcmdldDtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHIgKz0gJyAnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHIgKz0gJz8+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjZShsZXZlbCkgKyBub2RlLnZhbHVlICsgdGhpcy5uZXdsaW5lO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgbm9kZS52YWx1ZSArIHRoaXMubmV3bGluZTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5kdGRBdHRMaXN0ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHZhciByO1xuICAgICAgciA9IHRoaXMuc3BhY2UobGV2ZWwpICsgJzwhQVRUTElTVCAnICsgbm9kZS5lbGVtZW50TmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlTmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlVHlwZTtcbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZVR5cGUgIT09ICcjREVGQVVMVCcpIHtcbiAgICAgICAgciArPSAnICcgKyBub2RlLmRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgciArPSAnIFwiJyArIG5vZGUuZGVmYXVsdFZhbHVlICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZHRkRWxlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCFFTEVNRU5UICcgKyBub2RlLm5hbWUgKyAnICcgKyBub2RlLnZhbHVlICsgJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLmR0ZEVudGl0eSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8IUVOVElUWSc7XG4gICAgICBpZiAobm9kZS5wZSkge1xuICAgICAgICByICs9ICcgJSc7XG4gICAgICB9XG4gICAgICByICs9ICcgJyArIG5vZGUubmFtZTtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHIgKz0gJyBcIicgKyBub2RlLnZhbHVlICsgJ1wiJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub2RlLnB1YklEICYmIG5vZGUuc3lzSUQpIHtcbiAgICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubkRhdGEpIHtcbiAgICAgICAgICByICs9ICcgTkRBVEEgJyArIG5vZGUubkRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZHRkTm90YXRpb24gPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICByID0gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCFOT1RBVElPTiAnICsgbm9kZS5uYW1lO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUucHViSUQpIHtcbiAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiJztcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICByICs9ICcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgfVxuICAgICAgciArPSAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgYXR0LCBuYW1lLCByLCByZWY7XG4gICAgICBsZXZlbCB8fCAobGV2ZWwgPSAwKTtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWE1MRWxlbWVudCkge1xuICAgICAgICByID0gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCcgKyBub2RlLm5hbWU7XG4gICAgICAgIHJlZiA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgICAgZm9yIChuYW1lIGluIHJlZikge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGF0dCA9IHJlZltuYW1lXTtcbiAgICAgICAgICByICs9IHRoaXMuYXR0cmlidXRlKGF0dCk7XG4gICAgICAgIH1cbiAgICAgICAgciArPSAobm9kZS5jaGlsZHJlbiA/ICc+JyA6ICcvPicpICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8IURPQ1RZUEUgJyArIG5vZGUucm9vdE5vZGVOYW1lO1xuICAgICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3lzSUQpIHtcbiAgICAgICAgICByICs9ICcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gKG5vZGUuY2hpbGRyZW4gPyAnIFsnIDogJz4nKSArIHRoaXMubmV3bGluZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuY2xvc2VOb2RlID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICBjYXNlICEobm9kZSBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpOlxuICAgICAgICAgIHJldHVybiB0aGlzLnNwYWNlKGxldmVsKSArICc8LycgKyBub2RlLm5hbWUgKyAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICAgIGNhc2UgIShub2RlIGluc3RhbmNlb2YgWE1MRG9jVHlwZSk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgJ10+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFN0cmluZ1dyaXRlcjtcblxuICB9KShYTUxXcml0ZXJCYXNlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxTdHJpbmdpZmllcixcbiAgICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxTdHJpbmdpZmllciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxTdHJpbmdpZmllcihvcHRpb25zKSB7XG4gICAgICB0aGlzLmFzc2VydExlZ2FsQ2hhciA9IGJpbmQodGhpcy5hc3NlcnRMZWdhbENoYXIsIHRoaXMpO1xuICAgICAgdmFyIGtleSwgcmVmLCB2YWx1ZTtcbiAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gICAgICB0aGlzLm5vRG91YmxlRW5jb2RpbmcgPSBvcHRpb25zLm5vRG91YmxlRW5jb2Rpbmc7XG4gICAgICByZWYgPSBvcHRpb25zLnN0cmluZ2lmeSB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZWxlTmFtZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIodmFsKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmVsZVRleHQgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHZhbCA9ICcnICsgdmFsIHx8ICcnO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHRoaXMuZWxFc2NhcGUodmFsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgnXV0+JywgJ11dXV0+PCFbQ0RBVEFbPicpO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHZhbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIGlmICh2YWwubWF0Y2goLy0tLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWVudCB0ZXh0IGNhbm5vdCBjb250YWluIGRvdWJsZS1oeXBlbjogXCIgKyB2YWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHZhbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHJldHVybiAnJyArIHZhbCB8fCAnJztcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmF0dE5hbWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmF0dFZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIHJldHVybiB0aGlzLmF0dEVzY2FwZSh2YWwpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuaW5zVGFyZ2V0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5pbnNWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAodmFsLm1hdGNoKC9cXD8+LykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHZhbHVlOiBcIiArIHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUueG1sVmVyc2lvbiA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAoIXZhbC5tYXRjaCgvMVxcLlswLTldKy8pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmVyc2lvbiBudW1iZXI6IFwiICsgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS54bWxFbmNvZGluZyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAoIXZhbC5tYXRjaCgvXltBLVphLXpdKD86W0EtWmEtejAtOS5fLV18LSkqJC8pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZW5jb2Rpbmc6IFwiICsgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS54bWxTdGFuZGFsb25lID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHJldHVybiBcInllc1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwibm9cIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZFB1YklEID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRTeXNJRCA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZHRkRWxlbWVudFZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRBdHRUeXBlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRBdHREZWZhdWx0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZEVudGl0eVZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRORGF0YSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydEF0dEtleSA9ICdAJztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UElLZXkgPSAnPyc7XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydFRleHRLZXkgPSAnI3RleHQnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDRGF0YUtleSA9ICcjY2RhdGEnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDb21tZW50S2V5ID0gJyNjb21tZW50JztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UmF3S2V5ID0gJyNyYXcnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmFzc2VydExlZ2FsQ2hhciA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgdmFyIHJlcztcbiAgICAgIHJlcyA9IHN0ci5tYXRjaCgvW1xcMFxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS8pO1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlciBpbiBzdHJpbmc6IFwiICsgc3RyICsgXCIgYXQgaW5kZXggXCIgKyByZXMuaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmVsRXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgICB2YXIgYW1wcmVnZXg7XG4gICAgICBhbXByZWdleCA9IHRoaXMubm9Eb3VibGVFbmNvZGluZyA/IC8oPyEmXFxTKzspJi9nIDogLyYvZztcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShhbXByZWdleCwgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cXHIvZywgJyYjeEQ7Jyk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5hdHRFc2NhcGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICAgIHZhciBhbXByZWdleDtcbiAgICAgIGFtcHJlZ2V4ID0gdGhpcy5ub0RvdWJsZUVuY29kaW5nID8gLyg/ISZcXFMrOykmL2cgOiAvJi9nO1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFtcHJlZ2V4LCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoL1xcdC9nLCAnJiN4OTsnKS5yZXBsYWNlKC9cXG4vZywgJyYjeEE7JykucmVwbGFjZSgvXFxyL2csICcmI3hEOycpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MU3RyaW5naWZpZXI7XG5cbiAgfSkoKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxOb2RlLCBYTUxUZXh0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MVGV4dCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFRleHQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MVGV4dChwYXJlbnQsIHRleHQpIHtcbiAgICAgIFhNTFRleHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBlbGVtZW50IHRleHRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuZWxlVGV4dCh0ZXh0KTtcbiAgICB9XG5cbiAgICBYTUxUZXh0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTFRleHQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnRleHQodGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxUZXh0O1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTFdyaXRlckJhc2UsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MV3JpdGVyQmFzZSA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxXcml0ZXJCYXNlKG9wdGlvbnMpIHtcbiAgICAgIHZhciBrZXksIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgdmFsdWU7XG4gICAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgICAgdGhpcy5wcmV0dHkgPSBvcHRpb25zLnByZXR0eSB8fCBmYWxzZTtcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSA9IChyZWYgPSBvcHRpb25zLmFsbG93RW1wdHkpICE9IG51bGwgPyByZWYgOiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICB0aGlzLmluZGVudCA9IChyZWYxID0gb3B0aW9ucy5pbmRlbnQpICE9IG51bGwgPyByZWYxIDogJyAgJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gKHJlZjIgPSBvcHRpb25zLm5ld2xpbmUpICE9IG51bGwgPyByZWYyIDogJ1xcbic7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gKHJlZjMgPSBvcHRpb25zLm9mZnNldCkgIT0gbnVsbCA/IHJlZjMgOiAwO1xuICAgICAgICB0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMgPSAocmVmNCA9IG9wdGlvbnMuZG9udHByZXR0eXRleHRub2RlcykgIT0gbnVsbCA/IHJlZjQgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmRlbnQgPSAnJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gJyc7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5kb250cHJldHR5dGV4dG5vZGVzID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV3bGluZWRlZmF1bHQgPSB0aGlzLm5ld2xpbmU7XG4gICAgICB0aGlzLnByZXR0eWRlZmF1bHQgPSB0aGlzLnByZXR0eTtcbiAgICAgIHJlZjUgPSBvcHRpb25zLndyaXRlciB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZjUpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmNSwga2V5KSkgY29udGludWU7XG4gICAgICAgIHZhbHVlID0gcmVmNVtrZXldO1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIGlmIChcInByZXR0eVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcmV0dHkgPSBvcHRpb25zLnByZXR0eTtcbiAgICAgIH1cbiAgICAgIGlmIChcImFsbG93RW1wdHlcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuYWxsb3dFbXB0eSA9IG9wdGlvbnMuYWxsb3dFbXB0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICB0aGlzLmluZGVudCA9IFwiaW5kZW50XCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuaW5kZW50IDogJyAgJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gXCJuZXdsaW5lXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMubmV3bGluZSA6ICdcXG4nO1xuICAgICAgICB0aGlzLm9mZnNldCA9IFwib2Zmc2V0XCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMub2Zmc2V0IDogMDtcbiAgICAgICAgdGhpcy5kb250cHJldHR5dGV4dG5vZGVzID0gXCJkb250cHJldHR5dGV4dG5vZGVzXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZG9udHByZXR0eXRleHRub2RlcyA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGVudCA9ICcnO1xuICAgICAgICB0aGlzLm5ld2xpbmUgPSAnJztcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMgPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXdsaW5lZGVmYXVsdCA9IHRoaXMubmV3bGluZTtcbiAgICAgIHRoaXMucHJldHR5ZGVmYXVsdCA9IHRoaXMucHJldHR5O1xuICAgICAgcmVmID0gb3B0aW9ucy53cml0ZXIgfHwge307XG4gICAgICBmb3IgKGtleSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSByZWZba2V5XTtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUuc3BhY2UgPSBmdW5jdGlvbihsZXZlbCkge1xuICAgICAgdmFyIGluZGVudDtcbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICBpbmRlbnQgPSAobGV2ZWwgfHwgMCkgKyB0aGlzLm9mZnNldCArIDE7XG4gICAgICAgIGlmIChpbmRlbnQgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBcnJheShpbmRlbnQpLmpvaW4odGhpcy5pbmRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gWE1MV3JpdGVyQmFzZTtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTERvY3VtZW50LCBYTUxEb2N1bWVudENCLCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFN0cmluZ1dyaXRlciwgYXNzaWduLCBpc0Z1bmN0aW9uLCByZWY7XG5cbiAgcmVmID0gcmVxdWlyZSgnLi9VdGlsaXR5JyksIGFzc2lnbiA9IHJlZi5hc3NpZ24sIGlzRnVuY3Rpb24gPSByZWYuaXNGdW5jdGlvbjtcblxuICBYTUxEb2N1bWVudCA9IHJlcXVpcmUoJy4vWE1MRG9jdW1lbnQnKTtcblxuICBYTUxEb2N1bWVudENCID0gcmVxdWlyZSgnLi9YTUxEb2N1bWVudENCJyk7XG5cbiAgWE1MU3RyaW5nV3JpdGVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdXcml0ZXInKTtcblxuICBYTUxTdHJlYW1Xcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmVhbVdyaXRlcicpO1xuXG4gIG1vZHVsZS5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKG5hbWUsIHhtbGRlYywgZG9jdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBkb2MsIHJvb3Q7XG4gICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUm9vdCBlbGVtZW50IG5lZWRzIGEgbmFtZVwiKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IGFzc2lnbih7fSwgeG1sZGVjLCBkb2N0eXBlLCBvcHRpb25zKTtcbiAgICBkb2MgPSBuZXcgWE1MRG9jdW1lbnQob3B0aW9ucyk7XG4gICAgcm9vdCA9IGRvYy5lbGVtZW50KG5hbWUpO1xuICAgIGlmICghb3B0aW9ucy5oZWFkbGVzcykge1xuICAgICAgZG9jLmRlY2xhcmF0aW9uKG9wdGlvbnMpO1xuICAgICAgaWYgKChvcHRpb25zLnB1YklEICE9IG51bGwpIHx8IChvcHRpb25zLnN5c0lEICE9IG51bGwpKSB7XG4gICAgICAgIGRvYy5kb2N0eXBlKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cy5iZWdpbiA9IGZ1bmN0aW9uKG9wdGlvbnMsIG9uRGF0YSwgb25FbmQpIHtcbiAgICB2YXIgcmVmMTtcbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgcmVmMSA9IFtvcHRpb25zLCBvbkRhdGFdLCBvbkRhdGEgPSByZWYxWzBdLCBvbkVuZCA9IHJlZjFbMV07XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmIChvbkRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MRG9jdW1lbnRDQihvcHRpb25zLCBvbkRhdGEsIG9uRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBYTUxEb2N1bWVudChvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMuc3RyaW5nV3JpdGVyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyaW5nV3JpdGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLnN0cmVhbVdyaXRlciA9IGZ1bmN0aW9uKHN0cmVhbSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucyk7XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJmdW5jdGlvbiBET01QYXJzZXIob3B0aW9ucyl7XHJcblx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fHtsb2NhdG9yOnt9fTtcclxuXHRcclxufVxyXG5ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZyA9IGZ1bmN0aW9uKHNvdXJjZSxtaW1lVHlwZSl7XHJcblx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcblx0dmFyIHNheCA9ICBuZXcgWE1MUmVhZGVyKCk7XHJcblx0dmFyIGRvbUJ1aWxkZXIgPSBvcHRpb25zLmRvbUJ1aWxkZXIgfHwgbmV3IERPTUhhbmRsZXIoKTsvL2NvbnRlbnRIYW5kbGVyIGFuZCBMZXhpY2FsSGFuZGxlclxyXG5cdHZhciBlcnJvckhhbmRsZXIgPSBvcHRpb25zLmVycm9ySGFuZGxlcjtcclxuXHR2YXIgbG9jYXRvciA9IG9wdGlvbnMubG9jYXRvcjtcclxuXHR2YXIgZGVmYXVsdE5TTWFwID0gb3B0aW9ucy54bWxuc3x8e307XHJcblx0dmFyIGVudGl0eU1hcCA9IHsnbHQnOic8JywnZ3QnOic+JywnYW1wJzonJicsJ3F1b3QnOidcIicsJ2Fwb3MnOlwiJ1wifVxyXG5cdGlmKGxvY2F0b3Ipe1xyXG5cdFx0ZG9tQnVpbGRlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcilcclxuXHR9XHJcblx0XHJcblx0c2F4LmVycm9ySGFuZGxlciA9IGJ1aWxkRXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcixkb21CdWlsZGVyLGxvY2F0b3IpO1xyXG5cdHNheC5kb21CdWlsZGVyID0gb3B0aW9ucy5kb21CdWlsZGVyIHx8IGRvbUJ1aWxkZXI7XHJcblx0aWYoL1xcL3g/aHRtbD8kLy50ZXN0KG1pbWVUeXBlKSl7XHJcblx0XHRlbnRpdHlNYXAubmJzcCA9ICdcXHhhMCc7XHJcblx0XHRlbnRpdHlNYXAuY29weSA9ICdcXHhhOSc7XHJcblx0XHRkZWZhdWx0TlNNYXBbJyddPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XHJcblx0fVxyXG5cdGRlZmF1bHROU01hcC54bWwgPSBkZWZhdWx0TlNNYXAueG1sIHx8ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnO1xyXG5cdGlmKHNvdXJjZSl7XHJcblx0XHRzYXgucGFyc2Uoc291cmNlLGRlZmF1bHROU01hcCxlbnRpdHlNYXApO1xyXG5cdH1lbHNle1xyXG5cdFx0c2F4LmVycm9ySGFuZGxlci5lcnJvcihcImludmFsaWQgZG9jIHNvdXJjZVwiKTtcclxuXHR9XHJcblx0cmV0dXJuIGRvbUJ1aWxkZXIuZG9jO1xyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkRXJyb3JIYW5kbGVyKGVycm9ySW1wbCxkb21CdWlsZGVyLGxvY2F0b3Ipe1xyXG5cdGlmKCFlcnJvckltcGwpe1xyXG5cdFx0aWYoZG9tQnVpbGRlciBpbnN0YW5jZW9mIERPTUhhbmRsZXIpe1xyXG5cdFx0XHRyZXR1cm4gZG9tQnVpbGRlcjtcclxuXHRcdH1cclxuXHRcdGVycm9ySW1wbCA9IGRvbUJ1aWxkZXIgO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JIYW5kbGVyID0ge31cclxuXHR2YXIgaXNDYWxsYmFjayA9IGVycm9ySW1wbCBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xyXG5cdGxvY2F0b3IgPSBsb2NhdG9yfHx7fVxyXG5cdGZ1bmN0aW9uIGJ1aWxkKGtleSl7XHJcblx0XHR2YXIgZm4gPSBlcnJvckltcGxba2V5XTtcclxuXHRcdGlmKCFmbiAmJiBpc0NhbGxiYWNrKXtcclxuXHRcdFx0Zm4gPSBlcnJvckltcGwubGVuZ3RoID09IDI/ZnVuY3Rpb24obXNnKXtlcnJvckltcGwoa2V5LG1zZyl9OmVycm9ySW1wbDtcclxuXHRcdH1cclxuXHRcdGVycm9ySGFuZGxlcltrZXldID0gZm4gJiYgZnVuY3Rpb24obXNnKXtcclxuXHRcdFx0Zm4oJ1t4bWxkb20gJytrZXkrJ11cXHQnK21zZytfbG9jYXRvcihsb2NhdG9yKSk7XHJcblx0XHR9fHxmdW5jdGlvbigpe307XHJcblx0fVxyXG5cdGJ1aWxkKCd3YXJuaW5nJyk7XHJcblx0YnVpbGQoJ2Vycm9yJyk7XHJcblx0YnVpbGQoJ2ZhdGFsRXJyb3InKTtcclxuXHRyZXR1cm4gZXJyb3JIYW5kbGVyO1xyXG59XHJcblxyXG4vL2NvbnNvbGUubG9nKCcjXFxuXFxuXFxuXFxuXFxuXFxuXFxuIyMjIycpXHJcbi8qKlxyXG4gKiArQ29udGVudEhhbmRsZXIrRXJyb3JIYW5kbGVyXHJcbiAqICtMZXhpY2FsSGFuZGxlcitFbnRpdHlSZXNvbHZlcjJcclxuICogLURlY2xIYW5kbGVyLURUREhhbmRsZXIgXHJcbiAqIFxyXG4gKiBEZWZhdWx0SGFuZGxlcjpFbnRpdHlSZXNvbHZlciwgRFRESGFuZGxlciwgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlclxyXG4gKiBEZWZhdWx0SGFuZGxlcjI6RGVmYXVsdEhhbmRsZXIsTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyLCBFbnRpdHlSZXNvbHZlcjJcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvaGVscGVycy9EZWZhdWx0SGFuZGxlci5odG1sXHJcbiAqL1xyXG5mdW5jdGlvbiBET01IYW5kbGVyKCkge1xyXG4gICAgdGhpcy5jZGF0YSA9IGZhbHNlO1xyXG59XHJcbmZ1bmN0aW9uIHBvc2l0aW9uKGxvY2F0b3Isbm9kZSl7XHJcblx0bm9kZS5saW5lTnVtYmVyID0gbG9jYXRvci5saW5lTnVtYmVyO1xyXG5cdG5vZGUuY29sdW1uTnVtYmVyID0gbG9jYXRvci5jb2x1bW5OdW1iZXI7XHJcbn1cclxuLyoqXHJcbiAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudFxyXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sXHJcbiAqLyBcclxuRE9NSGFuZGxlci5wcm90b3R5cGUgPSB7XHJcblx0c3RhcnREb2N1bWVudCA6IGZ1bmN0aW9uKCkge1xyXG4gICAgXHR0aGlzLmRvYyA9IG5ldyBET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgXHRpZiAodGhpcy5sb2NhdG9yKSB7XHJcbiAgICAgICAgXHR0aGlzLmRvYy5kb2N1bWVudFVSSSA9IHRoaXMubG9jYXRvci5zeXN0ZW1JZDtcclxuICAgIFx0fVxyXG5cdH0sXHJcblx0c3RhcnRFbGVtZW50OmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cnMpIHtcclxuXHRcdHZhciBkb2MgPSB0aGlzLmRvYztcclxuXHQgICAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHFOYW1lfHxsb2NhbE5hbWUpO1xyXG5cdCAgICB2YXIgbGVuID0gYXR0cnMubGVuZ3RoO1xyXG5cdCAgICBhcHBlbmRFbGVtZW50KHRoaXMsIGVsKTtcclxuXHQgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsO1xyXG5cdCAgICBcclxuXHRcdHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsZWwpXHJcblx0ICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxlbjsgaSsrKSB7XHJcblx0ICAgICAgICB2YXIgbmFtZXNwYWNlVVJJID0gYXR0cnMuZ2V0VVJJKGkpO1xyXG5cdCAgICAgICAgdmFyIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7XHJcblx0ICAgICAgICB2YXIgcU5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTtcclxuXHRcdFx0dmFyIGF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxTmFtZSk7XHJcblx0XHRcdHRoaXMubG9jYXRvciAmJnBvc2l0aW9uKGF0dHJzLmdldExvY2F0b3IoaSksYXR0cik7XHJcblx0XHRcdGF0dHIudmFsdWUgPSBhdHRyLm5vZGVWYWx1ZSA9IHZhbHVlO1xyXG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpXHJcblx0ICAgIH1cclxuXHR9LFxyXG5cdGVuZEVsZW1lbnQ6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKSB7XHJcblx0XHR2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudEVsZW1lbnRcclxuXHRcdHZhciB0YWdOYW1lID0gY3VycmVudC50YWdOYW1lO1xyXG5cdFx0dGhpcy5jdXJyZW50RWxlbWVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcclxuXHR9LFxyXG5cdHN0YXJ0UHJlZml4TWFwcGluZzpmdW5jdGlvbihwcmVmaXgsIHVyaSkge1xyXG5cdH0sXHJcblx0ZW5kUHJlZml4TWFwcGluZzpmdW5jdGlvbihwcmVmaXgpIHtcclxuXHR9LFxyXG5cdHByb2Nlc3NpbmdJbnN0cnVjdGlvbjpmdW5jdGlvbih0YXJnZXQsIGRhdGEpIHtcclxuXHQgICAgdmFyIGlucyA9IHRoaXMuZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpO1xyXG5cdCAgICB0aGlzLmxvY2F0b3IgJiYgcG9zaXRpb24odGhpcy5sb2NhdG9yLGlucylcclxuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBpbnMpO1xyXG5cdH0sXHJcblx0aWdub3JhYmxlV2hpdGVzcGFjZTpmdW5jdGlvbihjaCwgc3RhcnQsIGxlbmd0aCkge1xyXG5cdH0sXHJcblx0Y2hhcmFjdGVyczpmdW5jdGlvbihjaGFycywgc3RhcnQsIGxlbmd0aCkge1xyXG5cdFx0Y2hhcnMgPSBfdG9TdHJpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpXHJcblx0XHQvL2NvbnNvbGUubG9nKGNoYXJzKVxyXG5cdFx0aWYoY2hhcnMpe1xyXG5cdFx0XHRpZiAodGhpcy5jZGF0YSkge1xyXG5cdFx0XHRcdHZhciBjaGFyTm9kZSA9IHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihjaGFycyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dmFyIGNoYXJOb2RlID0gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoY2hhcnMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHRoaXMuY3VycmVudEVsZW1lbnQpe1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hhck5vZGUpO1xyXG5cdFx0XHR9ZWxzZSBpZigvXlxccyokLy50ZXN0KGNoYXJzKSl7XHJcblx0XHRcdFx0dGhpcy5kb2MuYXBwZW5kQ2hpbGQoY2hhck5vZGUpO1xyXG5cdFx0XHRcdC8vcHJvY2VzcyB4bWxcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmxvY2F0b3IgJiYgcG9zaXRpb24odGhpcy5sb2NhdG9yLGNoYXJOb2RlKVxyXG5cdFx0fVxyXG5cdH0sXHJcblx0c2tpcHBlZEVudGl0eTpmdW5jdGlvbihuYW1lKSB7XHJcblx0fSxcclxuXHRlbmREb2N1bWVudDpmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuZG9jLm5vcm1hbGl6ZSgpO1xyXG5cdH0sXHJcblx0c2V0RG9jdW1lbnRMb2NhdG9yOmZ1bmN0aW9uIChsb2NhdG9yKSB7XHJcblx0ICAgIGlmKHRoaXMubG9jYXRvciA9IGxvY2F0b3Ipey8vICYmICEoJ2xpbmVOdW1iZXInIGluIGxvY2F0b3IpKXtcclxuXHQgICAgXHRsb2NhdG9yLmxpbmVOdW1iZXIgPSAwO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHQvL0xleGljYWxIYW5kbGVyXHJcblx0Y29tbWVudDpmdW5jdGlvbihjaGFycywgc3RhcnQsIGxlbmd0aCkge1xyXG5cdFx0Y2hhcnMgPSBfdG9TdHJpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpXHJcblx0ICAgIHZhciBjb21tID0gdGhpcy5kb2MuY3JlYXRlQ29tbWVudChjaGFycyk7XHJcblx0ICAgIHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsY29tbSlcclxuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBjb21tKTtcclxuXHR9LFxyXG5cdFxyXG5cdHN0YXJ0Q0RBVEE6ZnVuY3Rpb24oKSB7XHJcblx0ICAgIC8vdXNlZCBpbiBjaGFyYWN0ZXJzKCkgbWV0aG9kc1xyXG5cdCAgICB0aGlzLmNkYXRhID0gdHJ1ZTtcclxuXHR9LFxyXG5cdGVuZENEQVRBOmZ1bmN0aW9uKCkge1xyXG5cdCAgICB0aGlzLmNkYXRhID0gZmFsc2U7XHJcblx0fSxcclxuXHRcclxuXHRzdGFydERURDpmdW5jdGlvbihuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpIHtcclxuXHRcdHZhciBpbXBsID0gdGhpcy5kb2MuaW1wbGVtZW50YXRpb247XHJcblx0ICAgIGlmIChpbXBsICYmIGltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKSB7XHJcblx0ICAgICAgICB2YXIgZHQgPSBpbXBsLmNyZWF0ZURvY3VtZW50VHlwZShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpO1xyXG5cdCAgICAgICAgdGhpcy5sb2NhdG9yICYmIHBvc2l0aW9uKHRoaXMubG9jYXRvcixkdClcclxuXHQgICAgICAgIGFwcGVuZEVsZW1lbnQodGhpcywgZHQpO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHQvKipcclxuXHQgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlclxyXG5cdCAqIEBsaW5rIGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L0Vycm9ySGFuZGxlci5odG1sXHJcblx0ICovXHJcblx0d2FybmluZzpmdW5jdGlvbihlcnJvcikge1xyXG5cdFx0Y29uc29sZS53YXJuKCdbeG1sZG9tIHdhcm5pbmddXFx0JytlcnJvcixfbG9jYXRvcih0aGlzLmxvY2F0b3IpKTtcclxuXHR9LFxyXG5cdGVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHRjb25zb2xlLmVycm9yKCdbeG1sZG9tIGVycm9yXVxcdCcrZXJyb3IsX2xvY2F0b3IodGhpcy5sb2NhdG9yKSk7XHJcblx0fSxcclxuXHRmYXRhbEVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHRjb25zb2xlLmVycm9yKCdbeG1sZG9tIGZhdGFsRXJyb3JdXFx0JytlcnJvcixfbG9jYXRvcih0aGlzLmxvY2F0b3IpKTtcclxuXHQgICAgdGhyb3cgZXJyb3I7XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIF9sb2NhdG9yKGwpe1xyXG5cdGlmKGwpe1xyXG5cdFx0cmV0dXJuICdcXG5AJysobC5zeXN0ZW1JZCB8fCcnKSsnI1tsaW5lOicrbC5saW5lTnVtYmVyKycsY29sOicrbC5jb2x1bW5OdW1iZXIrJ10nXHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIF90b1N0cmluZyhjaGFycyxzdGFydCxsZW5ndGgpe1xyXG5cdGlmKHR5cGVvZiBjaGFycyA9PSAnc3RyaW5nJyl7XHJcblx0XHRyZXR1cm4gY2hhcnMuc3Vic3RyKHN0YXJ0LGxlbmd0aClcclxuXHR9ZWxzZXsvL2phdmEgc2F4IGNvbm5lY3Qgd2lkdGggeG1sZG9tIG9uIHJoaW5vKHdoYXQgYWJvdXQ6IFwiPyAmJiAhKGNoYXJzIGluc3RhbmNlb2YgU3RyaW5nKVwiKVxyXG5cdFx0aWYoY2hhcnMubGVuZ3RoID49IHN0YXJ0K2xlbmd0aCB8fCBzdGFydCl7XHJcblx0XHRcdHJldHVybiBuZXcgamF2YS5sYW5nLlN0cmluZyhjaGFycyxzdGFydCxsZW5ndGgpKycnO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNoYXJzO1xyXG5cdH1cclxufVxyXG5cclxuLypcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0xleGljYWxIYW5kbGVyLmh0bWxcclxuICogdXNlZCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOlxyXG4gKiAgI2NvbW1lbnQoY2hhcnMsIHN0YXJ0LCBsZW5ndGgpXHJcbiAqICAjc3RhcnRDREFUQSgpXHJcbiAqICAjZW5kQ0RBVEEoKVxyXG4gKiAgI3N0YXJ0RFREKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZClcclxuICpcclxuICpcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOlxyXG4gKiAgI2VuZERURCgpXHJcbiAqICAjc3RhcnRFbnRpdHkobmFtZSlcclxuICogICNlbmRFbnRpdHkobmFtZSlcclxuICpcclxuICpcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0RlY2xIYW5kbGVyLmh0bWxcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyXHJcbiAqIFx0I2F0dHJpYnV0ZURlY2woZU5hbWUsIGFOYW1lLCB0eXBlLCBtb2RlLCB2YWx1ZSlcclxuICogICNlbGVtZW50RGVjbChuYW1lLCBtb2RlbClcclxuICogICNleHRlcm5hbEVudGl0eURlY2wobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKVxyXG4gKiAgI2ludGVybmFsRW50aXR5RGVjbChuYW1lLCB2YWx1ZSlcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0VudGl0eVJlc29sdmVyMi5odG1sXHJcbiAqIElHTk9SRUQgbWV0aG9kIG9mIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyMlxyXG4gKiAgI3Jlc29sdmVFbnRpdHkoU3RyaW5nIG5hbWUsU3RyaW5nIHB1YmxpY0lkLFN0cmluZyBiYXNlVVJJLFN0cmluZyBzeXN0ZW1JZClcclxuICogICNyZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZClcclxuICogICNnZXRFeHRlcm5hbFN1YnNldChuYW1lLCBiYXNlVVJJKVxyXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9EVERIYW5kbGVyLmh0bWxcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguRFRESGFuZGxlclxyXG4gKiAgI25vdGF0aW9uRGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpIHt9O1xyXG4gKiAgI3VucGFyc2VkRW50aXR5RGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5vdGF0aW9uTmFtZSkge307XHJcbiAqL1xyXG5cImVuZERURCxzdGFydEVudGl0eSxlbmRFbnRpdHksYXR0cmlidXRlRGVjbCxlbGVtZW50RGVjbCxleHRlcm5hbEVudGl0eURlY2wsaW50ZXJuYWxFbnRpdHlEZWNsLHJlc29sdmVFbnRpdHksZ2V0RXh0ZXJuYWxTdWJzZXQsbm90YXRpb25EZWNsLHVucGFyc2VkRW50aXR5RGVjbFwiLnJlcGxhY2UoL1xcdysvZyxmdW5jdGlvbihrZXkpe1xyXG5cdERPTUhhbmRsZXIucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbigpe3JldHVybiBudWxsfVxyXG59KVxyXG5cclxuLyogUHJpdmF0ZSBzdGF0aWMgaGVscGVycyB0cmVhdGVkIGJlbG93IGFzIHByaXZhdGUgaW5zdGFuY2UgbWV0aG9kcywgc28gZG9uJ3QgbmVlZCB0byBhZGQgdGhlc2UgdG8gdGhlIHB1YmxpYyBBUEk7IHdlIG1pZ2h0IHVzZSBhIFJlbGF0b3IgdG8gYWxzbyBnZXQgcmlkIG9mIG5vbi1zdGFuZGFyZCBwdWJsaWMgcHJvcGVydGllcyAqL1xyXG5mdW5jdGlvbiBhcHBlbmRFbGVtZW50IChoYW5kZXIsbm9kZSkge1xyXG4gICAgaWYgKCFoYW5kZXIuY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICBoYW5kZXIuZG9jLmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBoYW5kZXIuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICB9XHJcbn0vL2FwcGVuZENoaWxkIGFuZCBzZXRBdHRyaWJ1dGVOUyBhcmUgcHJlZm9ybWFuY2Uga2V5XHJcblxyXG4vL2lmKHR5cGVvZiByZXF1aXJlID09ICdmdW5jdGlvbicpe1xyXG5cdHZhciBYTUxSZWFkZXIgPSByZXF1aXJlKCcuL3NheCcpLlhNTFJlYWRlcjtcclxuXHR2YXIgRE9NSW1wbGVtZW50YXRpb24gPSBleHBvcnRzLkRPTUltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9kb20nKS5ET01JbXBsZW1lbnRhdGlvbjtcclxuXHRleHBvcnRzLlhNTFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL2RvbScpLlhNTFNlcmlhbGl6ZXIgO1xyXG5cdGV4cG9ydHMuRE9NUGFyc2VyID0gRE9NUGFyc2VyO1xyXG4vL31cclxuIiwiLypcbiAqIERPTSBMZXZlbCAyXG4gKiBPYmplY3QgRE9NRXhjZXB0aW9uXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1ET00tTGV2ZWwtMS9lY21hLXNjcmlwdC1sYW5ndWFnZS1iaW5kaW5nLmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItQ29yZS0yMDAwMTExMy9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBjb3B5KHNyYyxkZXN0KXtcblx0Zm9yKHZhciBwIGluIHNyYyl7XG5cdFx0ZGVzdFtwXSA9IHNyY1twXTtcblx0fVxufVxuLyoqXG5eXFx3K1xcLnByb3RvdHlwZVxcLihbX1xcd10rKVxccyo9XFxzKigoPzouKlxce1xccyo/W1xcclxcbl1bXFxzXFxTXSo/Xn0pfFxcUy4qPyg/PVs7XFxyXFxuXSkpOz9cbl5cXHcrXFwucHJvdG90eXBlXFwuKFtfXFx3XSspXFxzKj1cXHMqKFxcUy4qPyg/PVs7XFxyXFxuXSkpOz9cbiAqL1xuZnVuY3Rpb24gX2V4dGVuZHMoQ2xhc3MsU3VwZXIpe1xuXHR2YXIgcHQgPSBDbGFzcy5wcm90b3R5cGU7XG5cdGlmKE9iamVjdC5jcmVhdGUpe1xuXHRcdHZhciBwcHQgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSlcblx0XHRwdC5fX3Byb3RvX18gPSBwcHQ7XG5cdH1cblx0aWYoIShwdCBpbnN0YW5jZW9mIFN1cGVyKSl7XG5cdFx0ZnVuY3Rpb24gdCgpe307XG5cdFx0dC5wcm90b3R5cGUgPSBTdXBlci5wcm90b3R5cGU7XG5cdFx0dCA9IG5ldyB0KCk7XG5cdFx0Y29weShwdCx0KTtcblx0XHRDbGFzcy5wcm90b3R5cGUgPSBwdCA9IHQ7XG5cdH1cblx0aWYocHQuY29uc3RydWN0b3IgIT0gQ2xhc3Mpe1xuXHRcdGlmKHR5cGVvZiBDbGFzcyAhPSAnZnVuY3Rpb24nKXtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJ1bmtub3cgQ2xhc3M6XCIrQ2xhc3MpXG5cdFx0fVxuXHRcdHB0LmNvbnN0cnVjdG9yID0gQ2xhc3Ncblx0fVxufVxudmFyIGh0bWxucyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyA7XG4vLyBOb2RlIFR5cGVzXG52YXIgTm9kZVR5cGUgPSB7fVxudmFyIEVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IE5vZGVUeXBlLkVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IDE7XG52YXIgQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gTm9kZVR5cGUuQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gMjtcbnZhciBURVhUX05PREUgICAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5URVhUX05PREUgICAgICAgICAgICAgICAgICAgPSAzO1xudmFyIENEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkNEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IDQ7XG52YXIgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gNTtcbnZhciBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5FTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSA2O1xudmFyIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IE5vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IDc7XG52YXIgQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gTm9kZVR5cGUuQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gODtcbnZhciBET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5ET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSA5O1xudmFyIERPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IDEwO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IDExO1xudmFyIE5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IE5vZGVUeXBlLk5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IDEyO1xuXG4vLyBFeGNlcHRpb25Db2RlXG52YXIgRXhjZXB0aW9uQ29kZSA9IHt9XG52YXIgRXhjZXB0aW9uTWVzc2FnZSA9IHt9O1xudmFyIElOREVYX1NJWkVfRVJSICAgICAgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5ERVhfU0laRV9FUlIgICAgICAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzFdPVwiSW5kZXggc2l6ZSBlcnJvclwiKSwxKTtcbnZhciBET01TVFJJTkdfU0laRV9FUlIgICAgICAgICAgPSBFeGNlcHRpb25Db2RlLkRPTVNUUklOR19TSVpFX0VSUiAgICAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVsyXT1cIkRPTVN0cmluZyBzaXplIGVycm9yXCIpLDIpO1xudmFyIEhJRVJBUkNIWV9SRVFVRVNUX0VSUiAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSElFUkFSQ0hZX1JFUVVFU1RfRVJSICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzNdPVwiSGllcmFyY2h5IHJlcXVlc3QgZXJyb3JcIiksMyk7XG52YXIgV1JPTkdfRE9DVU1FTlRfRVJSICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5XUk9OR19ET0NVTUVOVF9FUlIgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbNF09XCJXcm9uZyBkb2N1bWVudFwiKSw0KTtcbnZhciBJTlZBTElEX0NIQVJBQ1RFUl9FUlIgICAgICAgPSBFeGNlcHRpb25Db2RlLklOVkFMSURfQ0hBUkFDVEVSX0VSUiAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVs1XT1cIkludmFsaWQgY2hhcmFjdGVyXCIpLDUpO1xudmFyIE5PX0RBVEFfQUxMT1dFRF9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuTk9fREFUQV9BTExPV0VEX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzZdPVwiTm8gZGF0YSBhbGxvd2VkXCIpLDYpO1xudmFyIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiA9IEV4Y2VwdGlvbkNvZGUuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSID0gKChFeGNlcHRpb25NZXNzYWdlWzddPVwiTm8gbW9kaWZpY2F0aW9uIGFsbG93ZWRcIiksNyk7XG52YXIgTk9UX0ZPVU5EX0VSUiAgICAgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfRk9VTkRfRVJSICAgICAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOF09XCJOb3QgZm91bmRcIiksOCk7XG52YXIgTk9UX1NVUFBPUlRFRF9FUlIgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfU1VQUE9SVEVEX0VSUiAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOV09XCJOb3Qgc3VwcG9ydGVkXCIpLDkpO1xudmFyIElOVVNFX0FUVFJJQlVURV9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5VU0VfQVRUUklCVVRFX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzEwXT1cIkF0dHJpYnV0ZSBpbiB1c2VcIiksMTApO1xuLy9sZXZlbDJcbnZhciBJTlZBTElEX1NUQVRFX0VSUiAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuSU5WQUxJRF9TVEFURV9FUlIgICAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTFdPVwiSW52YWxpZCBzdGF0ZVwiKSwxMSk7XG52YXIgU1lOVEFYX0VSUiAgICAgICAgICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLlNZTlRBWF9FUlIgICAgICAgICAgICAgICBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEyXT1cIlN5bnRheCBlcnJvclwiKSwxMik7XG52YXIgSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEzXT1cIkludmFsaWQgbW9kaWZpY2F0aW9uXCIpLDEzKTtcbnZhciBOQU1FU1BBQ0VfRVJSICAgICAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuTkFNRVNQQUNFX0VSUiAgICAgICAgICAgXHQ9ICgoRXhjZXB0aW9uTWVzc2FnZVsxNF09XCJJbnZhbGlkIG5hbWVzcGFjZVwiKSwxNCk7XG52YXIgSU5WQUxJRF9BQ0NFU1NfRVJSICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfQUNDRVNTX0VSUiAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTVdPVwiSW52YWxpZCBhY2Nlc3NcIiksMTUpO1xuXG5cbmZ1bmN0aW9uIERPTUV4Y2VwdGlvbihjb2RlLCBtZXNzYWdlKSB7XG5cdGlmKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcil7XG5cdFx0dmFyIGVycm9yID0gbWVzc2FnZTtcblx0fWVsc2V7XG5cdFx0ZXJyb3IgPSB0aGlzO1xuXHRcdEVycm9yLmNhbGwodGhpcywgRXhjZXB0aW9uTWVzc2FnZVtjb2RlXSk7XG5cdFx0dGhpcy5tZXNzYWdlID0gRXhjZXB0aW9uTWVzc2FnZVtjb2RlXTtcblx0XHRpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRE9NRXhjZXB0aW9uKTtcblx0fVxuXHRlcnJvci5jb2RlID0gY29kZTtcblx0aWYobWVzc2FnZSkgdGhpcy5tZXNzYWdlID0gdGhpcy5tZXNzYWdlICsgXCI6IFwiICsgbWVzc2FnZTtcblx0cmV0dXJuIGVycm9yO1xufTtcbkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5jb3B5KEV4Y2VwdGlvbkNvZGUsRE9NRXhjZXB0aW9uKVxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMvY29yZS5odG1sI0lELTUzNjI5NzE3N1xuICogVGhlIE5vZGVMaXN0IGludGVyZmFjZSBwcm92aWRlcyB0aGUgYWJzdHJhY3Rpb24gb2YgYW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG5vZGVzLCB3aXRob3V0IGRlZmluaW5nIG9yIGNvbnN0cmFpbmluZyBob3cgdGhpcyBjb2xsZWN0aW9uIGlzIGltcGxlbWVudGVkLiBOb2RlTGlzdCBvYmplY3RzIGluIHRoZSBET00gYXJlIGxpdmUuXG4gKiBUaGUgaXRlbXMgaW4gdGhlIE5vZGVMaXN0IGFyZSBhY2Nlc3NpYmxlIHZpYSBhbiBpbnRlZ3JhbCBpbmRleCwgc3RhcnRpbmcgZnJvbSAwLlxuICovXG5mdW5jdGlvbiBOb2RlTGlzdCgpIHtcbn07XG5Ob2RlTGlzdC5wcm90b3R5cGUgPSB7XG5cdC8qKlxuXHQgKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgY2hpbGQgbm9kZSBpbmRpY2VzIGlzIDAgdG8gbGVuZ3RoLTEgaW5jbHVzaXZlLlxuXHQgKiBAc3RhbmRhcmQgbGV2ZWwxXG5cdCAqL1xuXHRsZW5ndGg6MCwgXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleHRoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24uIElmIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LCB0aGlzIHJldHVybnMgbnVsbC5cblx0ICogQHN0YW5kYXJkIGxldmVsMVxuXHQgKiBAcGFyYW0gaW5kZXggIHVuc2lnbmVkIGxvbmcgXG5cdCAqICAgSW5kZXggaW50byB0aGUgY29sbGVjdGlvbi5cblx0ICogQHJldHVybiBOb2RlXG5cdCAqIFx0VGhlIG5vZGUgYXQgdGhlIGluZGV4dGggcG9zaXRpb24gaW4gdGhlIE5vZGVMaXN0LCBvciBudWxsIGlmIHRoYXQgaXMgbm90IGEgdmFsaWQgaW5kZXguIFxuXHQgKi9cblx0aXRlbTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRyZXR1cm4gdGhpc1tpbmRleF0gfHwgbnVsbDtcblx0fSxcblx0dG9TdHJpbmc6ZnVuY3Rpb24oaXNIVE1MLG5vZGVGaWx0ZXIpe1xuXHRcdGZvcih2YXIgYnVmID0gW10sIGkgPSAwO2k8dGhpcy5sZW5ndGg7aSsrKXtcblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKHRoaXNbaV0sYnVmLGlzSFRNTCxub2RlRmlsdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ1Zi5qb2luKCcnKTtcblx0fVxufTtcbmZ1bmN0aW9uIExpdmVOb2RlTGlzdChub2RlLHJlZnJlc2gpe1xuXHR0aGlzLl9ub2RlID0gbm9kZTtcblx0dGhpcy5fcmVmcmVzaCA9IHJlZnJlc2hcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xufVxuZnVuY3Rpb24gX3VwZGF0ZUxpdmVMaXN0KGxpc3Qpe1xuXHR2YXIgaW5jID0gbGlzdC5fbm9kZS5faW5jIHx8IGxpc3QuX25vZGUub3duZXJEb2N1bWVudC5faW5jO1xuXHRpZihsaXN0Ll9pbmMgIT0gaW5jKXtcblx0XHR2YXIgbHMgPSBsaXN0Ll9yZWZyZXNoKGxpc3QuX25vZGUpO1xuXHRcdC8vY29uc29sZS5sb2cobHMubGVuZ3RoKVxuXHRcdF9fc2V0X18obGlzdCwnbGVuZ3RoJyxscy5sZW5ndGgpO1xuXHRcdGNvcHkobHMsbGlzdCk7XG5cdFx0bGlzdC5faW5jID0gaW5jO1xuXHR9XG59XG5MaXZlTm9kZUxpc3QucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbihpKXtcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xuXHRyZXR1cm4gdGhpc1tpXTtcbn1cblxuX2V4dGVuZHMoTGl2ZU5vZGVMaXN0LE5vZGVMaXN0KTtcbi8qKlxuICogXG4gKiBPYmplY3RzIGltcGxlbWVudGluZyB0aGUgTmFtZWROb2RlTWFwIGludGVyZmFjZSBhcmUgdXNlZCB0byByZXByZXNlbnQgY29sbGVjdGlvbnMgb2Ygbm9kZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgYnkgbmFtZS4gTm90ZSB0aGF0IE5hbWVkTm9kZU1hcCBkb2VzIG5vdCBpbmhlcml0IGZyb20gTm9kZUxpc3Q7IE5hbWVkTm9kZU1hcHMgYXJlIG5vdCBtYWludGFpbmVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLiBPYmplY3RzIGNvbnRhaW5lZCBpbiBhbiBvYmplY3QgaW1wbGVtZW50aW5nIE5hbWVkTm9kZU1hcCBtYXkgYWxzbyBiZSBhY2Nlc3NlZCBieSBhbiBvcmRpbmFsIGluZGV4LCBidXQgdGhpcyBpcyBzaW1wbHkgdG8gYWxsb3cgY29udmVuaWVudCBlbnVtZXJhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBOYW1lZE5vZGVNYXAsIGFuZCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBET00gc3BlY2lmaWVzIGFuIG9yZGVyIHRvIHRoZXNlIE5vZGVzLlxuICogTmFtZWROb2RlTWFwIG9iamVjdHMgaW4gdGhlIERPTSBhcmUgbGl2ZS5cbiAqIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb3IgRG9jdW1lbnRUeXBlIGVudGl0aWVzIFxuICovXG5mdW5jdGlvbiBOYW1lZE5vZGVNYXAoKSB7XG59O1xuXG5mdW5jdGlvbiBfZmluZE5vZGVJbmRleChsaXN0LG5vZGUpe1xuXHR2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXHR3aGlsZShpLS0pe1xuXHRcdGlmKGxpc3RbaV0gPT09IG5vZGUpe3JldHVybiBpfVxuXHR9XG59XG5cbmZ1bmN0aW9uIF9hZGROYW1lZE5vZGUoZWwsbGlzdCxuZXdBdHRyLG9sZEF0dHIpe1xuXHRpZihvbGRBdHRyKXtcblx0XHRsaXN0W19maW5kTm9kZUluZGV4KGxpc3Qsb2xkQXR0cildID0gbmV3QXR0cjtcblx0fWVsc2V7XG5cdFx0bGlzdFtsaXN0Lmxlbmd0aCsrXSA9IG5ld0F0dHI7XG5cdH1cblx0aWYoZWwpe1xuXHRcdG5ld0F0dHIub3duZXJFbGVtZW50ID0gZWw7XG5cdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0aWYoZG9jKXtcblx0XHRcdG9sZEF0dHIgJiYgX29uUmVtb3ZlQXR0cmlidXRlKGRvYyxlbCxvbGRBdHRyKTtcblx0XHRcdF9vbkFkZEF0dHJpYnV0ZShkb2MsZWwsbmV3QXR0cik7XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBfcmVtb3ZlTmFtZWROb2RlKGVsLGxpc3QsYXR0cil7XG5cdC8vY29uc29sZS5sb2coJ3JlbW92ZSBhdHRyOicrYXR0cilcblx0dmFyIGkgPSBfZmluZE5vZGVJbmRleChsaXN0LGF0dHIpO1xuXHRpZihpPj0wKXtcblx0XHR2YXIgbGFzdEluZGV4ID0gbGlzdC5sZW5ndGgtMVxuXHRcdHdoaWxlKGk8bGFzdEluZGV4KXtcblx0XHRcdGxpc3RbaV0gPSBsaXN0WysraV1cblx0XHR9XG5cdFx0bGlzdC5sZW5ndGggPSBsYXN0SW5kZXg7XG5cdFx0aWYoZWwpe1xuXHRcdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRpZihkb2Mpe1xuXHRcdFx0XHRfb25SZW1vdmVBdHRyaWJ1dGUoZG9jLGVsLGF0dHIpO1xuXHRcdFx0XHRhdHRyLm93bmVyRWxlbWVudCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ZWxzZXtcblx0XHR0aHJvdyBET01FeGNlcHRpb24oTk9UX0ZPVU5EX0VSUixuZXcgRXJyb3IoZWwudGFnTmFtZSsnQCcrYXR0cikpXG5cdH1cbn1cbk5hbWVkTm9kZU1hcC5wcm90b3R5cGUgPSB7XG5cdGxlbmd0aDowLFxuXHRpdGVtOk5vZGVMaXN0LnByb3RvdHlwZS5pdGVtLFxuXHRnZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGtleSkge1xuLy9cdFx0aWYoa2V5LmluZGV4T2YoJzonKT4wIHx8IGtleSA9PSAneG1sbnMnKXtcbi8vXHRcdFx0cmV0dXJuIG51bGw7XG4vL1x0XHR9XG5cdFx0Ly9jb25zb2xlLmxvZygpXG5cdFx0dmFyIGkgPSB0aGlzLmxlbmd0aDtcblx0XHR3aGlsZShpLS0pe1xuXHRcdFx0dmFyIGF0dHIgPSB0aGlzW2ldO1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhhdHRyLm5vZGVOYW1lLGtleSlcblx0XHRcdGlmKGF0dHIubm9kZU5hbWUgPT0ga2V5KXtcblx0XHRcdFx0cmV0dXJuIGF0dHI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRzZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGF0dHIpIHtcblx0XHR2YXIgZWwgPSBhdHRyLm93bmVyRWxlbWVudDtcblx0XHRpZihlbCAmJiBlbCE9dGhpcy5fb3duZXJFbGVtZW50KXtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oSU5VU0VfQVRUUklCVVRFX0VSUik7XG5cdFx0fVxuXHRcdHZhciBvbGRBdHRyID0gdGhpcy5nZXROYW1lZEl0ZW0oYXR0ci5ub2RlTmFtZSk7XG5cdFx0X2FkZE5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyLG9sZEF0dHIpO1xuXHRcdHJldHVybiBvbGRBdHRyO1xuXHR9LFxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0c2V0TmFtZWRJdGVtTlM6IGZ1bmN0aW9uKGF0dHIpIHsvLyByYWlzZXM6IFdST05HX0RPQ1VNRU5UX0VSUixOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsSU5VU0VfQVRUUklCVVRFX0VSUlxuXHRcdHZhciBlbCA9IGF0dHIub3duZXJFbGVtZW50LCBvbGRBdHRyO1xuXHRcdGlmKGVsICYmIGVsIT10aGlzLl9vd25lckVsZW1lbnQpe1xuXHRcdFx0dGhyb3cgbmV3IERPTUV4Y2VwdGlvbihJTlVTRV9BVFRSSUJVVEVfRVJSKTtcblx0XHR9XG5cdFx0b2xkQXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtTlMoYXR0ci5uYW1lc3BhY2VVUkksYXR0ci5sb2NhbE5hbWUpO1xuXHRcdF9hZGROYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cixvbGRBdHRyKTtcblx0XHRyZXR1cm4gb2xkQXR0cjtcblx0fSxcblxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0cmVtb3ZlTmFtZWRJdGVtOiBmdW5jdGlvbihrZXkpIHtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtKGtleSk7XG5cdFx0X3JlbW92ZU5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyKTtcblx0XHRyZXR1cm4gYXR0cjtcblx0XHRcblx0XHRcblx0fSwvLyByYWlzZXM6IE5PVF9GT1VORF9FUlIsTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXG5cdFxuXHQvL2ZvciBsZXZlbDJcblx0cmVtb3ZlTmFtZWRJdGVtTlM6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLGxvY2FsTmFtZSl7XG5cdFx0dmFyIGF0dHIgPSB0aGlzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUpO1xuXHRcdF9yZW1vdmVOYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cik7XG5cdFx0cmV0dXJuIGF0dHI7XG5cdH0sXG5cdGdldE5hbWVkSXRlbU5TOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuXHRcdHZhciBpID0gdGhpcy5sZW5ndGg7XG5cdFx0d2hpbGUoaS0tKXtcblx0XHRcdHZhciBub2RlID0gdGhpc1tpXTtcblx0XHRcdGlmKG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSAmJiBub2RlLm5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkpe1xuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn07XG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLURPTS1MZXZlbC0xL2xldmVsLW9uZS1jb3JlLmh0bWwjSUQtMTAyMTYxNDkwXG4gKi9cbmZ1bmN0aW9uIERPTUltcGxlbWVudGF0aW9uKC8qIE9iamVjdCAqLyBmZWF0dXJlcykge1xuXHR0aGlzLl9mZWF0dXJlcyA9IHt9O1xuXHRpZiAoZmVhdHVyZXMpIHtcblx0XHRmb3IgKHZhciBmZWF0dXJlIGluIGZlYXR1cmVzKSB7XG5cdFx0XHQgdGhpcy5fZmVhdHVyZXMgPSBmZWF0dXJlc1tmZWF0dXJlXTtcblx0XHR9XG5cdH1cbn07XG5cbkRPTUltcGxlbWVudGF0aW9uLnByb3RvdHlwZSA9IHtcblx0aGFzRmVhdHVyZTogZnVuY3Rpb24oLyogc3RyaW5nICovIGZlYXR1cmUsIC8qIHN0cmluZyAqLyB2ZXJzaW9uKSB7XG5cdFx0dmFyIHZlcnNpb25zID0gdGhpcy5fZmVhdHVyZXNbZmVhdHVyZS50b0xvd2VyQ2FzZSgpXTtcblx0XHRpZiAodmVyc2lvbnMgJiYgKCF2ZXJzaW9uIHx8IHZlcnNpb24gaW4gdmVyc2lvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSxcblx0Ly8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcblx0Y3JlYXRlRG9jdW1lbnQ6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLCAgcXVhbGlmaWVkTmFtZSwgZG9jdHlwZSl7Ly8gcmFpc2VzOklOVkFMSURfQ0hBUkFDVEVSX0VSUixOQU1FU1BBQ0VfRVJSLFdST05HX0RPQ1VNRU5UX0VSUlxuXHRcdHZhciBkb2MgPSBuZXcgRG9jdW1lbnQoKTtcblx0XHRkb2MuaW1wbGVtZW50YXRpb24gPSB0aGlzO1xuXHRcdGRvYy5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0ZG9jLmRvY3R5cGUgPSBkb2N0eXBlO1xuXHRcdGlmKGRvY3R5cGUpe1xuXHRcdFx0ZG9jLmFwcGVuZENoaWxkKGRvY3R5cGUpO1xuXHRcdH1cblx0XHRpZihxdWFsaWZpZWROYW1lKXtcblx0XHRcdHZhciByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRkb2MuYXBwZW5kQ2hpbGQocm9vdCk7XG5cdFx0fVxuXHRcdHJldHVybiBkb2M7XG5cdH0sXG5cdC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDI6XG5cdGNyZWF0ZURvY3VtZW50VHlwZTpmdW5jdGlvbihxdWFsaWZpZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpey8vIHJhaXNlczpJTlZBTElEX0NIQVJBQ1RFUl9FUlIsTkFNRVNQQUNFX0VSUlxuXHRcdHZhciBub2RlID0gbmV3IERvY3VtZW50VHlwZSgpO1xuXHRcdG5vZGUubmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5ub2RlTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5wdWJsaWNJZCA9IHB1YmxpY0lkO1xuXHRcdG5vZGUuc3lzdGVtSWQgPSBzeXN0ZW1JZDtcblx0XHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRcdC8vcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyAgICAgICAgaW50ZXJuYWxTdWJzZXQ7XG5cdFx0XG5cdFx0Ly9UT0RPOi4uXG5cdFx0Ly8gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOYW1lZE5vZGVNYXAgICAgIGVudGl0aWVzO1xuXHRcdC8vICByZWFkb25seSBhdHRyaWJ1dGUgTmFtZWROb2RlTWFwICAgICBub3RhdGlvbnM7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH1cbn07XG5cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMvY29yZS5odG1sI0lELTE5NTA2NDEyNDdcbiAqL1xuXG5mdW5jdGlvbiBOb2RlKCkge1xufTtcblxuTm9kZS5wcm90b3R5cGUgPSB7XG5cdGZpcnN0Q2hpbGQgOiBudWxsLFxuXHRsYXN0Q2hpbGQgOiBudWxsLFxuXHRwcmV2aW91c1NpYmxpbmcgOiBudWxsLFxuXHRuZXh0U2libGluZyA6IG51bGwsXG5cdGF0dHJpYnV0ZXMgOiBudWxsLFxuXHRwYXJlbnROb2RlIDogbnVsbCxcblx0Y2hpbGROb2RlcyA6IG51bGwsXG5cdG93bmVyRG9jdW1lbnQgOiBudWxsLFxuXHRub2RlVmFsdWUgOiBudWxsLFxuXHRuYW1lc3BhY2VVUkkgOiBudWxsLFxuXHRwcmVmaXggOiBudWxsLFxuXHRsb2NhbE5hbWUgOiBudWxsLFxuXHQvLyBNb2RpZmllZCBpbiBET00gTGV2ZWwgMjpcblx0aW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKG5ld0NoaWxkLCByZWZDaGlsZCl7Ly9yYWlzZXMgXG5cdFx0cmV0dXJuIF9pbnNlcnRCZWZvcmUodGhpcyxuZXdDaGlsZCxyZWZDaGlsZCk7XG5cdH0sXG5cdHJlcGxhY2VDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCwgb2xkQ2hpbGQpey8vcmFpc2VzIFxuXHRcdHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG9sZENoaWxkKTtcblx0XHRpZihvbGRDaGlsZCl7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKG9sZENoaWxkKTtcblx0XHR9XG5cdH0sXG5cdHJlbW92ZUNoaWxkOmZ1bmN0aW9uKG9sZENoaWxkKXtcblx0XHRyZXR1cm4gX3JlbW92ZUNoaWxkKHRoaXMsb2xkQ2hpbGQpO1xuXHR9LFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG51bGwpO1xuXHR9LFxuXHRoYXNDaGlsZE5vZGVzOmZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsO1xuXHR9LFxuXHRjbG9uZU5vZGU6ZnVuY3Rpb24oZGVlcCl7XG5cdFx0cmV0dXJuIGNsb25lTm9kZSh0aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsdGhpcyxkZWVwKTtcblx0fSxcblx0Ly8gTW9kaWZpZWQgaW4gRE9NIExldmVsIDI6XG5cdG5vcm1hbGl6ZTpmdW5jdGlvbigpe1xuXHRcdHZhciBjaGlsZCA9IHRoaXMuZmlyc3RDaGlsZDtcblx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHR2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0aWYobmV4dCAmJiBuZXh0Lm5vZGVUeXBlID09IFRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSA9PSBURVhUX05PREUpe1xuXHRcdFx0XHR0aGlzLnJlbW92ZUNoaWxkKG5leHQpO1xuXHRcdFx0XHRjaGlsZC5hcHBlbmREYXRhKG5leHQuZGF0YSk7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0Y2hpbGQubm9ybWFsaXplKCk7XG5cdFx0XHRcdGNoaWxkID0gbmV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG4gIFx0Ly8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcblx0aXNTdXBwb3J0ZWQ6ZnVuY3Rpb24oZmVhdHVyZSwgdmVyc2lvbil7XG5cdFx0cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKGZlYXR1cmUsdmVyc2lvbik7XG5cdH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcbiAgICBoYXNBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7XG4gICAgXHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aD4wO1xuICAgIH0sXG4gICAgbG9va3VwUHJlZml4OmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSl7XG4gICAgXHR2YXIgZWwgPSB0aGlzO1xuICAgIFx0d2hpbGUoZWwpe1xuICAgIFx0XHR2YXIgbWFwID0gZWwuX25zTWFwO1xuICAgIFx0XHQvL2NvbnNvbGUuZGlyKG1hcClcbiAgICBcdFx0aWYobWFwKXtcbiAgICBcdFx0XHRmb3IodmFyIG4gaW4gbWFwKXtcbiAgICBcdFx0XHRcdGlmKG1hcFtuXSA9PSBuYW1lc3BhY2VVUkkpe1xuICAgIFx0XHRcdFx0XHRyZXR1cm4gbjtcbiAgICBcdFx0XHRcdH1cbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdFx0ZWwgPSBlbC5ub2RlVHlwZSA9PSBBVFRSSUJVVEVfTk9ERT9lbC5vd25lckRvY3VtZW50IDogZWwucGFyZW50Tm9kZTtcbiAgICBcdH1cbiAgICBcdHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMzpcbiAgICBsb29rdXBOYW1lc3BhY2VVUkk6ZnVuY3Rpb24ocHJlZml4KXtcbiAgICBcdHZhciBlbCA9IHRoaXM7XG4gICAgXHR3aGlsZShlbCl7XG4gICAgXHRcdHZhciBtYXAgPSBlbC5fbnNNYXA7XG4gICAgXHRcdC8vY29uc29sZS5kaXIobWFwKVxuICAgIFx0XHRpZihtYXApe1xuICAgIFx0XHRcdGlmKHByZWZpeCBpbiBtYXApe1xuICAgIFx0XHRcdFx0cmV0dXJuIG1hcFtwcmVmaXhdIDtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdFx0ZWwgPSBlbC5ub2RlVHlwZSA9PSBBVFRSSUJVVEVfTk9ERT9lbC5vd25lckRvY3VtZW50IDogZWwucGFyZW50Tm9kZTtcbiAgICBcdH1cbiAgICBcdHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMzpcbiAgICBpc0RlZmF1bHROYW1lc3BhY2U6ZnVuY3Rpb24obmFtZXNwYWNlVVJJKXtcbiAgICBcdHZhciBwcmVmaXggPSB0aGlzLmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpO1xuICAgIFx0cmV0dXJuIHByZWZpeCA9PSBudWxsO1xuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gX3htbEVuY29kZXIoYyl7XG5cdHJldHVybiBjID09ICc8JyAmJiAnJmx0OycgfHxcbiAgICAgICAgIGMgPT0gJz4nICYmICcmZ3Q7JyB8fFxuICAgICAgICAgYyA9PSAnJicgJiYgJyZhbXA7JyB8fFxuICAgICAgICAgYyA9PSAnXCInICYmICcmcXVvdDsnIHx8XG4gICAgICAgICAnJiMnK2MuY2hhckNvZGVBdCgpKyc7J1xufVxuXG5cbmNvcHkoTm9kZVR5cGUsTm9kZSk7XG5jb3B5KE5vZGVUeXBlLE5vZGUucHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0gY2FsbGJhY2sgcmV0dXJuIHRydWUgZm9yIGNvbnRpbnVlLGZhbHNlIGZvciBicmVha1xuICogQHJldHVybiBib29sZWFuIHRydWU6IGJyZWFrIHZpc2l0O1xuICovXG5mdW5jdGlvbiBfdmlzaXROb2RlKG5vZGUsY2FsbGJhY2spe1xuXHRpZihjYWxsYmFjayhub2RlKSl7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYobm9kZSA9IG5vZGUuZmlyc3RDaGlsZCl7XG5cdFx0ZG97XG5cdFx0XHRpZihfdmlzaXROb2RlKG5vZGUsY2FsbGJhY2spKXtyZXR1cm4gdHJ1ZX1cbiAgICAgICAgfXdoaWxlKG5vZGU9bm9kZS5uZXh0U2libGluZylcbiAgICB9XG59XG5cblxuXG5mdW5jdGlvbiBEb2N1bWVudCgpe1xufVxuZnVuY3Rpb24gX29uQWRkQXR0cmlidXRlKGRvYyxlbCxuZXdBdHRyKXtcblx0ZG9jICYmIGRvYy5faW5jKys7XG5cdHZhciBucyA9IG5ld0F0dHIubmFtZXNwYWNlVVJJIDtcblx0aWYobnMgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJyl7XG5cdFx0Ly91cGRhdGUgbmFtZXNwYWNlXG5cdFx0ZWwuX25zTWFwW25ld0F0dHIucHJlZml4P25ld0F0dHIubG9jYWxOYW1lOicnXSA9IG5ld0F0dHIudmFsdWVcblx0fVxufVxuZnVuY3Rpb24gX29uUmVtb3ZlQXR0cmlidXRlKGRvYyxlbCxuZXdBdHRyLHJlbW92ZSl7XG5cdGRvYyAmJiBkb2MuX2luYysrO1xuXHR2YXIgbnMgPSBuZXdBdHRyLm5hbWVzcGFjZVVSSSA7XG5cdGlmKG5zID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycpe1xuXHRcdC8vdXBkYXRlIG5hbWVzcGFjZVxuXHRcdGRlbGV0ZSBlbC5fbnNNYXBbbmV3QXR0ci5wcmVmaXg/bmV3QXR0ci5sb2NhbE5hbWU6JyddXG5cdH1cbn1cbmZ1bmN0aW9uIF9vblVwZGF0ZUNoaWxkKGRvYyxlbCxuZXdDaGlsZCl7XG5cdGlmKGRvYyAmJiBkb2MuX2luYyl7XG5cdFx0ZG9jLl9pbmMrKztcblx0XHQvL3VwZGF0ZSBjaGlsZE5vZGVzXG5cdFx0dmFyIGNzID0gZWwuY2hpbGROb2Rlcztcblx0XHRpZihuZXdDaGlsZCl7XG5cdFx0XHRjc1tjcy5sZW5ndGgrK10gPSBuZXdDaGlsZDtcblx0XHR9ZWxzZXtcblx0XHRcdC8vY29uc29sZS5sb2coMSlcblx0XHRcdHZhciBjaGlsZCA9IGVsLmZpcnN0Q2hpbGQ7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdGNzW2krK10gPSBjaGlsZDtcblx0XHRcdFx0Y2hpbGQgPWNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0Y3MubGVuZ3RoID0gaTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBhdHRyaWJ1dGVzO1xuICogY2hpbGRyZW47XG4gKiBcbiAqIHdyaXRlYWJsZSBwcm9wZXJ0aWVzOlxuICogbm9kZVZhbHVlLEF0dHI6dmFsdWUsQ2hhcmFjdGVyRGF0YTpkYXRhXG4gKiBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gX3JlbW92ZUNoaWxkKHBhcmVudE5vZGUsY2hpbGQpe1xuXHR2YXIgcHJldmlvdXMgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmc7XG5cdHZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdGlmKHByZXZpb3VzKXtcblx0XHRwcmV2aW91cy5uZXh0U2libGluZyA9IG5leHQ7XG5cdH1lbHNle1xuXHRcdHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5leHRcblx0fVxuXHRpZihuZXh0KXtcblx0XHRuZXh0LnByZXZpb3VzU2libGluZyA9IHByZXZpb3VzO1xuXHR9ZWxzZXtcblx0XHRwYXJlbnROb2RlLmxhc3RDaGlsZCA9IHByZXZpb3VzO1xuXHR9XG5cdF9vblVwZGF0ZUNoaWxkKHBhcmVudE5vZGUub3duZXJEb2N1bWVudCxwYXJlbnROb2RlKTtcblx0cmV0dXJuIGNoaWxkO1xufVxuLyoqXG4gKiBwcmVmb3JtYW5jZSBrZXkocmVmQ2hpbGQgPT0gbnVsbClcbiAqL1xuZnVuY3Rpb24gX2luc2VydEJlZm9yZShwYXJlbnROb2RlLG5ld0NoaWxkLG5leHRDaGlsZCl7XG5cdHZhciBjcCA9IG5ld0NoaWxkLnBhcmVudE5vZGU7XG5cdGlmKGNwKXtcblx0XHRjcC5yZW1vdmVDaGlsZChuZXdDaGlsZCk7Ly9yZW1vdmUgYW5kIHVwZGF0ZVxuXHR9XG5cdGlmKG5ld0NoaWxkLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtcblx0XHR2YXIgbmV3Rmlyc3QgPSBuZXdDaGlsZC5maXJzdENoaWxkO1xuXHRcdGlmIChuZXdGaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gbmV3Q2hpbGQ7XG5cdFx0fVxuXHRcdHZhciBuZXdMYXN0ID0gbmV3Q2hpbGQubGFzdENoaWxkO1xuXHR9ZWxzZXtcblx0XHRuZXdGaXJzdCA9IG5ld0xhc3QgPSBuZXdDaGlsZDtcblx0fVxuXHR2YXIgcHJlID0gbmV4dENoaWxkID8gbmV4dENoaWxkLnByZXZpb3VzU2libGluZyA6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXG5cdG5ld0ZpcnN0LnByZXZpb3VzU2libGluZyA9IHByZTtcblx0bmV3TGFzdC5uZXh0U2libGluZyA9IG5leHRDaGlsZDtcblx0XG5cdFxuXHRpZihwcmUpe1xuXHRcdHByZS5uZXh0U2libGluZyA9IG5ld0ZpcnN0O1xuXHR9ZWxzZXtcblx0XHRwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPSBuZXdGaXJzdDtcblx0fVxuXHRpZihuZXh0Q2hpbGQgPT0gbnVsbCl7XG5cdFx0cGFyZW50Tm9kZS5sYXN0Q2hpbGQgPSBuZXdMYXN0O1xuXHR9ZWxzZXtcblx0XHRuZXh0Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gbmV3TGFzdDtcblx0fVxuXHRkb3tcblx0XHRuZXdGaXJzdC5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcblx0fXdoaWxlKG5ld0ZpcnN0ICE9PSBuZXdMYXN0ICYmIChuZXdGaXJzdD0gbmV3Rmlyc3QubmV4dFNpYmxpbmcpKVxuXHRfb25VcGRhdGVDaGlsZChwYXJlbnROb2RlLm93bmVyRG9jdW1lbnR8fHBhcmVudE5vZGUscGFyZW50Tm9kZSk7XG5cdC8vY29uc29sZS5sb2cocGFyZW50Tm9kZS5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPT0gbnVsbClcblx0aWYgKG5ld0NoaWxkLm5vZGVUeXBlID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcblx0XHRuZXdDaGlsZC5maXJzdENoaWxkID0gbmV3Q2hpbGQubGFzdENoaWxkID0gbnVsbDtcblx0fVxuXHRyZXR1cm4gbmV3Q2hpbGQ7XG59XG5mdW5jdGlvbiBfYXBwZW5kU2luZ2xlQ2hpbGQocGFyZW50Tm9kZSxuZXdDaGlsZCl7XG5cdHZhciBjcCA9IG5ld0NoaWxkLnBhcmVudE5vZGU7XG5cdGlmKGNwKXtcblx0XHR2YXIgcHJlID0gcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdFx0Y3AucmVtb3ZlQ2hpbGQobmV3Q2hpbGQpOy8vcmVtb3ZlIGFuZCB1cGRhdGVcblx0XHR2YXIgcHJlID0gcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdH1cblx0dmFyIHByZSA9IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRuZXdDaGlsZC5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcblx0bmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gcHJlO1xuXHRuZXdDaGlsZC5uZXh0U2libGluZyA9IG51bGw7XG5cdGlmKHByZSl7XG5cdFx0cHJlLm5leHRTaWJsaW5nID0gbmV3Q2hpbGQ7XG5cdH1lbHNle1xuXHRcdHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5ld0NoaWxkO1xuXHR9XG5cdHBhcmVudE5vZGUubGFzdENoaWxkID0gbmV3Q2hpbGQ7XG5cdF9vblVwZGF0ZUNoaWxkKHBhcmVudE5vZGUub3duZXJEb2N1bWVudCxwYXJlbnROb2RlLG5ld0NoaWxkKTtcblx0cmV0dXJuIG5ld0NoaWxkO1xuXHQvL2NvbnNvbGUubG9nKFwiX19hYVwiLHBhcmVudE5vZGUubGFzdENoaWxkLm5leHRTaWJsaW5nID09IG51bGwpXG59XG5Eb2N1bWVudC5wcm90b3R5cGUgPSB7XG5cdC8vaW1wbGVtZW50YXRpb24gOiBudWxsLFxuXHRub2RlTmFtZSA6ICAnI2RvY3VtZW50Jyxcblx0bm9kZVR5cGUgOiAgRE9DVU1FTlRfTk9ERSxcblx0ZG9jdHlwZSA6ICBudWxsLFxuXHRkb2N1bWVudEVsZW1lbnQgOiAgbnVsbCxcblx0X2luYyA6IDEsXG5cdFxuXHRpbnNlcnRCZWZvcmUgOiAgZnVuY3Rpb24obmV3Q2hpbGQsIHJlZkNoaWxkKXsvL3JhaXNlcyBcblx0XHRpZihuZXdDaGlsZC5ub2RlVHlwZSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtcblx0XHRcdHZhciBjaGlsZCA9IG5ld0NoaWxkLmZpcnN0Q2hpbGQ7XG5cdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdHZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdHRoaXMuaW5zZXJ0QmVmb3JlKGNoaWxkLHJlZkNoaWxkKTtcblx0XHRcdFx0Y2hpbGQgPSBuZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ld0NoaWxkO1xuXHRcdH1cblx0XHRpZih0aGlzLmRvY3VtZW50RWxlbWVudCA9PSBudWxsICYmIG5ld0NoaWxkLm5vZGVUeXBlID09IEVMRU1FTlRfTk9ERSl7XG5cdFx0XHR0aGlzLmRvY3VtZW50RWxlbWVudCA9IG5ld0NoaWxkO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gX2luc2VydEJlZm9yZSh0aGlzLG5ld0NoaWxkLHJlZkNoaWxkKSwobmV3Q2hpbGQub3duZXJEb2N1bWVudCA9IHRoaXMpLG5ld0NoaWxkO1xuXHR9LFxuXHRyZW1vdmVDaGlsZCA6ICBmdW5jdGlvbihvbGRDaGlsZCl7XG5cdFx0aWYodGhpcy5kb2N1bWVudEVsZW1lbnQgPT0gb2xkQ2hpbGQpe1xuXHRcdFx0dGhpcy5kb2N1bWVudEVsZW1lbnQgPSBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gX3JlbW92ZUNoaWxkKHRoaXMsb2xkQ2hpbGQpO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRpbXBvcnROb2RlIDogZnVuY3Rpb24oaW1wb3J0ZWROb2RlLGRlZXApe1xuXHRcdHJldHVybiBpbXBvcnROb2RlKHRoaXMsaW1wb3J0ZWROb2RlLGRlZXApO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRnZXRFbGVtZW50QnlJZCA6XHRmdW5jdGlvbihpZCl7XG5cdFx0dmFyIHJ0diA9IG51bGw7XG5cdFx0X3Zpc2l0Tm9kZSh0aGlzLmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihub2RlKXtcblx0XHRcdGlmKG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVF9OT0RFKXtcblx0XHRcdFx0aWYobm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgPT0gaWQpe1xuXHRcdFx0XHRcdHJ0diA9IG5vZGU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KVxuXHRcdHJldHVybiBydHY7XG5cdH0sXG5cdFxuXHQvL2RvY3VtZW50IGZhY3RvcnkgbWV0aG9kOlxuXHRjcmVhdGVFbGVtZW50IDpcdGZ1bmN0aW9uKHRhZ05hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEVsZW1lbnQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSB0YWdOYW1lO1xuXHRcdG5vZGUudGFnTmFtZSA9IHRhZ05hbWU7XG5cdFx0bm9kZS5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcyA9IG5ldyBOYW1lZE5vZGVNYXAoKTtcblx0XHRhdHRycy5fb3duZXJFbGVtZW50ID0gbm9kZTtcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCA6XHRmdW5jdGlvbigpe1xuXHRcdHZhciBub2RlID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVUZXh0Tm9kZSA6XHRmdW5jdGlvbihkYXRhKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBUZXh0KCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLmFwcGVuZERhdGEoZGF0YSlcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQ29tbWVudCA6XHRmdW5jdGlvbihkYXRhKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBDb21tZW50KCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLmFwcGVuZERhdGEoZGF0YSlcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQ0RBVEFTZWN0aW9uIDpcdGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHZhciBub2RlID0gbmV3IENEQVRBU2VjdGlvbigpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudCA9IHRoaXM7XG5cdFx0bm9kZS5hcHBlbmREYXRhKGRhdGEpXG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiA6XHRmdW5jdGlvbih0YXJnZXQsZGF0YSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLnRhZ05hbWUgPSBub2RlLnRhcmdldCA9IHRhcmdldDtcblx0XHRub2RlLm5vZGVWYWx1ZT0gbm9kZS5kYXRhID0gZGF0YTtcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQXR0cmlidXRlIDpcdGZ1bmN0aW9uKG5hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEF0dHIoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnRcdD0gdGhpcztcblx0XHRub2RlLm5hbWUgPSBuYW1lO1xuXHRcdG5vZGUubm9kZU5hbWVcdD0gbmFtZTtcblx0XHRub2RlLmxvY2FsTmFtZSA9IG5hbWU7XG5cdFx0bm9kZS5zcGVjaWZpZWQgPSB0cnVlO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVFbnRpdHlSZWZlcmVuY2UgOlx0ZnVuY3Rpb24obmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgRW50aXR5UmVmZXJlbmNlKCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50XHQ9IHRoaXM7XG5cdFx0bm9kZS5ub2RlTmFtZVx0PSBuYW1lO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRjcmVhdGVFbGVtZW50TlMgOlx0ZnVuY3Rpb24obmFtZXNwYWNlVVJJLHF1YWxpZmllZE5hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEVsZW1lbnQoKTtcblx0XHR2YXIgcGwgPSBxdWFsaWZpZWROYW1lLnNwbGl0KCc6Jyk7XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcyA9IG5ldyBOYW1lZE5vZGVNYXAoKTtcblx0XHRub2RlLmNoaWxkTm9kZXMgPSBuZXcgTm9kZUxpc3QoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUudGFnTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cdFx0aWYocGwubGVuZ3RoID09IDIpe1xuXHRcdFx0bm9kZS5wcmVmaXggPSBwbFswXTtcblx0XHRcdG5vZGUubG9jYWxOYW1lID0gcGxbMV07XG5cdFx0fWVsc2V7XG5cdFx0XHQvL2VsLnByZWZpeCA9IG51bGw7XG5cdFx0XHRub2RlLmxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0fVxuXHRcdGF0dHJzLl9vd25lckVsZW1lbnQgPSBub2RlO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRjcmVhdGVBdHRyaWJ1dGVOUyA6XHRmdW5jdGlvbihuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgQXR0cigpO1xuXHRcdHZhciBwbCA9IHF1YWxpZmllZE5hbWUuc3BsaXQoJzonKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUubmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cdFx0bm9kZS5zcGVjaWZpZWQgPSB0cnVlO1xuXHRcdGlmKHBsLmxlbmd0aCA9PSAyKXtcblx0XHRcdG5vZGUucHJlZml4ID0gcGxbMF07XG5cdFx0XHRub2RlLmxvY2FsTmFtZSA9IHBsWzFdO1xuXHRcdH1lbHNle1xuXHRcdFx0Ly9lbC5wcmVmaXggPSBudWxsO1xuXHRcdFx0bm9kZS5sb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZTtcblx0fVxufTtcbl9leHRlbmRzKERvY3VtZW50LE5vZGUpO1xuXG5cbmZ1bmN0aW9uIEVsZW1lbnQoKSB7XG5cdHRoaXMuX25zTWFwID0ge307XG59O1xuRWxlbWVudC5wcm90b3R5cGUgPSB7XG5cdG5vZGVUeXBlIDogRUxFTUVOVF9OT0RFLFxuXHRoYXNBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpIT1udWxsO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTtcblx0XHRyZXR1cm4gYXR0ciAmJiBhdHRyLnZhbHVlIHx8ICcnO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOb2RlIDogZnVuY3Rpb24obmFtZSl7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obmFtZSk7XG5cdH0sXG5cdHNldEF0dHJpYnV0ZSA6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0YXR0ci52YWx1ZSA9IGF0dHIubm9kZVZhbHVlID0gXCJcIiArIHZhbHVlO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlTm9kZShhdHRyKVxuXHR9LFxuXHRyZW1vdmVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZShuYW1lKVxuXHRcdGF0dHIgJiYgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpO1xuXHR9LFxuXHRcblx0Ly9mb3VyIHJlYWwgb3BlYXJ0aW9uIG1ldGhvZFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0aWYobmV3Q2hpbGQubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG51bGwpO1xuXHRcdH1lbHNle1xuXHRcdFx0cmV0dXJuIF9hcHBlbmRTaW5nbGVDaGlsZCh0aGlzLG5ld0NoaWxkKTtcblx0XHR9XG5cdH0sXG5cdHNldEF0dHJpYnV0ZU5vZGUgOiBmdW5jdGlvbihuZXdBdHRyKXtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShuZXdBdHRyKTtcblx0fSxcblx0c2V0QXR0cmlidXRlTm9kZU5TIDogZnVuY3Rpb24obmV3QXR0cil7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5zZXROYW1lZEl0ZW1OUyhuZXdBdHRyKTtcblx0fSxcblx0cmVtb3ZlQXR0cmlidXRlTm9kZSA6IGZ1bmN0aW9uKG9sZEF0dHIpe1xuXHRcdC8vY29uc29sZS5sb2codGhpcyA9PSBvbGRBdHRyLm93bmVyRWxlbWVudClcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShvbGRBdHRyLm5vZGVOYW1lKTtcblx0fSxcblx0Ly9nZXQgcmVhbCBhdHRyaWJ1dGUgbmFtZSxhbmQgcmVtb3ZlIGl0IGJ5IHJlbW92ZUF0dHJpYnV0ZU5vZGVcblx0cmVtb3ZlQXR0cmlidXRlTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0dmFyIG9sZCA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTtcblx0XHRvbGQgJiYgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZCk7XG5cdH0sXG5cdFxuXHRoYXNBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIT1udWxsO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTtcblx0XHRyZXR1cm4gYXR0ciAmJiBhdHRyLnZhbHVlIHx8ICcnO1xuXHR9LFxuXHRzZXRBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7XG5cdFx0YXR0ci52YWx1ZSA9IGF0dHIubm9kZVZhbHVlID0gXCJcIiArIHZhbHVlO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlTm9kZShhdHRyKVxuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOb2RlTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7XG5cdH0sXG5cdFxuXHRnZXRFbGVtZW50c0J5VGFnTmFtZSA6IGZ1bmN0aW9uKHRhZ05hbWUpe1xuXHRcdHJldHVybiBuZXcgTGl2ZU5vZGVMaXN0KHRoaXMsZnVuY3Rpb24oYmFzZSl7XG5cdFx0XHR2YXIgbHMgPSBbXTtcblx0XHRcdF92aXNpdE5vZGUoYmFzZSxmdW5jdGlvbihub2RlKXtcblx0XHRcdFx0aWYobm9kZSAhPT0gYmFzZSAmJiBub2RlLm5vZGVUeXBlID09IEVMRU1FTlRfTk9ERSAmJiAodGFnTmFtZSA9PT0gJyonIHx8IG5vZGUudGFnTmFtZSA9PSB0YWdOYW1lKSl7XG5cdFx0XHRcdFx0bHMucHVzaChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbHM7XG5cdFx0fSk7XG5cdH0sXG5cdGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0cmV0dXJuIG5ldyBMaXZlTm9kZUxpc3QodGhpcyxmdW5jdGlvbihiYXNlKXtcblx0XHRcdHZhciBscyA9IFtdO1xuXHRcdFx0X3Zpc2l0Tm9kZShiYXNlLGZ1bmN0aW9uKG5vZGUpe1xuXHRcdFx0XHRpZihub2RlICE9PSBiYXNlICYmIG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiAobmFtZXNwYWNlVVJJID09PSAnKicgfHwgbm9kZS5uYW1lc3BhY2VVUkkgPT09IG5hbWVzcGFjZVVSSSkgJiYgKGxvY2FsTmFtZSA9PT0gJyonIHx8IG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSkpe1xuXHRcdFx0XHRcdGxzLnB1c2gobm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGxzO1xuXHRcdFx0XG5cdFx0fSk7XG5cdH1cbn07XG5Eb2N1bWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZTtcbkRvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TID0gRWxlbWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUztcblxuXG5fZXh0ZW5kcyhFbGVtZW50LE5vZGUpO1xuZnVuY3Rpb24gQXR0cigpIHtcbn07XG5BdHRyLnByb3RvdHlwZS5ub2RlVHlwZSA9IEFUVFJJQlVURV9OT0RFO1xuX2V4dGVuZHMoQXR0cixOb2RlKTtcblxuXG5mdW5jdGlvbiBDaGFyYWN0ZXJEYXRhKCkge1xufTtcbkNoYXJhY3RlckRhdGEucHJvdG90eXBlID0ge1xuXHRkYXRhIDogJycsXG5cdHN1YnN0cmluZ0RhdGEgOiBmdW5jdGlvbihvZmZzZXQsIGNvdW50KSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQrY291bnQpO1xuXHR9LFxuXHRhcHBlbmREYXRhOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0dGV4dCA9IHRoaXMuZGF0YSt0ZXh0O1xuXHRcdHRoaXMubm9kZVZhbHVlID0gdGhpcy5kYXRhID0gdGV4dDtcblx0XHR0aGlzLmxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXHR9LFxuXHRpbnNlcnREYXRhOiBmdW5jdGlvbihvZmZzZXQsdGV4dCkge1xuXHRcdHRoaXMucmVwbGFjZURhdGEob2Zmc2V0LDAsdGV4dCk7XG5cdFxuXHR9LFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0dGhyb3cgbmV3IEVycm9yKEV4Y2VwdGlvbk1lc3NhZ2VbSElFUkFSQ0hZX1JFUVVFU1RfRVJSXSlcblx0fSxcblx0ZGVsZXRlRGF0YTogZnVuY3Rpb24ob2Zmc2V0LCBjb3VudCkge1xuXHRcdHRoaXMucmVwbGFjZURhdGEob2Zmc2V0LGNvdW50LFwiXCIpO1xuXHR9LFxuXHRyZXBsYWNlRGF0YTogZnVuY3Rpb24ob2Zmc2V0LCBjb3VudCwgdGV4dCkge1xuXHRcdHZhciBzdGFydCA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCxvZmZzZXQpO1xuXHRcdHZhciBlbmQgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKG9mZnNldCtjb3VudCk7XG5cdFx0dGV4dCA9IHN0YXJ0ICsgdGV4dCArIGVuZDtcblx0XHR0aGlzLm5vZGVWYWx1ZSA9IHRoaXMuZGF0YSA9IHRleHQ7XG5cdFx0dGhpcy5sZW5ndGggPSB0ZXh0Lmxlbmd0aDtcblx0fVxufVxuX2V4dGVuZHMoQ2hhcmFjdGVyRGF0YSxOb2RlKTtcbmZ1bmN0aW9uIFRleHQoKSB7XG59O1xuVGV4dC5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjdGV4dFwiLFxuXHRub2RlVHlwZSA6IFRFWFRfTk9ERSxcblx0c3BsaXRUZXh0IDogZnVuY3Rpb24ob2Zmc2V0KSB7XG5cdFx0dmFyIHRleHQgPSB0aGlzLmRhdGE7XG5cdFx0dmFyIG5ld1RleHQgPSB0ZXh0LnN1YnN0cmluZyhvZmZzZXQpO1xuXHRcdHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBvZmZzZXQpO1xuXHRcdHRoaXMuZGF0YSA9IHRoaXMubm9kZVZhbHVlID0gdGV4dDtcblx0XHR0aGlzLmxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXHRcdHZhciBuZXdOb2RlID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld1RleHQpO1xuXHRcdGlmKHRoaXMucGFyZW50Tm9kZSl7XG5cdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXMubmV4dFNpYmxpbmcpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3Tm9kZTtcblx0fVxufVxuX2V4dGVuZHMoVGV4dCxDaGFyYWN0ZXJEYXRhKTtcbmZ1bmN0aW9uIENvbW1lbnQoKSB7XG59O1xuQ29tbWVudC5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjY29tbWVudFwiLFxuXHRub2RlVHlwZSA6IENPTU1FTlRfTk9ERVxufVxuX2V4dGVuZHMoQ29tbWVudCxDaGFyYWN0ZXJEYXRhKTtcblxuZnVuY3Rpb24gQ0RBVEFTZWN0aW9uKCkge1xufTtcbkNEQVRBU2VjdGlvbi5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjY2RhdGEtc2VjdGlvblwiLFxuXHRub2RlVHlwZSA6IENEQVRBX1NFQ1RJT05fTk9ERVxufVxuX2V4dGVuZHMoQ0RBVEFTZWN0aW9uLENoYXJhY3RlckRhdGEpO1xuXG5cbmZ1bmN0aW9uIERvY3VtZW50VHlwZSgpIHtcbn07XG5Eb2N1bWVudFR5cGUucHJvdG90eXBlLm5vZGVUeXBlID0gRE9DVU1FTlRfVFlQRV9OT0RFO1xuX2V4dGVuZHMoRG9jdW1lbnRUeXBlLE5vZGUpO1xuXG5mdW5jdGlvbiBOb3RhdGlvbigpIHtcbn07XG5Ob3RhdGlvbi5wcm90b3R5cGUubm9kZVR5cGUgPSBOT1RBVElPTl9OT0RFO1xuX2V4dGVuZHMoTm90YXRpb24sTm9kZSk7XG5cbmZ1bmN0aW9uIEVudGl0eSgpIHtcbn07XG5FbnRpdHkucHJvdG90eXBlLm5vZGVUeXBlID0gRU5USVRZX05PREU7XG5fZXh0ZW5kcyhFbnRpdHksTm9kZSk7XG5cbmZ1bmN0aW9uIEVudGl0eVJlZmVyZW5jZSgpIHtcbn07XG5FbnRpdHlSZWZlcmVuY2UucHJvdG90eXBlLm5vZGVUeXBlID0gRU5USVRZX1JFRkVSRU5DRV9OT0RFO1xuX2V4dGVuZHMoRW50aXR5UmVmZXJlbmNlLE5vZGUpO1xuXG5mdW5jdGlvbiBEb2N1bWVudEZyYWdtZW50KCkge1xufTtcbkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLm5vZGVOYW1lID1cdFwiI2RvY3VtZW50LWZyYWdtZW50XCI7XG5Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5ub2RlVHlwZSA9XHRET0NVTUVOVF9GUkFHTUVOVF9OT0RFO1xuX2V4dGVuZHMoRG9jdW1lbnRGcmFnbWVudCxOb2RlKTtcblxuXG5mdW5jdGlvbiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKSB7XG59XG5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ucHJvdG90eXBlLm5vZGVUeXBlID0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFO1xuX2V4dGVuZHMoUHJvY2Vzc2luZ0luc3RydWN0aW9uLE5vZGUpO1xuZnVuY3Rpb24gWE1MU2VyaWFsaXplcigpe31cblhNTFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVRvU3RyaW5nID0gZnVuY3Rpb24obm9kZSxpc0h0bWwsbm9kZUZpbHRlcil7XG5cdHJldHVybiBub2RlU2VyaWFsaXplVG9TdHJpbmcuY2FsbChub2RlLGlzSHRtbCxub2RlRmlsdGVyKTtcbn1cbk5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gbm9kZVNlcmlhbGl6ZVRvU3RyaW5nO1xuZnVuY3Rpb24gbm9kZVNlcmlhbGl6ZVRvU3RyaW5nKGlzSHRtbCxub2RlRmlsdGVyKXtcblx0dmFyIGJ1ZiA9IFtdO1xuXHR2YXIgcmVmTm9kZSA9IHRoaXMubm9kZVR5cGUgPT0gOT90aGlzLmRvY3VtZW50RWxlbWVudDp0aGlzO1xuXHR2YXIgcHJlZml4ID0gcmVmTm9kZS5wcmVmaXg7XG5cdHZhciB1cmkgPSByZWZOb2RlLm5hbWVzcGFjZVVSSTtcblx0XG5cdGlmKHVyaSAmJiBwcmVmaXggPT0gbnVsbCl7XG5cdFx0Ly9jb25zb2xlLmxvZyhwcmVmaXgpXG5cdFx0dmFyIHByZWZpeCA9IHJlZk5vZGUubG9va3VwUHJlZml4KHVyaSk7XG5cdFx0aWYocHJlZml4ID09IG51bGwpe1xuXHRcdFx0Ly9pc0hUTUwgPSB0cnVlO1xuXHRcdFx0dmFyIHZpc2libGVOYW1lc3BhY2VzPVtcblx0XHRcdHtuYW1lc3BhY2U6dXJpLHByZWZpeDpudWxsfVxuXHRcdFx0Ly97bmFtZXNwYWNlOnVyaSxwcmVmaXg6Jyd9XG5cdFx0XHRdXG5cdFx0fVxuXHR9XG5cdHNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMsYnVmLGlzSHRtbCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKTtcblx0Ly9jb25zb2xlLmxvZygnIyMjJyx0aGlzLm5vZGVUeXBlLHVyaSxwcmVmaXgsYnVmLmpvaW4oJycpKVxuXHRyZXR1cm4gYnVmLmpvaW4oJycpO1xufVxuZnVuY3Rpb24gbmVlZE5hbWVzcGFjZURlZmluZShub2RlLGlzSFRNTCwgdmlzaWJsZU5hbWVzcGFjZXMpIHtcblx0dmFyIHByZWZpeCA9IG5vZGUucHJlZml4fHwnJztcblx0dmFyIHVyaSA9IG5vZGUubmFtZXNwYWNlVVJJO1xuXHRpZiAoIXByZWZpeCAmJiAhdXJpKXtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHByZWZpeCA9PT0gXCJ4bWxcIiAmJiB1cmkgPT09IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIgXG5cdFx0fHwgdXJpID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycpe1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRcblx0dmFyIGkgPSB2aXNpYmxlTmFtZXNwYWNlcy5sZW5ndGggXG5cdC8vY29uc29sZS5sb2coJ0BAQEAnLG5vZGUudGFnTmFtZSxwcmVmaXgsdXJpLHZpc2libGVOYW1lc3BhY2VzKVxuXHR3aGlsZSAoaS0tKSB7XG5cdFx0dmFyIG5zID0gdmlzaWJsZU5hbWVzcGFjZXNbaV07XG5cdFx0Ly8gZ2V0IG5hbWVzcGFjZSBwcmVmaXhcblx0XHQvL2NvbnNvbGUubG9nKG5vZGUubm9kZVR5cGUsbm9kZS50YWdOYW1lLG5zLnByZWZpeCxwcmVmaXgpXG5cdFx0aWYgKG5zLnByZWZpeCA9PSBwcmVmaXgpe1xuXHRcdFx0cmV0dXJuIG5zLm5hbWVzcGFjZSAhPSB1cmk7XG5cdFx0fVxuXHR9XG5cdC8vY29uc29sZS5sb2coaXNIVE1MLHVyaSxwcmVmaXg9PScnKVxuXHQvL2lmKGlzSFRNTCAmJiBwcmVmaXggPT1udWxsICYmIHVyaSA9PSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcpe1xuXHQvL1x0cmV0dXJuIGZhbHNlO1xuXHQvL31cblx0Ly9ub2RlLmZsYWcgPSAnMTExMTEnXG5cdC8vY29uc29sZS5lcnJvcigzLHRydWUsbm9kZS5mbGFnLG5vZGUucHJlZml4LG5vZGUubmFtZXNwYWNlVVJJKVxuXHRyZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUsYnVmLGlzSFRNTCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKXtcblx0aWYobm9kZUZpbHRlcil7XG5cdFx0bm9kZSA9IG5vZGVGaWx0ZXIobm9kZSk7XG5cdFx0aWYobm9kZSl7XG5cdFx0XHRpZih0eXBlb2Ygbm9kZSA9PSAnc3RyaW5nJyl7XG5cdFx0XHRcdGJ1Zi5wdXNoKG5vZGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fWVsc2V7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vYnVmLnNvcnQuYXBwbHkoYXR0cnMsIGF0dHJpYnV0ZVNvcnRlcik7XG5cdH1cblx0c3dpdGNoKG5vZGUubm9kZVR5cGUpe1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRpZiAoIXZpc2libGVOYW1lc3BhY2VzKSB2aXNpYmxlTmFtZXNwYWNlcyA9IFtdO1xuXHRcdHZhciBzdGFydFZpc2libGVOYW1lc3BhY2VzID0gdmlzaWJsZU5hbWVzcGFjZXMubGVuZ3RoO1xuXHRcdHZhciBhdHRycyA9IG5vZGUuYXR0cmlidXRlcztcblx0XHR2YXIgbGVuID0gYXR0cnMubGVuZ3RoO1xuXHRcdHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblx0XHR2YXIgbm9kZU5hbWUgPSBub2RlLnRhZ05hbWU7XG5cdFx0XG5cdFx0aXNIVE1MID0gIChodG1sbnMgPT09IG5vZGUubmFtZXNwYWNlVVJJKSB8fGlzSFRNTCBcblx0XHRidWYucHVzaCgnPCcsbm9kZU5hbWUpO1xuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdGZvcih2YXIgaT0wO2k8bGVuO2krKyl7XG5cdFx0XHQvLyBhZGQgbmFtZXNwYWNlcyBmb3IgYXR0cmlidXRlc1xuXHRcdFx0dmFyIGF0dHIgPSBhdHRycy5pdGVtKGkpO1xuXHRcdFx0aWYgKGF0dHIucHJlZml4ID09ICd4bWxucycpIHtcblx0XHRcdFx0dmlzaWJsZU5hbWVzcGFjZXMucHVzaCh7IHByZWZpeDogYXR0ci5sb2NhbE5hbWUsIG5hbWVzcGFjZTogYXR0ci52YWx1ZSB9KTtcblx0XHRcdH1lbHNlIGlmKGF0dHIubm9kZU5hbWUgPT0gJ3htbG5zJyl7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6ICcnLCBuYW1lc3BhY2U6IGF0dHIudmFsdWUgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvcih2YXIgaT0wO2k8bGVuO2krKyl7XG5cdFx0XHR2YXIgYXR0ciA9IGF0dHJzLml0ZW0oaSk7XG5cdFx0XHRpZiAobmVlZE5hbWVzcGFjZURlZmluZShhdHRyLGlzSFRNTCwgdmlzaWJsZU5hbWVzcGFjZXMpKSB7XG5cdFx0XHRcdHZhciBwcmVmaXggPSBhdHRyLnByZWZpeHx8Jyc7XG5cdFx0XHRcdHZhciB1cmkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblx0XHRcdFx0dmFyIG5zID0gcHJlZml4ID8gJyB4bWxuczonICsgcHJlZml4IDogXCIgeG1sbnNcIjtcblx0XHRcdFx0YnVmLnB1c2gobnMsICc9XCInICwgdXJpICwgJ1wiJyk7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6IHByZWZpeCwgbmFtZXNwYWNlOnVyaSB9KTtcblx0XHRcdH1cblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGF0dHIsYnVmLGlzSFRNTCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKTtcblx0XHR9XG5cdFx0Ly8gYWRkIG5hbWVzcGFjZSBmb3IgY3VycmVudCBub2RlXHRcdFxuXHRcdGlmIChuZWVkTmFtZXNwYWNlRGVmaW5lKG5vZGUsaXNIVE1MLCB2aXNpYmxlTmFtZXNwYWNlcykpIHtcblx0XHRcdHZhciBwcmVmaXggPSBub2RlLnByZWZpeHx8Jyc7XG5cdFx0XHR2YXIgdXJpID0gbm9kZS5uYW1lc3BhY2VVUkk7XG5cdFx0XHR2YXIgbnMgPSBwcmVmaXggPyAnIHhtbG5zOicgKyBwcmVmaXggOiBcIiB4bWxuc1wiO1xuXHRcdFx0YnVmLnB1c2gobnMsICc9XCInICwgdXJpICwgJ1wiJyk7XG5cdFx0XHR2aXNpYmxlTmFtZXNwYWNlcy5wdXNoKHsgcHJlZml4OiBwcmVmaXgsIG5hbWVzcGFjZTp1cmkgfSk7XG5cdFx0fVxuXHRcdFxuXHRcdGlmKGNoaWxkIHx8IGlzSFRNTCAmJiAhL14oPzptZXRhfGxpbmt8aW1nfGJyfGhyfGlucHV0KSQvaS50ZXN0KG5vZGVOYW1lKSl7XG5cdFx0XHRidWYucHVzaCgnPicpO1xuXHRcdFx0Ly9pZiBpcyBjZGF0YSBjaGlsZCBub2RlXG5cdFx0XHRpZihpc0hUTUwgJiYgL15zY3JpcHQkL2kudGVzdChub2RlTmFtZSkpe1xuXHRcdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdFx0aWYoY2hpbGQuZGF0YSl7XG5cdFx0XHRcdFx0XHRidWYucHVzaChjaGlsZC5kYXRhKTtcblx0XHRcdFx0XHR9ZWxzZXtcblx0XHRcdFx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGNoaWxkLGJ1Zixpc0hUTUwsbm9kZUZpbHRlcix2aXNpYmxlTmFtZXNwYWNlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1lbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdFx0XHRzZXJpYWxpemVUb1N0cmluZyhjaGlsZCxidWYsaXNIVE1MLG5vZGVGaWx0ZXIsdmlzaWJsZU5hbWVzcGFjZXMpO1xuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGJ1Zi5wdXNoKCc8Lycsbm9kZU5hbWUsJz4nKTtcblx0XHR9ZWxzZXtcblx0XHRcdGJ1Zi5wdXNoKCcvPicpO1xuXHRcdH1cblx0XHQvLyByZW1vdmUgYWRkZWQgdmlzaWJsZSBuYW1lc3BhY2VzXG5cdFx0Ly92aXNpYmxlTmFtZXNwYWNlcy5sZW5ndGggPSBzdGFydFZpc2libGVOYW1lc3BhY2VzO1xuXHRcdHJldHVybjtcblx0Y2FzZSBET0NVTUVOVF9OT0RFOlxuXHRjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG5cdFx0dmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGNoaWxkLGJ1Zixpc0hUTUwsbm9kZUZpbHRlcix2aXNpYmxlTmFtZXNwYWNlcyk7XG5cdFx0XHRjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdGNhc2UgQVRUUklCVVRFX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCcgJyxub2RlLm5hbWUsJz1cIicsbm9kZS52YWx1ZS5yZXBsYWNlKC9bPCZcIl0vZyxfeG1sRW5jb2RlciksJ1wiJyk7XG5cdGNhc2UgVEVYVF9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaChub2RlLmRhdGEucmVwbGFjZSgvWzwmXS9nLF94bWxFbmNvZGVyKSk7XG5cdGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJzwhW0NEQVRBWycsbm9kZS5kYXRhLCddXT4nKTtcblx0Y2FzZSBDT01NRU5UX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjwhLS1cIixub2RlLmRhdGEsXCItLT5cIik7XG5cdGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHRcdHZhciBwdWJpZCA9IG5vZGUucHVibGljSWQ7XG5cdFx0dmFyIHN5c2lkID0gbm9kZS5zeXN0ZW1JZDtcblx0XHRidWYucHVzaCgnPCFET0NUWVBFICcsbm9kZS5uYW1lKTtcblx0XHRpZihwdWJpZCl7XG5cdFx0XHRidWYucHVzaCgnIFBVQkxJQyBcIicscHViaWQpO1xuXHRcdFx0aWYgKHN5c2lkICYmIHN5c2lkIT0nLicpIHtcblx0XHRcdFx0YnVmLnB1c2goICdcIiBcIicsc3lzaWQpO1xuXHRcdFx0fVxuXHRcdFx0YnVmLnB1c2goJ1wiPicpO1xuXHRcdH1lbHNlIGlmKHN5c2lkICYmIHN5c2lkIT0nLicpe1xuXHRcdFx0YnVmLnB1c2goJyBTWVNURU0gXCInLHN5c2lkLCdcIj4nKTtcblx0XHR9ZWxzZXtcblx0XHRcdHZhciBzdWIgPSBub2RlLmludGVybmFsU3Vic2V0O1xuXHRcdFx0aWYoc3ViKXtcblx0XHRcdFx0YnVmLnB1c2goXCIgW1wiLHN1YixcIl1cIik7XG5cdFx0XHR9XG5cdFx0XHRidWYucHVzaChcIj5cIik7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0Y2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjw/XCIsbm9kZS50YXJnZXQsXCIgXCIsbm9kZS5kYXRhLFwiPz5cIik7XG5cdGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJyYnLG5vZGUubm9kZU5hbWUsJzsnKTtcblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERTpcblx0ZGVmYXVsdDpcblx0XHRidWYucHVzaCgnPz8nLG5vZGUubm9kZU5hbWUpO1xuXHR9XG59XG5mdW5jdGlvbiBpbXBvcnROb2RlKGRvYyxub2RlLGRlZXApe1xuXHR2YXIgbm9kZTI7XG5cdHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRub2RlMiA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcblx0XHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRcdC8vdmFyIGF0dHJzID0gbm9kZTIuYXR0cmlidXRlcztcblx0XHQvL3ZhciBsZW4gPSBhdHRycy5sZW5ndGg7XG5cdFx0Ly9mb3IodmFyIGk9MDtpPGxlbjtpKyspe1xuXHRcdFx0Ly9ub2RlMi5zZXRBdHRyaWJ1dGVOb2RlTlMoaW1wb3J0Tm9kZShkb2MsYXR0cnMuaXRlbShpKSxkZWVwKSk7XG5cdFx0Ly99XG5cdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRicmVhaztcblx0Y2FzZSBBVFRSSUJVVEVfTk9ERTpcblx0XHRkZWVwID0gdHJ1ZTtcblx0XHRicmVhaztcblx0Ly9jYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTpcblx0Ly9jYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTpcblx0Ly8vL2Nhc2UgVEVYVF9OT0RFOlxuXHQvL2Nhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHQvL2Nhc2UgQ09NTUVOVF9OT0RFOlxuXHQvL1x0ZGVlcCA9IGZhbHNlO1xuXHQvL1x0YnJlYWs7XG5cdC8vY2FzZSBET0NVTUVOVF9OT0RFOlxuXHQvL2Nhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHQvL2Nhbm5vdCBiZSBpbXBvcnRlZC5cblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERe+8mlxuXHQvL2NhbiBub3QgaGl0IGluIGxldmVsM1xuXHQvL2RlZmF1bHQ6dGhyb3cgZTtcblx0fVxuXHRpZighbm9kZTIpe1xuXHRcdG5vZGUyID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOy8vZmFsc2Vcblx0fVxuXHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRub2RlMi5wYXJlbnROb2RlID0gbnVsbDtcblx0aWYoZGVlcCl7XG5cdFx0dmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdG5vZGUyLmFwcGVuZENoaWxkKGltcG9ydE5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cbi8vXG4vL3ZhciBfcmVsYXRpb25NYXAgPSB7Zmlyc3RDaGlsZDoxLGxhc3RDaGlsZDoxLHByZXZpb3VzU2libGluZzoxLG5leHRTaWJsaW5nOjEsXG4vL1x0XHRcdFx0XHRhdHRyaWJ1dGVzOjEsY2hpbGROb2RlczoxLHBhcmVudE5vZGU6MSxkb2N1bWVudEVsZW1lbnQ6MSxkb2N0eXBlLH07XG5mdW5jdGlvbiBjbG9uZU5vZGUoZG9jLG5vZGUsZGVlcCl7XG5cdHZhciBub2RlMiA9IG5ldyBub2RlLmNvbnN0cnVjdG9yKCk7XG5cdGZvcih2YXIgbiBpbiBub2RlKXtcblx0XHR2YXIgdiA9IG5vZGVbbl07XG5cdFx0aWYodHlwZW9mIHYgIT0gJ29iamVjdCcgKXtcblx0XHRcdGlmKHYgIT0gbm9kZTJbbl0pe1xuXHRcdFx0XHRub2RlMltuXSA9IHY7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKG5vZGUuY2hpbGROb2Rlcyl7XG5cdFx0bm9kZTIuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHR9XG5cdG5vZGUyLm93bmVyRG9jdW1lbnQgPSBkb2M7XG5cdHN3aXRjaCAobm9kZTIubm9kZVR5cGUpIHtcblx0Y2FzZSBFTEVNRU5UX05PREU6XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcztcblx0XHR2YXIgYXR0cnMyXHQ9IG5vZGUyLmF0dHJpYnV0ZXMgPSBuZXcgTmFtZWROb2RlTWFwKCk7XG5cdFx0dmFyIGxlbiA9IGF0dHJzLmxlbmd0aFxuXHRcdGF0dHJzMi5fb3duZXJFbGVtZW50ID0gbm9kZTI7XG5cdFx0Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtcblx0XHRcdG5vZGUyLnNldEF0dHJpYnV0ZU5vZGUoY2xvbmVOb2RlKGRvYyxhdHRycy5pdGVtKGkpLHRydWUpKTtcblx0XHR9XG5cdFx0YnJlYWs7O1xuXHRjYXNlIEFUVFJJQlVURV9OT0RFOlxuXHRcdGRlZXAgPSB0cnVlO1xuXHR9XG5cdGlmKGRlZXApe1xuXHRcdHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRub2RlMi5hcHBlbmRDaGlsZChjbG9uZU5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cblxuZnVuY3Rpb24gX19zZXRfXyhvYmplY3Qsa2V5LHZhbHVlKXtcblx0b2JqZWN0W2tleV0gPSB2YWx1ZVxufVxuLy9kbyBkeW5hbWljXG50cnl7XG5cdGlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KExpdmVOb2RlTGlzdC5wcm90b3R5cGUsJ2xlbmd0aCcse1xuXHRcdFx0Z2V0OmZ1bmN0aW9uKCl7XG5cdFx0XHRcdF91cGRhdGVMaXZlTGlzdCh0aGlzKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuJCRsZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KE5vZGUucHJvdG90eXBlLCd0ZXh0Q29udGVudCcse1xuXHRcdFx0Z2V0OmZ1bmN0aW9uKCl7XG5cdFx0XHRcdHJldHVybiBnZXRUZXh0Q29udGVudCh0aGlzKTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6ZnVuY3Rpb24oZGF0YSl7XG5cdFx0XHRcdHN3aXRjaCh0aGlzLm5vZGVUeXBlKXtcblx0XHRcdFx0Y2FzZSBFTEVNRU5UX05PREU6XG5cdFx0XHRcdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRcdFx0XHR3aGlsZSh0aGlzLmZpcnN0Q2hpbGQpe1xuXHRcdFx0XHRcdFx0dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZihkYXRhIHx8IFN0cmluZyhkYXRhKSl7XG5cdFx0XHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vVE9ETzpcblx0XHRcdFx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPSBkYXRhO1xuXHRcdFx0XHRcdHRoaXMubm9kZVZhbHVlID0gZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pXG5cdFx0XG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnQobm9kZSl7XG5cdFx0XHRzd2l0Y2gobm9kZS5ub2RlVHlwZSl7XG5cdFx0XHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRcdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRcdFx0dmFyIGJ1ZiA9IFtdO1xuXHRcdFx0XHRub2RlID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdFx0XHR3aGlsZShub2RlKXtcblx0XHRcdFx0XHRpZihub2RlLm5vZGVUeXBlIT09NyAmJiBub2RlLm5vZGVUeXBlICE9PTgpe1xuXHRcdFx0XHRcdFx0YnVmLnB1c2goZ2V0VGV4dENvbnRlbnQobm9kZSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYnVmLmpvaW4oJycpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIG5vZGUubm9kZVZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRfX3NldF9fID0gZnVuY3Rpb24ob2JqZWN0LGtleSx2YWx1ZSl7XG5cdFx0XHQvL2NvbnNvbGUubG9nKHZhbHVlKVxuXHRcdFx0b2JqZWN0WyckJCcra2V5XSA9IHZhbHVlXG5cdFx0fVxuXHR9XG59Y2F0Y2goZSl7Ly9pZThcbn1cblxuLy9pZih0eXBlb2YgcmVxdWlyZSA9PSAnZnVuY3Rpb24nKXtcblx0ZXhwb3J0cy5ET01JbXBsZW1lbnRhdGlvbiA9IERPTUltcGxlbWVudGF0aW9uO1xuXHRleHBvcnRzLlhNTFNlcmlhbGl6ZXIgPSBYTUxTZXJpYWxpemVyO1xuLy99XG4iLCIvL1s0XSAgIFx0TmFtZVN0YXJ0Q2hhclx0ICAgOjo9ICAgXHRcIjpcIiB8IFtBLVpdIHwgXCJfXCIgfCBbYS16XSB8IFsjeEMwLSN4RDZdIHwgWyN4RDgtI3hGNl0gfCBbI3hGOC0jeDJGRl0gfCBbI3gzNzAtI3gzN0RdIHwgWyN4MzdGLSN4MUZGRl0gfCBbI3gyMDBDLSN4MjAwRF0gfCBbI3gyMDcwLSN4MjE4Rl0gfCBbI3gyQzAwLSN4MkZFRl0gfCBbI3gzMDAxLSN4RDdGRl0gfCBbI3hGOTAwLSN4RkRDRl0gfCBbI3hGREYwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeEVGRkZGXVxyXG4vL1s0YV0gICBcdE5hbWVDaGFyXHQgICA6Oj0gICBcdE5hbWVTdGFydENoYXIgfCBcIi1cIiB8IFwiLlwiIHwgWzAtOV0gfCAjeEI3IHwgWyN4MDMwMC0jeDAzNkZdIHwgWyN4MjAzRi0jeDIwNDBdXHJcbi8vWzVdICAgXHROYW1lXHQgICA6Oj0gICBcdE5hbWVTdGFydENoYXIgKE5hbWVDaGFyKSpcclxudmFyIG5hbWVTdGFydENoYXIgPSAvW0EtWl9hLXpcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS8vL1xcdTEwMDAwLVxcdUVGRkZGXHJcbnZhciBuYW1lQ2hhciA9IG5ldyBSZWdFeHAoXCJbXFxcXC1cXFxcLjAtOVwiK25hbWVTdGFydENoYXIuc291cmNlLnNsaWNlKDEsLTEpK1wiXFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdXCIpO1xyXG52YXIgdGFnTmFtZVBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeJytuYW1lU3RhcnRDaGFyLnNvdXJjZStuYW1lQ2hhci5zb3VyY2UrJyooPzpcXDonK25hbWVTdGFydENoYXIuc291cmNlK25hbWVDaGFyLnNvdXJjZSsnKik/JCcpO1xyXG4vL3ZhciB0YWdOYW1lUGF0dGVybiA9IC9eW2EtekEtWl9dW1xcd1xcLVxcLl0qKD86XFw6W2EtekEtWl9dW1xcd1xcLVxcLl0qKT8kL1xyXG4vL3ZhciBoYW5kbGVycyA9ICdyZXNvbHZlRW50aXR5LGdldEV4dGVybmFsU3Vic2V0LGNoYXJhY3RlcnMsZW5kRG9jdW1lbnQsZW5kRWxlbWVudCxlbmRQcmVmaXhNYXBwaW5nLGlnbm9yYWJsZVdoaXRlc3BhY2UscHJvY2Vzc2luZ0luc3RydWN0aW9uLHNldERvY3VtZW50TG9jYXRvcixza2lwcGVkRW50aXR5LHN0YXJ0RG9jdW1lbnQsc3RhcnRFbGVtZW50LHN0YXJ0UHJlZml4TWFwcGluZyxub3RhdGlvbkRlY2wsdW5wYXJzZWRFbnRpdHlEZWNsLGVycm9yLGZhdGFsRXJyb3Isd2FybmluZyxhdHRyaWJ1dGVEZWNsLGVsZW1lbnREZWNsLGV4dGVybmFsRW50aXR5RGVjbCxpbnRlcm5hbEVudGl0eURlY2wsY29tbWVudCxlbmRDREFUQSxlbmREVEQsZW5kRW50aXR5LHN0YXJ0Q0RBVEEsc3RhcnREVEQsc3RhcnRFbnRpdHknLnNwbGl0KCcsJylcclxuXHJcbi8vU19UQUcsXHRTX0FUVFIsXHRTX0VRLFx0U19BVFRSX05PUVVPVF9WQUxVRVxyXG4vL1NfQVRUUl9TUEFDRSxcdFNfQVRUUl9FTkQsXHRTX1RBR19TUEFDRSwgU19UQUdfQ0xPU0VcclxudmFyIFNfVEFHID0gMDsvL3RhZyBuYW1lIG9mZmVycmluZ1xyXG52YXIgU19BVFRSID0gMTsvL2F0dHIgbmFtZSBvZmZlcnJpbmcgXHJcbnZhciBTX0FUVFJfU1BBQ0U9MjsvL2F0dHIgbmFtZSBlbmQgYW5kIHNwYWNlIG9mZmVyXHJcbnZhciBTX0VRID0gMzsvLz1zcGFjZT9cclxudmFyIFNfQVRUUl9OT1FVT1RfVkFMVUUgPSA0Oy8vYXR0ciB2YWx1ZShubyBxdW90IHZhbHVlIG9ubHkpXHJcbnZhciBTX0FUVFJfRU5EID0gNTsvL2F0dHIgdmFsdWUgZW5kIGFuZCBubyBzcGFjZShxdW90IGVuZClcclxudmFyIFNfVEFHX1NQQUNFID0gNjsvLyhhdHRyIHZhbHVlIGVuZCB8fCB0YWcgZW5kICkgJiYgKHNwYWNlIG9mZmVyKVxyXG52YXIgU19UQUdfQ0xPU0UgPSA3Oy8vY2xvc2VkIGVsPGVsIC8+XHJcblxyXG5mdW5jdGlvbiBYTUxSZWFkZXIoKXtcclxuXHRcclxufVxyXG5cclxuWE1MUmVhZGVyLnByb3RvdHlwZSA9IHtcclxuXHRwYXJzZTpmdW5jdGlvbihzb3VyY2UsZGVmYXVsdE5TTWFwLGVudGl0eU1hcCl7XHJcblx0XHR2YXIgZG9tQnVpbGRlciA9IHRoaXMuZG9tQnVpbGRlcjtcclxuXHRcdGRvbUJ1aWxkZXIuc3RhcnREb2N1bWVudCgpO1xyXG5cdFx0X2NvcHkoZGVmYXVsdE5TTWFwICxkZWZhdWx0TlNNYXAgPSB7fSlcclxuXHRcdHBhcnNlKHNvdXJjZSxkZWZhdWx0TlNNYXAsZW50aXR5TWFwLFxyXG5cdFx0XHRcdGRvbUJ1aWxkZXIsdGhpcy5lcnJvckhhbmRsZXIpO1xyXG5cdFx0ZG9tQnVpbGRlci5lbmREb2N1bWVudCgpO1xyXG5cdH1cclxufVxyXG5mdW5jdGlvbiBwYXJzZShzb3VyY2UsZGVmYXVsdE5TTWFwQ29weSxlbnRpdHlNYXAsZG9tQnVpbGRlcixlcnJvckhhbmRsZXIpe1xyXG5cdGZ1bmN0aW9uIGZpeGVkRnJvbUNoYXJDb2RlKGNvZGUpIHtcclxuXHRcdC8vIFN0cmluZy5wcm90b3R5cGUuZnJvbUNoYXJDb2RlIGRvZXMgbm90IHN1cHBvcnRzXHJcblx0XHQvLyA+IDIgYnl0ZXMgdW5pY29kZSBjaGFycyBkaXJlY3RseVxyXG5cdFx0aWYgKGNvZGUgPiAweGZmZmYpIHtcclxuXHRcdFx0Y29kZSAtPSAweDEwMDAwO1xyXG5cdFx0XHR2YXIgc3Vycm9nYXRlMSA9IDB4ZDgwMCArIChjb2RlID4+IDEwKVxyXG5cdFx0XHRcdCwgc3Vycm9nYXRlMiA9IDB4ZGMwMCArIChjb2RlICYgMHgzZmYpO1xyXG5cclxuXHRcdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3Vycm9nYXRlMSwgc3Vycm9nYXRlMik7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcclxuXHRcdH1cclxuXHR9XHJcblx0ZnVuY3Rpb24gZW50aXR5UmVwbGFjZXIoYSl7XHJcblx0XHR2YXIgayA9IGEuc2xpY2UoMSwtMSk7XHJcblx0XHRpZihrIGluIGVudGl0eU1hcCl7XHJcblx0XHRcdHJldHVybiBlbnRpdHlNYXBba107IFxyXG5cdFx0fWVsc2UgaWYoay5jaGFyQXQoMCkgPT09ICcjJyl7XHJcblx0XHRcdHJldHVybiBmaXhlZEZyb21DaGFyQ29kZShwYXJzZUludChrLnN1YnN0cigxKS5yZXBsYWNlKCd4JywnMHgnKSkpXHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCdlbnRpdHkgbm90IGZvdW5kOicrYSk7XHJcblx0XHRcdHJldHVybiBhO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRmdW5jdGlvbiBhcHBlbmRUZXh0KGVuZCl7Ly9oYXMgc29tZSBidWdzXHJcblx0XHRpZihlbmQ+c3RhcnQpe1xyXG5cdFx0XHR2YXIgeHQgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkucmVwbGFjZSgvJiM/XFx3KzsvZyxlbnRpdHlSZXBsYWNlcik7XHJcblx0XHRcdGxvY2F0b3ImJnBvc2l0aW9uKHN0YXJ0KTtcclxuXHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHh0LDAsZW5kLXN0YXJ0KTtcclxuXHRcdFx0c3RhcnQgPSBlbmRcclxuXHRcdH1cclxuXHR9XHJcblx0ZnVuY3Rpb24gcG9zaXRpb24ocCxtKXtcclxuXHRcdHdoaWxlKHA+PWxpbmVFbmQgJiYgKG0gPSBsaW5lUGF0dGVybi5leGVjKHNvdXJjZSkpKXtcclxuXHRcdFx0bGluZVN0YXJ0ID0gbS5pbmRleDtcclxuXHRcdFx0bGluZUVuZCA9IGxpbmVTdGFydCArIG1bMF0ubGVuZ3RoO1xyXG5cdFx0XHRsb2NhdG9yLmxpbmVOdW1iZXIrKztcclxuXHRcdFx0Ly9jb25zb2xlLmxvZygnbGluZSsrOicsbG9jYXRvcixzdGFydFBvcyxlbmRQb3MpXHJcblx0XHR9XHJcblx0XHRsb2NhdG9yLmNvbHVtbk51bWJlciA9IHAtbGluZVN0YXJ0KzE7XHJcblx0fVxyXG5cdHZhciBsaW5lU3RhcnQgPSAwO1xyXG5cdHZhciBsaW5lRW5kID0gMDtcclxuXHR2YXIgbGluZVBhdHRlcm4gPSAvLiooPzpcXHJcXG4/fFxcbil8LiokL2dcclxuXHR2YXIgbG9jYXRvciA9IGRvbUJ1aWxkZXIubG9jYXRvcjtcclxuXHRcclxuXHR2YXIgcGFyc2VTdGFjayA9IFt7Y3VycmVudE5TTWFwOmRlZmF1bHROU01hcENvcHl9XVxyXG5cdHZhciBjbG9zZU1hcCA9IHt9O1xyXG5cdHZhciBzdGFydCA9IDA7XHJcblx0d2hpbGUodHJ1ZSl7XHJcblx0XHR0cnl7XHJcblx0XHRcdHZhciB0YWdTdGFydCA9IHNvdXJjZS5pbmRleE9mKCc8JyxzdGFydCk7XHJcblx0XHRcdGlmKHRhZ1N0YXJ0PDApe1xyXG5cdFx0XHRcdGlmKCFzb3VyY2Uuc3Vic3RyKHN0YXJ0KS5tYXRjaCgvXlxccyokLykpe1xyXG5cdFx0XHRcdFx0dmFyIGRvYyA9IGRvbUJ1aWxkZXIuZG9jO1xyXG5cdCAgICBcdFx0XHR2YXIgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShzb3VyY2Uuc3Vic3RyKHN0YXJ0KSk7XHJcblx0ICAgIFx0XHRcdGRvYy5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuXHQgICAgXHRcdFx0ZG9tQnVpbGRlci5jdXJyZW50RWxlbWVudCA9IHRleHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0YWdTdGFydD5zdGFydCl7XHJcblx0XHRcdFx0YXBwZW5kVGV4dCh0YWdTdGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3dpdGNoKHNvdXJjZS5jaGFyQXQodGFnU3RhcnQrMSkpe1xyXG5cdFx0XHRjYXNlICcvJzpcclxuXHRcdFx0XHR2YXIgZW5kID0gc291cmNlLmluZGV4T2YoJz4nLHRhZ1N0YXJ0KzMpO1xyXG5cdFx0XHRcdHZhciB0YWdOYW1lID0gc291cmNlLnN1YnN0cmluZyh0YWdTdGFydCsyLGVuZCk7XHJcblx0XHRcdFx0dmFyIGNvbmZpZyA9IHBhcnNlU3RhY2sucG9wKCk7XHJcblx0XHRcdFx0aWYoZW5kPDApe1xyXG5cdFx0XHRcdFx0XHJcblx0ICAgICAgICBcdFx0dGFnTmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcodGFnU3RhcnQrMikucmVwbGFjZSgvW1xcczxdLiovLCcnKTtcclxuXHQgICAgICAgIFx0XHQvL2NvbnNvbGUuZXJyb3IoJyNAQEBAQEAnK3RhZ05hbWUpXHJcblx0ICAgICAgICBcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKFwiZW5kIHRhZyBuYW1lOiBcIit0YWdOYW1lKycgaXMgbm90IGNvbXBsZXRlOicrY29uZmlnLnRhZ05hbWUpO1xyXG5cdCAgICAgICAgXHRcdGVuZCA9IHRhZ1N0YXJ0KzErdGFnTmFtZS5sZW5ndGg7XHJcblx0ICAgICAgICBcdH1lbHNlIGlmKHRhZ05hbWUubWF0Y2goL1xcczwvKSl7XHJcblx0ICAgICAgICBcdFx0dGFnTmFtZSA9IHRhZ05hbWUucmVwbGFjZSgvW1xcczxdLiovLCcnKTtcclxuXHQgICAgICAgIFx0XHRlcnJvckhhbmRsZXIuZXJyb3IoXCJlbmQgdGFnIG5hbWU6IFwiK3RhZ05hbWUrJyBtYXliZSBub3QgY29tcGxldGUnKTtcclxuXHQgICAgICAgIFx0XHRlbmQgPSB0YWdTdGFydCsxK3RhZ05hbWUubGVuZ3RoO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IocGFyc2VTdGFjay5sZW5ndGgscGFyc2VTdGFjaylcclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IoY29uZmlnKTtcclxuXHRcdFx0XHR2YXIgbG9jYWxOU01hcCA9IGNvbmZpZy5sb2NhbE5TTWFwO1xyXG5cdFx0XHRcdHZhciBlbmRNYXRjaCA9IGNvbmZpZy50YWdOYW1lID09IHRhZ05hbWU7XHJcblx0XHRcdFx0dmFyIGVuZElnbm9yZUNhc2VNYWNoID0gZW5kTWF0Y2ggfHwgY29uZmlnLnRhZ05hbWUmJmNvbmZpZy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpXHJcblx0XHQgICAgICAgIGlmKGVuZElnbm9yZUNhc2VNYWNoKXtcclxuXHRcdCAgICAgICAgXHRkb21CdWlsZGVyLmVuZEVsZW1lbnQoY29uZmlnLnVyaSxjb25maWcubG9jYWxOYW1lLHRhZ05hbWUpO1xyXG5cdFx0XHRcdFx0aWYobG9jYWxOU01hcCl7XHJcblx0XHRcdFx0XHRcdGZvcih2YXIgcHJlZml4IGluIGxvY2FsTlNNYXApe1xyXG5cdFx0XHRcdFx0XHRcdGRvbUJ1aWxkZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpIDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYoIWVuZE1hdGNoKXtcclxuXHRcdCAgICAgICAgICAgIFx0ZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3IoXCJlbmQgdGFnIG5hbWU6IFwiK3RhZ05hbWUrJyBpcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgc3RhcnQgdGFnTmFtZTonK2NvbmZpZy50YWdOYW1lICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHQgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICBcdHBhcnNlU3RhY2sucHVzaChjb25maWcpXHJcblx0XHQgICAgICAgIH1cclxuXHRcdFx0XHRcclxuXHRcdFx0XHRlbmQrKztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHQvLyBlbmQgZWxtZW50XHJcblx0XHRcdGNhc2UgJz8nOi8vIDw/Li4uPz5cclxuXHRcdFx0XHRsb2NhdG9yJiZwb3NpdGlvbih0YWdTdGFydCk7XHJcblx0XHRcdFx0ZW5kID0gcGFyc2VJbnN0cnVjdGlvbihzb3VyY2UsdGFnU3RhcnQsZG9tQnVpbGRlcik7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJyEnOi8vIDwhZG9jdHlwZSw8IVtDREFUQSw8IS0tXHJcblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xyXG5cdFx0XHRcdGVuZCA9IHBhcnNlRENDKHNvdXJjZSx0YWdTdGFydCxkb21CdWlsZGVyLGVycm9ySGFuZGxlcik7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xyXG5cdFx0XHRcdHZhciBlbCA9IG5ldyBFbGVtZW50QXR0cmlidXRlcygpO1xyXG5cdFx0XHRcdHZhciBjdXJyZW50TlNNYXAgPSBwYXJzZVN0YWNrW3BhcnNlU3RhY2subGVuZ3RoLTFdLmN1cnJlbnROU01hcDtcclxuXHRcdFx0XHQvL2VsU3RhcnRFbmRcclxuXHRcdFx0XHR2YXIgZW5kID0gcGFyc2VFbGVtZW50U3RhcnRQYXJ0KHNvdXJjZSx0YWdTdGFydCxlbCxjdXJyZW50TlNNYXAsZW50aXR5UmVwbGFjZXIsZXJyb3JIYW5kbGVyKTtcclxuXHRcdFx0XHR2YXIgbGVuID0gZWwubGVuZ3RoO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKCFlbC5jbG9zZWQgJiYgZml4U2VsZkNsb3NlZChzb3VyY2UsZW5kLGVsLnRhZ05hbWUsY2xvc2VNYXApKXtcclxuXHRcdFx0XHRcdGVsLmNsb3NlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZighZW50aXR5TWFwLm5ic3Ape1xyXG5cdFx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygndW5jbG9zZWQgeG1sIGF0dHJpYnV0ZScpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZihsb2NhdG9yICYmIGxlbil7XHJcblx0XHRcdFx0XHR2YXIgbG9jYXRvcjIgPSBjb3B5TG9jYXRvcihsb2NhdG9yLHt9KTtcclxuXHRcdFx0XHRcdC8vdHJ5ey8vYXR0cmlidXRlIHBvc2l0aW9uIGZpeGVkXHJcblx0XHRcdFx0XHRmb3IodmFyIGkgPSAwO2k8bGVuO2krKyl7XHJcblx0XHRcdFx0XHRcdHZhciBhID0gZWxbaV07XHJcblx0XHRcdFx0XHRcdHBvc2l0aW9uKGEub2Zmc2V0KTtcclxuXHRcdFx0XHRcdFx0YS5sb2NhdG9yID0gY29weUxvY2F0b3IobG9jYXRvcix7fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvL31jYXRjaChlKXtjb25zb2xlLmVycm9yKCdAQEBAQCcrZSl9XHJcblx0XHRcdFx0XHRkb21CdWlsZGVyLmxvY2F0b3IgPSBsb2NhdG9yMlxyXG5cdFx0XHRcdFx0aWYoYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCkpe1xyXG5cdFx0XHRcdFx0XHRwYXJzZVN0YWNrLnB1c2goZWwpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRkb21CdWlsZGVyLmxvY2F0b3IgPSBsb2NhdG9yO1xyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0aWYoYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCkpe1xyXG5cdFx0XHRcdFx0XHRwYXJzZVN0YWNrLnB1c2goZWwpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKGVsLnVyaSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnICYmICFlbC5jbG9zZWQpe1xyXG5cdFx0XHRcdFx0ZW5kID0gcGFyc2VIdG1sU3BlY2lhbENvbnRlbnQoc291cmNlLGVuZCxlbC50YWdOYW1lLGVudGl0eVJlcGxhY2VyLGRvbUJ1aWxkZXIpXHJcblx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRlbmQrKztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1jYXRjaChlKXtcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCdlbGVtZW50IHBhcnNlIGVycm9yOiAnK2UpXHJcblx0XHRcdC8vZXJyb3JIYW5kbGVyLmVycm9yKCdlbGVtZW50IHBhcnNlIGVycm9yOiAnK2UpO1xyXG5cdFx0XHRlbmQgPSAtMTtcclxuXHRcdFx0Ly90aHJvdyBlO1xyXG5cdFx0fVxyXG5cdFx0aWYoZW5kPnN0YXJ0KXtcclxuXHRcdFx0c3RhcnQgPSBlbmQ7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0Ly9UT0RPOiDov5nph4zmnInlj6/og71zYXjlm57pgIDvvIzmnInkvY3nva7plJnor6/po47pmalcclxuXHRcdFx0YXBwZW5kVGV4dChNYXRoLm1heCh0YWdTdGFydCxzdGFydCkrMSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIGNvcHlMb2NhdG9yKGYsdCl7XHJcblx0dC5saW5lTnVtYmVyID0gZi5saW5lTnVtYmVyO1xyXG5cdHQuY29sdW1uTnVtYmVyID0gZi5jb2x1bW5OdW1iZXI7XHJcblx0cmV0dXJuIHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAc2VlICNhcHBlbmRFbGVtZW50KHNvdXJjZSxlbFN0YXJ0RW5kLGVsLHNlbGZDbG9zZWQsZW50aXR5UmVwbGFjZXIsZG9tQnVpbGRlcixwYXJzZVN0YWNrKTtcclxuICogQHJldHVybiBlbmQgb2YgdGhlIGVsZW1lbnRTdGFydFBhcnQoZW5kIG9mIGVsZW1lbnRFbmRQYXJ0IGZvciBzZWxmQ2xvc2VkIGVsKVxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VFbGVtZW50U3RhcnRQYXJ0KHNvdXJjZSxzdGFydCxlbCxjdXJyZW50TlNNYXAsZW50aXR5UmVwbGFjZXIsZXJyb3JIYW5kbGVyKXtcclxuXHR2YXIgYXR0ck5hbWU7XHJcblx0dmFyIHZhbHVlO1xyXG5cdHZhciBwID0gKytzdGFydDtcclxuXHR2YXIgcyA9IFNfVEFHOy8vc3RhdHVzXHJcblx0d2hpbGUodHJ1ZSl7XHJcblx0XHR2YXIgYyA9IHNvdXJjZS5jaGFyQXQocCk7XHJcblx0XHRzd2l0Y2goYyl7XHJcblx0XHRjYXNlICc9JzpcclxuXHRcdFx0aWYocyA9PT0gU19BVFRSKXsvL2F0dHJOYW1lXHJcblx0XHRcdFx0YXR0ck5hbWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XHJcblx0XHRcdFx0cyA9IFNfRVE7XHJcblx0XHRcdH1lbHNlIGlmKHMgPT09IFNfQVRUUl9TUEFDRSl7XHJcblx0XHRcdFx0cyA9IFNfRVE7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdC8vZmF0YWxFcnJvcjogZXF1YWwgbXVzdCBhZnRlciBhdHRyTmFtZSBvciBzcGFjZSBhZnRlciBhdHRyTmFtZVxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignYXR0cmlidXRlIGVxdWFsIG11c3QgYWZ0ZXIgYXR0ck5hbWUnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ1xcJyc6XHJcblx0XHRjYXNlICdcIic6XHJcblx0XHRcdGlmKHMgPT09IFNfRVEgfHwgcyA9PT0gU19BVFRSIC8vfHwgcyA9PSBTX0FUVFJfU1BBQ0VcclxuXHRcdFx0XHQpey8vZXF1YWxcclxuXHRcdFx0XHRpZihzID09PSBTX0FUVFIpe1xyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJylcclxuXHRcdFx0XHRcdGF0dHJOYW1lID0gc291cmNlLnNsaWNlKHN0YXJ0LHApXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHN0YXJ0ID0gcCsxO1xyXG5cdFx0XHRcdHAgPSBzb3VyY2UuaW5kZXhPZihjLHN0YXJ0KVxyXG5cdFx0XHRcdGlmKHA+MCl7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHNvdXJjZS5zbGljZShzdGFydCxwKS5yZXBsYWNlKC8mIz9cXHcrOy9nLGVudGl0eVJlcGxhY2VyKTtcclxuXHRcdFx0XHRcdGVsLmFkZChhdHRyTmFtZSx2YWx1ZSxzdGFydC0xKTtcclxuXHRcdFx0XHRcdHMgPSBTX0FUVFJfRU5EO1xyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0Ly9mYXRhbEVycm9yOiBubyBlbmQgcXVvdCBtYXRjaFxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdhdHRyaWJ1dGUgdmFsdWUgbm8gZW5kIFxcJycrYysnXFwnIG1hdGNoJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ZWxzZSBpZihzID09IFNfQVRUUl9OT1FVT1RfVkFMVUUpe1xyXG5cdFx0XHRcdHZhbHVlID0gc291cmNlLnNsaWNlKHN0YXJ0LHApLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coYXR0ck5hbWUsdmFsdWUsc3RhcnQscClcclxuXHRcdFx0XHRlbC5hZGQoYXR0ck5hbWUsdmFsdWUsc3RhcnQpO1xyXG5cdFx0XHRcdC8vY29uc29sZS5kaXIoZWwpXHJcblx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBcIicrYXR0ck5hbWUrJ1wiIG1pc3NlZCBzdGFydCBxdW90KCcrYysnKSEhJyk7XHJcblx0XHRcdFx0c3RhcnQgPSBwKzE7XHJcblx0XHRcdFx0cyA9IFNfQVRUUl9FTkRcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0Ly9mYXRhbEVycm9yOiBubyBlcXVhbCBiZWZvcmVcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICcvJzpcclxuXHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRjYXNlIFNfVEFHOlxyXG5cdFx0XHRcdGVsLnNldFRhZ05hbWUoc291cmNlLnNsaWNlKHN0YXJ0LHApKTtcclxuXHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRjYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRjYXNlIFNfVEFHX0NMT1NFOlxyXG5cdFx0XHRcdHMgPVNfVEFHX0NMT1NFO1xyXG5cdFx0XHRcdGVsLmNsb3NlZCA9IHRydWU7XHJcblx0XHRcdGNhc2UgU19BVFRSX05PUVVPVF9WQUxVRTpcclxuXHRcdFx0Y2FzZSBTX0FUVFI6XHJcblx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHQvL2Nhc2UgU19FUTpcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJhdHRyaWJ1dGUgaW52YWxpZCBjbG9zZSBjaGFyKCcvJylcIilcclxuXHRcdFx0fVxyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJyc6Ly9lbmQgZG9jdW1lbnRcclxuXHRcdFx0Ly90aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0JylcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xyXG5cdFx0XHRpZihzID09IFNfVEFHKXtcclxuXHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHA7XHJcblx0XHRjYXNlICc+JzpcclxuXHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRjYXNlIFNfVEFHOlxyXG5cdFx0XHRcdGVsLnNldFRhZ05hbWUoc291cmNlLnNsaWNlKHN0YXJ0LHApKTtcclxuXHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRjYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRjYXNlIFNfVEFHX0NMT1NFOlxyXG5cdFx0XHRcdGJyZWFrOy8vbm9ybWFsXHJcblx0XHRcdGNhc2UgU19BVFRSX05PUVVPVF9WQUxVRTovL0NvbXBhdGlibGUgc3RhdGVcclxuXHRcdFx0Y2FzZSBTX0FUVFI6XHJcblx0XHRcdFx0dmFsdWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XHJcblx0XHRcdFx0aWYodmFsdWUuc2xpY2UoLTEpID09PSAnLycpe1xyXG5cdFx0XHRcdFx0ZWwuY2xvc2VkICA9IHRydWU7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRjYXNlIFNfQVRUUl9TUEFDRTpcclxuXHRcdFx0XHRpZihzID09PSBTX0FUVFJfU1BBQ0Upe1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBhdHRyTmFtZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYocyA9PSBTX0FUVFJfTk9RVU9UX1ZBTFVFKXtcclxuXHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK3ZhbHVlKydcIiBtaXNzZWQgcXVvdChcIikhIScpO1xyXG5cdFx0XHRcdFx0ZWwuYWRkKGF0dHJOYW1lLHZhbHVlLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpLHN0YXJ0KVxyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0aWYoY3VycmVudE5TTWFwWycnXSAhPT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnIHx8ICF2YWx1ZS5tYXRjaCgvXig/OmRpc2FibGVkfGNoZWNrZWR8c2VsZWN0ZWQpJC9pKSl7XHJcblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK3ZhbHVlKydcIiBtaXNzZWQgdmFsdWUhISBcIicrdmFsdWUrJ1wiIGluc3RlYWQhIScpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbC5hZGQodmFsdWUsdmFsdWUsc3RhcnQpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIFNfRVE6XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdhdHRyaWJ1dGUgdmFsdWUgbWlzc2VkISEnKTtcclxuXHRcdFx0fVxyXG4vL1x0XHRcdGNvbnNvbGUubG9nKHRhZ05hbWUsdGFnTmFtZVBhdHRlcm4sdGFnTmFtZVBhdHRlcm4udGVzdCh0YWdOYW1lKSlcclxuXHRcdFx0cmV0dXJuIHA7XHJcblx0XHQvKnhtbCBzcGFjZSAnXFx4MjAnIHwgI3g5IHwgI3hEIHwgI3hBOyAqL1xyXG5cdFx0Y2FzZSAnXFx1MDA4MCc6XHJcblx0XHRcdGMgPSAnICc7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRpZihjPD0gJyAnKXsvL3NwYWNlXHJcblx0XHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRcdGNhc2UgU19UQUc6XHJcblx0XHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7Ly90YWdOYW1lXHJcblx0XHRcdFx0XHRzID0gU19UQUdfU1BBQ0U7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFNfQVRUUjpcclxuXHRcdFx0XHRcdGF0dHJOYW1lID0gc291cmNlLnNsaWNlKHN0YXJ0LHApXHJcblx0XHRcdFx0XHRzID0gU19BVFRSX1NQQUNFO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfTk9RVU9UX1ZBTFVFOlxyXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gc291cmNlLnNsaWNlKHN0YXJ0LHApLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBcIicrdmFsdWUrJ1wiIG1pc3NlZCBxdW90KFwiKSEhJyk7XHJcblx0XHRcdFx0XHRlbC5hZGQoYXR0ck5hbWUsdmFsdWUsc3RhcnQpXHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRcdFx0cyA9IFNfVEFHX1NQQUNFO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRcdC8vY2FzZSBTX0VROlxyXG5cdFx0XHRcdC8vY2FzZSBTX0FUVFJfU1BBQ0U6XHJcblx0XHRcdFx0Ly9cdHZvaWQoKTticmVhaztcclxuXHRcdFx0XHQvL2Nhc2UgU19UQUdfQ0xPU0U6XHJcblx0XHRcdFx0XHQvL2lnbm9yZSB3YXJuaW5nXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ZWxzZXsvL25vdCBzcGFjZVxyXG4vL1NfVEFHLFx0U19BVFRSLFx0U19FUSxcdFNfQVRUUl9OT1FVT1RfVkFMVUVcclxuLy9TX0FUVFJfU1BBQ0UsXHRTX0FUVFJfRU5ELFx0U19UQUdfU1BBQ0UsIFNfVEFHX0NMT1NFXHJcblx0XHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRcdC8vY2FzZSBTX1RBRzp2b2lkKCk7YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfQVRUUjp2b2lkKCk7YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfQVRUUl9OT1FVT1RfVkFMVUU6dm9pZCgpO2JyZWFrO1xyXG5cdFx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxyXG5cdFx0XHRcdFx0dmFyIHRhZ05hbWUgPSAgZWwudGFnTmFtZTtcclxuXHRcdFx0XHRcdGlmKGN1cnJlbnROU01hcFsnJ10gIT09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyB8fCAhYXR0ck5hbWUubWF0Y2goL14oPzpkaXNhYmxlZHxjaGVja2VkfHNlbGVjdGVkKSQvaSkpe1xyXG5cdFx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygnYXR0cmlidXRlIFwiJythdHRyTmFtZSsnXCIgbWlzc2VkIHZhbHVlISEgXCInK2F0dHJOYW1lKydcIiBpbnN0ZWFkMiEhJylcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsLmFkZChhdHRyTmFtZSxhdHRyTmFtZSxzdGFydCk7XHJcblx0XHRcdFx0XHRzdGFydCA9IHA7XHJcblx0XHRcdFx0XHRzID0gU19BVFRSO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBzcGFjZSBpcyByZXF1aXJlZFwiJythdHRyTmFtZSsnXCIhIScpXHJcblx0XHRcdFx0Y2FzZSBTX1RBR19TUEFDRTpcclxuXHRcdFx0XHRcdHMgPSBTX0FUVFI7XHJcblx0XHRcdFx0XHRzdGFydCA9IHA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFNfRVE6XHJcblx0XHRcdFx0XHRzID0gU19BVFRSX05PUVVPVF9WQUxVRTtcclxuXHRcdFx0XHRcdHN0YXJ0ID0gcDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgU19UQUdfQ0xPU0U6XHJcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJlbGVtZW50cyBjbG9zZWQgY2hhcmFjdGVyICcvJyBhbmQgJz4nIG11c3QgYmUgY29ubmVjdGVkIHRvXCIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fS8vZW5kIG91dGVyIHN3aXRjaFxyXG5cdFx0Ly9jb25zb2xlLmxvZygncCsrJyxwKVxyXG5cdFx0cCsrO1xyXG5cdH1cclxufVxyXG4vKipcclxuICogQHJldHVybiB0cnVlIGlmIGhhcyBuZXcgbmFtZXNwYWNlIGRlZmluZVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCl7XHJcblx0dmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lO1xyXG5cdHZhciBsb2NhbE5TTWFwID0gbnVsbDtcclxuXHQvL3ZhciBjdXJyZW50TlNNYXAgPSBwYXJzZVN0YWNrW3BhcnNlU3RhY2subGVuZ3RoLTFdLmN1cnJlbnROU01hcDtcclxuXHR2YXIgaSA9IGVsLmxlbmd0aDtcclxuXHR3aGlsZShpLS0pe1xyXG5cdFx0dmFyIGEgPSBlbFtpXTtcclxuXHRcdHZhciBxTmFtZSA9IGEucU5hbWU7XHJcblx0XHR2YXIgdmFsdWUgPSBhLnZhbHVlO1xyXG5cdFx0dmFyIG5zcCA9IHFOYW1lLmluZGV4T2YoJzonKTtcclxuXHRcdGlmKG5zcD4wKXtcclxuXHRcdFx0dmFyIHByZWZpeCA9IGEucHJlZml4ID0gcU5hbWUuc2xpY2UoMCxuc3ApO1xyXG5cdFx0XHR2YXIgbG9jYWxOYW1lID0gcU5hbWUuc2xpY2UobnNwKzEpO1xyXG5cdFx0XHR2YXIgbnNQcmVmaXggPSBwcmVmaXggPT09ICd4bWxucycgJiYgbG9jYWxOYW1lXHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0bG9jYWxOYW1lID0gcU5hbWU7XHJcblx0XHRcdHByZWZpeCA9IG51bGxcclxuXHRcdFx0bnNQcmVmaXggPSBxTmFtZSA9PT0gJ3htbG5zJyAmJiAnJ1xyXG5cdFx0fVxyXG5cdFx0Ly9jYW4gbm90IHNldCBwcmVmaXgsYmVjYXVzZSBwcmVmaXggIT09ICcnXHJcblx0XHRhLmxvY2FsTmFtZSA9IGxvY2FsTmFtZSA7XHJcblx0XHQvL3ByZWZpeCA9PSBudWxsIGZvciBubyBucyBwcmVmaXggYXR0cmlidXRlIFxyXG5cdFx0aWYobnNQcmVmaXggIT09IGZhbHNlKXsvL2hhY2shIVxyXG5cdFx0XHRpZihsb2NhbE5TTWFwID09IG51bGwpe1xyXG5cdFx0XHRcdGxvY2FsTlNNYXAgPSB7fVxyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coY3VycmVudE5TTWFwLDApXHJcblx0XHRcdFx0X2NvcHkoY3VycmVudE5TTWFwLGN1cnJlbnROU01hcD17fSlcclxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKGN1cnJlbnROU01hcCwxKVxyXG5cdFx0XHR9XHJcblx0XHRcdGN1cnJlbnROU01hcFtuc1ByZWZpeF0gPSBsb2NhbE5TTWFwW25zUHJlZml4XSA9IHZhbHVlO1xyXG5cdFx0XHRhLnVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLydcclxuXHRcdFx0ZG9tQnVpbGRlci5zdGFydFByZWZpeE1hcHBpbmcobnNQcmVmaXgsIHZhbHVlKSBcclxuXHRcdH1cclxuXHR9XHJcblx0dmFyIGkgPSBlbC5sZW5ndGg7XHJcblx0d2hpbGUoaS0tKXtcclxuXHRcdGEgPSBlbFtpXTtcclxuXHRcdHZhciBwcmVmaXggPSBhLnByZWZpeDtcclxuXHRcdGlmKHByZWZpeCl7Ly9ubyBwcmVmaXggYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2VcclxuXHRcdFx0aWYocHJlZml4ID09PSAneG1sJyl7XHJcblx0XHRcdFx0YS51cmkgPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJztcclxuXHRcdFx0fWlmKHByZWZpeCAhPT0gJ3htbG5zJyl7XHJcblx0XHRcdFx0YS51cmkgPSBjdXJyZW50TlNNYXBbcHJlZml4IHx8ICcnXVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8ve2NvbnNvbGUubG9nKCcjIyMnK2EucU5hbWUsZG9tQnVpbGRlci5sb2NhdG9yLnN5c3RlbUlkKycnLGN1cnJlbnROU01hcCxhLnVyaSl9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0dmFyIG5zcCA9IHRhZ05hbWUuaW5kZXhPZignOicpO1xyXG5cdGlmKG5zcD4wKXtcclxuXHRcdHByZWZpeCA9IGVsLnByZWZpeCA9IHRhZ05hbWUuc2xpY2UoMCxuc3ApO1xyXG5cdFx0bG9jYWxOYW1lID0gZWwubG9jYWxOYW1lID0gdGFnTmFtZS5zbGljZShuc3ArMSk7XHJcblx0fWVsc2V7XHJcblx0XHRwcmVmaXggPSBudWxsOy8vaW1wb3J0YW50ISFcclxuXHRcdGxvY2FsTmFtZSA9IGVsLmxvY2FsTmFtZSA9IHRhZ05hbWU7XHJcblx0fVxyXG5cdC8vbm8gcHJlZml4IGVsZW1lbnQgaGFzIGRlZmF1bHQgbmFtZXNwYWNlXHJcblx0dmFyIG5zID0gZWwudXJpID0gY3VycmVudE5TTWFwW3ByZWZpeCB8fCAnJ107XHJcblx0ZG9tQnVpbGRlci5zdGFydEVsZW1lbnQobnMsbG9jYWxOYW1lLHRhZ05hbWUsZWwpO1xyXG5cdC8vZW5kUHJlZml4TWFwcGluZyBhbmQgc3RhcnRQcmVmaXhNYXBwaW5nIGhhdmUgbm90IGFueSBoZWxwIGZvciBkb20gYnVpbGRlclxyXG5cdC8vbG9jYWxOU01hcCA9IG51bGxcclxuXHRpZihlbC5jbG9zZWQpe1xyXG5cdFx0ZG9tQnVpbGRlci5lbmRFbGVtZW50KG5zLGxvY2FsTmFtZSx0YWdOYW1lKTtcclxuXHRcdGlmKGxvY2FsTlNNYXApe1xyXG5cdFx0XHRmb3IocHJlZml4IGluIGxvY2FsTlNNYXApe1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpIFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fWVsc2V7XHJcblx0XHRlbC5jdXJyZW50TlNNYXAgPSBjdXJyZW50TlNNYXA7XHJcblx0XHRlbC5sb2NhbE5TTWFwID0gbG9jYWxOU01hcDtcclxuXHRcdC8vcGFyc2VTdGFjay5wdXNoKGVsKTtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxufVxyXG5mdW5jdGlvbiBwYXJzZUh0bWxTcGVjaWFsQ29udGVudChzb3VyY2UsZWxTdGFydEVuZCx0YWdOYW1lLGVudGl0eVJlcGxhY2VyLGRvbUJ1aWxkZXIpe1xyXG5cdGlmKC9eKD86c2NyaXB0fHRleHRhcmVhKSQvaS50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdHZhciBlbEVuZFN0YXJ0ID0gIHNvdXJjZS5pbmRleE9mKCc8LycrdGFnTmFtZSsnPicsZWxTdGFydEVuZCk7XHJcblx0XHR2YXIgdGV4dCA9IHNvdXJjZS5zdWJzdHJpbmcoZWxTdGFydEVuZCsxLGVsRW5kU3RhcnQpO1xyXG5cdFx0aWYoL1smPF0vLnRlc3QodGV4dCkpe1xyXG5cdFx0XHRpZigvXnNjcmlwdCQvaS50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdFx0XHQvL2lmKCEvXFxdXFxdPi8udGVzdCh0ZXh0KSl7XHJcblx0XHRcdFx0XHQvL2xleEhhbmRsZXIuc3RhcnRDREFUQSgpO1xyXG5cdFx0XHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHRleHQsMCx0ZXh0Lmxlbmd0aCk7XHJcblx0XHRcdFx0XHQvL2xleEhhbmRsZXIuZW5kQ0RBVEEoKTtcclxuXHRcdFx0XHRcdHJldHVybiBlbEVuZFN0YXJ0O1xyXG5cdFx0XHRcdC8vfVxyXG5cdFx0XHR9Ly99ZWxzZXsvL3RleHQgYXJlYVxyXG5cdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuY2hhcmFjdGVycyh0ZXh0LDAsdGV4dC5sZW5ndGgpO1xyXG5cdFx0XHRcdHJldHVybiBlbEVuZFN0YXJ0O1xyXG5cdFx0XHQvL31cclxuXHRcdFx0XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBlbFN0YXJ0RW5kKzE7XHJcbn1cclxuZnVuY3Rpb24gZml4U2VsZkNsb3NlZChzb3VyY2UsZWxTdGFydEVuZCx0YWdOYW1lLGNsb3NlTWFwKXtcclxuXHQvL2lmKHRhZ05hbWUgaW4gY2xvc2VNYXApe1xyXG5cdHZhciBwb3MgPSBjbG9zZU1hcFt0YWdOYW1lXTtcclxuXHRpZihwb3MgPT0gbnVsbCl7XHJcblx0XHQvL2NvbnNvbGUubG9nKHRhZ05hbWUpXHJcblx0XHRwb3MgPSAgc291cmNlLmxhc3RJbmRleE9mKCc8LycrdGFnTmFtZSsnPicpXHJcblx0XHRpZihwb3M8ZWxTdGFydEVuZCl7Ly/lv5jorrDpl63lkIhcclxuXHRcdFx0cG9zID0gc291cmNlLmxhc3RJbmRleE9mKCc8LycrdGFnTmFtZSlcclxuXHRcdH1cclxuXHRcdGNsb3NlTWFwW3RhZ05hbWVdID1wb3NcclxuXHR9XHJcblx0cmV0dXJuIHBvczxlbFN0YXJ0RW5kO1xyXG5cdC8vfSBcclxufVxyXG5mdW5jdGlvbiBfY29weShzb3VyY2UsdGFyZ2V0KXtcclxuXHRmb3IodmFyIG4gaW4gc291cmNlKXt0YXJnZXRbbl0gPSBzb3VyY2Vbbl19XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VEQ0Moc291cmNlLHN0YXJ0LGRvbUJ1aWxkZXIsZXJyb3JIYW5kbGVyKXsvL3N1cmUgc3RhcnQgd2l0aCAnPCEnXHJcblx0dmFyIG5leHQ9IHNvdXJjZS5jaGFyQXQoc3RhcnQrMilcclxuXHRzd2l0Y2gobmV4dCl7XHJcblx0Y2FzZSAnLSc6XHJcblx0XHRpZihzb3VyY2UuY2hhckF0KHN0YXJ0ICsgMykgPT09ICctJyl7XHJcblx0XHRcdHZhciBlbmQgPSBzb3VyY2UuaW5kZXhPZignLS0+JyxzdGFydCs0KTtcclxuXHRcdFx0Ly9hcHBlbmQgY29tbWVudCBzb3VyY2Uuc3Vic3RyaW5nKDQsZW5kKS8vPCEtLVxyXG5cdFx0XHRpZihlbmQ+c3RhcnQpe1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuY29tbWVudChzb3VyY2Usc3RhcnQrNCxlbmQtc3RhcnQtNCk7XHJcblx0XHRcdFx0cmV0dXJuIGVuZCszO1xyXG5cdFx0XHR9ZWxzZXtcclxuXHRcdFx0XHRlcnJvckhhbmRsZXIuZXJyb3IoXCJVbmNsb3NlZCBjb21tZW50XCIpO1xyXG5cdFx0XHRcdHJldHVybiAtMTtcclxuXHRcdFx0fVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdC8vZXJyb3JcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdGRlZmF1bHQ6XHJcblx0XHRpZihzb3VyY2Uuc3Vic3RyKHN0YXJ0KzMsNikgPT0gJ0NEQVRBWycpe1xyXG5cdFx0XHR2YXIgZW5kID0gc291cmNlLmluZGV4T2YoJ11dPicsc3RhcnQrOSk7XHJcblx0XHRcdGRvbUJ1aWxkZXIuc3RhcnRDREFUQSgpO1xyXG5cdFx0XHRkb21CdWlsZGVyLmNoYXJhY3RlcnMoc291cmNlLHN0YXJ0KzksZW5kLXN0YXJ0LTkpO1xyXG5cdFx0XHRkb21CdWlsZGVyLmVuZENEQVRBKCkgXHJcblx0XHRcdHJldHVybiBlbmQrMztcclxuXHRcdH1cclxuXHRcdC8vPCFET0NUWVBFXHJcblx0XHQvL3N0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcgbmFtZSwgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZCwgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZCkgXHJcblx0XHR2YXIgbWF0Y2hzID0gc3BsaXQoc291cmNlLHN0YXJ0KTtcclxuXHRcdHZhciBsZW4gPSBtYXRjaHMubGVuZ3RoO1xyXG5cdFx0aWYobGVuPjEgJiYgLyFkb2N0eXBlL2kudGVzdChtYXRjaHNbMF1bMF0pKXtcclxuXHRcdFx0dmFyIG5hbWUgPSBtYXRjaHNbMV1bMF07XHJcblx0XHRcdHZhciBwdWJpZCA9IGxlbj4zICYmIC9ecHVibGljJC9pLnRlc3QobWF0Y2hzWzJdWzBdKSAmJiBtYXRjaHNbM11bMF1cclxuXHRcdFx0dmFyIHN5c2lkID0gbGVuPjQgJiYgbWF0Y2hzWzRdWzBdO1xyXG5cdFx0XHR2YXIgbGFzdE1hdGNoID0gbWF0Y2hzW2xlbi0xXVxyXG5cdFx0XHRkb21CdWlsZGVyLnN0YXJ0RFREKG5hbWUscHViaWQgJiYgcHViaWQucmVwbGFjZSgvXihbJ1wiXSkoLio/KVxcMSQvLCckMicpLFxyXG5cdFx0XHRcdFx0c3lzaWQgJiYgc3lzaWQucmVwbGFjZSgvXihbJ1wiXSkoLio/KVxcMSQvLCckMicpKTtcclxuXHRcdFx0ZG9tQnVpbGRlci5lbmREVEQoKTtcclxuXHRcdFx0XHJcblx0XHRcdHJldHVybiBsYXN0TWF0Y2guaW5kZXgrbGFzdE1hdGNoWzBdLmxlbmd0aFxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gLTE7XHJcbn1cclxuXHJcblxyXG5cclxuZnVuY3Rpb24gcGFyc2VJbnN0cnVjdGlvbihzb3VyY2Usc3RhcnQsZG9tQnVpbGRlcil7XHJcblx0dmFyIGVuZCA9IHNvdXJjZS5pbmRleE9mKCc/Picsc3RhcnQpO1xyXG5cdGlmKGVuZCl7XHJcblx0XHR2YXIgbWF0Y2ggPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkubWF0Y2goL148XFw/KFxcUyopXFxzKihbXFxzXFxTXSo/KVxccyokLyk7XHJcblx0XHRpZihtYXRjaCl7XHJcblx0XHRcdHZhciBsZW4gPSBtYXRjaFswXS5sZW5ndGg7XHJcblx0XHRcdGRvbUJ1aWxkZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG1hdGNoWzFdLCBtYXRjaFsyXSkgO1xyXG5cdFx0XHRyZXR1cm4gZW5kKzI7XHJcblx0XHR9ZWxzZXsvL2Vycm9yXHJcblx0XHRcdHJldHVybiAtMTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIC0xO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHNvdXJjZVxyXG4gKi9cclxuZnVuY3Rpb24gRWxlbWVudEF0dHJpYnV0ZXMoc291cmNlKXtcclxuXHRcclxufVxyXG5FbGVtZW50QXR0cmlidXRlcy5wcm90b3R5cGUgPSB7XHJcblx0c2V0VGFnTmFtZTpmdW5jdGlvbih0YWdOYW1lKXtcclxuXHRcdGlmKCF0YWdOYW1lUGF0dGVybi50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhZ05hbWU6Jyt0YWdOYW1lKVxyXG5cdFx0fVxyXG5cdFx0dGhpcy50YWdOYW1lID0gdGFnTmFtZVxyXG5cdH0sXHJcblx0YWRkOmZ1bmN0aW9uKHFOYW1lLHZhbHVlLG9mZnNldCl7XHJcblx0XHRpZighdGFnTmFtZVBhdHRlcm4udGVzdChxTmFtZSkpe1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXR0cmlidXRlOicrcU5hbWUpXHJcblx0XHR9XHJcblx0XHR0aGlzW3RoaXMubGVuZ3RoKytdID0ge3FOYW1lOnFOYW1lLHZhbHVlOnZhbHVlLG9mZnNldDpvZmZzZXR9XHJcblx0fSxcclxuXHRsZW5ndGg6MCxcclxuXHRnZXRMb2NhbE5hbWU6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXNbaV0ubG9jYWxOYW1lfSxcclxuXHRnZXRMb2NhdG9yOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzW2ldLmxvY2F0b3J9LFxyXG5cdGdldFFOYW1lOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzW2ldLnFOYW1lfSxcclxuXHRnZXRVUkk6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXNbaV0udXJpfSxcclxuXHRnZXRWYWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS52YWx1ZX1cclxuLy9cdCxnZXRJbmRleDpmdW5jdGlvbih1cmksIGxvY2FsTmFtZSkpe1xyXG4vL1x0XHRpZihsb2NhbE5hbWUpe1xyXG4vL1x0XHRcdFxyXG4vL1x0XHR9ZWxzZXtcclxuLy9cdFx0XHR2YXIgcU5hbWUgPSB1cmlcclxuLy9cdFx0fVxyXG4vL1x0fSxcclxuLy9cdGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWUodGhpcy5nZXRJbmRleC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxcclxuLy9cdGdldFR5cGU6ZnVuY3Rpb24odXJpLGxvY2FsTmFtZSl7fVxyXG4vL1x0Z2V0VHlwZTpmdW5jdGlvbihpKXt9LFxyXG59XHJcblxyXG5cclxuXHJcblxyXG5mdW5jdGlvbiBfc2V0X3Byb3RvXyh0aGl6LHBhcmVudCl7XHJcblx0dGhpei5fX3Byb3RvX18gPSBwYXJlbnQ7XHJcblx0cmV0dXJuIHRoaXo7XHJcbn1cclxuaWYoIShfc2V0X3Byb3RvXyh7fSxfc2V0X3Byb3RvXy5wcm90b3R5cGUpIGluc3RhbmNlb2YgX3NldF9wcm90b18pKXtcclxuXHRfc2V0X3Byb3RvXyA9IGZ1bmN0aW9uKHRoaXoscGFyZW50KXtcclxuXHRcdGZ1bmN0aW9uIHAoKXt9O1xyXG5cdFx0cC5wcm90b3R5cGUgPSBwYXJlbnQ7XHJcblx0XHRwID0gbmV3IHAoKTtcclxuXHRcdGZvcihwYXJlbnQgaW4gdGhpeil7XHJcblx0XHRcdHBbcGFyZW50XSA9IHRoaXpbcGFyZW50XTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBwO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaXQoc291cmNlLHN0YXJ0KXtcclxuXHR2YXIgbWF0Y2g7XHJcblx0dmFyIGJ1ZiA9IFtdO1xyXG5cdHZhciByZWcgPSAvJ1teJ10rJ3xcIlteXCJdK1wifFteXFxzPD5cXC89XSs9P3woXFwvP1xccyo+fDwpL2c7XHJcblx0cmVnLmxhc3RJbmRleCA9IHN0YXJ0O1xyXG5cdHJlZy5leGVjKHNvdXJjZSk7Ly9za2lwIDxcclxuXHR3aGlsZShtYXRjaCA9IHJlZy5leGVjKHNvdXJjZSkpe1xyXG5cdFx0YnVmLnB1c2gobWF0Y2gpO1xyXG5cdFx0aWYobWF0Y2hbMV0pcmV0dXJuIGJ1ZjtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydHMuWE1MUmVhZGVyID0gWE1MUmVhZGVyO1xyXG5cclxuIiwiLyoqXG4gKiBXcmFwcGVyIGZvciBidWlsdC1pbiBodHRwLmpzIHRvIGVtdWxhdGUgdGhlIGJyb3dzZXIgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LlxuICpcbiAqIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCBKUyBkZXNpZ25lZCBmb3IgYnJvd3NlcnMgdG8gaW1wcm92ZSByZXVzZSBvZiBjb2RlIGFuZFxuICogYWxsb3cgdGhlIHVzZSBvZiBleGlzdGluZyBsaWJyYXJpZXMuXG4gKlxuICogVXNhZ2U6IGluY2x1ZGUoXCJYTUxIdHRwUmVxdWVzdC5qc1wiKSBhbmQgdXNlIFhNTEh0dHBSZXF1ZXN0IHBlciBXM0Mgc3BlY3MuXG4gKlxuICogQGF1dGhvciBEYW4gRGVGZWxpcHBpIDxkYW5AZHJpdmVyZGFuLmNvbT5cbiAqIEBjb250cmlidXRvciBEYXZpZCBFbGxpcyA8ZC5mLmVsbGlzQGllZWUub3JnPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxudmFyIFVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG52YXIgc3Bhd24gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKS5zcGF3bjtcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuZXhwb3J0cy5YTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICAvKipcbiAgICogUHJpdmF0ZSB2YXJpYWJsZXNcbiAgICovXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGh0dHAgPSByZXF1aXJlKFwiaHR0cFwiKTtcbiAgdmFyIGh0dHBzID0gcmVxdWlyZShcImh0dHBzXCIpO1xuXG4gIC8vIEhvbGRzIGh0dHAuanMgb2JqZWN0c1xuICB2YXIgcmVxdWVzdDtcbiAgdmFyIHJlc3BvbnNlO1xuXG4gIC8vIFJlcXVlc3Qgc2V0dGluZ3NcbiAgdmFyIHNldHRpbmdzID0ge307XG5cbiAgLy8gRGlzYWJsZSBoZWFkZXIgYmxhY2tsaXN0LlxuICAvLyBOb3QgcGFydCBvZiBYSFIgc3BlY3MuXG4gIHZhciBkaXNhYmxlSGVhZGVyQ2hlY2sgPSBmYWxzZTtcblxuICAvLyBTZXQgc29tZSBkZWZhdWx0IGhlYWRlcnNcbiAgdmFyIGRlZmF1bHRIZWFkZXJzID0ge1xuICAgIFwiVXNlci1BZ2VudFwiOiBcIm5vZGUtWE1MSHR0cFJlcXVlc3RcIixcbiAgICBcIkFjY2VwdFwiOiBcIiovKlwiLFxuICB9O1xuXG4gIHZhciBoZWFkZXJzID0ge307XG4gIHZhciBoZWFkZXJzQ2FzZSA9IHt9O1xuXG4gIC8vIFRoZXNlIGhlYWRlcnMgYXJlIG5vdCB1c2VyIHNldGFibGUuXG4gIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGFsbG93ZWQgYnV0IGJhbm5lZCBpbiB0aGUgc3BlYzpcbiAgLy8gKiB1c2VyLWFnZW50XG4gIHZhciBmb3JiaWRkZW5SZXF1ZXN0SGVhZGVycyA9IFtcbiAgICBcImFjY2VwdC1jaGFyc2V0XCIsXG4gICAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgICBcImFjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVyc1wiLFxuICAgIFwiYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2RcIixcbiAgICBcImNvbm5lY3Rpb25cIixcbiAgICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgXCJjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nXCIsXG4gICAgXCJjb29raWVcIixcbiAgICBcImNvb2tpZTJcIixcbiAgICBcImRhdGVcIixcbiAgICBcImV4cGVjdFwiLFxuICAgIFwiaG9zdFwiLFxuICAgIFwia2VlcC1hbGl2ZVwiLFxuICAgIFwib3JpZ2luXCIsXG4gICAgXCJyZWZlcmVyXCIsXG4gICAgXCJ0ZVwiLFxuICAgIFwidHJhaWxlclwiLFxuICAgIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgICBcInVwZ3JhZGVcIixcbiAgICBcInZpYVwiXG4gIF07XG5cbiAgLy8gVGhlc2UgcmVxdWVzdCBtZXRob2RzIGFyZSBub3QgYWxsb3dlZFxuICB2YXIgZm9yYmlkZGVuUmVxdWVzdE1ldGhvZHMgPSBbXG4gICAgXCJUUkFDRVwiLFxuICAgIFwiVFJBQ0tcIixcbiAgICBcIkNPTk5FQ1RcIlxuICBdO1xuXG4gIC8vIFNlbmQgZmxhZ1xuICB2YXIgc2VuZEZsYWcgPSBmYWxzZTtcbiAgLy8gRXJyb3IgZmxhZywgdXNlZCB3aGVuIGVycm9ycyBvY2N1ciBvciBhYm9ydCBpcyBjYWxsZWRcbiAgdmFyIGVycm9yRmxhZyA9IGZhbHNlO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyc1xuICB2YXIgbGlzdGVuZXJzID0ge307XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB0aGlzLlVOU0VOVCA9IDA7XG4gIHRoaXMuT1BFTkVEID0gMTtcbiAgdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gMjtcbiAgdGhpcy5MT0FESU5HID0gMztcbiAgdGhpcy5ET05FID0gNDtcblxuICAvKipcbiAgICogUHVibGljIHZhcnNcbiAgICovXG5cbiAgLy8gQ3VycmVudCBzdGF0ZVxuICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLlVOU0VOVDtcblxuICAvLyBkZWZhdWx0IHJlYWR5IHN0YXRlIGNoYW5nZSBoYW5kbGVyIGluIGNhc2Ugb25lIGlzIG5vdCBzZXQgb3IgaXMgc2V0IGxhdGVcbiAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG4gIC8vIFJlc3VsdCAmIHJlc3BvbnNlXG4gIHRoaXMucmVzcG9uc2VUZXh0ID0gXCJcIjtcbiAgdGhpcy5yZXNwb25zZVhNTCA9IFwiXCI7XG4gIHRoaXMuc3RhdHVzID0gbnVsbDtcbiAgdGhpcy5zdGF0dXNUZXh0ID0gbnVsbDtcbiAgXG4gIC8vIFdoZXRoZXIgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyBzaG91bGQgYmUgbWFkZSB1c2luZ1xuICAvLyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMgb3IgYXV0aG9yaXphdGlvbiBoZWFkZXJzXG4gIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBoZWFkZXIgaXMgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBoZWFkZXIgSGVhZGVyIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm4gYm9vbGVhbiBGYWxzZSBpZiBub3QgYWxsb3dlZCwgb3RoZXJ3aXNlIHRydWVcbiAgICovXG4gIHZhciBpc0FsbG93ZWRIdHRwSGVhZGVyID0gZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgcmV0dXJuIGRpc2FibGVIZWFkZXJDaGVjayB8fCAoaGVhZGVyICYmIGZvcmJpZGRlblJlcXVlc3RIZWFkZXJzLmluZGV4T2YoaGVhZGVyLnRvTG93ZXJDYXNlKCkpID09PSAtMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmcgbWV0aG9kIFJlcXVlc3QgbWV0aG9kIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm4gYm9vbGVhbiBGYWxzZSBpZiBub3QgYWxsb3dlZCwgb3RoZXJ3aXNlIHRydWVcbiAgICovXG4gIHZhciBpc0FsbG93ZWRIdHRwTWV0aG9kID0gZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIChtZXRob2QgJiYgZm9yYmlkZGVuUmVxdWVzdE1ldGhvZHMuaW5kZXhPZihtZXRob2QpID09PSAtMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjb25uZWN0aW9uLiBDdXJyZW50bHkgc3VwcG9ydHMgbG9jYWwgc2VydmVyIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyaW5nIG1ldGhvZCBDb25uZWN0aW9uIG1ldGhvZCAoZWcgR0VULCBQT1NUKVxuICAgKiBAcGFyYW0gc3RyaW5nIHVybCBVUkwgZm9yIHRoZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gYm9vbGVhbiBhc3luYyBBc3luY2hyb25vdXMgY29ubmVjdGlvbi4gRGVmYXVsdCBpcyB0cnVlLlxuICAgKiBAcGFyYW0gc3RyaW5nIHVzZXIgVXNlcm5hbWUgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIChvcHRpb25hbClcbiAgICogQHBhcmFtIHN0cmluZyBwYXNzd29yZCBQYXNzd29yZCBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24gKG9wdGlvbmFsKVxuICAgKi9cbiAgdGhpcy5vcGVuID0gZnVuY3Rpb24obWV0aG9kLCB1cmwsIGFzeW5jLCB1c2VyLCBwYXNzd29yZCkge1xuICAgIHRoaXMuYWJvcnQoKTtcbiAgICBlcnJvckZsYWcgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGZvciB2YWxpZCByZXF1ZXN0IG1ldGhvZFxuICAgIGlmICghaXNBbGxvd2VkSHR0cE1ldGhvZChtZXRob2QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWN1cml0eUVycm9yOiBSZXF1ZXN0IG1ldGhvZCBub3QgYWxsb3dlZFwiKTtcbiAgICB9XG5cbiAgICBzZXR0aW5ncyA9IHtcbiAgICAgIFwibWV0aG9kXCI6IG1ldGhvZCxcbiAgICAgIFwidXJsXCI6IHVybC50b1N0cmluZygpLFxuICAgICAgXCJhc3luY1wiOiAodHlwZW9mIGFzeW5jICE9PSBcImJvb2xlYW5cIiA/IHRydWUgOiBhc3luYyksXG4gICAgICBcInVzZXJcIjogdXNlciB8fCBudWxsLFxuICAgICAgXCJwYXNzd29yZFwiOiBwYXNzd29yZCB8fCBudWxsXG4gICAgfTtcblxuICAgIHNldFN0YXRlKHRoaXMuT1BFTkVEKTtcbiAgfTtcblxuICAvKipcbiAgICogRGlzYWJsZXMgb3IgZW5hYmxlcyBpc0FsbG93ZWRIdHRwSGVhZGVyKCkgY2hlY2sgdGhlIHJlcXVlc3QuIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICogVGhpcyBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBXM0Mgc3BlYy5cbiAgICpcbiAgICogQHBhcmFtIGJvb2xlYW4gc3RhdGUgRW5hYmxlIG9yIGRpc2FibGUgaGVhZGVyIGNoZWNraW5nLlxuICAgKi9cbiAgdGhpcy5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGRpc2FibGVIZWFkZXJDaGVjayA9IHN0YXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgaGVhZGVyIGZvciB0aGUgcmVxdWVzdCBvciBhcHBlbmRzIHRoZSB2YWx1ZSBpZiBvbmUgaXMgYWxyZWFkeSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmcgaGVhZGVyIEhlYWRlciBuYW1lXG4gICAqIEBwYXJhbSBzdHJpbmcgdmFsdWUgSGVhZGVyIHZhbHVlXG4gICAqL1xuICB0aGlzLnNldFJlcXVlc3RIZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIsIHZhbHVlKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSOiBzZXRSZXF1ZXN0SGVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHN0YXRlIGlzIE9QRU5cIik7XG4gICAgfVxuICAgIGlmICghaXNBbGxvd2VkSHR0cEhlYWRlcihoZWFkZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJSZWZ1c2VkIHRvIHNldCB1bnNhZmUgaGVhZGVyIFxcXCJcIiArIGhlYWRlciArIFwiXFxcIlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbmRGbGFnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUjogc2VuZCBmbGFnIGlzIHRydWVcIik7XG4gICAgfVxuICAgIGhlYWRlciA9IGhlYWRlcnNDYXNlW2hlYWRlci50b0xvd2VyQ2FzZSgpXSB8fCBoZWFkZXI7XG4gICAgaGVhZGVyc0Nhc2VbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gaGVhZGVyO1xuICAgIGhlYWRlcnNbaGVhZGVyXSA9IGhlYWRlcnNbaGVhZGVyXSA/IGhlYWRlcnNbaGVhZGVyXSArICcsICcgKyB2YWx1ZSA6IHZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBoZWFkZXIgTmFtZSBvZiBoZWFkZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJuIHN0cmluZyBUZXh0IG9mIHRoZSBoZWFkZXIgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgdGhpcy5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlcikge1xuICAgIGlmICh0eXBlb2YgaGVhZGVyID09PSBcInN0cmluZ1wiXG4gICAgICAmJiB0aGlzLnJlYWR5U3RhdGUgPiB0aGlzLk9QRU5FRFxuICAgICAgJiYgcmVzcG9uc2VcbiAgICAgICYmIHJlc3BvbnNlLmhlYWRlcnNcbiAgICAgICYmIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldXG4gICAgICAmJiAhZXJyb3JGbGFnXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVyc1toZWFkZXIudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSByZXNwb25zZSBoZWFkZXJzLlxuICAgKlxuICAgKiBAcmV0dXJuIHN0cmluZyBBIHN0cmluZyB3aXRoIGFsbCByZXNwb25zZSBoZWFkZXJzIHNlcGFyYXRlZCBieSBDUitMRlxuICAgKi9cbiAgdGhpcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlIDwgdGhpcy5IRUFERVJTX1JFQ0VJVkVEIHx8IGVycm9yRmxhZykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICAvLyBDb29raWUgaGVhZGVycyBhcmUgZXhjbHVkZWRcbiAgICAgIGlmIChpICE9PSBcInNldC1jb29raWVcIiAmJiBpICE9PSBcInNldC1jb29raWUyXCIpIHtcbiAgICAgICAgcmVzdWx0ICs9IGkgKyBcIjogXCIgKyByZXNwb25zZS5oZWFkZXJzW2ldICsgXCJcXHJcXG5cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVxdWVzdCBoZWFkZXJcbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBuYW1lIE5hbWUgb2YgaGVhZGVyIHRvIGdldFxuICAgKiBAcmV0dXJuIHN0cmluZyBSZXR1cm5zIHRoZSByZXF1ZXN0IGhlYWRlciBvciBlbXB0eSBzdHJpbmcgaWYgbm90IHNldFxuICAgKi9cbiAgdGhpcy5nZXRSZXF1ZXN0SGVhZGVyID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBoZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICByZXR1cm4gaGVhZGVyc1toZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcbiAgfTtcblxuICAvKipcbiAgICogU2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBkYXRhIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhcyByZXF1ZXN0IGJvZHkuXG4gICAqL1xuICB0aGlzLnNlbmQgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSOiBjb25uZWN0aW9uIG11c3QgYmUgb3BlbmVkIGJlZm9yZSBzZW5kKCkgaXMgY2FsbGVkXCIpO1xuICAgIH1cblxuICAgIGlmIChzZW5kRmxhZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRF9TVEFURV9FUlI6IHNlbmQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIHNzbCA9IGZhbHNlLCBsb2NhbCA9IGZhbHNlO1xuICAgIHZhciB1cmwgPSBVcmwucGFyc2Uoc2V0dGluZ3MudXJsKTtcbiAgICB2YXIgaG9zdDtcbiAgICAvLyBEZXRlcm1pbmUgdGhlIHNlcnZlclxuICAgIHN3aXRjaCAodXJsLnByb3RvY29sKSB7XG4gICAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgICAgIHNzbCA9IHRydWU7XG4gICAgICAgIC8vIFNTTCAmIG5vbi1TU0wgYm90aCBuZWVkIGhvc3QsIG5vIGJyZWFrIGhlcmUuXG4gICAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICAgICAgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJmaWxlOlwiOlxuICAgICAgICBsb2NhbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgIGNhc2UgXCJcIjpcbiAgICAgICAgaG9zdCA9IFwibG9jYWxob3N0XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm90b2NvbCBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIGZpbGVzIG9mZiB0aGUgbG9jYWwgZmlsZXN5c3RlbSAoZmlsZTovLylcbiAgICBpZiAobG9jYWwpIHtcbiAgICAgIGlmIChzZXR0aW5ncy5tZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWE1MSHR0cFJlcXVlc3Q6IE9ubHkgR0VUIG1ldGhvZCBpcyBzdXBwb3J0ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR0aW5ncy5hc3luYykge1xuICAgICAgICBmcy5yZWFkRmlsZSh1cmwucGF0aG5hbWUsIFwidXRmOFwiLCBmdW5jdGlvbihlcnJvciwgZGF0YSkge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gMjAwO1xuICAgICAgICAgICAgc2VsZi5yZXNwb25zZVRleHQgPSBkYXRhO1xuICAgICAgICAgICAgc2V0U3RhdGUoc2VsZi5ET05FKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IGZzLnJlYWRGaWxlU3luYyh1cmwucGF0aG5hbWUsIFwidXRmOFwiKTtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IDIwMDtcbiAgICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIHBvcnQgODAuIElmIGFjY2Vzc2luZyBsb2NhbGhvc3Qgb24gYW5vdGhlciBwb3J0IGJlIHN1cmVcbiAgICAvLyB0byB1c2UgaHR0cDovL2xvY2FsaG9zdDpwb3J0L3BhdGhcbiAgICB2YXIgcG9ydCA9IHVybC5wb3J0IHx8IChzc2wgPyA0NDMgOiA4MCk7XG4gICAgLy8gQWRkIHF1ZXJ5IHN0cmluZyBpZiBvbmUgaXMgdXNlZFxuICAgIHZhciB1cmkgPSB1cmwucGF0aG5hbWUgKyAodXJsLnNlYXJjaCA/IHVybC5zZWFyY2ggOiBcIlwiKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgaWYgdGhleSBoYXZlbid0IGJlZW4gc2V0XG4gICAgZm9yICh2YXIgbmFtZSBpbiBkZWZhdWx0SGVhZGVycykge1xuICAgICAgaWYgKCFoZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGhlYWRlcnNbbmFtZV0gPSBkZWZhdWx0SGVhZGVyc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIEhvc3QgaGVhZGVyIG9yIHRoZSBzZXJ2ZXIgbWF5IHJlamVjdCB0aGUgcmVxdWVzdFxuICAgIGhlYWRlcnMuSG9zdCA9IGhvc3Q7XG4gICAgaWYgKCEoKHNzbCAmJiBwb3J0ID09PSA0NDMpIHx8IHBvcnQgPT09IDgwKSkge1xuICAgICAgaGVhZGVycy5Ib3N0ICs9IFwiOlwiICsgdXJsLnBvcnQ7XG4gICAgfVxuXG4gICAgLy8gU2V0IEJhc2ljIEF1dGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHNldHRpbmdzLnVzZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MucGFzc3dvcmQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgc2V0dGluZ3MucGFzc3dvcmQgPSBcIlwiO1xuICAgICAgfVxuICAgICAgdmFyIGF1dGhCdWYgPSBuZXcgQnVmZmVyKHNldHRpbmdzLnVzZXIgKyBcIjpcIiArIHNldHRpbmdzLnBhc3N3b3JkKTtcbiAgICAgIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IFwiQmFzaWMgXCIgKyBhdXRoQnVmLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIH1cblxuICAgIC8vIFNldCBjb250ZW50IGxlbmd0aCBoZWFkZXJcbiAgICBpZiAoc2V0dGluZ3MubWV0aG9kID09PSBcIkdFVFwiIHx8IHNldHRpbmdzLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtTGVuZ3RoXCJdID0gQnVmZmVyLmlzQnVmZmVyKGRhdGEpID8gZGF0YS5sZW5ndGggOiBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcblxuICAgICAgaWYgKCFoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgLy8gRm9yIGEgcG9zdCB3aXRoIG5vIGRhdGEgc2V0IENvbnRlbnQtTGVuZ3RoOiAwLlxuICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBieSBidWdneSBzZXJ2ZXJzIHRoYXQgZG9uJ3QgbWVldCB0aGUgc3BlY3MuXG4gICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSAwO1xuICAgIH1cblxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICBwYXRoOiB1cmksXG4gICAgICBtZXRob2Q6IHNldHRpbmdzLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBhZ2VudDogZmFsc2UsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHNlbGYud2l0aENyZWRlbnRpYWxzXG4gICAgfTtcblxuICAgIC8vIFJlc2V0IGVycm9yIGZsYWdcbiAgICBlcnJvckZsYWcgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBhc3luYyByZXF1ZXN0c1xuICAgIGlmIChzZXR0aW5ncy5hc3luYykge1xuICAgICAgLy8gVXNlIHRoZSBwcm9wZXIgcHJvdG9jb2xcbiAgICAgIHZhciBkb1JlcXVlc3QgPSBzc2wgPyBodHRwcy5yZXF1ZXN0IDogaHR0cC5yZXF1ZXN0O1xuXG4gICAgICAvLyBSZXF1ZXN0IGlzIGJlaW5nIHNlbnQsIHNldCBzZW5kIGZsYWdcbiAgICAgIHNlbmRGbGFnID0gdHJ1ZTtcblxuICAgICAgLy8gQXMgcGVyIHNwZWMsIHRoaXMgaXMgY2FsbGVkIGhlcmUgZm9yIGhpc3RvcmljYWwgcmVhc29ucy5cbiAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChcInJlYWR5c3RhdGVjaGFuZ2VcIik7XG5cbiAgICAgIC8vIEhhbmRsZXIgZm9yIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxlciA9IGZ1bmN0aW9uIHJlc3BvbnNlSGFuZGxlcihyZXNwKSB7XG4gICAgICAgIC8vIFNldCByZXNwb25zZSB2YXIgdG8gdGhlIHJlc3BvbnNlIHdlIGdvdCBiYWNrXG4gICAgICAgIC8vIFRoaXMgaXMgc28gaXQgcmVtYWlucyBhY2Nlc3NhYmxlIG91dHNpZGUgdGhpcyBzY29wZVxuICAgICAgICByZXNwb25zZSA9IHJlc3A7XG4gICAgICAgIC8vIENoZWNrIGZvciByZWRpcmVjdFxuICAgICAgICAvLyBAVE9ETyBQcmV2ZW50IGxvb3BlZCByZWRpcmVjdHNcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXNwb25zZS5zdGF0dXNDb2RlID09PSAzMDIgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMzAzIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDMwNykge1xuICAgICAgICAgIC8vIENoYW5nZSBVUkwgdG8gdGhlIHJlZGlyZWN0IGxvY2F0aW9uXG4gICAgICAgICAgc2V0dGluZ3MudXJsID0gcmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbjtcbiAgICAgICAgICB2YXIgdXJsID0gVXJsLnBhcnNlKHNldHRpbmdzLnVybCk7XG4gICAgICAgICAgLy8gU2V0IGhvc3QgdmFyIGluIGNhc2UgaXQncyB1c2VkIGxhdGVyXG4gICAgICAgICAgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAgICAgICAvLyBPcHRpb25zIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiB1cmwucG9ydCxcbiAgICAgICAgICAgIHBhdGg6IHVybC5wYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiByZXNwb25zZS5zdGF0dXNDb2RlID09PSAzMDMgPyBcIkdFVFwiIDogc2V0dGluZ3MubWV0aG9kLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogc2VsZi53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSXNzdWUgdGhlIG5ldyByZXF1ZXN0XG4gICAgICAgICAgcmVxdWVzdCA9IGRvUmVxdWVzdChuZXdPcHRpb25zLCByZXNwb25zZUhhbmRsZXIpLm9uKFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICByZXF1ZXN0LmVuZCgpO1xuICAgICAgICAgIC8vIEBUT0RPIENoZWNrIGlmIGFuIFhIUiBldmVudCBuZWVkcyB0byBiZSBmaXJlZCBoZXJlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2Uuc2V0RW5jb2RpbmcoXCJ1dGY4XCIpO1xuXG4gICAgICAgIHNldFN0YXRlKHNlbGYuSEVBREVSU19SRUNFSVZFRCk7XG4gICAgICAgIHNlbGYuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcblxuICAgICAgICByZXNwb25zZS5vbihcImRhdGFcIiwgZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUncyBzb21lIGRhdGFcbiAgICAgICAgICBpZiAoY2h1bmspIHtcbiAgICAgICAgICAgIHNlbGYucmVzcG9uc2VUZXh0ICs9IGNodW5rO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEb24ndCBlbWl0IHN0YXRlIGNoYW5nZXMgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWJvcnRlZC5cbiAgICAgICAgICBpZiAoc2VuZEZsYWcpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKHNlbGYuTE9BRElORyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoc2VuZEZsYWcpIHtcbiAgICAgICAgICAgIC8vIERpc2NhcmQgdGhlIGVuZCBldmVudCBpZiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgICAgICAgc2VuZEZsYWcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFcnJvciBoYW5kbGVyIGZvciB0aGUgcmVxdWVzdFxuICAgICAgdmFyIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcikge1xuICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IGRvUmVxdWVzdChvcHRpb25zLCByZXNwb25zZUhhbmRsZXIpLm9uKFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcblxuICAgICAgLy8gTm9kZSAwLjQgYW5kIGxhdGVyIHdvbid0IGFjY2VwdCBlbXB0eSBkYXRhLiBNYWtlIHN1cmUgaXQncyBuZWVkZWQuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXF1ZXN0LndyaXRlKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0LmVuZCgpO1xuXG4gICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoXCJsb2Fkc3RhcnRcIik7XG4gICAgfSBlbHNlIHsgLy8gU3luY2hyb25vdXNcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIG90aGVyIE5vZGUgcHJvY2Vzc1xuICAgICAgdmFyIGNvbnRlbnRGaWxlID0gXCIubm9kZS14bWxodHRwcmVxdWVzdC1jb250ZW50LVwiICsgcHJvY2Vzcy5waWQ7XG4gICAgICB2YXIgc3luY0ZpbGUgPSBcIi5ub2RlLXhtbGh0dHByZXF1ZXN0LXN5bmMtXCIgKyBwcm9jZXNzLnBpZDtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc3luY0ZpbGUsIFwiXCIsIFwidXRmOFwiKTtcbiAgICAgIC8vIFRoZSBhc3luYyByZXF1ZXN0IHRoZSBvdGhlciBOb2RlIHByb2Nlc3MgZXhlY3V0ZXNcbiAgICAgIHZhciBleGVjU3RyaW5nID0gXCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKSwgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpLCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XCJcbiAgICAgICAgKyBcInZhciBkb1JlcXVlc3QgPSBodHRwXCIgKyAoc3NsID8gXCJzXCIgOiBcIlwiKSArIFwiLnJlcXVlc3Q7XCJcbiAgICAgICAgKyBcInZhciBvcHRpb25zID0gXCIgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKSArIFwiO1wiXG4gICAgICAgICsgXCJ2YXIgcmVzcG9uc2VUZXh0ID0gJyc7XCJcbiAgICAgICAgKyBcInZhciByZXEgPSBkb1JlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24ocmVzcG9uc2UpIHtcIlxuICAgICAgICArIFwicmVzcG9uc2Uuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcIlxuICAgICAgICArIFwicmVzcG9uc2Uub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1wiXG4gICAgICAgICsgXCIgIHJlc3BvbnNlVGV4dCArPSBjaHVuaztcIlxuICAgICAgICArIFwifSk7XCJcbiAgICAgICAgKyBcInJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcIlxuICAgICAgICArIFwiZnMud3JpdGVGaWxlU3luYygnXCIgKyBjb250ZW50RmlsZSArIFwiJywgSlNPTi5zdHJpbmdpZnkoe2VycjogbnVsbCwgZGF0YToge3N0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsIHRleHQ6IHJlc3BvbnNlVGV4dH19KSwgJ3V0ZjgnKTtcIlxuICAgICAgICArIFwiZnMudW5saW5rU3luYygnXCIgKyBzeW5jRmlsZSArIFwiJyk7XCJcbiAgICAgICAgKyBcIn0pO1wiXG4gICAgICAgICsgXCJyZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbihlcnJvcikge1wiXG4gICAgICAgICsgXCJmcy53cml0ZUZpbGVTeW5jKCdcIiArIGNvbnRlbnRGaWxlICsgXCInLCBKU09OLnN0cmluZ2lmeSh7ZXJyOiBlcnJvcn0pLCAndXRmOCcpO1wiXG4gICAgICAgICsgXCJmcy51bmxpbmtTeW5jKCdcIiArIHN5bmNGaWxlICsgXCInKTtcIlxuICAgICAgICArIFwifSk7XCJcbiAgICAgICAgKyBcIn0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycm9yKSB7XCJcbiAgICAgICAgKyBcImZzLndyaXRlRmlsZVN5bmMoJ1wiICsgY29udGVudEZpbGUgKyBcIicsIEpTT04uc3RyaW5naWZ5KHtlcnI6IGVycm9yfSksICd1dGY4Jyk7XCJcbiAgICAgICAgKyBcImZzLnVubGlua1N5bmMoJ1wiICsgc3luY0ZpbGUgKyBcIicpO1wiXG4gICAgICAgICsgXCJ9KTtcIlxuICAgICAgICArIChkYXRhID8gXCJyZXEud3JpdGUoJ1wiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkuc2xpY2UoMSwtMSkucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpICsgXCInKTtcIjpcIlwiKVxuICAgICAgICArIFwicmVxLmVuZCgpO1wiO1xuICAgICAgLy8gU3RhcnQgdGhlIG90aGVyIE5vZGUgUHJvY2VzcywgZXhlY3V0aW5nIHRoaXMgc3RyaW5nXG4gICAgICB2YXIgc3luY1Byb2MgPSBzcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIFtcIi1lXCIsIGV4ZWNTdHJpbmddKTtcbiAgICAgIHdoaWxlKGZzLmV4aXN0c1N5bmMoc3luY0ZpbGUpKSB7XG4gICAgICAgIC8vIFdhaXQgd2hpbGUgdGhlIHN5bmMgZmlsZSBpcyBlbXB0eVxuICAgICAgfVxuICAgICAgdmFyIHJlc3AgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb250ZW50RmlsZSwgJ3V0ZjgnKSk7XG4gICAgICAvLyBLaWxsIHRoZSBjaGlsZCBwcm9jZXNzIG9uY2UgdGhlIGZpbGUgaGFzIGRhdGFcbiAgICAgIHN5bmNQcm9jLnN0ZGluLmVuZCgpO1xuICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgZnMudW5saW5rU3luYyhjb250ZW50RmlsZSk7XG5cbiAgICAgIGlmIChyZXNwLmVycikge1xuICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlc3AuZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlID0gcmVzcC5kYXRhO1xuICAgICAgICBzZWxmLnN0YXR1cyA9IHJlc3AuZGF0YS5zdGF0dXNDb2RlO1xuICAgICAgICBzZWxmLnJlc3BvbnNlVGV4dCA9IHJlc3AuZGF0YS50ZXh0O1xuICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgdG8gZGVhbCB3aXRoIGl0LlxuICAgKi9cbiAgdGhpcy5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGVycm9yO1xuICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gZXJyb3Iuc3RhY2s7XG4gICAgZXJyb3JGbGFnID0gdHJ1ZTtcbiAgICBzZXRTdGF0ZSh0aGlzLkRPTkUpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnZXJyb3InKTtcbiAgfTtcblxuICAvKipcbiAgICogQWJvcnRzIGEgcmVxdWVzdC5cbiAgICovXG4gIHRoaXMuYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocmVxdWVzdCkge1xuICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaGVhZGVycyA9IGRlZmF1bHRIZWFkZXJzO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IFwiXCI7XG4gICAgdGhpcy5yZXNwb25zZVhNTCA9IFwiXCI7XG5cbiAgICBlcnJvckZsYWcgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5VTlNFTlRcbiAgICAgICAgJiYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQgfHwgc2VuZEZsYWcpXG4gICAgICAgICYmIHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5ET05FKSB7XG4gICAgICBzZW5kRmxhZyA9IGZhbHNlO1xuICAgICAgc2V0U3RhdGUodGhpcy5ET05FKTtcbiAgICB9XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gdGhpcy5VTlNFTlQ7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhYm9ydCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyLiBQcmVmZXJyZWQgbWV0aG9kIG9mIGJpbmRpbmcgdG8gZXZlbnRzLlxuICAgKi9cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCEoZXZlbnQgaW4gbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgIH1cbiAgICAvLyBDdXJyZW50bHkgYWxsb3dzIGR1cGxpY2F0ZSBjYWxsYmFja3MuIFNob3VsZCBpdD9cbiAgICBsaXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgY2FsbGJhY2sgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGJvdW5kLlxuICAgKiBPbmx5IHdvcmtzIG9uIHRoZSBtYXRjaGluZyBmdW5jaXRvbiwgY2Fubm90IGJlIGEgY29weS5cbiAgICovXG4gIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIC8vIEZpbHRlciB3aWxsIHJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBjYWxsYmFjayByZW1vdmVkXG4gICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgcmV0dXJuIGV2ICE9PSBjYWxsYmFjaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW55IGV2ZW50cywgaW5jbHVkaW5nIGJvdGggXCJvblwiIG1ldGhvZHMgYW5kIGV2ZW50cyBhdHRhY2hlZCB1c2luZyBhZGRFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgdGhpcy5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHNlbGZbXCJvblwiICsgZXZlbnRdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHNlbGZbXCJvblwiICsgZXZlbnRdKCk7XG4gICAgfVxuICAgIGlmIChldmVudCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0ZW5lcnNbZXZlbnRdLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxpc3RlbmVyc1tldmVudF1baV0uY2FsbChzZWxmKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgcmVhZHlTdGF0ZSBhbmQgY2FsbHMgb25yZWFkeXN0YXRlY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50IHN0YXRlIE5ldyBzdGF0ZVxuICAgKi9cbiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUgPT0gc2VsZi5MT0FESU5HIHx8IHNlbGYucmVhZHlTdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgIHNlbGYucmVhZHlTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICBpZiAoc2V0dGluZ3MuYXN5bmMgfHwgc2VsZi5yZWFkeVN0YXRlIDwgc2VsZi5PUEVORUQgfHwgc2VsZi5yZWFkeVN0YXRlID09PSBzZWxmLkRPTkUpIHtcbiAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KFwicmVhZHlzdGF0ZWNoYW5nZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYucmVhZHlTdGF0ZSA9PT0gc2VsZi5ET05FICYmICFlcnJvckZsYWcpIHtcbiAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KFwibG9hZFwiKTtcbiAgICAgICAgLy8gQFRPRE8gZmlndXJlIG91dCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZExvYWRYSFIoY29va2llKVxuICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoXCJsb2FkZW5kXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIm5hbWVcIjogXCJzYmdudml6XCIsXG4gIFwidmVyc2lvblwiOiBcIjMuMS4wXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJTQkdOUEQgdmlzdWFsaXphdGlvbiBsaWJyYXJ5XCIsXG4gIFwibWFpblwiOiBcInNyYy9pbmRleC5qc1wiLFxuICBcImxpY2VuY2VcIjogXCJMR1BMLTMuMFwiLFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwidGVzdFwiOiBcImVjaG8gXFxcIkVycm9yOiBubyB0ZXN0IHNwZWNpZmllZFxcXCIgJiYgZXhpdCAxXCIsXG4gICAgXCJidWlsZC1zYmdudml6LWpzXCI6IFwiZ3VscCBidWlsZFwiLFxuICAgIFwiZGVidWctanNcIjogXCJub2RlbW9uIC1lIGpzIC0td2F0Y2ggc3JjIC14IFxcXCJucG0gcnVuIGJ1aWxkLXNiZ252aXotanNcXFwiXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9pVmlzLWF0LUJpbGtlbnQvc2JnbnZpei5qcy5naXRcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2lWaXMtYXQtQmlsa2VudC9zYmdudml6LmpzL2lzc3Vlc1wiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaVZpcy1hdC1CaWxrZW50L3NiZ252aXouanMvXCIsXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJqcXVlcnlcIjogXCJeMi4yLjRcIixcbiAgICBcImZpbGVzYXZlcmpzXCI6IFwifjAuMi4yXCIsXG4gICAgXCJjeXRvc2NhcGVcIjogXCJpVmlzLWF0LUJpbGtlbnQvY3l0b3NjYXBlLmpzI3Vuc3RhYmxlXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibGlic2Jnbi5qc1wiOiBcIl4wLjEuMVwiLFxuICAgIFwicHJldHR5LWRhdGFcIjogXCJeMC40MC4wXCIsXG4gICAgXCJ4bWwyanNcIjogXCJeMC40LjE3XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl4xMS4yLjBcIixcbiAgICBcImd1bHBcIjogXCJeMy45LjBcIixcbiAgICBcImd1bHAtZGVyZXF1aXJlXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJndWxwLWpzaGludFwiOiBcIl4xLjExLjJcIixcbiAgICBcImd1bHAtcHJvbXB0XCI6IFwiXjAuMS4yXCIsXG4gICAgXCJndWxwLXJlcGxhY2VcIjogXCJeMC41LjRcIixcbiAgICBcImd1bHAtc2hlbGxcIjogXCJeMC41LjBcIixcbiAgICBcImd1bHAtdXRpbFwiOiBcIl4zLjAuNlwiLFxuICAgIFwianNoaW50LXN0eWxpc2hcIjogXCJeMi4wLjFcIixcbiAgICBcIm5vZGUtbm90aWZpZXJcIjogXCJeNC4zLjFcIixcbiAgICBcInJ1bi1zZXF1ZW5jZVwiOiBcIl4xLjEuNFwiLFxuICAgIFwidmlueWwtYnVmZmVyXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJ2aW55bC1zb3VyY2Utc3RyZWFtXCI6IFwiXjEuMS4wXCJcbiAgfVxufVxuIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBzYmdudml6ID0gd2luZG93LnNiZ252aXogPSBmdW5jdGlvbihfb3B0aW9ucywgX2xpYnMpIHtcbiAgICB2YXIgbGlicyA9IHt9O1xuICAgIGxpYnMualF1ZXJ5ID0gX2xpYnMualF1ZXJ5IHx8IGpRdWVyeTtcbiAgICBsaWJzLmN5dG9zY2FwZSA9IF9saWJzLmN5dG9zY2FwZSB8fCBjeXRvc2NhcGU7XG4gICAgbGlicy5zYXZlQXMgPSBfbGlicy5maWxlc2F2ZXJqcyA/IF9saWJzLmZpbGVzYXZlcmpzLnNhdmVBcyA6IHNhdmVBcztcbiAgICBcbiAgICAvLyBTZXQgdGhlIGxpYnJhcmllcyB0byBhY2Nlc3MgdGhlbSBmcm9tIGFueSBmaWxlXG4gICAgdmFyIGxpYlV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKTtcbiAgICBsaWJVdGlsaXRpZXMuc2V0TGlicyhsaWJzKTtcbiAgICBcbiAgICB2YXIgb3B0aW9uVXRpbGl0aWVzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcycpO1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmV4dGVuZE9wdGlvbnMoX29wdGlvbnMpO1xuICAgIFxuICAgIHZhciBzYmduUmVuZGVyZXIgPSByZXF1aXJlKCcuL3NiZ24tZXh0ZW5zaW9ucy9zYmduLWN5LXJlbmRlcmVyJyk7XG4gICAgdmFyIHNiZ25DeUluc3RhbmNlID0gcmVxdWlyZSgnLi9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1pbnN0YW5jZScpO1xuICAgIFxuICAgIC8vIFV0aWxpdGllcyB3aG9zZSBmdW5jdGlvbnMgd2lsbCBiZSBleHBvc2VkIHNlcGVyYXRlbHlcbiAgICB2YXIgdWlVdGlsaXRpZXMgPSByZXF1aXJlKCcuL3V0aWxpdGllcy91aS11dGlsaXRpZXMnKTtcbiAgICB2YXIgZmlsZVV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzJyk7XG4gICAgdmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvZ3JhcGgtdXRpbGl0aWVzJyk7XG4gICAgdmFyIG1haW5VdGlsaXRpZXMgPSByZXF1aXJlKCcuL3V0aWxpdGllcy9tYWluLXV0aWxpdGllcycpO1xuICAgIHJlcXVpcmUoJy4vdXRpbGl0aWVzL2tleWJvYXJkLWlucHV0LXV0aWxpdGllcycpOyAvLyByZXF1aXJlIGtleWJvcmQgaW5wdXQgdXRpbGl0aWVzXG4gICAgLy8gVXRpbGl0aWVzIHRvIGJlIGV4cG9zZWQgYXMgaXNcbiAgICB2YXIgZWxlbWVudFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2VsZW1lbnQtdXRpbGl0aWVzJyk7XG4gICAgdmFyIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvdW5kby1yZWRvLWFjdGlvbi1mdW5jdGlvbnMnKTtcbiAgICB2YXIgY2xhc3NlcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2NsYXNzZXMnKTtcbiAgICBcbiAgICBzYmduUmVuZGVyZXIoKTtcbiAgICBzYmduQ3lJbnN0YW5jZSgpO1xuICAgIFxuICAgIC8vIEV4cG9zZSB0aGUgYXBpXG4gICAgLy8gRXhwb3NlIGVsZW1lbnRVdGlsaXRpZXMgYW5kIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zIGFzIGlzLCBtb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdGhlc2VcbiAgICBzYmdudml6LmVsZW1lbnRVdGlsaXRpZXMgPSBlbGVtZW50VXRpbGl0aWVzO1xuICAgIHNiZ252aXoudW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMgPSB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucztcbiAgICBcbiAgICAvLyBFeHBvc2UgZWFjaCBtYWluIHV0aWxpdHkgc2VwZXJhdGVseVxuICAgIGZvciAodmFyIHByb3AgaW4gbWFpblV0aWxpdGllcykge1xuICAgICAgc2JnbnZpeltwcm9wXSA9IG1haW5VdGlsaXRpZXNbcHJvcF07XG4gICAgfVxuICAgIFxuICAgIC8vIEV4cG9zZSBlYWNoIGZpbGUgdXRpbGl0eSBzZXBlcmF0ZWx5XG4gICAgZm9yICh2YXIgcHJvcCBpbiBmaWxlVXRpbGl0aWVzKSB7XG4gICAgICBzYmdudml6W3Byb3BdID0gZmlsZVV0aWxpdGllc1twcm9wXTtcbiAgICB9XG4gICAgXG4gICAgLy8gRXhwb3NlIGVhY2ggZmlsZSB1dGlsaXR5IHNlcGVyYXRlbHlcbiAgICBmb3IgKHZhciBwcm9wIGluIHVpVXRpbGl0aWVzKSB7XG4gICAgICBzYmdudml6W3Byb3BdID0gdWlVdGlsaXRpZXNbcHJvcF07XG4gICAgfVxuICAgIFxuICAgIC8vIEV4cG9zZSBlYWNoIHNiZ24gZ3JhcGggdXRpbGl0eSBzZXBlcmF0ZWx5XG4gICAgZm9yICh2YXIgcHJvcCBpbiBncmFwaFV0aWxpdGllcykge1xuICAgICAgc2JnbnZpeltwcm9wXSA9IGdyYXBoVXRpbGl0aWVzW3Byb3BdO1xuICAgIH1cblxuICAgIHNiZ252aXouY2xhc3NlcyA9IGNsYXNzZXM7XG4gIH07XG4gIFxuICBpZiAoIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gc2JnbnZpejtcbiAgfVxufSkoKTsiLCJ2YXIgZWxlbWVudFV0aWxpdGllcyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9lbGVtZW50LXV0aWxpdGllcycpO1xudmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xudmFyIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL3VuZG8tcmVkby1hY3Rpb24tZnVuY3Rpb25zJyk7XG52YXIgcmVmcmVzaFBhZGRpbmdzID0gZ3JhcGhVdGlsaXRpZXMucmVmcmVzaFBhZGRpbmdzLmJpbmQoZ3JhcGhVdGlsaXRpZXMpO1xuXG52YXIgbGlicyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBjeXRvc2NhcGUgPSBsaWJzLmN5dG9zY2FwZTtcblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9vcHRpb24tdXRpbGl0aWVzJyk7XG52YXIgb3B0aW9ucyA9IG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zKCk7XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgbG9jYXRlZCBvbiB0aGUgZ2l2ZW4gYW5nbGUgb24gdGhlIGNpcmNsZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXJhbCBjb29yZGluYXRlcyBhbmQgcmFkaXVzLlxuICovXG52YXIgZ2V0UG9pbnRPbkNpcmNsZSA9IGZ1bmN0aW9uKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgYW5nbGVJbkRlZ3JlZSkge1xuXHR2YXIgYW5nbGVJblJhZGlhbiA9IGFuZ2xlSW5EZWdyZWUgKiAoIE1hdGguUEkgLyAxODAgKTsgLy8gQ29udmVydCBkZWdyZWUgdG8gcmFkaWFuXG5cdHJldHVybiB7XG5cdFx0eDogcmFkaXVzICogTWF0aC5jb3MoYW5nbGVJblJhZGlhbikgKyBjZW50ZXJYLFxuXHRcdHk6IC0xICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGVJblJhZGlhbikgKyBjZW50ZXJZIC8vIFdlIG11bHRpcGx5IHdpdGggLTEgaGVyZSBiZWNhdXNlIEpTIHkgY29vcmRpbmF0ZSBzaWduIGlzIHRoZSBvcG9zaXRlIG9mIHRoZSBNYXRoYW1hdGljYWwgY29vcmRpbmF0ZXMgc3lzdGVtXG5cdH07XG59O1xuXG4vKlxuICogR2VuZXJhdGVzIGEgcG9seWdvbiBzdHJpbmcgYXBwcm94aW1hdGluZyBhIGNpcmNsZSB3aXRoIGdpdmVuIGNlbnRlciwgcmFkaXVzLCBzdGFydCwgZW5kIGFuZ2xlcyBhbmQgbnVtYmVyIG9mIHBvaW50cyB0byByZXByZXNlbnQgdGhlIGNpcmNsZVxuICovXG52YXIgZ2VuZXJhdGVDaXJjbGVTdHJpbmcgPSBmdW5jdGlvbihjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGFuZ2xlRnJvbSwgYW5nbGVUbywgbnVtT2ZQb2ludHMpIHtcblx0dmFyIGNpcmNsZVN0ciA9IFwiXCI7XG5cdHZhciBzdGVwU2l6ZSA9ICggYW5nbGVUbyAtIGFuZ2xlRnJvbSApIC8gbnVtT2ZQb2ludHM7IC8vIFdlIHdpbGwgaW5jcmVtZW50IHRoZSBjdXJyZW50IGFuZ2xlIGJ5IHN0ZXAgc2l6ZSBpbiBlYWNoIGl0ZXJhdGlvblxuXHR2YXIgY3VycmVudEFuZ2xlID0gYW5nbGVGcm9tOyAvLyBjdXJyZW50IGFuZ2xlIHdpbGwgYmUgdXBkYXRlZCBpbiBlYWNoIGl0ZXJhdGlvblxuXHRcblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbnVtT2ZQb2ludHM7IGkrKyApIHtcblx0XHR2YXIgcG9pbnQgPSBnZXRQb2ludE9uQ2lyY2xlKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgY3VycmVudEFuZ2xlKTtcblx0XHRjdXJyZW50QW5nbGUgKz0gc3RlcFNpemU7XG5cdFx0Y2lyY2xlU3RyICs9IHBvaW50LnggKyBcIiBcIiArIHBvaW50LnkgKyBcIiBcIjtcblx0fVxuXHRcblx0cmV0dXJuIGNpcmNsZVN0cjtcbn07XG5cbi8qXG4gKiAgR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBwcm9jZXNzZXMvbG9naWNhbCBvcGVyYXRvcnMgd2l0aCBwb3J0cy5cbiAqICBsaW5lSFc6IEhhbGYgd2lkdGggb2YgbGluZSB0aHJvdWdoIHRoZSBjaXJjbGUgdG8gdGhlIGludGVyc2VjdGlvbiBwb2ludFxuICogIHNoYXBlSFc6IEhhbGYgd2lkdGggb2YgdGhlIHNoYXBlIGRpc2NsdWRpbmcgdGhlIHBvcnRzIChJdCBpcyByYWRpdXMgZm9yIHRoZSBjaXJjdWxhciBzaGFwZXMpXG4gKiAgdHlwZTogVHlwZSBvZiB0aGUgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHMuIE9wdGlvbnMgYXJlICdjaXJjbGUnLCAncmVjdGFuZ2xlJ1xuICogIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiBvZiB0aGUgcG9ydHMgT3B0aW9ucyBhcmUgJ2hvcml6b250YWwnLCAndmVydGljYWwnXG4gKi9cblxudmFyIGdlbmVyYXRlU2hhcGVXaXRoUG9ydFN0cmluZyA9IGZ1bmN0aW9uKGxpbmVIVywgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pIHtcblx0dmFyIHBvbHlnb25TdHI7XG4gICAgdmFyIG51bU9mUG9pbnRzID0gMzA7IC8vIE51bWJlciBvZiBwb2ludHMgdGhhdCBib3RoIGhhbHZlcyBvZiBjaXJjbGUgd2lsbCBoYXZlXG5cdGlmIChvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG5cdFx0dmFyIGFib3ZlUG9pbnRzLCBiZWxvd1BvaW50cztcblx0XG5cdFx0aWYgKHR5cGUgPT09ICdjaXJjbGUnKSB7XG5cdFx0XHRhYm92ZVBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDE4MCwgMCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0YmVsb3dQb2ludHMgPSBnZW5lcmF0ZUNpcmNsZVN0cmluZygwLCAwLCBzaGFwZUhXLCAzNjAsIDE4MCwgbnVtT2ZQb2ludHMpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0YWJvdmVQb2ludHMgPSAnLScgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICc7XG5cdFx0XHRiZWxvd1BvaW50cyA9IHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAnO1xuXHRcdH1cblx0XHRcblx0XHRwb2x5Z29uU3RyID0gXCItMSAtXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgXCI7XHRcblx0XHRwb2x5Z29uU3RyICs9IGFib3ZlUG9pbnRzO1xuXHRcdHBvbHlnb25TdHIgKz0gc2hhcGVIVyArIFwiIC1cIiArIGxpbmVIVyArIFwiIDEgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIFwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgXCI7XG5cdFx0cG9seWdvblN0ciArPSBiZWxvd1BvaW50cztcblx0XHRwb2x5Z29uU3RyICs9IFwiLVwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgLTEgXCIgKyBsaW5lSFc7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dmFyIGxlZnRQb2ludHMsIHJpZ2h0UG9pbnRzO1xuXHRcdFxuXHRcdGlmICh0eXBlID09PSAnY2lyY2xlJykge1xuXHRcdFx0bGVmdFBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDkwLCAyNzAsIG51bU9mUG9pbnRzKTtcblx0XHRcdHJpZ2h0UG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgLTkwLCA5MCwgbnVtT2ZQb2ludHMpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0bGVmdFBvaW50cyA9ICctJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgJztcblx0XHRcdHJpZ2h0UG9pbnRzID0gc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICc7IFxuXHRcdH1cblx0XHRcblx0XHRwb2x5Z29uU3RyID0gXCItXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyAxICsgXCIgLVwiICsgbGluZUhXICsgXCIgLVwiICsgc2hhcGVIVyArIFwiIFwiO1xuXHRcdHBvbHlnb25TdHIgKz0gbGVmdFBvaW50cztcblx0XHRwb2x5Z29uU3RyICs9IFwiLVwiICsgbGluZUhXICsgXCIgXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIDEgXCIgKyBsaW5lSFcgKyBcIiBcIiArIHNoYXBlSFcgKyBcIiBcIjtcblx0XHRwb2x5Z29uU3RyICs9IHJpZ2h0UG9pbnRzO1xuXHRcdHBvbHlnb25TdHIgKz0gbGluZUhXICsgXCIgLVwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgLTFcIjtcblx0fVxuXHRcblx0cmV0dXJuIHBvbHlnb25TdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRhaW5lclNlbGVjdG9yID0gb3B0aW9ucy5uZXR3b3JrQ29udGFpbmVyU2VsZWN0b3I7XG4gIHZhciBpbWdQYXRoID0gb3B0aW9ucy5pbWdQYXRoO1xuICBcbiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKClcbiAge1xuICAgIHZhciBzYmduTmV0d29ya0NvbnRhaW5lciA9ICQoY29udGFpbmVyU2VsZWN0b3IpO1xuXG4gICAgLy8gY3JlYXRlIGFuZCBpbml0IGN5dG9zY2FwZTpcbiAgICB2YXIgY3kgPSBjeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyOiBzYmduTmV0d29ya0NvbnRhaW5lcixcbiAgICAgIHN0eWxlOiBzYmduU3R5bGVTaGVldCxcbiAgICAgIHNob3dPdmVybGF5OiBmYWxzZSwgbWluWm9vbTogMC4xMjUsIG1heFpvb206IDE2LFxuICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgIG1vdGlvbkJsdXI6IHRydWUsXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5OiAwLjEsXG4gICAgICByZWFkeTogZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cuY3kgPSB0aGlzO1xuICAgICAgICAvLyBJZiB1bmRvYWJsZSByZWdpc3RlciB1bmRvL3JlZG8gYWN0aW9uc1xuICAgICAgICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgICAgICAgIHJlZ2lzdGVyVW5kb1JlZG9BY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgYmluZEN5RXZlbnRzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBcbiAgLy8gTm90ZSB0aGF0IGluIENoaVNFIHRoaXMgZnVuY3Rpb24gaXMgaW4gYSBzZXBlcmF0ZSBmaWxlIGJ1dCBpbiB0aGUgdmlld2VyIGl0IGhhcyBqdXN0IDIgbWV0aG9kcyBhbmQgc28gaXQgaXMgbG9jYXRlZCBpbiB0aGlzIGZpbGVcbiAgZnVuY3Rpb24gcmVnaXN0ZXJVbmRvUmVkb0FjdGlvbnMoKSB7XG4gICAgLy8gY3JlYXRlIG9yIGdldCB0aGUgdW5kby1yZWRvIGluc3RhbmNlXG4gICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcblxuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYWwgYWN0aW9uc1xuICAgIC8vIHJlZ2lzdGVyIGFkZCByZW1vdmUgYWN0aW9uc1xuICAgIHVyLmFjdGlvbihcImRlbGV0ZUVsZXNTaW1wbGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlRWxlc1NpbXBsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuICAgIHVyLmFjdGlvbihcImRlbGV0ZU5vZGVzU21hcnRcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlTm9kZXNTbWFydCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuICAgIHVyLmFjdGlvbihcInNldFBvcnRzT3JkZXJpbmdcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuc2V0UG9ydHNPcmRlcmluZywgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuc2V0UG9ydHNPcmRlcmluZyk7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGJpbmRDeUV2ZW50cygpIHtcbiAgICBjeS5vbigndGFwZW5kJywgJ25vZGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGN5LnN0eWxlKCkudXBkYXRlKCk7XG4gICAgfSk7XG4gICAgXG4gICAgY3kub24oXCJleHBhbmRjb2xsYXBzZS5iZWZvcmVjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXM7XG4gICAgICAvL1RoZSBjaGlsZHJlbiBpbmZvIG9mIGNvbXBsZXggbm9kZXMgc2hvdWxkIGJlIHNob3duIHdoZW4gdGhleSBhcmUgY29sbGFwc2VkXG4gICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG4gICAgICAgIC8vVGhlIG5vZGUgaXMgYmVpbmcgY29sbGFwc2VkIHN0b3JlIGluZm9sYWJlbCB0byB1c2UgaXQgbGF0ZXJcbiAgICAgICAgdmFyIGluZm9MYWJlbCA9IGVsZW1lbnRVdGlsaXRpZXMuZ2V0SW5mb0xhYmVsKG5vZGUpO1xuICAgICAgICBub2RlLl9wcml2YXRlLmRhdGEuaW5mb0xhYmVsID0gaW5mb0xhYmVsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXM7XG4gICAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBqdXN0IGNvbGxhcHNlZCBub2RlcyBzaG91bGQgYmUgMzYsIGJ1dCB0aGV5IGFyZSBzdXBwb3NlZCB0byBiZSByZXNpemFibGUuIFRoZXJlZm9yZSwgd2VcbiAgICAgIC8vIHNldCB0aGVpciBkYXRhKCdiYm94JykgYWNjb3JkaW5nbHkuIFdlIGRvIG5vdCBzdG9yZSB0aGVpciBleGlzdGluZyBiYm94LncgYW5kIGJib3guaCBiZWNhdXNlIHRoZXkgaGF2ZSBubyBzaWduaWZpY2FuY2UgZm9yIGNvbXBvdW5kcyAoZm9yIG5vdykuXG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgICB2YXIgYmJveCA9IG5vZGUuZGF0YSgnYmJveCcpO1xuICAgICAgYmJveC53ID0gMzY7XG4gICAgICBiYm94LmggPSAzNjtcbiAgICAgIG5vZGUuZGF0YSgnYmJveCcsIGJib3gpO1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9KTtcblxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYmVmb3JlZXhwYW5kXCIsIFwibm9kZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcztcbiAgICAgIG5vZGUucmVtb3ZlRGF0YShcImluZm9MYWJlbFwiKTtcbiAgICB9KTtcblxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJleHBhbmRcIiwgXCJub2RlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzO1xuICAgICAgY3kubm9kZXMoKS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgICAgLy9Eb24ndCBzaG93IGNoaWxkcmVuIGluZm8gd2hlbiB0aGUgY29tcGxleCBub2RlIGlzIGV4cGFuZGVkXG4gICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlU3R5bGUoJ2NvbnRlbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGN5Lm9uKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQubGF5b3V0Lm9wdGlvbnMubmFtZSAhPT0gJ3ByZXNldCcpXG4gICAgICB7XG4gICAgICAgIGlmIChncmFwaFV0aWxpdGllcy5wb3J0c0VuYWJsZWQgPT09IHRydWUpXG4gICAgICAgIHtcbiAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNoYW5nZVBvcnRzT3JpZW50YXRpb25BZnRlckxheW91dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkKGRvY3VtZW50KS5vbigndXBkYXRlR3JhcGhFbmQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgLy8gbGlzdCBhbGwgZW50aXR5dHlwZXMgYW5kc3RvcmUgdGhlbSBpbiB0aGUgZ2xvYmFsIHNjcmF0Y2hcbiAgICAgIC8vIG9ubHkgc3RhdGVmdWwgRVBOIChjb21wbGV4LCBtYWNyb21vbGVjdWxlIG9yIG51Y2xlaWMgYWNpZCkgYXJlIGNvbmNlcm5lZFxuXG4gICAgICAvLyBmb2xsb3dpbmcgaXMgdW5hcHBsaWVkIGR1ZSB0byBwZXJmb3JtYW5jZSBkZWNyZWFzaW5nLCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgMjAlIHRpbWUgb24gbG9hZFxuICAgICAgLypjeS5zdGFydEJhdGNoKCk7XG4gICAgICB2YXIgZW50aXR5SGFzaCA9IHt9O1xuICAgICAgY3kubm9kZXMoXCJbY2xhc3M9J2NvbXBsZXgnXSwgW2NsYXNzPSdtYWNyb21vbGVjdWxlJ10sIFtjbGFzcz0nbnVjbGVpYyBhY2lkIGZlYXR1cmUnXVwiKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gaWRlbnRpZnkgYW4gZW50aXR5IGJ5IGl0cyBsYWJlbCBBTkQgY2xhc3NcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5kYXRhKCdsYWJlbCcpO1xuICAgICAgICB2YXIgX2NsYXNzID0gbm9kZS5kYXRhKCdjbGFzcycpO1xuICAgICAgICB2YXIgaWQ9bGFiZWwrJy0nK19jbGFzcztcbiAgICAgICAgaWYoIWVudGl0eUhhc2guaGFzT3duUHJvcGVydHkoaWQpKSB7IC8vIGNyZWF0ZSBlbnRpdHl0eXBlIGlmIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICAgICAgICAgIGVudGl0eUhhc2hbaWRdID0gbmV3IGNsYXNzZXMuRW50aXR5VHlwZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cnJlbnRFbnRpdHlUeXBlID0gZW50aXR5SGFzaFtpZF07XG4gICAgICAgIGN1cnJlbnRFbnRpdHlUeXBlLkVQTnMucHVzaChub2RlKTsgLy8gYXNzaWduZSB0aGUgY3VycmVudCBlbGVtZW50IHRvIGl0cyBjb3JyZXNwb25kaW5nIGVudGl0eXR5cGVcblxuICAgICAgICAvLyBjb2xsZWN0IGFsbCBzdGF0ZVZhcmlhYmxlcyBvZiB0aGUgY3VycmVudCBlbGVtZW50LCB3ZSBuZWVkIHRvIGFzc2lnbiBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbnMgdG8gdGhlbVxuICAgICAgICBmb3IodmFyIGk9MDsgaSA8IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKVtpXTtcbiAgICAgICAgICBpZihzdGF0ZXNhbmRpbmZvcyBpbnN0YW5jZW9mIGNsYXNzZXMuU3RhdGVWYXJpYWJsZSkgeyAvLyBzdGF0ZVZhcmlhYmxlIGZvdW5kXG4gICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlVmFyaWFibGUgPSBzdGF0ZXNhbmRpbmZvcztcbiAgICAgICAgICAgIGN1cnJlbnRFbnRpdHlUeXBlLmFzc2lnblN0YXRlVmFyaWFibGUoY3VycmVudFN0YXRlVmFyaWFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgICAgY3kuc2NyYXRjaCgnX3NiZ252aXonLCB7U0JHTkVudGl0eVR5cGVzOiBlbnRpdHlIYXNofSk7Ki9cblxuICAgICAgLy8gYXNzaWduIHN0YXRlc2FuZGluZm9zIHRvIHRoZWlyIGxheW91dFxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgY3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycsIHt9KTtcbiAgICAgICAgLy8gZm9yIGVhY2ggc3RhdGVzYW5kaW5mb3NcbiAgICAgICAgZm9yKHZhciBpPTA7IGkgPCBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJykubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3RhdGVzYW5kaW5mb3MgPSBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJylbaV07XG4gICAgICAgICAgdmFyIGxvY2F0aW9uID0gc3RhdGVzYW5kaW5mb3MuYW5jaG9yU2lkZTsgLy8gdG9wIGJvdHRvbSByaWdodCBsZWZ0XG4gICAgICAgICAgdmFyIGxheW91dHMgPSBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJyk7XG4gICAgICAgICAgaWYoIWxheW91dHNbbG9jYXRpb25dKSB7IC8vIGxheW91dCBkb2Vzbid0IGV4aXN0IHlldCBmb3IgdGhpcyBsb2NhdGlvblxuICAgICAgICAgICAgbGF5b3V0c1tsb2NhdGlvbl0gPSBuZXcgY2xhc3Nlcy5BdXhVbml0TGF5b3V0KG5vZGUsIGxvY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGxheW91dCBvZiB0aGlzIHNpZGVcbiAgICAgICAgICBsYXlvdXRzW2xvY2F0aW9uXS5hZGRBdXhVbml0KHN0YXRlc2FuZGluZm9zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgdGhhdCBlYWNoIGxheW91dCBoYXMgc3RhdGVzYW5kaW5mb3MgaW4gY29ycmVjdCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlaXIgaW5pdGlhbCBwb3NpdGlvbnNcbiAgICAgICAgZm9yKHZhciBsb2NhdGlvbiBpbiBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJykpIHtcbiAgICAgICAgICBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbbG9jYXRpb25dLnJlb3JkZXJGcm9tUG9zaXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb25Db2xvciA9ICcjZDY3NjE0JztcbiAgdmFyIHNiZ25TdHlsZVNoZWV0ID0gY3l0b3NjYXBlLnN0eWxlc2hlZXQoKVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMS4yNSxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnIzU1NScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZmZmZmZmJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLjUsXG4gICAgICAgICAgICAndGV4dC1vcGFjaXR5JzogMSxcbiAgICAgICAgICAgICdvcGFjaXR5JzogMSxcbiAgICAgICAgICAgICdwYWRkaW5nJzogMCxcbiAgICAgICAgICAgICd0ZXh0LXdyYXAnOiAnd3JhcCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbP2Nsb25lbWFya2VyXVtjbGFzcz0ncGVydHVyYmluZyBhZ2VudCddLG5vZGVbP2Nsb25lbWFya2VyXVtjbGFzcz0ndW5zcGVjaWZpZWQgZW50aXR5J11cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogXCJ1cmwoJ1wiICsgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCUzQ3N2ZyUyMHdpZHRoJTNEJTIyMTAwJTIyJTIwaGVpZ2h0JTNEJTIyMTAwJTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMTAwJTIwMTAwJTIyJTIwc3R5bGUlM0QlMjJmaWxsJTNBbm9uZSUzQnN0cm9rZSUzQWJsYWNrJTNCc3Ryb2tlLXdpZHRoJTNBMCUzQiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyMiUyMCUzRSUzQ3JlY3QlMjB4JTNEJTIyMCUyMiUyMHklM0QlMjIwJTIyJTIwd2lkdGglM0QlMjIxMDAlMjIlMjBoZWlnaHQlM0QlMjIxMDAlMjIlMjBzdHlsZSUzRCUyMmZpbGwlM0ElMjNhOWE5YTklMjIvJTNFJTIwJTNDL3N2ZyUzRScgKyBcIicpXCIsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogJzEwMCUnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtd2lkdGgnOiAnMTAwJScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnMjUlJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdub25lJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2Nsb25lbWFya2VyJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZWxlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NoYXBlJzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDeVNoYXBlKGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NvbnRlbnQnOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEVsZW1lbnRDb250ZW50KGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0TGFiZWxUZXh0U2l6ZShlbGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J2Fzc29jaWF0aW9uJ10sW2NsYXNzPSdkaXNzb2NpYXRpb24nXSxbY2xhc3M9J2FuZCddLFtjbGFzcz0nb3InXSxbY2xhc3M9J25vdCddLFtjbGFzcz0ncHJvY2VzcyddLFtjbGFzcz0nb21pdHRlZCBwcm9jZXNzJ10sW2NsYXNzPSd1bmNlcnRhaW4gcHJvY2VzcyddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnc2hhcGUtcG9seWdvbi1wb2ludHMnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCA9PT0gdHJ1ZSAmJiBlbGUuZGF0YSgncG9ydHMnKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcG9ydHMgb2YgdGhlIGVkZ2UgYXJlIHN5bWV0cmljIGFjY29yZGluZyB0byB0aGUgbm9kZSBjZW50ZXIgc28ganVzdCBjaGVja2luZyBvbmUgcG9ydCBpcyBlbm91Z2ggZm9yIHVzXG4gICAgICAgICAgICAgICAgdmFyIHBvcnQgPSBlbGUuZGF0YSgncG9ydHMnKVswXTsgXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBvcnRzIGFyZSBsb2NhdGVkIGFib3ZlL2JlbG93IG9mIHRoZSBub2RlIHRoZW4gdGhlIG9yaWVudGF0aW9uIGlzICd2ZXJ0aWNhbCcgZWxzZSBpdCBpcyAnaG9yaXpvbnRhbCdcbiAgICAgICAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBwb3J0LnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBoYWxmIHdpZHRoIG9mIHRoZSBhY3R1YWwgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHNcbiAgICAgICAgICAgICAgICB2YXIgc2hhcGVIVyA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gNTAgLyBNYXRoLmFicyhwb3J0LnkpIDogNTAgLyBNYXRoLmFicyhwb3J0LngpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2xhc3Mgb2YgdGhlIG5vZGVcbiAgICAgICAgICAgICAgICB2YXIgX2NsYXNzID0gZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgICAgICAgICAgLy8gSWYgY2xhc3MgaXMgb25lIG9mIHByb2Nlc3MsIG9taXR0ZWQgcHJvY2VzcyBvciB1bmNlcnRhaW4gcHJvY2VzcyB0aGVuIHRoZSB0eXBlIG9mIGFjdHVhbCBzaGFwZSBpcyAncmVjdGFuZ2xlJyBlbHNlIGl0IGlzICdjaXJjbGUnXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBfY2xhc3MuZW5kc1dpdGgoJ3Byb2Nlc3MnKSA/ICdyZWN0YW5nbGUnIDogJ2NpcmNsZSc7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBwb2x5Z29uIHN0cmluZyB3aXRoIGFib3ZlIHBhcmFtZXRlcnMgYW5kIHJldHVybiBpdFxuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVNoYXBlV2l0aFBvcnRTdHJpbmcoMC4wMSwgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaXMgbm90IGV4cGVjdGVkIHRvIGhhdmUgYSBwb3lnb25pYWwgc2hhcGUgKEJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSAyIHBvcnRzKSBqdXN0IHJldHVybiBhIHRyaXZpYWwgc3RyaW5nIGhlcmUgbm90IHRvIGhhdmUgYSBydW4gdGltZSBidWdcbiAgICAgICAgICAgICAgcmV0dXJuICctMSAtMSAxIDEgMSAwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J3BlcnR1cmJpbmcgYWdlbnQnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAtMC41LCAwLCAgLTEsIDEsICAgMSwgMSwgICAwLjUsIDAsIDEsIC0xJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZVtjbGFzcz0ndGFnJ11cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMC4yNSwgLTEsICAgMSwgMCwgICAgMC4yNSwgMSwgICAgLTEsIDEnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFtjbGFzc149J2NvbXBsZXgnXVwiKSAvLyBzdGFydCB3aXRoIGNvbXBsZXhcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAndGV4dC1tYXJnaW4teSc6IGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q29tcGxleE1hcmdpbixcbiAgICAgICAgICAgICdwYWRkaW5nJzogZWxlbWVudFV0aWxpdGllcy5nZXRDb21wbGV4UGFkZGluZyxcbiAgICAgICAgICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycgOiAnZXhjbHVkZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdjb21wYXJ0bWVudCddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMy4yNSxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ2JvdHRvbScsXG4gICAgICAgICAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICd0ZXh0LW1hcmdpbi15JyA6IC0xICogb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZyxcbiAgICAgICAgICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycgOiAnZXhjbHVkZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFtjbGFzcz0nY29tcGFydG1lbnQnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3BhZGRpbmcnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MoKSArIG9wdGlvbnMuZXh0cmFDb21wYXJ0bWVudFBhZGRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdzdWJtYXAnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIuMjUsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMCxcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAndGV4dC1tYXJnaW4teScgOiAtMSAqIG9wdGlvbnMuZXh0cmFDb21wYXJ0bWVudFBhZGRpbmcsXG4gICAgICAgICAgICAnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnIDogJ2V4Y2x1ZGUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbY2xhc3M9J3N1Ym1hcCddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAncGFkZGluZyc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ3JhcGhVdGlsaXRpZXMuZ2V0Q29tcG91bmRQYWRkaW5ncygpICsgb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6Y2hpbGRsZXNzW2Jib3hdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnd2lkdGgnOiAnZGF0YShiYm94LncpJyxcbiAgICAgICAgICAgICdoZWlnaHQnOiAnZGF0YShiYm94LmgpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluSGVpZ2h0XVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzVG9wXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQtYmlhcy10b3AnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzVG9wJykgKyAnJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzQm90dG9tXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzQm90dG9tJykgKyAnJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5XaWR0aF1cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdtaW4td2lkdGgnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5XaWR0aCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoQmlhc0xlZnRdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnbWluLXdpZHRoLWJpYXMtbGVmdCc6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoJ21pbldpZHRoQmlhc0xlZnQnKSArICclJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoQmlhc1JpZ2h0XVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi13aWR0aC1iaWFzLXJpZ2h0JzogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgnbWluV2lkdGhCaWFzUmlnaHQnKSArICclJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGUuY3ktZXhwYW5kLWNvbGxhcHNlLWNvbGxhcHNlZC1ub2RlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ2Rhc2hlZCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6c2VsZWN0ZWRcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzAwMCcsXG4gICAgICAgICAgICAndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOmFjdGl2ZVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDAuNywgJ292ZXJsYXktY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICdvdmVybGF5LXBhZGRpbmcnOiAnMTQnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM1NTUnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1maWxsJzogJ2hvbGxvdycsXG4gICAgICAgICAgICAnc291cmNlLWFycm93LWZpbGwnOiAnaG9sbG93JyxcbiAgICAgICAgICAgICd3aWR0aCc6IDEuMjUsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyM1NTUnLFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjNTU1JyxcbiAgICAgICAgICAgICd0ZXh0LWJvcmRlci1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGVsZS5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNvbG9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuY3NzKCdsaW5lLWNvbG9yJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NvbG9yJzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICBpZiAoZWxlLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uQ29sb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2xpbmUtY29sb3InKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYXJyb3ctc2NhbGUnOiAxLjI1XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlLmN5LWV4cGFuZC1jb2xsYXBzZS1tZXRhLWVkZ2VcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyNDNEM0QzQnLFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjQzRDNEM0JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0M0QzRDNCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2U6c2VsZWN0ZWRcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG4gICAgICAgICAgICAnc291cmNlLWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3JcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2U6YWN0aXZlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMC43LCAnb3ZlcmxheS1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuICAgICAgICAgICAgJ292ZXJsYXktcGFkZGluZyc6ICc4J1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiZWRnZVtjYXJkaW5hbGl0eSA+IDBdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGV4dC1yb3RhdGlvbic6ICdhdXRvcm90YXRlJyxcbiAgICAgICAgICAgICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgICd0ZXh0LWJvcmRlci1vcGFjaXR5JzogJzEnLFxuICAgICAgICAgICAgJ3RleHQtYm9yZGVyLXdpZHRoJzogJzEnLFxuICAgICAgICAgICAgJ3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICd3aGl0ZScsXG4gICAgICAgICAgICAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknOiAnMSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J2NvbnN1bXB0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NvdXJjZS1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG4gICAgICAgICAgICAnc291cmNlLXRleHQtb2Zmc2V0JzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDYXJkaW5hbGl0eURpc3RhbmNlKGVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlW2NsYXNzPSdwcm9kdWN0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3RhcmdldC1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3RhcmdldC10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG4gICAgICAgICAgICAndGFyZ2V0LXRleHQtb2Zmc2V0JzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDYXJkaW5hbGl0eURpc3RhbmNlKGVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlW2NsYXNzXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1zaGFwZSc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q3lBcnJvd1NoYXBlKGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1zaGFwZSc6ICdub25lJyxcbiAgICAgICAgICAgICdzb3VyY2UtZW5kcG9pbnQnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RW5kUG9pbnQoZWxlLCAnc291cmNlJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3RhcmdldC1lbmRwb2ludCc6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRFbmRQb2ludChlbGUsICd0YXJnZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J2luaGliaXRpb24nXSxbY2xhc3M9J25lZ2F0aXZlIGluZmx1ZW5jZSddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWZpbGwnOiAnZmlsbGVkJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiZWRnZVtjbGFzcz0ncHJvZHVjdGlvbiddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWZpbGwnOiAnZmlsbGVkJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiY29yZVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NlbGVjdGlvbi1ib3gtY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAnMC4yJywgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogc2VsZWN0aW9uQ29sb3JcbiAgICAgICAgICB9KTtcbn07XG4iLCIvKlxuICogUmVuZGVyIHNiZ24gc3BlY2lmaWMgc2hhcGVzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGN5dG9zY2FwZS5qcyBjb3JlXG4gKi9cblxudmFyIHRydW5jYXRlVGV4dCA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy90ZXh0LXV0aWxpdGllcycpLnRydW5jYXRlVGV4dDtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIGN5dG9zY2FwZSA9IGxpYnMuY3l0b3NjYXBlO1xuXG52YXIgY3lNYXRoID0gbWF0aCA9IGN5dG9zY2FwZS5tYXRoO1xudmFyIGN5QmFzZU5vZGVTaGFwZXMgPSBjeXRvc2NhcGUuYmFzZU5vZGVTaGFwZXM7XG52YXIgY3lTdHlsZVByb3BlcnRpZXMgPSBjeXRvc2NhcGUuc3R5bGVQcm9wZXJ0aWVzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyICQkID0gY3l0b3NjYXBlO1xuICBcbiAgLy8gVGFrZW4gZnJvbSBjeXRvc2NhcGUuanMgYW5kIG1vZGlmaWVkXG4gIHZhciBkcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzICl7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG4gIFxuICAvLyBUYWtlbiBmcm9tIGN5dG9zY2FwZS5qc1xuICB2YXIgZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzICl7XG5cbiAgICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICBjb250ZXh0Lm1vdmVUbyggeCArIGhhbGZXICogcG9pbnRzWzBdLCB5ICsgaGFsZkggKiBwb2ludHNbMV0gKTtcblxuICAgIGZvciggdmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKyApe1xuICAgICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqIHBvaW50c1sgaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbIGkgKiAyICsgMV0gKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuICBcbiAgdmFyIHNiZ25TaGFwZXMgPSAkJC5zYmduLnNiZ25TaGFwZXMgPSB7XG4gICAgJ3NvdXJjZSBhbmQgc2luayc6IHRydWUsXG4gICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAnY29tcGxleCc6IHRydWUsXG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdzaW1wbGUgY2hlbWljYWwnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICB9O1xuXG4gIHZhciB0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlcyA9ICQkLnNiZ24udG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXMgPSB7XG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSc6IHRydWUsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICB9O1xuXG4gIGN5TWF0aC5jYWxjdWxhdGVEaXN0YW5jZSA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50Mikge1xuICAgIHZhciBkaXN0YW5jZSA9IE1hdGgucG93KHBvaW50MVswXSAtIHBvaW50MlswXSwgMikgKyBNYXRoLnBvdyhwb2ludDFbMV0gLSBwb2ludDJbMV0sIDIpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoZGlzdGFuY2UpO1xuICB9O1xuXG4gICQkLnNiZ24uY29sb3JzID0ge1xuICAgIGNsb25lOiBcIiNhOWE5YTlcIlxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3MgPSBmdW5jdGlvbiAobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgIHZhciBsYXlvdXRzID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpO1xuXG4gICAgZm9yICh2YXIgc2lkZSBpbiBsYXlvdXRzKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0c1tzaWRlXTtcbiAgICAgIGxheW91dC5kcmF3KGNvbnRleHQpO1xuICAgIH1cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5BZlNoYXBlRm4gPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdHlwZSkge1xuICAgIFxuICAgIGlmICggdHlwZSA9PSBcIkJBIG1hY3JvbW9sZWN1bGVcIil7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydyb3VuZHJlY3RhbmdsZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCIpe1xuXHQgICAgY3lCYXNlTm9kZVNoYXBlc1snZWxsaXBzZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgvMiwgd2lkdGgvMik7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgbnVjbGVpYyBhY2lkIGZlYXR1cmVcIil7XG5cdCAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgeCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIHR5cGUgPT0gXCJCQSB1bnNwZWNpZmllZCBlbnRpdHlcIil7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydlbGxpcHNlJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIHR5cGUgPT0gXCJCQSBjb21wbGV4XCIpe1xuXHQgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVDb21wbGV4U2hhcGVQb2ludHMoaGVpZ2h0LzIsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgcGVydHVyYmluZyBhZ2VudFwiKXtcblx0ICAgIHZhciBwb2ludHMgPSBbLTEsIC0xLCAgIC0wLjUsIDAsICAtMSwgMSwgICAxLCAxLCAgIDAuNSwgMCwgMSwgLTFdO1xuXHQgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgfVxuICAgIGVsc2V7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydyZWN0YW5nbGUnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLkFmU2hhcGVBcmdzRm4gPSBmdW5jdGlvbiAoc2VsZil7XG5cdCAgcmV0dXJuIFtzZWxmLmJib3gudywgc2VsZi5iYm94LmgsIHNlbGYucGFyZW50LmRhdGEoXCJjbGFzc1wiKV07XG4gIH1cblxuXG4gICQkLnNiZ24ubnVjbGVpY0FjaWRDaGVja1BvaW50ID0gZnVuY3Rpb24gKHgsIHksIGNlbnRlclgsIGNlbnRlclksIG5vZGUsIHRocmVzaG9sZCwgcG9pbnRzLCBjb3JuZXJSYWRpdXMpIHtcbiAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgdmFyIGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgIC8vY2hlY2sgcmVjdGFuZ2xlIGF0IHRvcFxuICAgIGlmIChjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHBvaW50cyxcbiAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclkgLSBjb3JuZXJSYWRpdXMgLyAyLCB3aWR0aCwgaGVpZ2h0IC0gY29ybmVyUmFkaXVzIC8gMywgWzAsIC0xXSxcbiAgICAgICAgICAgIHBhZGRpbmcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIHJlY3RhbmdsZSBhdCBib3R0b21cbiAgICBpZiAoY3lNYXRoLnBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBwb2ludHMsXG4gICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cyAvIDIsIHdpZHRoIC0gMiAqIGNvcm5lclJhZGl1cywgY29ybmVyUmFkaXVzLCBbMCwgLTFdLFxuICAgICAgICAgICAgcGFkZGluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgZWxsaXBzZXNcbiAgICB2YXIgY2hlY2tJbkVsbGlwc2UgPSBmdW5jdGlvbiAoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICAgICAgeCAtPSBjZW50ZXJYO1xuICAgICAgeSAtPSBjZW50ZXJZO1xuXG4gICAgICB4IC89ICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHkgLz0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcblxuICAgICAgcmV0dXJuIChNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpIDw9IDEpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LFxuICAgICAgICAgICAgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICAgICAgY29ybmVyUmFkaXVzICogMiwgY29ybmVyUmFkaXVzICogMiwgcGFkZGluZykpIHtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSxcbiAgICAgICAgICAgIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNvcm5lclJhZGl1cyAqIDIsIGNvcm5lclJhZGl1cyAqIDIsIHBhZGRpbmcpKSB7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvL3dlIG5lZWQgdG8gZm9yY2Ugb3BhY2l0eSB0byAxIHNpbmNlIHdlIG1pZ2h0IGhhdmUgc3RhdGUgYW5kIGluZm8gYm94ZXMuXG4gIC8vaGF2aW5nIG9wYXF1ZSBub2RlcyB3aGljaCBoYXZlIHN0YXRlIGFuZCBpbmZvIGJveGVzIGdpdmVzIHVucGxlYXNlbnQgcmVzdWx0cy5cbiAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZSA9IGZ1bmN0aW9uIChub2RlLCBjb250ZXh0KSB7XG4gICAgdmFyIHBhcmVudE9wYWNpdHkgPSBub2RlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbiAgICBpZiAocGFyZW50T3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJyZ2JhKFwiXG4gICAgICAgICAgICArIG5vZGUuX3ByaXZhdGUuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLnZhbHVlWzBdICsgXCIsXCJcbiAgICAgICAgICAgICsgbm9kZS5fcHJpdmF0ZS5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0udmFsdWVbMV0gKyBcIixcIlxuICAgICAgICAgICAgKyBub2RlLl9wcml2YXRlLnN0eWxlW1wiYmFja2dyb3VuZC1jb2xvclwiXS52YWx1ZVsyXSArIFwiLFwiXG4gICAgICAgICAgICArICgxICogbm9kZS5jc3MoJ29wYWNpdHknKSAqIHBhcmVudE9wYWNpdHkpICsgXCIpXCI7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3U2ltcGxlQ2hlbWljYWxQYXRoID0gZnVuY3Rpb24gKFxuICAgICAgICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIC8vdmFyIGNvcm5lclJhZGl1cyA9ICQkLm1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9IE1hdGgubWluKGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKHgsIHktaGFsZkhlaWdodCk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aCwgeS1oYWxmSGVpZ2h0LCB4K2hhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGgsIHkraGFsZkhlaWdodCwgeCwgeStoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5K2hhbGZIZWlnaHQsIHgtaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5LWhhbGZIZWlnaHQsIHgsIHktaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBKb2luIGxpbmVcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5LWhhbGZIZWlnaHQpO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsID0gZnVuY3Rpb24gKFxuICAgICAgICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbFBhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgb3BhY2l0eSkge1xuICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG4gICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAgIHZhciBtYXJrZXJCZWdpblggPSBjZW50ZXJYIC0gd2lkdGgvMiAqIE1hdGguc2luKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJCZWdpblkgPSBjZW50ZXJZICsgaGVpZ2h0LzIgKiBNYXRoLmNvcyhNYXRoLlBJIC8gMyk7XG4gICAgICB2YXIgbWFya2VyRW5kWCA9IGNlbnRlclg7XG4gICAgICB2YXIgbWFya2VyRW5kWSA9IG1hcmtlckJlZ2luWTtcblxuICAgICAgY29udGV4dC5tb3ZlVG8obWFya2VyQmVnaW5YLCBtYXJrZXJCZWdpblkpO1xuICAgICAgY29udGV4dC5saW5lVG8obWFya2VyRW5kWCwgbWFya2VyRW5kWSk7XG4gICAgICBjb250ZXh0LmFyYyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aC8yLCAzICogTWF0aC5QSSAvIDYsIDUgKiBNYXRoLlBJIC8gNik7XG5cbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gIH1cbiAgO1xuXG4gIGZ1bmN0aW9uIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBvcGFjaXR5KSB7XG4gICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgdmFyIG1hcmtlckJlZ2luWCA9IGNlbnRlclg7XG4gICAgICB2YXIgbWFya2VyQmVnaW5ZID0gY2VudGVyWSArIGhlaWdodC8yICogTWF0aC5jb3MoTWF0aC5QSSAvIDMpO1xuICAgICAgdmFyIG1hcmtlckVuZFggPSBjZW50ZXJYICsgd2lkdGgvMiAqIE1hdGguc2luKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJFbmRZID0gbWFya2VyQmVnaW5ZO1xuXG4gICAgICBjb250ZXh0Lm1vdmVUbyhtYXJrZXJCZWdpblgsIG1hcmtlckJlZ2luWSk7XG4gICAgICBjb250ZXh0LmxpbmVUbyhtYXJrZXJFbmRYLCBtYXJrZXJFbmRZKTtcbiAgICAgIGNvbnRleHQuYXJjKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLzIsIE1hdGguUEkgLyA2LCAzICogTWF0aC5QSSAvIDYpO1xuXG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjeUJhc2VOb2RlU2hhcGVzWydlbGxpcHNlJ10uZHJhd1BhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUgPSBmdW5jdGlvbiAoY29udGV4dCwgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgbGVmdCA9IGNlbnRlclggLSBoYWxmV2lkdGgsIHJpZ2h0ID0gY2VudGVyWCArIGhhbGZXaWR0aDtcbiAgICB2YXIgYm90dG9tID0gY2VudGVyWSAtIGhhbGZIZWlnaHQsIHRvcCA9IGNlbnRlclkgKyBoYWxmSGVpZ2h0O1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICBjb250ZXh0Lm1vdmVUbyhsZWZ0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBjZW50ZXJZKTtcbiAgICBjb250ZXh0LmFyY1RvKHJpZ2h0LCB0b3AsIGNlbnRlclgsIHRvcCwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmFyY1RvKGxlZnQsIHRvcCwgbGVmdCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmxpbmVUbyhsZWZ0LCBib3R0b20pO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAvKlxuICAgKiBDb2RlIHRha2VuIGZyb20gaHR0cHM6Ly9qc3BlcmYuY29tL3N0cmluZy1wcm90b3R5cGUtZW5kc3dpdGhcbiAgICogRGlyZWN0IGltcGxlbWVudGF0aW9uIHNlZW1zIHRvIHdvcmsgYmV0dGVyLlxuICAgKiBVc2luZyB0aGlzIGltcHJvdmVzIGlzTXVsdGltZXIoKSBwZXJmb3JtYW5jZS5cbiAgICogTWFrZXMgaXQgdGFrZSAwLjEgb3IgMC4yJSBsZXNzIHRpbWUgZnJvbSB0aGUgd2hvbGVcbiAgICogbG9hZGluZyBwcm9jZXNzLCBkb3duIGZyb20gfjAuNCUgaW5pdGlhbGx5LlxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBwYXR0ZXJuKSB7XG4gICAgZm9yICh2YXIgaSA9IHBhdHRlcm4ubGVuZ3RoLCBsID0gc3RyLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKHN0ci5jaGFyQXQoLS1sKSAhPSBwYXR0ZXJuLmNoYXJBdChpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgJCQuc2Jnbi5pc011bHRpbWVyID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgc2JnbkNsYXNzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzO1xuICAgIGlmIChzYmduQ2xhc3MgJiYgZW5kc1dpdGgoc2JnbkNsYXNzLCBcIm11bHRpbWVyXCIpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBpcyBjcmVhdGVkIHRvIGhhdmUgc2FtZSBjb3JuZXIgbGVuZ3RoIHdoZW5cbiAgLy9jb21wbGV4J3Mgd2lkdGggb3IgaGVpZ2h0IGlzIGNoYW5nZWRcbiAgJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyA9IGZ1bmN0aW9uIChjb3JuZXJMZW5ndGgsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAvL2NwIHN0YW5kcyBmb3IgY29ybmVyIHByb3BvcnRpb25cbiAgICB2YXIgY3BYID0gTWF0aC5taW4oY29ybmVyTGVuZ3RoLCAwLjUgKiB3aWR0aCkgLyB3aWR0aDtcbiAgICB2YXIgY3BZID0gTWF0aC5taW4oY29ybmVyTGVuZ3RoLCAwLjUgKiBoZWlnaHQpIC8gaGVpZ2h0O1xuXG4gICAgdmFyIGNvbXBsZXhQb2ludHMgPSBbLTEgKyBjcFgsIC0xLCAtMSwgLTEgKyBjcFksIC0xLCAxIC0gY3BZLCAtMSArIGNwWCxcbiAgICAgIDEsIDEgLSBjcFgsIDEsIDEsIDEgLSBjcFksIDEsIC0xICsgY3BZLCAxIC0gY3BYLCAtMV07XG5cbiAgICByZXR1cm4gY29tcGxleFBvaW50cztcbiAgfTtcblxuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnc291cmNlIGFuZCBzaW5rJyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdudWNsZWljIGFjaWQgZmVhdHVyZScpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnY29tcGxleCcpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnbWFjcm9tb2xlY3VsZScpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnc2ltcGxlIGNoZW1pY2FsJyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdiaW9sb2dpY2FsIGFjdGl2aXR5Jyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdjb21wYXJ0bWVudCcpO1xuXG4gICQkLnNiZ24ucmVnaXN0ZXJTYmduTm9kZVNoYXBlcyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0gPSB7XG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICAvL2FkZCBtdWx0aW1lciBzaGFwZVxuICAgICAgICAgICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsKGNvbnRleHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgICAkJC5zYmduLmNsb25lTWFya2VyLnNpbXBsZUNoZW1pY2FsKGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGggLSBwYWRkaW5nLCBoZWlnaHQgLSBwYWRkaW5nLCBjbG9uZU1hcmtlciwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuY3NzKCdiYWNrZ3JvdW5kLW9wYWNpdHknKSk7XG5cbiAgICAgICAgICAvL2NvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAkJC5zYmduLmNsb25lTWFya2VyLnNpbXBsZUNoZW1pY2FsKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLSBwYWRkaW5nLCBoZWlnaHQgLSBwYWRkaW5nLCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuLy8gICAgICAgIHZhciBub2RlUHJvcCA9IHsnbGFiZWwnOiBsYWJlbCwgJ2NlbnRlclgnOiBjZW50ZXJYLCAnY2VudGVyWSc6IGNlbnRlclksXG4vLyAgICAgICAgICAnb3BhY2l0eSc6IG5vZGUuX3ByaXZhdGUuc3R5bGVbJ3RleHQtb3BhY2l0eSddLnZhbHVlLCAnd2lkdGgnOiBub2RlLndpZHRoKCksICdoZWlnaHQnOiBub2RlLmhlaWdodCgpfTtcbi8vICAgICAgICAkJC5zYmduLmRyYXdEeW5hbWljTGFiZWxUZXh0KGNvbnRleHQsIG5vZGVQcm9wKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcblxuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wic2ltcGxlIGNoZW1pY2FsXCJdLm11bHRpbWVyUGFkZGluZztcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzID0gW107XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzID0gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMuY29uY2F0KG5vZGVJbnRlcnNlY3RMaW5lcywgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0ubXVsdGltZXJQYWRkaW5nO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KHgsIHksXG4gICAgICAgICAgICAgICAgcGFkZGluZywgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZKTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckNoZWNrUG9pbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVyQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoeCwgeSxcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlQ2hlY2tQb2ludCB8fCBzdGF0ZUFuZEluZm9DaGVja1BvaW50IHx8IG11bHRpbWVyQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDQsIDApLFxuICAgICAgbXVsdGltZXJQYWRkaW5nOiA1LFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wibWFjcm9tb2xlY3VsZVwiXS5tdWx0aW1lclBhZGRpbmc7XG4gICAgICAgIHZhciBjbG9uZU1hcmtlciA9IG5vZGUuX3ByaXZhdGUuZGF0YS5jbG9uZW1hcmtlcjtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubWFjcm9tb2xlY3VsZShjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCB0cnVlLFxuICAgICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuICAgICAgICAgIC8vY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXdSb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubWFjcm9tb2xlY3VsZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBmYWxzZSxcbiAgICAgICAgICAgICAgICBub2RlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5JykpO1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICAkJC5zYmduLmZvcmNlT3BhY2l0eVRvT25lKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAkJC5zYmduLmRyYXdTdGF0ZUFuZEluZm9zKG5vZGUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuXG4vLyAgICAgICAgdmFyIG5vZGVQcm9wID0geydsYWJlbCc6IGxhYmVsLCAnY2VudGVyWCc6IGNlbnRlclgsICdjZW50ZXJZJzogY2VudGVyWSxcbi8vICAgICAgICAgICdvcGFjaXR5Jzogbm9kZS5fcHJpdmF0ZS5zdHlsZVsndGV4dC1vcGFjaXR5J10udmFsdWUsICd3aWR0aCc6IG5vZGUud2lkdGgoKSwgJ2hlaWdodCc6IG5vZGUuaGVpZ2h0KCl9O1xuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZVN0YXRlQW5kSW5mb0JveGVzKFxuICAgICAgICAgICAgICAgIG5vZGUsIHgsIHkpO1xuXG4gICAgICAgIHZhciBub2RlSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cywgcGFkZGluZyk7XG5cbiAgICAgICAgLy9jaGVjayB3aGV0aGVyIHNiZ24gY2xhc3MgaW5jbHVkZXMgbXVsdGltZXIgc3Vic3RyaW5nIG9yIG5vdFxuICAgICAgICB2YXIgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyA9IFtdO1xuICAgICAgICBpZiAoJCQuc2Jnbi5pc011bHRpbWVyKG5vZGUpKSB7XG4gICAgICAgICAgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyA9ICQkLnNiZ24ucm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKFxuICAgICAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cywgcGFkZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMsIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMpO1xuXG4gICAgICAgIHJldHVybiAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludChbeCwgeV0sIGludGVyc2VjdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uICh4LCB5LCBub2RlLCB0aHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0ubXVsdGltZXJQYWRkaW5nO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KHgsIHksIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9DaGVja1BvaW50ID0gJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMoeCwgeSwgbm9kZSxcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVyQ2hlY2tQb2ludCA9IGZhbHNlO1xuICAgICAgICBpZiAoJCQuc2Jnbi5pc011bHRpbWVyKG5vZGUpKSB7XG4gICAgICAgICAgbXVsdGltZXJDaGVja1BvaW50ID0gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGVDaGVja1BvaW50IHx8IHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgfHwgbXVsdGltZXJDaGVja1BvaW50O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXSA9IHtcbiAgICAgIHBvaW50czogW10sXG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBjb3JuZXJMZW5ndGg6IDI0LFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCktIHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgICB2YXIgY29ybmVyTGVuZ3RoID0gY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0uY29ybmVyTGVuZ3RoO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgY2xvbmVNYXJrZXIgPSBub2RlLl9wcml2YXRlLmRhdGEuY2xvbmVtYXJrZXI7XG5cblxuICAgICAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5wb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKGNvcm5lckxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICAvL2FkZCBtdWx0aW1lciBzaGFwZVxuICAgICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyk7XG4gICAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5jb21wbGV4KGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuY3NzKCdiYWNrZ3JvdW5kLW9wYWNpdHknKSk7XG5cbiAgICAgICAgICAvL2NvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5jb21wbGV4KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgLy8kJC5zYmduLmRyYXdDb21wbGV4U3RhdGVBbmRJbmZvKGNvbnRleHQsIG5vZGUsIHN0YXRlQW5kSW5mb3MsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAkJC5zYmduLmRyYXdTdGF0ZUFuZEluZm9zKG5vZGUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgfSxcbi8vICAgICAgaW50ZXJzZWN0TGluZTogY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmludGVyc2VjdExpbmUsXG4vLyAgICAgIGNoZWNrUG9pbnQ6IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50XG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5tdWx0aW1lclBhZGRpbmc7XG4gICAgICAgIHZhciBjb3JuZXJMZW5ndGggPSBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5jb3JuZXJMZW5ndGg7XG5cbiAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ucG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyhjb3JuZXJMZW5ndGgsXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMoXG4gICAgICAgICAgICAgICAgbm9kZSwgeCwgeSk7XG5cbiAgICAgICAgdmFyIG5vZGVJbnRlcnNlY3RMaW5lcyA9IGN5TWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLCBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgIHBhZGRpbmcpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBbXTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ucG9pbnRzLFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICB3aWR0aCAvIDIsIGhlaWdodCAvIDIsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMuY29uY2F0KG5vZGVJbnRlcnNlY3RMaW5lcywgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IChub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSAobm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VGbG9hdChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpKSArIHRocmVzaG9sZDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIGNvcm5lckxlbmd0aCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLmNvcm5lckxlbmd0aDtcblxuICAgICAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5wb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKGNvcm5lckxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB2YXIgbm9kZUNoZWNrUG9pbnQgPSBjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckNoZWNrUG9pbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVyQ2hlY2tQb2ludCA9IGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oeCwgeSxcbiAgICAgICAgICAgICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGVDaGVja1BvaW50IHx8IHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgfHwgbXVsdGltZXJDaGVja1BvaW50O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wibnVjbGVpYyBhY2lkIGZlYXR1cmVcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIDtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubnVjbGVpY0FjaWRGZWF0dXJlKGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIHRydWUsXG4gICAgICAgICAgICAgICAgICBub2RlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5JykpO1xuXG4gICAgICAgICAgLy9jb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCxcbiAgICAgICAgICAgICAgICBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5udWNsZWljQWNpZEZlYXR1cmUoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuLy8gICAgICAgIHZhciBub2RlUHJvcCA9IHsnbGFiZWwnOiBsYWJlbCwgJ2NlbnRlclgnOiBjZW50ZXJYLCAnY2VudGVyWSc6IGNlbnRlclksXG4vLyAgICAgICAgICAnb3BhY2l0eSc6IG5vZGUuX3ByaXZhdGUuc3R5bGVbJ3RleHQtb3BhY2l0eSddLnZhbHVlLCAnd2lkdGgnOiBub2RlLndpZHRoKCksICdoZWlnaHQnOiBub2RlLmhlaWdodCgpfTtcblxuLy8gICAgICAgICQkLnNiZ24uZHJhd0R5bmFtaWNMYWJlbFRleHQoY29udGV4dCwgbm9kZVByb3ApO1xuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIH0sXG4gICAgICBkcmF3UGF0aDogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcblxuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gJCQuc2Jnbi5udWNsZWljQWNpZEludGVyc2VjdGlvbkxpbmUobm9kZSxcbiAgICAgICAgICAgICAgICB4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBbXTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSAkJC5zYmduLm51Y2xlaWNBY2lkSW50ZXJzZWN0aW9uTGluZShub2RlLFxuICAgICAgICAgICAgICAgICAgeCwgeSwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMsXG4gICAgICAgICAgICAgICAgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wibnVjbGVpYyBhY2lkIGZlYXR1cmVcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9ICQkLnNiZ24ubnVjbGVpY0FjaWRDaGVja1BvaW50KHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgbm9kZSwgdGhyZXNob2xkLCB0aGlzLnBvaW50cywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgPSAkJC5zYmduLmNoZWNrUG9pbnRTdGF0ZUFuZEluZm9Cb3hlcyh4LCB5LCBub2RlLFxuICAgICAgICAgICAgICAgIHRocmVzaG9sZCk7XG5cbiAgICAgICAgLy9jaGVjayB3aGV0aGVyIHNiZ24gY2xhc3MgaW5jbHVkZXMgbXVsdGltZXIgc3Vic3RyaW5nIG9yIG5vdFxuICAgICAgICB2YXIgbXVsdGltZXJDaGVja1BvaW50ID0gZmFsc2U7XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICBtdWx0aW1lckNoZWNrUG9pbnQgPSAkJC5zYmduLm51Y2xlaWNBY2lkQ2hlY2tQb2ludCh4LCB5LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIG5vZGUsIHRocmVzaG9sZCwgdGhpcy5wb2ludHMsIGNvcm5lclJhZGl1cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCB8fCBtdWx0aW1lckNoZWNrUG9pbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wic291cmNlIGFuZCBzaW5rXCJdID0ge1xuICAgICAgcG9pbnRzOiBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50cyg0LCAwKSxcbiAgICAgIGRyYXc6IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcblxuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBwdHMgPSBjeUJhc2VOb2RlU2hhcGVzW1wic291cmNlIGFuZCBzaW5rXCJdLnBvaW50cztcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgICQkLnNiZ24uZHJhd0VsbGlwc2UoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIHZhciBzY2FsZVggPSB3aWR0aCAqIE1hdGguc3FydCgyKSAvIDIsIHNjYWxlWSA9ICBoZWlnaHQgKiBNYXRoLnNxcnQoMikgLyAyO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKGNlbnRlclggKyBzY2FsZVggKiBwdHNbMl0sIGNlbnRlclkgKyBzY2FsZVkgKiBwdHNbM10pO1xuICAgICAgICBjb250ZXh0LmxpbmVUbyhjZW50ZXJYICsgc2NhbGVYICogcHRzWzZdLCBjZW50ZXJZICsgc2NhbGVZICogcHRzWzddKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lLFxuICAgICAgY2hlY2tQb2ludDogY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uY2hlY2tQb2ludFxuICAgIH07XG4gICAgY3lCYXNlTm9kZVNoYXBlc1tcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBsYWJlbCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5sYWJlbDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuXG4gICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY3lCYXNlTm9kZVNoYXBlc1tcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIl0ucG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcblxuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUFmSW5mb0JveGVzKFxuICAgICAgICAgICAgICAgIG5vZGUsIHgsIHkpO1xuICAgICAgIHZhciBub2RlSW50ZXJzZWN0TGluZXMgPSBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLCBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgIHBhZGRpbmcpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIHJldHVybiAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludChbeCwgeV0sIGludGVyc2VjdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uICh4LCB5LCBub2RlLCB0aHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wYXJ0bWVudFwiXSA9IHtcblxuICAgICAgbmFtZTogJ2NvbXBhcnRtZW50JyxcbiAgICAgIHBvaW50czogbWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoIDQsIDAgKSxcbiAgICAgIGRyYXc6IGZ1bmN0aW9uKCBjb250ZXh0LCBub2RlKXtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhZGRpbmc7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5nO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgZHJhd0JhcnJlbFBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCApO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcblxuICAgICAgfSxcblxuICAgICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24obm9kZSwgeCwgeSl7XG5cbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBiUHRzID0gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMoIHdpZHRoICsgMipwYWRkaW5nLCBoZWlnaHQgKyAyKnBhZGRpbmcsIGNlbnRlclgsIGNlbnRlclkgKTtcblxuICAgICAgICB2YXIgcHRzID0gW10uY29uY2F0KGJQdHMudG9wTGVmdCwgYlB0cy50b3BSaWdodCwgYlB0cy5ib3R0b21SaWdodCwgYlB0cy5ib3R0b21MZWZ0KTtcblxuICAgICAgICByZXR1cm4gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgcHRzLCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgICB9LFxuXG4gICAgICBjaGVja1BvaW50OiBmdW5jdGlvbih4LCB5LCBub2RlLCB0aHJlc2hvbGQgKXtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IG1hdGguZ2V0QmFycmVsQ3VydmVDb25zdGFudHMoIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgICBpZiggbWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHRoaXMucG9pbnRzLFxuICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogIGhPZmZzZXQsIFswLCAtMV0sIHBhZGRpbmcgKSApe1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgICBpZiggbWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHRoaXMucG9pbnRzLFxuICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gMiAqIHdPZmZzZXQsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyApICl7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmFycmVsQ3VydmVQdHMgPSBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyggd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuXG4gICAgICAgIHZhciBnZXRDdXJ2ZVQgPSBmdW5jdGlvbiAoeCwgeSwgY3VydmVQdHMpIHtcbiAgICAgICAgICB2YXIgeDAgPSBjdXJ2ZVB0c1sgNCBdO1xuICAgICAgICAgIHZhciB4MSA9IGN1cnZlUHRzWyAyIF07XG4gICAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbIDAgXTtcbiAgICAgICAgICB2YXIgeTAgPSBjdXJ2ZVB0c1sgNSBdO1xuICAgICAgICAgIC8vIHZhciB5MSA9IGN1cnZlUHRzWyAzIF07XG4gICAgICAgICAgdmFyIHkyID0gY3VydmVQdHNbIDEgXTtcblxuICAgICAgICAgIHZhciB4TWluID0gTWF0aC5taW4oIHgwLCB4MiApO1xuICAgICAgICAgIHZhciB4TWF4ID0gTWF0aC5tYXgoIHgwLCB4MiApO1xuICAgICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oIHkwLCB5MiApO1xuICAgICAgICAgIHZhciB5TWF4ID0gTWF0aC5tYXgoIHkwLCB5MiApO1xuXG4gICAgICAgICAgaWYoIHhNaW4gPD0geCAmJiB4IDw9IHhNYXggICYmIHlNaW4gPD0geSAmJiB5IDw9IHlNYXggKXtcbiAgICAgICAgICAgIHZhciBjb2VmZiA9IG1hdGguYmV6aWVyUHRzVG9RdWFkQ29lZmYoIHgwLCB4MSwgeDIgKTtcbiAgICAgICAgICAgIHZhciByb290cyA9IG1hdGguc29sdmVRdWFkcmF0aWMoIGNvZWZmWzBdLCBjb2VmZlsxXSwgY29lZmZbMl0sIHggKTtcblxuICAgICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24oIHIgKXtcbiAgICAgICAgICAgICAgcmV0dXJuIDAgPD0gciAmJiByIDw9IDE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYoIHZhbGlkUm9vdHMubGVuZ3RoID4gMCApe1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRSb290c1sgMCBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoIGJhcnJlbEN1cnZlUHRzICk7XG4gICAgICAgIGZvciggdmFyIGkgPSAwOyBpIDwgY3VydmVSZWdpb25zLmxlbmd0aDsgaSsrICl7XG4gICAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1sgaSBdO1xuICAgICAgICAgIHZhciBjb3JuZXJQdHMgPSBiYXJyZWxDdXJ2ZVB0c1sgY29ybmVyIF07XG4gICAgICAgICAgdmFyIHQgPSBnZXRDdXJ2ZVQoIHgsIHksIGNvcm5lclB0cyApO1xuXG4gICAgICAgICAgaWYoIHQgPT0gbnVsbCApeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgdmFyIHkwID0gY29ybmVyUHRzWyA1IF07XG4gICAgICAgICAgdmFyIHkxID0gY29ybmVyUHRzWyAzIF07XG4gICAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWyAxIF07XG4gICAgICAgICAgdmFyIGJlelkgPSBtYXRoLnFiZXppZXJBdCggeTAsIHkxLCB5MiwgdCApO1xuXG4gICAgICAgICAgaWYoIGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkgKXtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiggY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSApe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJvbGRDb21wYXJ0bWVudFwiXSA9IHtcbiAgICAgIHBvaW50czogY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSggNCwgMCApLFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhZGRpbmc7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5nO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgICQkLnNiZ24uZm9yY2VPcGFjaXR5VG9PbmUobm9kZSwgY29udGV4dCk7XG4gICAgICAgICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3Mobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG5cbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gY3lNYXRoLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgICBwYWRkaW5nICk7XG5cbiAgICAgICAgdmFyIGludGVyc2VjdGlvbnMgPSBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcy5jb25jYXQobm9kZUludGVyc2VjdExpbmVzKTtcblxuICAgICAgICByZXR1cm4gJCQuc2Jnbi5jbG9zZXN0SW50ZXJzZWN0aW9uUG9pbnQoW3gsIHldLCBpbnRlcnNlY3Rpb25zKTtcbiAgICAgIH0sXG4gICAgICBjaGVja1BvaW50OiBmdW5jdGlvbiAoeCwgeSwgbm9kZSwgdGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSArIHRocmVzaG9sZDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgICAgICB2YXIgbm9kZUNoZWNrUG9pbnQgPSBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgLy8kJC5zYmduLmRyYXdFbGxpcHNlUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvL2NvbnRleHQuZmlsbCgpO1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2VsbGlwc2UnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9O1xuXG4gICQkLnNiZ24uY2xvbmVNYXJrZXIgPSB7XG4gICAgc2ltcGxlQ2hlbWljYWw6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG4gICAgICAgIHZhciBmaXJzdENpcmNsZUNlbnRlclggPSBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgZmlyc3RDaXJjbGVDZW50ZXJZID0gY2VudGVyWTtcbiAgICAgICAgdmFyIHNlY29uZENpcmNsZUNlbnRlclggPSBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgc2Vjb25kQ2lyY2xlQ2VudGVyWSA9IGNlbnRlclk7XG5cbiAgICAgICAgc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgZmlyc3RDaXJjbGVDZW50ZXJYLCBmaXJzdENpcmNsZUNlbnRlclksXG4gICAgICAgICAgICAgICAgMiAqIGNvcm5lclJhZGl1cywgMiAqIGNvcm5lclJhZGl1cywgY2xvbmVNYXJrZXIsIG9wYWNpdHkpO1xuXG4gICAgICAgIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBzZWNvbmRDaXJjbGVDZW50ZXJYLCBzZWNvbmRDaXJjbGVDZW50ZXJZLFxuICAgICAgICAgICAgICAgIDIgKiBjb3JuZXJSYWRpdXMsIDIgKiBjb3JuZXJSYWRpdXMsIGNsb25lTWFya2VyLCBvcGFjaXR5KTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcbiAgICAgICAgdmFyIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgICAgdmFyIHJlY1BvaW50cyA9IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCk7XG4gICAgICAgIHZhciBjbG9uZVggPSBjZW50ZXJYO1xuICAgICAgICB2YXIgY2xvbmVZID0gY2VudGVyWSArIDMgLyA0ICogY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoIC0gMiAqIGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGNsb25lSGVpZ2h0ID0gY29ybmVyUmFkaXVzIC8gMjtcblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2xvbmVYLCBjbG9uZVksIGNsb25lV2lkdGgsIGNsb25lSGVpZ2h0LCByZWNQb2ludHMpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuICAgICAgfVxuICAgIH0sXG4gICAgbnVjbGVpY0FjaWRGZWF0dXJlOiBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KSB7XG4gICAgICBpZiAoY2xvbmVNYXJrZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBoZWlnaHQgLyA0O1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyAzICogaGVpZ2h0IC8gODtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcbiAgICAgICAgdmFyIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAkJC5zYmduLmRyYXdOdWNBY2lkRmVhdHVyZShjb250ZXh0LCBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCxcbiAgICAgICAgICAgICAgICBjbG9uZVgsIGNsb25lWSwgY29ybmVyUmFkaXVzLCBvcGFjaXR5KTtcblxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgICAgIC8vY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1hY3JvbW9sZWN1bGU6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubnVjbGVpY0FjaWRGZWF0dXJlKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KTtcbiAgICB9LFxuICAgIGNvbXBsZXg6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgaXNNdWx0aW1lciwgb3BhY2l0eSkge1xuICAgICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGNwWCA9IGNvcm5lckxlbmd0aCAvIHdpZHRoO1xuICAgICAgICB2YXIgY3BZID0gY29ybmVyTGVuZ3RoIC8gaGVpZ2h0O1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBoZWlnaHQgKiBjcFkgLyAyO1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY2xvbmVIZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBtYXJrZXJQb2ludHMgPSBbLTEsIC0xLCAxLCAtMSwgMSAtIGNwWCwgMSwgLTEgKyBjcFgsIDFdO1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuICAgICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjbG9uZVgsIGNsb25lWSxcbiAgICAgICAgICAgICAgICBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCwgbWFya2VyUG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuXG4vLyAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaW50ZXJzZWN0aW9ucykge1xuICAgIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA8PSAwKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgdmFyIGNsb3Nlc3RJbnRlcnNlY3Rpb24gPSBbXTtcbiAgICB2YXIgbWluRGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb25zLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICB2YXIgY2hlY2tQb2ludCA9IFtpbnRlcnNlY3Rpb25zW2ldLCBpbnRlcnNlY3Rpb25zW2kgKyAxXV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBjeU1hdGguY2FsY3VsYXRlRGlzdGFuY2UocG9pbnQsIGNoZWNrUG9pbnQpO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBjbG9zZXN0SW50ZXJzZWN0aW9uID0gY2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvc2VzdEludGVyc2VjdGlvbjtcbiAgfTtcblxuICAkJC5zYmduLm51Y2xlaWNBY2lkSW50ZXJzZWN0aW9uTGluZSA9IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cykge1xuICAgIHZhciBub2RlWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICB2YXIgbm9kZVkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuXG4gICAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciByaWdodFN0YXJ0WCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgICB2YXIgcmlnaHRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCByaWdodFN0YXJ0WCwgcmlnaHRTdGFydFksIHJpZ2h0RW5kWCwgcmlnaHRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVN0YXJ0WCwgYm90dG9tU3RhcnRZLCBib3R0b21FbmRYLCBib3R0b21FbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGVmdCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIGxlZnRTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgbGVmdEVuZFggPSBsZWZ0U3RhcnRYO1xuICAgICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzLCB3ZSBoYXZlIG9ubHkgdHdvIGFyY3MgZm9yXG4gICAgLy9udWNsZWljIGFjaWQgZmVhdHVyZXNcbiAgICB2YXIgYXJjSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIEJvdHRvbSBSaWdodFxuICAgIHtcbiAgICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21SaWdodENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLFxuICAgICAgICAgICAgICBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvdHRvbSBMZWZ0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLFxuICAgICAgICAgICAgICBib3R0b21MZWZ0Q2VudGVyWCwgYm90dG9tTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgaW50ZXJzZWN0aW9ucyBvZiBhbnkgbGluZSB3aXRoIGEgcm91bmQgcmVjdGFuZ2xlIFxuICAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgICB2YXIgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IFtdO1xuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WDtcbiAgICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgICB2YXIgYXJjSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIFRvcCBMZWZ0XG4gICAge1xuICAgICAgdmFyIHRvcExlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGFyY0ludGVyc2VjdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvcCBSaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPj0gdG9wUmlnaHRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wUmlnaHRDZW50ZXJZKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChhcmNJbnRlcnNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3R0b20gUmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIExlZnRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MixcbiAgICAgICAgICAgICAgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMClcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgaW50ZXJzZWN0aW9ucyBvZiBhbnkgbGluZSB3aXRoIHRoZSB1cHBlciBoYWxmIG9mIHBlcnR1cmJpbmcgYWdlbnQgXG4gICQkLnNiZ24ucGVydHVyYmluZ0FnZW50SW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gICAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBbXTtcblxuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WCAtIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgcGFkZGluZztcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WCArIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbiAgfTtcbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lRWxsaXBzZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuXG4gICAgdmFyIHcgPSB3aWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBoID0gaGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGFuID0gY2VudGVyWDtcbiAgICB2YXIgYm4gPSBjZW50ZXJZO1xuXG4gICAgdmFyIGQgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG5cbiAgICB2YXIgbSA9IGRbMV0gLyBkWzBdO1xuICAgIHZhciBuID0gLTEgKiBtICogeDIgKyB5MjtcbiAgICB2YXIgYSA9IGggKiBoICsgdyAqIHcgKiBtICogbTtcbiAgICB2YXIgYiA9IC0yICogYW4gKiBoICogaCArIDIgKiBtICogbiAqIHcgKiB3IC0gMiAqIGJuICogbSAqIHcgKiB3O1xuICAgIHZhciBjID0gYW4gKiBhbiAqIGggKiBoICsgbiAqIG4gKiB3ICogdyAtIDIgKiBibiAqIHcgKiB3ICogbiArXG4gICAgICAgICAgICBibiAqIGJuICogdyAqIHcgLSBoICogaCAqIHcgKiB3O1xuXG4gICAgdmFyIGRpc2NyaW1pbmFudCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuXG4gICAgaWYgKGRpc2NyaW1pbmFudCA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICAgIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG5cbiAgICB2YXIgeE1pbiA9IE1hdGgubWluKHQxLCB0Mik7XG4gICAgdmFyIHhNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuXG4gICAgdmFyIHlNaW4gPSBtICogeE1pbiAtIG0gKiB4MiArIHkyO1xuICAgIHZhciB5TWF4ID0gbSAqIHhNYXggLSBtICogeDIgKyB5MjtcblxuICAgIHJldHVybiBbeE1pbiwgeU1pbiwgeE1heCwgeU1heF07XG4gIH07XG5cbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMgPSBmdW5jdGlvbiAobm9kZSwgeCwgeSkge1xuICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgc3RhdGVBbmRJbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcblxuICAgIHZhciBzdGF0ZUNvdW50ID0gMCwgaW5mb0NvdW50ID0gMDtcblxuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlQW5kSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdGF0ZSA9IHN0YXRlQW5kSW5mb3NbaV07XG4gICAgICB2YXIgc3RhdGVXaWR0aCA9IHN0YXRlLmJib3gudztcbiAgICAgIHZhciBzdGF0ZUhlaWdodCA9IHN0YXRlLmJib3guaDtcbiAgICAgIHZhciBjb29yZCA9IHN0YXRlLmdldEFic29sdXRlQ29vcmQoKTtcbiAgICAgIHZhciBzdGF0ZUNlbnRlclggPSBjb29yZC54O1xuICAgICAgdmFyIHN0YXRlQ2VudGVyWSA9IGNvb3JkLnk7XG5cbiAgICAgIGlmIChzdGF0ZS5jbGF6eiA9PSBcInN0YXRlIHZhcmlhYmxlXCIgJiYgc3RhdGUuaXNEaXNwbGF5ZWQpIHsvL2RyYXcgZWxsaXBzZVxuICAgICAgICB2YXIgc3RhdGVJbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICBzdGF0ZUNlbnRlclgsIHN0YXRlQ2VudGVyWSwgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHBhZGRpbmcpO1xuXG4gICAgICAgIGlmIChzdGF0ZUludGVyc2VjdExpbmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KHN0YXRlSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIHN0YXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY2xhenogPT0gXCJ1bml0IG9mIGluZm9ybWF0aW9uXCIgJiYgc3RhdGUuaXNEaXNwbGF5ZWQpIHsvL2RyYXcgcmVjdGFuZ2xlXG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZLCBzdGF0ZVdpZHRoLCBzdGF0ZUhlaWdodCwgMCwgcGFkZGluZyk7XG5cbiAgICAgICAgaWYgKGluZm9JbnRlcnNlY3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgICAgIGludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLmNvbmNhdChpbmZvSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIGluZm9Db3VudCsrO1xuICAgICAgfVxuXG4gICAgfVxuICAgIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lQWZJbmZvQm94ZXMgPSBmdW5jdGlvbiAobm9kZSwgeCwgeSkge1xuICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgaW5mb0JveCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvc1swXTtcblxuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG5cbiAgICBpZiAoaW5mb0JveCAmJiBpbmZvQm94LmlzRGlzcGxheWVkKSB7XG4gICAgICB2YXIgaW5mb0JveFdpZHRoID0gaW5mb0JveC5iYm94Lnc7XG4gICAgICB2YXIgaW5mb0JveEhlaWdodCA9IGluZm9Cb3guYmJveC5oO1xuICAgICAgdmFyIGNvb3JkID0gaW5mb0JveC5nZXRBYnNvbHV0ZUNvb3JkKCk7XG4gICAgICB2YXIgaW5mb0JveENlbnRlclggPSBjb29yZC54O1xuICAgICAgdmFyIGluZm9Cb3hDZW50ZXJZID0gY29vcmQueTtcblxuICAgICAgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgbWFjcm9tb2xlY3VsZVwiIHx8IG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgbnVjbGVpYyBhY2lkIGZlYXR1cmVcIlxuICAgICAgICAgICAgICB8fCBub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIGNvbXBsZXhcIil7XG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICBpbmZvQm94Q2VudGVyWCwgaW5mb0JveENlbnRlclksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgNSwgcGFkZGluZyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIHVuc3BlY2lmaWVkIGVudGl0eVwiKXtcbiAgICAgICAgdmFyIGluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLCBpbmZvQm94Q2VudGVyWSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCBwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCIpe1xuICAgICAgICB2YXIgaW5mb0ludGVyc2VjdExpbmVzID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLFxuICAgICAgICAgICAgaW5mb0JveENlbnRlclksXG4gICAgICAgICAgICBpbmZvQm94V2lkdGgvNCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIHBlcnR1cmJpbmcgYWdlbnRcIil7XG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnBlcnR1cmJpbmdBZ2VudEludGVyc2VjdExpbmUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLCBpbmZvQm94Q2VudGVyWSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCAwLCBwYWRkaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZm9JbnRlcnNlY3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoaW5mb0ludGVyc2VjdExpbmVzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gIH07XG5cbiAgJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMgPSBmdW5jdGlvbiAoeCwgeSwgbm9kZSwgdGhyZXNob2xkKSB7XG4gICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgdmFyIHBhZGRpbmcgPXBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgIHZhciBzdGF0ZUFuZEluZm9zID0gbm9kZS5fcHJpdmF0ZS5kYXRhLnN0YXRlc2FuZGluZm9zO1xuXG4gICAgdmFyIHN0YXRlQ291bnQgPSAwLCBpbmZvQ291bnQgPSAwO1xuLy8gICAgdGhyZXNob2xkID0gcGFyc2VGbG9hdCh0aHJlc2hvbGQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZUFuZEluZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3RhdGUgPSBzdGF0ZUFuZEluZm9zW2ldO1xuICAgICAgdmFyIHN0YXRlV2lkdGggPSBwYXJzZUZsb2F0KHN0YXRlLmJib3gudykgKyB0aHJlc2hvbGQ7XG4gICAgICB2YXIgc3RhdGVIZWlnaHQgPSBwYXJzZUZsb2F0KHN0YXRlLmJib3guaCkgKyB0aHJlc2hvbGQ7XG4gICAgICB2YXIgY29vcmQgPSBzdGF0ZS5nZXRBYnNvbHV0ZUNvb3JkKCk7XG4gICAgICB2YXIgc3RhdGVDZW50ZXJYID0gY29vcmQueDtcbiAgICAgIHZhciBzdGF0ZUNlbnRlclkgPSBjb29yZC55O1xuXG4gICAgICBpZiAoc3RhdGUuY2xhenogPT0gXCJzdGF0ZSB2YXJpYWJsZVwiICYmIHN0YXRlLmlzRGlzcGxheWVkKSB7Ly9kcmF3IGVsbGlwc2VcbiAgICAgICAgdmFyIHN0YXRlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoXG4gICAgICAgICAgICAgICAgeCwgeSwgcGFkZGluZywgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZKTtcblxuICAgICAgICBpZiAoc3RhdGVDaGVja1BvaW50ID09IHRydWUpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgc3RhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5jbGF6eiA9PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIiAmJiBzdGF0ZS5pc0Rpc3BsYXllZCkgey8vZHJhdyByZWN0YW5nbGVcbiAgICAgICAgdmFyIGluZm9DaGVja1BvaW50ID0gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoXG4gICAgICAgICAgICAgICAgeCwgeSwgcGFkZGluZywgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZKTtcblxuICAgICAgICBpZiAoaW5mb0NoZWNrUG9pbnQgPT0gdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBpbmZvQ291bnQrKztcbiAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgJCQuc2Jnbi5pc05vZGVTaGFwZVRvdGFsbHlPdmVycmlkZW4gPSBmdW5jdGlvbiAocmVuZGVyLCBub2RlKSB7XG4gICAgaWYgKHRvdGFsbHlPdmVycmlkZW5Ob2RlU2hhcGVzW3JlbmRlci5nZXROb2RlU2hhcGUobm9kZSldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBcbi8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSByZXBsYWNlZCBieSBDeXRvc2NhcGUgZnVuY3Rpb25zIG9uY2UgdjMuMS4yIGlzIHJlbGVhc2VkXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgXG5cbiAgdmFyIGRyYXdCYXJyZWxQYXRoID0gZnVuY3Rpb24oXG4gIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKXtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgdmFyIHhCZWdpbiA9IHggLSBoYWxmV2lkdGg7XG4gICAgdmFyIHhFbmQgPSB4ICsgaGFsZldpZHRoO1xuICAgIHZhciB5QmVnaW4gPSB5IC0gaGFsZkhlaWdodDtcbiAgICB2YXIgeUVuZCA9IHkgKyBoYWxmSGVpZ2h0O1xuXG4gICAgdmFyIGJhcnJlbEN1cnZlQ29uc3RhbnRzID0gbWF0aC5nZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyggd2lkdGgsIGhlaWdodCApO1xuICAgIHZhciB3T2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgdmFyIGhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3T2Zmc2V0O1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIGNvbnRleHQubW92ZVRvKCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQgKTtcblxuICAgIGNvbnRleHQubGluZVRvKCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0ICk7XG4gICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kICk7XG5cbiAgICBjb250ZXh0LmxpbmVUbyggeEVuZCAtIHdPZmZzZXQsIHlFbmQgKTtcbiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kLCB5RW5kIC0gaE9mZnNldCApXG5cbiAgICBjb250ZXh0LmxpbmVUbyggeEVuZCwgeUJlZ2luICsgaE9mZnNldCApO1xuICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyggeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCAtICB3T2Zmc2V0LCB5QmVnaW4gKTtcblxuICAgIGNvbnRleHQubGluZVRvKCB4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4gKTtcbiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0ICk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuXG4gIHZhciBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICl7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoO1xuXG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBtYXRoLmdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICB2YXIgaE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgICB2YXIgY3RybFB0WE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdpZHRoO1xuXG4gICAgICAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgY29udHJvbCBwdCBvbiBbNCwgNV1cbiAgICAgIHZhciBwdHMgPSB7XG4gICAgICAgIHRvcExlZnQ6IFsgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbiBdLFxuICAgICAgICB0b3BSaWdodDogWyB4RW5kIC0gd09mZnNldCwgeUJlZ2luLCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0IF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbIHhFbmQsIHlFbmQgLSBoT2Zmc2V0LCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCAtIHdPZmZzZXQsIHlFbmQgXSxcbiAgICAgICAgYm90dG9tTGVmdDogWyB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0IF1cbiAgICAgIH07XG5cbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgfTtcbiBcbiAgbWF0aC5iZXppZXJQdHNUb1F1YWRDb2VmZiA9IGZ1bmN0aW9uKCBwMCwgcDEsIHAyICl7XG4gICAgcmV0dXJuIFtcbiAgICAgIHAwIC0gMiAqIHAxICsgcDIsXG4gICAgICAyICogKCBwMSAtIHAwICksXG4gICAgICBwMF07XG4gIH07XG5cbiAgbWF0aC5nZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0ICl7XG4gIC8vIGdldCBjdXJ2ZSB3aWR0aCwgaGVpZ2h0LCBhbmQgY29udHJvbCBwb2ludCBwb3NpdGlvbiBvZmZzZXRzIGFzIGEgcGVyY2VudGFnZSBvZiBub2RlIGhlaWdodCAvIHdpZHRoXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodE9mZnNldDogTWF0aC5taW4oMTUsIDAuMDUgKiBoZWlnaHQpLFxuICAgICAgd2lkdGhPZmZzZXQ6IE1hdGgubWluKDEwMCwgMC4yNSAqIHdpZHRoKSxcbiAgICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICAgIH07XG4gIH07XG5cbiAgbWF0aC5zb2x2ZVF1YWRyYXRpYyA9IGZ1bmN0aW9uKCBhLCBiLCBjLCB2YWwgKXtcbiAgICBjIC09IHZhbDtcblxuICAgIHZhciByID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgICBpZiggciA8IDAgKXsgcmV0dXJuIFtdOyB9XG5cbiAgICB2YXIgc3FydFIgPSBNYXRoLnNxcnQoIHIgKTtcbiAgICB2YXIgZGVub20gPSAyICogYTtcbiAgICB2YXIgcm9vdDEgPSAoIC1iICsgc3FydFIgKSAvIGRlbm9tO1xuICAgIHZhciByb290MiA9ICggLWIgLSBzcXJ0UiApIC8gZGVub207XG5cbiAgICByZXR1cm4gWyByb290MSwgcm9vdDIgXTtcbiAgfTtcbn07XG4iLCJ2YXIgY3lSZW5kZXJlciA9IHJlcXVpcmUoJy4uL3NiZ24tZXh0ZW5zaW9ucy9zYmduLWN5LXJlbmRlcmVyJyk7XG52YXIgbGlicyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBjeXRvc2NhcGUgPSBsaWJzLmN5dG9zY2FwZTtcbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcbnZhciB0cnVuY2F0ZSA9IHJlcXVpcmUoJy4vdGV4dC11dGlsaXRpZXMnKS50cnVuY2F0ZTtcblxudmFyIG5zID0ge307XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0gQXV4aWxpYXJ5VW5pdCAtLS0tLS0tLS0tLS0tLSAvL1xudmFyIEF1eGlsaWFyeVVuaXQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLmlkID0gbnVsbDtcbiAgdGhpcy5iYm94ID0gbnVsbDtcbiAgdGhpcy5jb29yZFR5cGUgPSBcInJlbGF0aXZlVG9DZW50ZXJcIjtcbiAgdGhpcy5hbmNob3JTaWRlID0gbnVsbDtcbiAgdGhpcy5pc0Rpc3BsYXllZCA9IGZhbHNlO1xufTtcbkF1eGlsaWFyeVVuaXQuZGVmYXVsdEJhY2tncm91bmRDb2xvciA9IFwiI2ZmZmZmZlwiO1xuXG4vKlxuICogUmV0dXJuIGEgbmV3IEF1eGlsaWFyeVVuaXQgb2JqZWN0LiBBIG5ldyBwYXJlbnQgcmVmZXJlbmNlIGFuZCBuZXcgaWQgY2FuXG4gKiBvcHRpb25uYWxseSBiZSBwYXNzZWQuXG4gKi9cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoZXhpc3RpbmdJbnN0YW5jZSwgbmV3UGFyZW50LCBuZXdJZCkge1xuICB2YXIgbmV3VW5pdCA9IGV4aXN0aW5nSW5zdGFuY2UgPyBleGlzdGluZ0luc3RhbmNlIDogbmV3IEF1eGlsaWFyeVVuaXQoKTtcbiAgbmV3VW5pdC5wYXJlbnQgPSBuZXdQYXJlbnQgPyBuZXdQYXJlbnQgOiB0aGlzLnBhcmVudDtcbiAgbmV3VW5pdC5pZCA9IG5ld0lkID8gbmV3SWQgOiB0aGlzLmlkO1xuICBuZXdVbml0LmJib3ggPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmJib3gpO1xuICBuZXdVbml0LmNvb3JkVHlwZSA9IHRoaXMuY29vcmRUeXBlO1xuICBuZXdVbml0LmFuY2hvclNpZGUgPSB0aGlzLmFuY2hvclNpZGU7XG4gIG5ld1VuaXQuaXNEaXNwbGF5ZWQgPSB0aGlzLmlzRGlzcGxheWVkO1xuICByZXR1cm4gbmV3VW5pdDtcbn07XG5cbi8vIGRyYXcgdGhlIGF1eGlsaWFyeSB1bml0IGF0IGl0cyBwb3NpdGlvblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIGNvb3JkcyA9IHRoaXMuZ2V0QWJzb2x1dGVDb29yZCgpO1xuXG4gIHRoaXMuZHJhd1NoYXBlKGNvbnRleHQsIGNvb3Jkcy54LCBjb29yZHMueSk7XG4gIGlmICh0aGlzLmhhc1RleHQoKSkge1xuICAgIHRoaXMuZHJhd1RleHQoY29udGV4dCwgY29vcmRzLngsIGNvb3Jkcy55KTtcbiAgfVxuICB0aGlzLmlzRGlzcGxheWVkID0gdHJ1ZTtcbn07XG5cbi8vIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkcmVuXG5BdXhpbGlhcnlVbml0LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCFcIik7XG59O1xuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdCBtZXRob2QhXCIpO1xufTtcbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmRyYXdTaGFwZSA9IGZ1bmN0aW9uKGNvbnRleHQsIHgsIHkpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3QgbWV0aG9kIVwiKTtcbn07XG5cbi8vIGRyYXcgdGhlIHN0YXRlc09ySW5mbydzIGxhYmVsIGF0IGdpdmVuIHBvc2l0aW9uXG5BdXhpbGlhcnlVbml0LnByb3RvdHlwZS5kcmF3VGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgdmFyIGZvbnRTaXplID0gOTsgLy8gcGFyc2VJbnQodGV4dFByb3AuaGVpZ2h0IC8gMS41KTtcblxuICAvLyBwYXJ0IG9mIDogJCQuc2Jnbi5kcmF3VGV4dChjb250ZXh0LCB0ZXh0UHJvcCk7XG4gIC8vIHNhdmUgc3R5bGUgYmVmb3JlIG1vZGlmaWNhdGlvblxuICB2YXIgb2xkRm9udCA9IGNvbnRleHQuZm9udDtcbiAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gIHZhciBvbGRPcGFjaXR5ID0gY29udGV4dC5nbG9iYWxBbHBoYTtcblxuICBjb250ZXh0LmZvbnQgPSBmb250U2l6ZSArIFwicHggQXJpYWxcIjtcbiAgY29udGV4dC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuICBjb250ZXh0LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gXCIjMGYwZjBmXCI7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSB0aGlzLnBhcmVudC5jc3MoJ3RleHQtb3BhY2l0eScpICogdGhpcy5wYXJlbnQuY3NzKCdvcGFjaXR5Jyk7IC8vID9cblxuICB2YXIgdGV4dDtcbiAgaWYob3B0aW9ucy5maXRMYWJlbHNUb0luZm9ib3hlcygpKXtcbiAgICAvLyBoZXJlIHdlIG1lbW9pemUgdGhlIHRydW5jYXRlZCB0ZXh0IGludG8gX3RleHRDYWNoZSxcbiAgICAvLyBhcyBpdCBpcyBub3Qgc29tZXRoaW5nIHRoYXQgY2hhbmdlcyBzbyBtdWNoXG4gICAgdGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBrZXkgPSB0ZXh0ICsgY29udGV4dC5mb250ICsgdGhpcy5iYm94Lnc7XG4gICAgaWYodGhpcy5fdGV4dENhY2hlICYmIHRoaXMuX3RleHRDYWNoZVtrZXldKSB7XG4gICAgICB0ZXh0ID0gdGhpcy5fdGV4dENhY2hlW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGV4dCA9IHRydW5jYXRlKHRoaXMuZ2V0VGV4dCgpLCBjb250ZXh0LmZvbnQsIHRoaXMuYmJveC53KTtcbiAgICAgIGlmKCF0aGlzLl90ZXh0Q2FjaGUpIHtcbiAgICAgICAgdGhpcy5fdGV4dENhY2hlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl90ZXh0Q2FjaGVba2V5XSA9IHRleHQ7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgfVxuXG4gIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2VudGVyWCwgY2VudGVyWSk7XG5cbiAgLy8gcmVzdG9yZSBzYXZlZCBzdHlsZVxuICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICBjb250ZXh0LmZvbnQgPSBvbGRGb250O1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkT3BhY2l0eTtcbn07XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmdldEFic29sdXRlQ29vcmQgPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvQ2VudGVyXCIpIHtcbiAgICB2YXIgYWJzWCA9IHRoaXMuYmJveC54ICogKHRoaXMucGFyZW50Lm91dGVyV2lkdGgoKSAtIHRoaXMucGFyZW50Ll9wcml2YXRlLmRhdGFbJ2JvcmRlci13aWR0aCddKSAvIDEwMCArIHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgdmFyIGFic1kgPSB0aGlzLmJib3gueSAqICh0aGlzLnBhcmVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICByZXR1cm4ge3g6IGFic1gsIHk6IGFic1l9O1xuICB9XG4gIGVsc2UgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvU2lkZVwiKSB7XG4gICAgaWYgKHRoaXMuYW5jaG9yU2lkZSA9PSBcInRvcFwiIHx8IHRoaXMuYW5jaG9yU2lkZSA9PSBcImJvdHRvbVwiKSB7XG4gICAgICB2YXIgYWJzWCA9IHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLnggLSAodGhpcy5wYXJlbnQub3V0ZXJXaWR0aCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMiArIHRoaXMuYmJveC54O1xuICAgICAgdmFyIGFic1kgPSB0aGlzLmJib3gueSAqICh0aGlzLnBhcmVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgYWJzWSA9IHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLnkgLSAodGhpcy5wYXJlbnQub3V0ZXJIZWlnaHQoKSAtIHRoaXMucGFyZW50Ll9wcml2YXRlLmRhdGFbJ2JvcmRlci13aWR0aCddKSAvIDIgKyB0aGlzLmJib3gueTtcbiAgICAgIHZhciBhYnNYID0gdGhpcy5iYm94LnggKiAodGhpcy5wYXJlbnQub3V0ZXJXaWR0aCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICB9XG5cbiAgLy8gZHVlIHRvIGNvcm5lciBvZiBiYXJyZWwgc2hhcGVkIGNvbXBhcnRtZW50IHNoaWZ0IGFic1ggdG8gcmlnaHRcbiAgaWYgKHRoaXMucGFyZW50LmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIpe1xuICAgICAgYWJzWCArPSB0aGlzLnBhcmVudC5vdXRlcldpZHRoKCkgKiAwLjE7XG4gIH07XG4gICAgcmV0dXJuIHt4OiBhYnNYLCB5OiBhYnNZfTtcbiAgfVxufTtcblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuc2V0QW5jaG9yU2lkZSA9IGZ1bmN0aW9uKHBhcmVudEJib3gpIHtcbiAgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvQ2VudGVyXCIpIHtcbiAgICB2YXIgdGhpc1ggPSB0aGlzLmJib3gueDtcbiAgICB2YXIgdGhpc1kgPSB0aGlzLmJib3gueTtcbiAgICBpZih0aGlzWSA+IDQ1KSB7XG4gICAgICB0aGlzLmFuY2hvclNpZGUgPSBcImJvdHRvbVwiO1xuICAgICAgdGhpcy5iYm94LnkgPSA1MDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpc1kgPCAtNDUpIHtcbiAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwidG9wXCI7XG4gICAgICB0aGlzLmJib3gueSA9IC01MDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpc1kgPT4gMCkge1xuICAgICAgaWYgKHRoaXNYID4gNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJyaWdodFwiO1xuICAgICAgICB0aGlzLmJib3gueCA9IDUwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpc1ggPCAtNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgIHRoaXMuYmJveC54ID0gLTUwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwiYm90dG9tXCI7XG4gICAgICAgIHRoaXMuYmJveC55ID0gNTA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXNYID4gNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJyaWdodFwiO1xuICAgICAgICB0aGlzLmJib3gueCA9IDUwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpc1ggPCAtNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgIHRoaXMuYmJveC54ID0gLTUwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwidG9wXCI7XG4gICAgICAgIHRoaXMuYmJveC55ID0gLTUwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuYWRkVG9QYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbG9jYXRpb24sIHBvc2l0aW9uLCBpbmRleCkge1xuXG4gIC8vIGFkZCBzdGF0ZSB2YXIgdG8gdGhlIHBhcmVudCdzIHN0YXRlc2FuZGluZm9zXG4gIGlmKHR5cGVvZiBpbmRleCAhPSBcInVuZGVmaW5lZFwiKSB7IC8vIHNwZWNpZmljIGluZGV4IHByb3ZpZGVkIChmb3IgdW5kby9yZWRvIGNvbnNpc3RlbmN5KVxuICAgIHBhcmVudE5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5zcGxpY2UoaW5kZXgsIDAsIHRoaXMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHBhcmVudE5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5wdXNoKHRoaXMpO1xuICB9XG5cbiAgaWYoIXBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKSkgeyAvLyBlbnN1cmUgbWluaW1hbCBpbml0aWFsaXphdGlvblxuICAgIHBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnLCB7fSk7XG4gIH1cbiAgaWYoIWxvY2F0aW9uKSB7IC8vIGxvY2F0aW9uIG5vdCBwcm92aWRlZCwgbmVlZCB0byBkZWZpbmUgaXQgYXV0b21hdGljYWxseVxuICAgIGxvY2F0aW9uID0gQXV4VW5pdExheW91dC5zZWxlY3ROZXh0QXZhaWxhYmxlKHBhcmVudE5vZGUpO1xuICB9XG4gIC8vIGhlcmUgd2UgYXJlIHN1cmUgdG8gaGF2ZSBhIGxvY2F0aW9uIGV2ZW4gaWYgaXQgd2FzIG5vdCBwcm92aWRlZCBhcyBhcmd1bWVudFxuICAvLyBnZXQgb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgbGF5b3V0XG4gIGlmKCFwYXJlbnROb2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbbG9jYXRpb25dKSB7XG4gICAgcGFyZW50Tm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXSA9IG5ldyBucy5BdXhVbml0TGF5b3V0KHBhcmVudE5vZGUsIGxvY2F0aW9uKTtcbiAgfVxuICB2YXIgbGF5b3V0ID0gcGFyZW50Tm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXTtcbiAgdGhpcy5hbmNob3JTaWRlID0gbG9jYXRpb247XG4gIHN3aXRjaChsb2NhdGlvbikge1xuICAgIGNhc2UgXCJ0b3BcIjogdGhpcy5iYm94LnkgPSAtNTA7IGJyZWFrO1xuICAgIGNhc2UgXCJib3R0b21cIjogdGhpcy5iYm94LnkgPSA1MDsgYnJlYWs7XG4gICAgY2FzZSBcImxlZnRcIjogdGhpcy5iYm94LnggPSAtNTA7IGJyZWFrO1xuICAgIGNhc2UgXCJyaWdodFwiOiB0aGlzLmJib3gueCA9IC01MDsgYnJlYWs7XG4gIH1cbiAgLy8gYWRkIHN0YXRlVmFyIHRvIGxheW91dCwgcHJlY29tcHV0aW5nIG9mIHJlbGF0aXZlIGNvb3JkcyB3aWxsIGJlIHRyaWdnZXJlZCBhY2NvcmRpbmdseVxuICB2YXIgaW5zZXJ0ZWRQb3NpdGlvbiA9IGxheW91dC5hZGRBdXhVbml0KHRoaXMsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGluc2VydGVkUG9zaXRpb247XG59XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLnJlbW92ZUZyb21QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJlbnRMYXlvdXQgPSB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpW3RoaXMuYW5jaG9yU2lkZV07XG4gIHBhcmVudExheW91dC5yZW1vdmVBdXhVbml0KHRoaXMpO1xuICBpZiAocGFyZW50TGF5b3V0LmlzRW1wdHkoKSl7XG4gICAgZGVsZXRlIHRoaXMucGFyZW50LmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbdGhpcy5hbmNob3JTaWRlXTtcbiAgfVxuICB2YXIgc3RhdGVzYW5kaW5mb3MgPSB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpO1xuICB2YXIgaW5kZXggID0gc3RhdGVzYW5kaW5mb3MuaW5kZXhPZih0aGlzKTtcbiAgc3RhdGVzYW5kaW5mb3Muc3BsaWNlKGluZGV4LCAxKTtcbn07XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmdldFBvc2l0aW9uSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50LmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbdGhpcy5hbmNob3JTaWRlXS51bml0cy5pbmRleE9mKHRoaXMpO1xufTtcblxubnMuQXV4aWxpYXJ5VW5pdCA9IEF1eGlsaWFyeVVuaXQ7XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgQXV4aWxpYXJ5VW5pdCAtLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyAtLS0tLS0tLS0tLS0tLSBTdGF0ZVZhcmlhYmxlIC0tLS0tLS0tLS0tLS0tIC8vXG4vKipcbiAqIHBhcmVudCBoYXMgdG8gYmUgYSBzdGF0ZWZ1bCBFUE4gKGNvbXBsZXgsIG1hY3JvbW9sZWN1bGUgb3IgbnVjbGVpYyBhY2lkKVxuICovXG52YXIgU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSwgc3RhdGVWYXJpYWJsZURlZmluaXRpb24sIHBhcmVudCkge1xuICBBdXhpbGlhcnlVbml0LmNhbGwodGhpcywgcGFyZW50KTtcbiAgdGhpcy5zdGF0ZSA9IHt9O1xuICB0aGlzLnN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuc3RhdGUudmFyaWFibGUgPSBudWxsO1xuICB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uID0gc3RhdGVWYXJpYWJsZURlZmluaXRpb247XG4gIHRoaXMuY2xhenogPSBcInN0YXRlIHZhcmlhYmxlXCI7XG59O1xuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF1eGlsaWFyeVVuaXQucHJvdG90eXBlKTtcblN0YXRlVmFyaWFibGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3RhdGVWYXJpYWJsZTtcblN0YXRlVmFyaWFibGUuc2hhcGVSYWRpdXMgPSAxNTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGVWYWx1ZSA9IHRoaXMuc3RhdGUudmFsdWUgfHwgJyc7XG4gIHZhciBzdGF0ZVZhcmlhYmxlID0gdGhpcy5zdGF0ZS52YXJpYWJsZSA/IFwiQFwiICsgdGhpcy5zdGF0ZS52YXJpYWJsZSA6IFwiXCI7XG5cbiAgcmV0dXJuIHN0YXRlVmFsdWUgKyBzdGF0ZVZhcmlhYmxlO1xufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKHRoaXMuc3RhdGUudmFsdWUgJiYgdGhpcy5zdGF0ZS52YWx1ZSAhPSBcIlwiKSB8fCAodGhpcy5zdGF0ZS52YXJpYWJsZSAmJiB0aGlzLnN0YXRlLnZhcmlhYmxlICE9IFwiXCIpO1xufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuZHJhd1NoYXBlID0gZnVuY3Rpb24oY29udGV4dCwgeCwgeSkge1xuICBjeXRvc2NhcGUuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsXG4gICAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICAgIHRoaXMuYmJveC53LCB0aGlzLmJib3guaCxcbiAgICAgICAgICAgICAgTWF0aC5taW4odGhpcy5iYm94LncgLyAyLCB0aGlzLmJib3guaCAvIDIsIFN0YXRlVmFyaWFibGUuc2hhcGVSYWRpdXMpKTtcbiAgdmFyIHRtcF9jdHh0ID0gY29udGV4dC5maWxsU3R5bGU7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gQXV4aWxpYXJ5VW5pdC5kZWZhdWx0QmFja2dyb3VuZENvbG9yO1xuICBjb250ZXh0LmZpbGwoKTtcbiAgY29udGV4dC5maWxsU3R5bGUgPSB0bXBfY3R4dDtcbiAgY29udGV4dC5zdHJva2UoKTtcbn07XG5cblN0YXRlVmFyaWFibGUuY3JlYXRlID0gZnVuY3Rpb24ocGFyZW50Tm9kZSwgdmFsdWUsIHZhcmlhYmxlLCBiYm94LCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4KSB7XG4gIC8vIGNyZWF0ZSB0aGUgbmV3IHN0YXRlIHZhciBvZiBpbmZvXG4gIHZhciBzdGF0ZVZhciA9IG5ldyBucy5TdGF0ZVZhcmlhYmxlKCk7XG4gIHN0YXRlVmFyLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gIHN0YXRlVmFyLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlVmFyLnZhcmlhYmxlID0gdmFyaWFibGU7XG4gIHN0YXRlVmFyLnN0YXRlID0ge3ZhbHVlOiB2YWx1ZSwgdmFyaWFibGU6IHZhcmlhYmxlfTtcbiAgc3RhdGVWYXIuYmJveCA9IGJib3g7XG5cbiAgLy8gbGluayB0byBsYXlvdXRcbiAgcG9zaXRpb24gPSBzdGF0ZVZhci5hZGRUb1BhcmVudChwYXJlbnROb2RlLCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4KTtcblxuICByZXR1cm4ge1xuICAgIGluZGV4OiBzdGF0ZVZhci5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHN0YXRlVmFyKSxcbiAgICBsb2NhdGlvbjogc3RhdGVWYXIuYW5jaG9yU2lkZSxcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfVxufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoKTtcbiAgdmFyIGluZGV4ID0gdGhpcy5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHRoaXMpO1xuICB0aGlzLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgLy9jb25zb2xlLmxvZyhcImFmdGVyIHJlbW92ZVwiLCB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpLCB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpKTtcbiAgcmV0dXJuIHtcbiAgICBjbGF6ejogXCJzdGF0ZSB2YXJpYWJsZVwiLFxuICAgIHN0YXRlOiB7XG4gICAgICB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgIHZhcmlhYmxlOiB0aGlzLnN0YXRlLnZhcmlhYmxlXG4gICAgfSxcbiAgICBiYm94OiB7XG4gICAgICB3OiB0aGlzLmJib3gudyxcbiAgICAgIGg6IHRoaXMuYmJveC5oXG4gICAgfSxcbiAgICBsb2NhdGlvbjogdGhpcy5hbmNob3JTaWRlLFxuICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICBpbmRleDogaW5kZXhcbiAgfTtcbn07XG5cblN0YXRlVmFyaWFibGUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihuZXdQYXJlbnQsIG5ld0lkKSB7XG4gIHZhciBuZXdTdGF0ZVZhciA9IEF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLCBuZXcgU3RhdGVWYXJpYWJsZSgpLCBuZXdQYXJlbnQsIG5ld0lkKTtcbiAgbmV3U3RhdGVWYXIuc3RhdGUgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLnN0YXRlKTtcbiAgbmV3U3RhdGVWYXIuc3RhdGVWYXJpYWJsZURlZmluaXRpb24gPSB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uO1xuICBuZXdTdGF0ZVZhci5jbGF6eiA9IHRoaXMuY2xheno7XG4gIHJldHVybiBuZXdTdGF0ZVZhcjtcbn07XG5cbm5zLlN0YXRlVmFyaWFibGUgPSBTdGF0ZVZhcmlhYmxlO1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIFN0YXRlVmFyaWFibGUgLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gLS0tLS0tLS0tLS0tLS0gVW5pdE9mSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0gLy9cbi8qKlxuICogcGFyZW50IGNhbiBiZSBhbiBFUE4sIGNvbXBhcnRtZW50IG9yIHN1YnVuaXRcbiAqIFRoZSBzaGFwZSBjYW4gdmFyeSBhbmQgY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gQnkgZGVmYXVsdCwgaXQgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzaGFwZSBcbiAqIG9mIFBEIHVuaXRzIG9mIGluZm9ybWF0aW9uLlxuICogVG8gcHJvdmlkZSBhIGN1c3RvbSBzaGFwZSwgMiBmdW5jdGlvbnMgbXVzdCBiZSBwYXNzZWQ6XG4gKiAgLSBzaGFwZUZuOiB0aGUgc2hhcGUgZnVuY3Rpb24gaXRzZWxmLCB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byByZW5kZXIgdGhlIHNoYXBlXG4gKiAgICAgICAgICAgICBUaGUgcHJvdG90eXBlIHNob3VsZCBiZTogZm4oY29udGV4dCwgeCwgeSwgW3NvbWUgb3RoZXIgYXJndW1lbnRzXSlcbiAqICAtIHNoYXBlQXJnc0ZuOiBwcm90b3R5cGUgZnVuY3Rpb24oc2VsZiksIGl0IHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gc2hhcGVGblxuICogICAgICAgICAgICAgICAgIFNlZSBleGFtcGxlIGFzIHRoZSBkZWZhdWx0IGJlbG93LlxuICogIFRvIHJlbmRlciB0aGUgc2hhcGUsIHdlIHdpbGwgc2ltcGx5IGRvOiBzaGFwZUZuLmFwcGx5KG51bGwsIFtjb250ZXh0LCB4LCB5XSArIHJlc3Qgb2YgdGhlIGxpc3QgcHJvdmlkZWQgYnkgc2hhcGVBcmdzRm4oKSApXG4gKi9cbnZhciBVbml0T2ZJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgcGFyZW50LCBzaGFwZUZuLCBzaGFwZUFyZ3NGbikge1xuICBBdXhpbGlhcnlVbml0LmNhbGwodGhpcywgcGFyZW50KTtcbiAgdGhpcy5sYWJlbCA9IHt0ZXh0OiB2YWx1ZX07IC8vIGZyb20gbGVnYWN5IGNvZGUsIGNvbnRhaW5zIHt0ZXh0OiB9XG4gIHRoaXMuY2xhenogPSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIjtcbiAgaWYoc2hhcGVGbiAmJiBzaGFwZUFyZ3NGbikge1xuICAgIHRoaXMuc2hhcGVGbiA9IHNoYXBlRm47XG4gICAgdGhpcy5zaGFwZUFyZ3NGbiA9IHNoYXBlQXJnc0ZuO1xuICB9XG4gIGVsc2UgeyAvLyBkZWZhdWx0IHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIHRoaXMuc2hhcGVGbiA9IGZ1bmN0aW9uKGMseCx5LHcsaCl7XG4gICAgICBjeXRvc2NhcGUuYmFzZU5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddLmRyYXcoYywgeCwgeSwgdywgaClcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFwZUFyZ3NGbiA9IGZ1bmN0aW9uIChzZWxmKSB7XG4gICAgICByZXR1cm4gW3NlbGYuYmJveC53LCBzZWxmLmJib3guaCwgMF07XG4gICAgfTtcbiAgfVxufTtcblVuaXRPZkluZm9ybWF0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUpO1xuVW5pdE9mSW5mb3JtYXRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVW5pdE9mSW5mb3JtYXRpb247XG5Vbml0T2ZJbmZvcm1hdGlvbi5zaGFwZVJhZGl1cyA9IDQ7XG5cblVuaXRPZkluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmxhYmVsLnRleHQ7XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5sYWJlbC50ZXh0ICYmIHRoaXMubGFiZWwudGV4dCAhPSBcIlwiO1xufTtcblxuVW5pdE9mSW5mb3JtYXRpb24ucHJvdG90eXBlLmRyYXdTaGFwZSA9IGZ1bmN0aW9uKGNvbnRleHQsIHgsIHkpIHtcbiAgdmFyIGFyZ3MgPSBbY29udGV4dCwgeCwgeV0uY29uY2F0KHRoaXMuc2hhcGVBcmdzRm4odGhpcykpO1xuICB0aGlzLnNoYXBlRm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIHZhciB0bXBfY3R4dCA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IEF1eGlsaWFyeVVuaXQuZGVmYXVsdEJhY2tncm91bmRDb2xvcjtcbiAgY29udGV4dC5maWxsKCk7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gdG1wX2N0eHQ7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB1bml0IG9mIGluZm8gYW5kIGxpbmtzIGV2ZXJ5dGhpbmcgYWNjb3JkaW5nbHlcbiAqIEBwYXJhbSBwYXJlbnROb2RlIC0gdGhlIGN5dG9zY2FwZSBlbGVtZW50IGhvc3RpbmcgdGhlIHVuaXQgb2YgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB2YWx1ZSAtIGl0cyB0ZXh0XG4gKiBAcGFyYW0gW2xvY2F0aW9uXSAtIHRoZSBzaWRlIHdoZXJlIGl0IHdpbGwgYmUgcGxhY2VkIHRvcCwgYm90dG9tLCByaWdodCwgbGVmdCBvciB1bmRlZmluZWQgKGF1dG8gcGxhY2VtZW50KVxuICogQHBhcmFtIFtwb3NpdGlvbl0gLSBpdHMgcG9zaXRpb24gaW4gdGhlIG9yZGVyIG9mIGVsZW1lbnRzIHBsYWNlZCBvbiB0aGUgc2FtZSBsb2NhdGlvblxuICogQHBhcmFtIFtpbmRleF0gLSBpdHMgaW5kZXggaW4gdGhlIHN0YXRlc2FuZGluZm9zIGxpc3RcbiAqL1xuVW5pdE9mSW5mb3JtYXRpb24uY3JlYXRlID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHZhbHVlLCBiYm94LCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4LCBzaGFwZUZuLCBzaGFwZUFyZ3NGbikge1xuICAvLyBjcmVhdGUgdGhlIG5ldyB1bml0IG9mIGluZm9cbiAgdmFyIHVuaXQgPSBuZXcgbnMuVW5pdE9mSW5mb3JtYXRpb24odmFsdWUsIHBhcmVudE5vZGUsIHNoYXBlRm4sIHNoYXBlQXJnc0ZuKTtcbiAgdW5pdC5iYm94ID0gYmJveDtcblxuICAvL2NvbnNvbGUubG9nKFwid2lsbCBpbnNlcnQgb25cIiwgbG9jYXRpb24sIHBvc2l0aW9uKTtcbiAgcG9zaXRpb24gPSB1bml0LmFkZFRvUGFyZW50KHBhcmVudE5vZGUsIGxvY2F0aW9uLCBwb3NpdGlvbiwgaW5kZXgpO1xuXG4gIHJldHVybiB7XG4gICAgaW5kZXg6IHVuaXQucGFyZW50LmRhdGEoJ3N0YXRlc2FuZGluZm9zJykuaW5kZXhPZih1bml0KSxcbiAgICBsb2NhdGlvbjogdW5pdC5hbmNob3JTaWRlLFxuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoKTtcbiAgdmFyIGluZGV4ID0gdGhpcy5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHRoaXMpO1xuICB0aGlzLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgLy9jb25zb2xlLmxvZyhcImFmdGVyIHJlbW92ZVwiLCB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpLCB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpKTtcbiAgcmV0dXJuIHtcbiAgICBjbGF6ejogXCJ1bml0IG9mIGluZm9ybWF0aW9uXCIsXG4gICAgbGFiZWw6IHtcbiAgICAgIHRleHQ6IHRoaXMubGFiZWwudGV4dFxuICAgIH0sXG4gICAgYmJveDoge1xuICAgICAgdzogdGhpcy5iYm94LncsXG4gICAgICBoOiB0aGlzLmJib3guaFxuICAgIH0sXG4gICAgbG9jYXRpb246IHRoaXMuYW5jaG9yU2lkZSxcbiAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgaW5kZXg6IGluZGV4XG4gIH07XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKG5ld1BhcmVudCwgbmV3SWQpIHtcbiAgdmFyIG5ld1VuaXRPZkluZm8gPSBBdXhpbGlhcnlVbml0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywgbmV3IFVuaXRPZkluZm9ybWF0aW9uKCksIG5ld1BhcmVudCwgbmV3SWQpO1xuICBuZXdVbml0T2ZJbmZvLmxhYmVsID0galF1ZXJ5LmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5sYWJlbCk7XG4gIG5ld1VuaXRPZkluZm8uY2xhenogPSB0aGlzLmNsYXp6O1xuICBuZXdVbml0T2ZJbmZvLnNoYXBlRm4gPSB0aGlzLnNoYXBlRm47XG4gIG5ld1VuaXRPZkluZm8uc2hhcGVBcmdzRm4gPSB0aGlzLnNoYXBlQXJnc0ZuO1xuICByZXR1cm4gbmV3VW5pdE9mSW5mbztcbn07XG5cbm5zLlVuaXRPZkluZm9ybWF0aW9uID0gVW5pdE9mSW5mb3JtYXRpb247XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgVW5pdE9mSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gLS0tLS0tLS0tLS0tLS0gRW50aXR5VHlwZSAtLS0tLS0tLS0tLS0tLSAvL1xuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgRVBOLCBmb3IgZXhhbXBsZSB0aGVyZSBjYW4gYmUgc2V2ZXJhbHMgbXlvc2luIEVQTiwgYnV0IG9ubHkgb25lIG15b3NpbiBFbnRpdHlUeXBlXG4gKiBUaGlzIGNsYXNzIHdpbGwgaG9sZCB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHN0YXRlIHZhcmlhYmxlLCB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgbXlvc2luc1xuICovXG52YXIgRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChuYW1lLCBFUE4pIHtcbiAgdGhpcy5uYW1lID0gbmFtZTsgLy8gbm9ybWFsbHkgdGhlIHNhbWUgYXMgaXRzIEVQTnNcbiAgdGhpcy5zdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbnMgPSBbXTsgLy8gMCBvciBtYW55IHNoYXJlZCBzdGF0ZSBkZWZpbml0aW9uc1xuICB0aGlzLkVQTnMgPSBbXTsgLy8gdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCAxIGVsZW1lbnQsIGVsc2Ugbm8gcmVhc29uIHRvIGV4aXN0XG59O1xuXG5FbnRpdHlUeXBlLnByb3RvdHlwZS5jcmVhdGVOZXdEZWZpbml0aW9uRm9yID0gZnVuY3Rpb24gKHN0YXRlVmFyKSB7XG4gIHZhciBuZXdEZWZpbml0aW9uID0gbmV3IG5zLlN0YXRlVmFyaWFibGVEZWZpbml0aW9uKCk7XG4gIG5ld0RlZmluaXRpb24uZW50aXR5VHlwZSA9IHRoaXM7XG4gIG5ld0RlZmluaXRpb24uc3RhdGVWYXJpYWJsZXMucHVzaChzdGF0ZVZhcik7XG5cbiAgc3RhdGVWYXIuc3RhdGVWYXJpYWJsZURlZmluaXRpb24gPSBuZXdEZWZpbml0aW9uO1xuICBzdGF0ZVZhci5wYXJlbnQuZGF0YSgnZW50aXR5VHlwZScsIHRoaXMpO1xuICB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9ucy5wdXNoKG5ld0RlZmluaXRpb24pO1xufTtcblxuRW50aXR5VHlwZS5wcm90b3R5cGUuYXNzaWduU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uIChzdGF0ZVZhcikge1xuICAvLyBmaXJzdCB0cml2aWFsIGNhc2UsIG5vIHN0YXRlRGVmaW5pdGlvbiB5ZXQgZm9yIHRoaXMgZW50aXR5VHlwZSwgc28gdGhpcyBpcyBhIG5ldyBvbmVcbiAgaWYgKHRoaXMuc3RhdGVWYXJpYWJsZURlZmluaXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5jcmVhdGVOZXdEZWZpbml0aW9uRm9yKHN0YXRlVmFyKTtcbiAgfVxuICBlbHNlIHsgLy8gaWYgZGVmaW5pdGlvbnMgYXJlIGFscmVhZHkgcHJlc2VudCwgd2UgbmVlZCB0byBtYXRjaCB0aG9zZSB0byB0aGUgY3VycmVudCBzdGF0ZVZhcmlhYmxlXG4gICAgZm9yKHZhciBpPTA7IGkgPCB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hdGNoU3RhdGVEZWYgPSB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uc1tpXTtcbiAgICAgIGlmIChtYXRjaFN0YXRlRGVmLm1hdGNoU3RhdGVWYXJpYWJsZShzdGF0ZVZhcikpe1xuICAgICAgICBtYXRjaFN0YXRlRGVmLnN0YXRlVmFyaWFibGVzLnB1c2goc3RhdGVWYXIpO1xuICAgICAgICBzdGF0ZVZhci5zdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IG1hdGNoU3RhdGVEZWY7XG4gICAgICAgIHN0YXRlVmFyLnBhcmVudC5kYXRhKCdlbnRpdHlUeXBlJywgdGhpcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm90aGluZyB3YXMgbWF0Y2hlZCBhbW9uZyB0aGUgY3VycmVudCBzdGF0ZVZhckRlZiBvZiB0aGlzIGVudGl0eVR5cGUsIGNyZWF0ZSBuZXcgb25lXG4gICAgdGhpcy5jcmVhdGVOZXdEZWZpbml0aW9uRm9yKHN0YXRlVmFyKTtcbiAgfVxufTtcblxubnMuRW50aXR5VHlwZSA9IEVudGl0eVR5cGU7XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgRW50aXR5VHlwZSAtLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyAtLS0tLS0tLS0tLS0tLSBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLSAvL1xuLyoqXG4gKiBUaGUgc3RhdGUgdmFyaWFibGUgZGVmaW5pdGlvbiBpcyBzb21ldGhpbmcgc2hhcmVkIGFjcm9zcyBkaWZmZXJlbnQgRVBOc1xuICogVGhlIGNvbmNlcm5lZCBFUE5zIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUgZW50aXR5cGUgcmVmZXJlbmNlXG4gKi9cbnZhciBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCBlbnRpdHlUeXBlKSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuZW50aXR5VHlwZSA9IGVudGl0eVR5cGU7IC8vIHJlZmVyZW5jZSB0byBvd25pbmcgZW50aXR5IHR5cGVcbiAgdGhpcy5zdGF0ZVZhcmlhYmxlcyA9IFtdOyAvLyB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IDEgZWxlbWVudCwgZWxzZSBubyByZWFzb24gdG8gZXhpc3Rcbn07XG5cbi8qKlxuICogcmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNoYXJlIHRoaXMgc3RhdGUgZGVmaW5pdGlvblxuICovXG5TdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUuZ2V0Q29uY2VybmVkRVBOcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbnRpdHlUeXBlLkVQTnM7XG59O1xuXG4vKipcbiAqIEd1ZXNzIGlmIHRoZSBwcm92aWRlZCBzdGF0ZVZhcmlhYmxlIGJlbG9uZ3MgdG8gdGhpcyBzdGF0ZVZhckRlZmluaXRpb25cbiAqIFdlIGNvbnNpZGVyIGl0IGRvZXMsIGlmIGVpdGhlciB0aGUgc3RhdGV2YXIudmFsdWUgb3Igc3RhdGV2YXIudmFyaWFibGUgYXJlIG1hdGNoaW5nIG9uZSBcbiAqIGlmIHRoZSBzdGF0ZXZhciBpbiB0aGUgc2V0IG9mIHRoZSBTdGF0ZVZhckRlZlxuICogVGhpcyBpcyBiZWNhdXNlIHdlIG5vcm1hbGx5IGNvbXBhcmUgb25seSBzdGF0ZVZhcmlhYmxlcyBmcm9tIHRoZSBzYW1lIGVudGl0eVR5cGVcbiAqL1xuU3RhdGVWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlLm1hdGNoU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uKHN0YXRlVmFyKSB7XG4gIGZvcih2YXIgaT0wOyBpIDwgdGhpcy5zdGF0ZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtYXRjaFN0YXRlVmFyID0gdGhpcy5zdGF0ZVZhcmlhYmxlc1tpXTtcbiAgICAvLyBEb24ndCBtYXRjaCBhIHN0YXRlVmFyIGFnYWluc3QgYW5vdGhlciBvbmUgZnJvbSB0aGUgc2FtZSBlbGVtZW50LlxuICAgIC8vIElmIDIgc3RhdGV2YXIgb24gdGhlIHNhbWUgZWxlbWVudCwgdGhlbiB0aGV5IGhhdmUgdG8gYmVsb25nIHRvIDIgZGlmZmVyZW50IHN0YXRlVmFyRGVmaW5pdGlvbnNcbiAgICBpZihtYXRjaFN0YXRlVmFyLnBhcmVudCA9PT0gc3RhdGVWYXIucGFyZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy9jb25zb2xlLmxvZyhcInRyeVwiLCBbbWF0Y2hTdGF0ZVZhci52YWx1ZSwgbWF0Y2hTdGF0ZVZhci52YXJpYWJsZV0sIFtzdGF0ZVZhci52YWx1ZSwgc3RhdGVWYXIudmFyaWFibGVdKTtcbiAgICAvLyBub3JtYWwgc3VyZSBjYXNlLiBFeGFtcGxlOlxuICAgIC8vIFAgVDEzNCAtIHVuZGVmaW5lZCBUMTM0XG4gICAgLy8gUCB1bmRlZiAtIFAgdW5kZWZcbiAgICBpZiAoLy8obWF0Y2hTdGF0ZVZhci52YWx1ZSAmJiBzdGF0ZVZhci52YWx1ZSAmJiBtYXRjaFN0YXRlVmFyLnZhbHVlID09IHN0YXRlVmFyLnZhbHVlICkgfHxcbiAgICAgICAgKG1hdGNoU3RhdGVWYXIudmFyaWFibGUgJiYgc3RhdGVWYXIudmFyaWFibGUgJiYgbWF0Y2hTdGF0ZVZhci52YXJpYWJsZSA9PSBzdGF0ZVZhci52YXJpYWJsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBtb3JlIHN1YnRsZSBjYXNlLCB3aXRoIGVtcHR5IHN0YXRlVmFyLiBMb29rIG9ubHkgYXQgdmFsdWUgYW5kIGRpc2NhcmQgdmFyaWFibGVcbiAgICAvLyBleGFtcGxlOiB1bmRlZiB1bmRlZiAtIFAgdW5kZWZcbiAgICBlbHNlIGlmICgoIW1hdGNoU3RhdGVWYXIudmFyaWFibGUgJiYgIXN0YXRlVmFyLnZhcmlhYmxlKSAmJiAobWF0Y2hTdGF0ZVZhci52YWx1ZSB8fCBzdGF0ZVZhci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5ucy5TdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IFN0YXRlVmFyaWFibGVEZWZpbml0aW9uO1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIFN0YXRlVmFyaWFibGVEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIC0tLS0tLS0tLS0tLS0tIEF1eFVuaXRMYXlvdXQgLS0tLS0tLS0tLS0tLS0gLy9cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIGxheWluZyBvdXQgdGhlIGF1eGlsaWFyeSB1bml0cyBjb250YWluZWQgb24gYSBzYW1lIGVkZ2VcbiAqL1xudmFyIEF1eFVuaXRMYXlvdXQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbG9jYXRpb24sIGFsaWdubWVudCkge1xuICB0aGlzLnVuaXRzID0gW107XG4gIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQgfHwgXCJsZWZ0XCI7IC8vIHRoaXMgd2FzIGludGVuZGVkIHRvIGJlIHVzZWQsIGJ1dCBpdCBpc24ndCBmb3Igbm93XG4gIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG4gIHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGUgPSBbXTtcbiAgdGhpcy5sZW5ndGhVc2VkID0gMDtcblxuICAvLyBzcGVjaWZpYyBydWxlcyBmb3IgdGhlIGxheW91dFxuICBpZihwYXJlbnROb2RlLmRhdGEoJ2NsYXNzJykgPT0gXCJzaW1wbGUgY2hlbWljYWxcIikge1xuICAgIHRoaXMub3V0ZXJNYXJnaW4gPSAzO1xuICB9XG59O1xuLyoqXG4gKiBvdXRlck1hcmdpbjogdGhlIGxlZnQgYW5kIHJpZ2h0IHNwYWNlIGxlZnQgYmV0d2VlbiB0aGUgc2lkZSBvZiB0aGUgbm9kZSwgYW5kIHRoZSBmaXJzdCAoYW5kIGxhc3QpIGJveFxuICogdW5pdEdhcDogdGhlIHNwYWNlIGJldHdlZW4gdGhlIGF1eGlsaWFyeSB1bml0c1xuICogYWx3YXlzU2hvd0F1eFVuaXRzOiBieXBhc3NlcyBhbnkgbGltaXQgb2YgdW5pdHMgZGlzcGxheWVkLCBhbmQgcHJldmVudCB1bml0cyBmcm9tIGRpc2FwcGVhcmluZyxcbiAqIGZvcmNpbmcgYSBtaW5pbXVtIHNpemUgZm9yIHRoZSBub2RlXG4gKiBtYXhVbml0RGlzcGxheWVkOiBzaG93IGF0IG1vc3QgdGhpcyBhbW91bnQgb2YgdW5pdHMsIGV2ZW4gd2hlbiB0aGVyZSBpcyBlbm91Z2ggc3BhY2VcbiAqXG4gKiBUaGVzZSBvcHRpb25zIGNhbiBiZSBkZWZpbmVkIGF0IHRoZSBpbnN0YW5jZSBsZXZlbC4gSWYgaXQgaXMgZm91bmQgaW4gYW4gaW5zdGFuY2UsIHRoZW4gaXQgXG4gKiB0YWtlcyBwcmVjZWRlbmNlLiBJZiBub3QgZm91bmQsIHRoZSBmb2xsb3dpbmcgY2xhc3MnIHZhbHVlcyBhcmUgdXNlZC5cbiAqL1xuQXV4VW5pdExheW91dC5vdXRlck1hcmdpbiA9IDEwO1xuQXV4VW5pdExheW91dC51bml0R2FwID0gNTtcbkF1eFVuaXRMYXlvdXQuYWx3YXlzU2hvd0F1eFVuaXRzID0gZmFsc2U7XG5BdXhVbml0TGF5b3V0Lm1heFVuaXREaXNwbGF5ZWQgPSAtMTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oZG9Gb3JjZVVwZGF0ZSkge1xuICB0aGlzLnByZWNvbXB1dGVDb29yZHMoZG9Gb3JjZVVwZGF0ZSk7XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5hZGRBdXhVbml0ID0gZnVuY3Rpb24odW5pdCwgcG9zaXRpb24pIHtcbiAgaWYodHlwZW9mIHBvc2l0aW9uICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiYWRkIHVuaXQgYXQgcG9zaXRpaW9uXCIsIHBvc2l0aW9uKTtcbiAgICB0aGlzLnVuaXRzLnNwbGljZShwb3NpdGlvbiwgMCwgdW5pdCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy51bml0cy5wdXNoKHVuaXQpO1xuICAgIHBvc2l0aW9uID0gdGhpcy51bml0cy5sZW5ndGggLSAxO1xuICB9XG5cbiAgdGhpcy51cGRhdGVMZW5ndGhDYWNoZSgpO1xuICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgaWYgKHRoaXMuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzKCkpIHtcbiAgICAvLyBzZXQgYSBtaW5pbXVtIHNpemUgYWNjb3JkaW5nIHRvIGJvdGggc2lkZXMgb24gdGhlIHNhbWUgb3JpZW50YXRpb25cbiAgICB0aGlzLnNldFBhcmVudE1pbkxlbmd0aCgpO1xuICAgIC8vIG5lZWQgdG8gcmVzaXplIHRoZSBwYXJlbnQgaW4gY2FzZSB0aGUgc3BhY2Ugd2FzIHRvbyBzbWFsbFxuICAgIHRoaXMucmVzaXplUGFyZW50KHRoaXMubGVuZ3RoVXNlZCk7XG4gIH1cbiAgLy9jeS5zdHlsZSgpLnVwZGF0ZSgpOyAvLyA8LSB3YXMgaXQgcmVhbGx5IG5lY2Vzc2FyeSA/XG4gIHJldHVybiBwb3NpdGlvbjtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLnJlbW92ZUF1eFVuaXQgPSBmdW5jdGlvbih1bml0KSB7XG4gIHZhciBpbmRleCA9IHRoaXMudW5pdHMuaW5kZXhPZih1bml0KTtcbiAgdGhpcy51bml0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB0aGlzLnVwZGF0ZUxlbmd0aENhY2hlKCk7XG4gIHRoaXMudXBkYXRlKHRydWUpO1xuICBpZiAodGhpcy5nZXRBbHdheXNTaG93QXV4VW5pdHMoKSkge1xuICAgIC8vIHNldCBhIG1pbmltdW0gc2l6ZSBhY2NvcmRpbmcgdG8gYm90aCBzaWRlcyBvbiB0aGUgc2FtZSBvcmllbnRhdGlvblxuICAgIHRoaXMuc2V0UGFyZW50TWluTGVuZ3RoKCk7XG4gIH1cbiAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbn07XG5cbi8qKlxuICogcmVvcmRlciBib3hlcyB1c2luZyB0aGVpciBkZWZpbmVkIHBvc2l0aW9ucy4gRnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCB0b3AgdG8gYm90dG9tLlxuICogdGhpcyBlbnN1cmVzIHRoYXQgdGhlaXIgb3JkZXIgaW4gdGhlIGxheW91dCdzIGxpc3QgY29ycmVzcG9uZHMgdG8gdGhlIHJlYWxpdHkgb2YgdGhlIG1hcC5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUucmVvcmRlckZyb21Qb3NpdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLnVuaXRzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIGlmKHNlbGYubG9jYXRpb24gPT0gXCJ0b3BcIiB8fCBzZWxmLmxvY2F0aW9uID09IFwiYm90dG9tXCIpIHtcbiAgICAgIGlmIChhLmJib3gueCA8IGIuYmJveC54KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmJib3gueCA+IGIuYmJveC54KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhLmJib3gueSA8IGIuYmJveC55KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmJib3gueSA+IGIuYmJveC55KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG4gIC8vY29uc29sZS5sb2coXCJ1bml0cyBhZnRlciByZW9hcmRlclwiLCB0aGlzLnVuaXRzKTtcbiAgdGhpcy51cGRhdGVMZW5ndGhDYWNoZSgpO1xuICB0aGlzLnVwZGF0ZSh0cnVlKTtcbn07XG5cbi8qKlxuICogdXNlIGEgY2FjaGVkIGxpc3QgdG8gZGV0ZXJtaW5lIHdoYXQgaXMgdGhlIGxlbmd0aCBuZWVkZWQgdG8gZHJhdyB4IGF1eCB1bml0cy5cbiAqIGNhbiB0aGVuIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIHBhcmVudCBub2RlJ3MgZGltZW5zaW9ucywgdG8gZGVjaWRlIGhvdyBtYW55XG4gKiBhdXggdW5pdHMgdG8gZHJhdy5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUudXBkYXRlTGVuZ3RoQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZW5kZXJMZW5ndGhDYWNoZSA9IFswXTtcbiAgdmFyIHByZXZpb3VzID0gdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudExlbmd0aDtcbiAgICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgICBjdXJyZW50TGVuZ3RoID0gdGhpcy51bml0c1tpXS5iYm94Lnc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3VycmVudExlbmd0aCA9IHRoaXMudW5pdHNbaV0uYmJveC5oO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckxlbmd0aENhY2hlLnB1c2gocHJldmlvdXMgKyBjdXJyZW50TGVuZ3RoICsgdGhpcy5nZXRPdXRlck1hcmdpbigpKTtcbiAgICBwcmV2aW91cyArPSBjdXJyZW50TGVuZ3RoICsgdGhpcy5nZXRVbml0R2FwKCk7XG4gIH1cbn07XG5cbi8qKlxuICogVXNlIHRoZSBjYWNoZWQgcHJlY29tcHV0ZWQgbGVuZ3RocyB0byBkZWNpZGUgaG93IG1hbnkgdW5pdHMgd2UgYXJlIGNhcGFibGUgb2YgZHJhd2luZyxcbiAqIGNvbnNpZGVyaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAqIFRoZSBudW1iZXIgcmV0dXJuZWQgc2F5czogd2UgYXJlIGFibGUgdG8gZHJhdyB0aGUgTiBmaXJzdCB1bml0cyBvZiB0aGUgbGlzdHMuXG4gKiBVbnVzZWQgZm9yIG5vdy5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUuZ2V0RHJhd2FibGVVbml0QW1vdW50ID0gZnVuY3Rpb24oKSB7XG4gIGlmKHRoaXMuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzKCkpIHtcbiAgICAvLyBieXBhc3MgYWxsIHRoaXNcbiAgICByZXR1cm4gdGhpcy51bml0cy5sZW5ndGg7XG4gIH1cblxuICAvLyBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc2lkZSBvbiB3aGljaCB3ZSBkcmF3XG4gIHZhciBhdmFpbGFibGVTcGFjZTtcbiAgaWYgKHRoaXMuaXNUb3JCKCkpIHtcbiAgICBhdmFpbGFibGVTcGFjZSA9IHRoaXMucGFyZW50Tm9kZS5vdXRlcldpZHRoKCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgYXZhaWxhYmxlU3BhY2UgPSB0aGlzLnBhcmVudE5vZGUub3V0ZXJIZWlnaHQoKTtcbiAgfVxuICAvLyBsb29wIG92ZXIgdGhlIGNhY2hlZCBwcmVjb21wdXRlZCBsZW5ndGhzXG4gIGZvcih2YXIgaT0wOyBpIDwgdGhpcy5yZW5kZXJMZW5ndGhDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGlmKHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGVbaV0gPiBhdmFpbGFibGVTcGFjZSkge1xuICAgICAgLy8gc3RvcCBpZiB3ZSBvdmVyZmxvd1xuICAgICAgcmV0dXJuIGkgLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy51bml0cy5sZW5ndGg7XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5zZXREaXNwbGF5ZWRVbml0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIHNpZGUgb24gd2hpY2ggd2UgZHJhd1xuICB2YXIgYXZhaWxhYmxlU3BhY2U7XG4gIGlmICh0aGlzLmlzVG9yQigpKSB7XG4gICAgYXZhaWxhYmxlU3BhY2UgPSB0aGlzLnBhcmVudE5vZGUub3V0ZXJXaWR0aCgpO1xuICAgIC8vIGR1ZSB0byBjb3JuZXIgb2YgYmFycmVsIHNoYXBlZCBjb21wYXJ0bWVudCBkZWNyZWFzZSBhdmFpbGFibGVTcGFjZSAtLSBubyBpbmZvYm94IG9uIGNvcm5lcnNcbiAgICBpZiAodGhpcy5wYXJlbnROb2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIpXG4gICAgICAgIGF2YWlsYWJsZVNwYWNlICo9IDAuODtcbiAgfVxuICBlbHNlIHtcbiAgICBhdmFpbGFibGVTcGFjZSA9IHRoaXMucGFyZW50Tm9kZS5vdXRlckhlaWdodCgpO1xuICB9XG5cbiAgLy8gdGhlcmUgaXMgYWx3YXlzIG4rMSBlbGVtZW50cyBpbiB0aGUgY2FjaGVkTGVuZ3RoIGZvciBuIHVuaXRzXG4gIHZhciBhbHdheXNTaG93QXV4VW5pdHMgPSB0aGlzLmdldEFsd2F5c1Nob3dBdXhVbml0cygpO1xuICB2YXIgbWF4VW5pdERpc3BsYXllZCA9IHRoaXMuZ2V0TWF4VW5pdERpc3BsYXllZCgpO1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZigodGhpcy5yZW5kZXJMZW5ndGhDYWNoZVtpKzFdIDw9IGF2YWlsYWJsZVNwYWNlIC8vIGRvIHdlIGhhdmUgZW5vdWdoIHNwYWNlP1xuICAgICAgJiYgKG1heFVuaXREaXNwbGF5ZWQgPT0gLTEgfHwgaSA8IG1heFVuaXREaXNwbGF5ZWQpKSAvLyBpcyB0aGVyZSBubyBsaW1pdD8gb3IgYXJlIHdlIHVuZGVyIHRoYXQgbGltaXQ/XG4gICAgICB8fCBhbHdheXNTaG93QXV4VW5pdHMpIHsgLy8gZG8gd2UgYWx3YXlzIHdhbnQgdG8gc2hvdyBldmVyeXRoaW5nIHJlZ2FyZGxlc3M/XG4gICAgICB0aGlzLnVuaXRzW2ldLmlzRGlzcGxheWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuaXRzW2ldLmlzRGlzcGxheWVkID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG4vLyBUT0RPIGZpbmQgYSB3YXkgdG8gcmVmYWN0b3IsIHJlbW92ZSB1Z2xpbmVzcyBvZiB0b3AtYm90dG9tL2xlZnQtcmlnaHQuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5wcmVjb21wdXRlQ29vcmRzID0gZnVuY3Rpb24gKGRvRm9yY2VVcGRhdGUpIHtcbiAgdGhpcy5zZXREaXNwbGF5ZWRVbml0cygpO1xuXG4gIHZhciBsZW5ndGhVc2VkID0gdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuICB2YXIgZmluYWxMZW5ndGhVc2VkID0gbGVuZ3RoVXNlZDtcbiAgdmFyIHVuaXRHYXAgPSB0aGlzLmdldFVuaXRHYXAoKTtcbiAgZm9yKHZhciBpPTA7IGkgPCB0aGlzLnVuaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gY2hhbmdlIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYXV4aWxpYXJ5IHVuaXQgYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gbGF5b3V0XG4gICAgdmFyIGF1eFVuaXQgPSB0aGlzLnVuaXRzW2ldO1xuICAgIGlmIChhdXhVbml0LmNvb3JkVHlwZSAhPSBcInJlbGF0aXZlVG9TaWRlXCIgfHwgZG9Gb3JjZVVwZGF0ZSkge1xuICAgICAgaWYgKGF1eFVuaXQuY29vcmRUeXBlID09IFwicmVsYXRpdmVUb0NlbnRlclwiIHx8IGRvRm9yY2VVcGRhdGUpIHtcbiAgICAgICAgaWYodGhpcy5pc1RvckIoKSkge1xuICAgICAgICAgIC8vYXV4VW5pdC5iYm94LnkgPSAwO1xuICAgICAgICAgIGF1eFVuaXQuYmJveC54ID0gbGVuZ3RoVXNlZCArIGF1eFVuaXQuYmJveC53IC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvL2F1eFVuaXQuYmJveC54ID0gMDtcbiAgICAgICAgICBhdXhVbml0LmJib3gueSA9IGxlbmd0aFVzZWQgKyBhdXhVbml0LmJib3guaCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF1eFVuaXQuY29vcmRUeXBlID0gXCJyZWxhdGl2ZVRvU2lkZVwiOyBcbiAgICB9XG5cbiAgICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgICAvL2F1eFVuaXQuYmJveC55ID0gMDtcbiAgICAgIGxlbmd0aFVzZWQgKz0gYXV4VW5pdC5iYm94LncgKyB1bml0R2FwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vYXV4VW5pdC5iYm94LnggPSAwO1xuICAgICAgbGVuZ3RoVXNlZCArPSBhdXhVbml0LmJib3guaCArIHVuaXRHYXA7XG4gICAgfVxuXG4gICAgaWYoYXV4VW5pdC5pc0Rpc3BsYXllZCkge1xuICAgICAgZmluYWxMZW5ndGhVc2VkID0gbGVuZ3RoVXNlZDtcbiAgICB9XG4gIH1cbiAgLy8gYWRqdXN0IHRoZSBsZW5ndGgsIHNob3VsZCBiZSBjb21wb3NlZCBvZiBvdXRlck1hcmdpbiBvbiB0aGUgZW5kLCBub3QgdW5pdEdhcFxuICBmaW5hbExlbmd0aFVzZWQgPSBmaW5hbExlbmd0aFVzZWQgLSB1bml0R2FwICsgdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuXG4gIHRoaXMubGVuZ3RoVXNlZCA9IGZpbmFsTGVuZ3RoVXNlZDtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXV4VW5pdCA9IHRoaXMudW5pdHNbaV07XG4gICAgaWYgKGF1eFVuaXQuaXNEaXNwbGF5ZWQpIHtcbiAgICAgIC8vIG1ha2UgZWFjaCB1bml0IGRyYXcgaXRzZWxmXG4gICAgICBhdXhVbml0LmRyYXcoY29udGV4dCk7XG4gICAgfVxuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnVuaXRzLmxlbmd0aCA9PSAwO1xufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUudW5pdENvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnVuaXRzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQXV0byBjaG9vc2UgdGhlIG5leHQgbGF5b3V0LiBUbyBhZGQgYSBuZXcgYXV4IHVuaXQsIGZvciBleGFtcGxlLlxuICovXG5BdXhVbml0TGF5b3V0LnNlbGVjdE5leHRBdmFpbGFibGUgPSBmdW5jdGlvbihub2RlKSB7XG4gIHZhciB0b3AgPSBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJykudG9wO1xuICB2YXIgYm90dG9tID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpLmJvdHRvbTtcbiAgdmFyIHJlc3VsdExvY2F0aW9uID0gXCJ0b3BcIjtcblxuICAvLyBzdGFydCBieSBhZGRpbmcgb24gdG9wIGlmIGZyZWVcbiAgaWYoIXRvcCB8fCB0b3AuaXNFbXB0eSgpKSB7XG4gICAgcmVzdWx0TG9jYXRpb24gPSBcInRvcFwiO1xuICB9XG4gIGVsc2UgaWYoIWJvdHRvbSB8fCBib3R0b20uaXNFbXB0eSgpKSB7XG4gICAgcmVzdWx0TG9jYXRpb24gPSBcImJvdHRvbVwiO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIHNlYXJjaCBmb3IgdGhlIHNpZGUgd2l0aCB0aGUgZmV3ZXIgdW5pdHMgb24gaXRcbiAgICBpZih0b3AudW5pdENvdW50KCkgPD0gYm90dG9tLnVuaXRDb3VudCgpKSB7XG4gICAgICByZXN1bHRMb2NhdGlvbiA9IFwidG9wXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVzdWx0TG9jYXRpb24gPSBcImJvdHRvbVwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0TG9jYXRpb247XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5yZXNpemVQYXJlbnQgPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gIGlmKHRoaXMuaXNUb3JCKCkpIHtcbiAgICBpZih0aGlzLnBhcmVudE5vZGUuZGF0YSgnYmJveCcpLncgPCBsZW5ndGgpIHtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZXN0YXJ0XCIsIFtcImNlbnRlcnJpZ2h0XCIsIHRoaXMucGFyZW50Tm9kZV0pO1xuICAgICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ2Jib3gnKS53ID0gbGVuZ3RoO1xuICAgICAgY3kudHJpZ2dlcihcIm5vZGVyZXNpemUucmVzaXplZW5kXCIsIFtcImNlbnRlcnJpZ2h0XCIsIHRoaXMucGFyZW50Tm9kZV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZih0aGlzLnBhcmVudE5vZGUuZGF0YSgnYmJveCcpLmggPCBsZW5ndGgpIHtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZXN0YXJ0XCIsIFtcImJvdHRvbWNlbnRlclwiLCB0aGlzLnBhcmVudE5vZGVdKTtcbiAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhKCdiYm94JykuaCA9IGxlbmd0aDtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZWVuZFwiLCBbXCJib3R0b21jZW50ZXJcIiwgdGhpcy5wYXJlbnROb2RlXSk7XG4gICAgfVxuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5pc1RvckIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxvY2F0aW9uID09IFwidG9wXCIgfHwgdGhpcy5sb2NhdGlvbiA9PSBcImJvdHRvbVwiO1xufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUuaXNMb3JSID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sb2NhdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLmxvY2F0aW9uID09IFwicmlnaHRcIjtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLnNldFBhcmVudE1pbkxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmVudExheW91dHMgPSB0aGlzLnBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKTtcbiAgc3dpdGNoKHRoaXMubG9jYXRpb24pIHtcbiAgICBjYXNlIFwidG9wXCI6XG4gICAgICB2YXIgY29tcGFyZVZhbCA9IHBhcmVudExheW91dHMuYm90dG9tID8gcGFyZW50TGF5b3V0cy5ib3R0b20ubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICB2YXIgY29tcGFyZVZhbCA9IHBhcmVudExheW91dHMudG9wID8gcGFyZW50TGF5b3V0cy50b3AubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgdmFyIGNvbXBhcmVWYWwgPSBwYXJlbnRMYXlvdXRzLnJpZ2h0ID8gcGFyZW50TGF5b3V0cy5yaWdodC5sZW5ndGhVc2VkIDogMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgdmFyIGNvbXBhcmVWYWwgPSBwYXJlbnRMYXlvdXRzLmxlZnQgPyBwYXJlbnRMYXlvdXRzLmxlZnQubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgfVxuICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ3Jlc2l6ZU1pbldpZHRoJywgTWF0aC5tYXgodGhpcy5sZW5ndGhVc2VkLCBjb21wYXJlVmFsKSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ3Jlc2l6ZU1pbkhlaWdodCcsIE1hdGgubWF4KHRoaXMubGVuZ3RoVXNlZCwgY29tcGFyZVZhbCkpO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRPdXRlck1hcmdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYodHlwZW9mIHRoaXMub3V0ZXJNYXJnaW4gIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5vdXRlck1hcmdpbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm91dGVyTWFyZ2luO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBBdXhVbml0TGF5b3V0Lm91dGVyTWFyZ2luO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRVbml0R2FwID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy51bml0R2FwICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMudW5pdEdhcCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnVuaXRHYXA7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQudW5pdEdhcDtcbiAgfVxufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy5hbHdheXNTaG93QXV4VW5pdHMgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5hbHdheXNTaG93QXV4VW5pdHMgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5hbHdheXNTaG93QXV4VW5pdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQuYWx3YXlzU2hvd0F1eFVuaXRzO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRNYXhVbml0RGlzcGxheWVkID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy5tYXhVbml0RGlzcGxheWVkICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMubWF4VW5pdERpc3BsYXllZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm1heFVuaXREaXNwbGF5ZWQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQubWF4VW5pdERpc3BsYXllZDtcbiAgfVxufTtcblxuLypcbiAqICBEdXBsaWNhdGUgYSBsYXlvdXQuIERvZXNuJ3QgY29weSB0aGUgdW5pdHMgYXR0cmlidXRlLCByZXNldCBpdCBpbnN0ZWFkLlxuICovXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24obmV3UGFyZW50KSB7XG4gIHZhciBuZXdMYXlvdXQgPSBuZXcgQXV4VW5pdExheW91dChuZXdQYXJlbnQpO1xuICAvLyBDb3B5aW5nIHRoZSBzYW1lIHJlZmVyZW5jZSB0byB1bml0cyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQuXG4gIC8vIER1cGxpY2F0aW5nIG93bmVkIHVuaXRzIGdvZXMgYmV5b25uZCB0aGUgc2NvcGUsIGJlY2F1c2Ugd2UgbmVlZCB0byBhc3NpZ25cbiAgLy8gaWRzIHRoYXQgYXJlIHRpZWQgdG8gdGhlIGdsb2JhbCBjb3VuZCBvZiB1bml0cyBvZiBhIG5vZGUuXG4gIC8vIFNvIGR1cGxpY2F0aW5nIHVuaXRzIGlzIHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBwcm9wZXJseSBkb25lIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cbiAgLy8gVE9ETyB0aGF0IGlzIGEgYml0IGRpcnR5LCBmaW5kIGEgbmljZSBtb2R1bGFyIHdheSB0byBhcnJhbmdlIHRoYXRcbiAgbmV3TGF5b3V0LnVuaXRzID0gW107XG4gIG5ld0xheW91dC5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb247XG4gIG5ld0xheW91dC5hbGlnbm1lbnQgPSB0aGlzLmFsaWdubWVudDtcbiAgbmV3TGF5b3V0LnBhcmVudE5vZGUgPSBuZXdQYXJlbnQ7XG4gIG5ld0xheW91dC5yZW5kZXJMZW5ndGhDYWNoZSA9IHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGU7XG4gIG5ld0xheW91dC5sZW5ndGhVc2VkID0gdGhpcy5sZW5ndGhVc2VkO1xuICBpZih0eXBlb2YgdGhpcy5vdXRlck1hcmdpbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC5vdXRlck1hcmdpbiA9IHRoaXMub3V0ZXJNYXJnaW47XG4gIH1cbiAgaWYodHlwZW9mIHRoaXMudW5pdEdhcCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC51bml0R2FwID0gdGhpcy51bml0R2FwO1xuICB9XG4gIGlmKHR5cGVvZiB0aGlzLmFsd2F5c1Nob3dBdXhVbml0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC5hbHdheXNTaG93QXV4VW5pdHMgPSB0aGlzLmFsd2F5c1Nob3dBdXhVbml0cztcbiAgfVxuICBpZih0eXBlb2YgdGhpcy5tYXhVbml0RGlzcGxheWVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbmV3TGF5b3V0Lm1heFVuaXREaXNwbGF5ZWQgPSB0aGlzLm1heFVuaXREaXNwbGF5ZWQ7XG4gIH1cbiAgcmV0dXJuIG5ld0xheW91dDtcbn07XG5cbm5zLkF1eFVuaXRMYXlvdXQgPSBBdXhVbml0TGF5b3V0O1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIEF1eFVuaXRMYXlvdXQgLS0tLS0tLS0tLS0tLS0gLy9cblxubW9kdWxlLmV4cG9ydHMgPSBucztcbiIsIi8qXG4gKiBDb21tb24gdXRpbGl0aWVzIGZvciBlbGVtZW50cyBpbmNsdWRlcyBib3RoIGdlbmVyYWwgdXRpbGl0aWVzIGFuZCBzYmduIHNwZWNpZmljIHV0aWxpdGllcyBcbiAqL1xuXG52YXIgdHJ1bmNhdGVUZXh0ID0gcmVxdWlyZSgnLi90ZXh0LXV0aWxpdGllcycpLnRydW5jYXRlVGV4dDtcbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBncmFwaFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vZ3JhcGgtdXRpbGl0aWVzJyk7XG5cbnZhciBlbGVtZW50VXRpbGl0aWVzID0ge1xuXG4gICAgbWFwVHlwZTogdW5kZWZpbmVkLCAvLyBpbml0aWFsaXplIG1hcCB0eXBlXG5cbiAgICAvL3RoZSBsaXN0IG9mIHRoZSBlbGVtZW50IGNsYXNzZXMgaGFuZGxlZCBieSB0aGUgdG9vbFxuICAgIGhhbmRsZWRFbGVtZW50czoge1xuICAgICAgICAndW5zcGVjaWZpZWQgZW50aXR5JzogdHJ1ZSxcbiAgICAgICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgICAgICdtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAgICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAgICAgJ3BlcnR1cmJpbmcgYWdlbnQnOiB0cnVlLFxuICAgICAgICAnc291cmNlIGFuZCBzaW5rJzogdHJ1ZSxcbiAgICAgICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICAgICAncHJvY2Vzcyc6IHRydWUsXG4gICAgICAgICdvbWl0dGVkIHByb2Nlc3MnOiB0cnVlLFxuICAgICAgICAndW5jZXJ0YWluIHByb2Nlc3MnOiB0cnVlLFxuICAgICAgICAnYXNzb2NpYXRpb24nOiB0cnVlLFxuICAgICAgICAnZGlzc29jaWF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ3BoZW5vdHlwZSc6IHRydWUsXG4gICAgICAgICd0YWcnOiB0cnVlLFxuICAgICAgICAnY29uc3VtcHRpb24nOiB0cnVlLFxuICAgICAgICAncHJvZHVjdGlvbic6IHRydWUsXG4gICAgICAgICdtb2R1bGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ3N0aW11bGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2NhdGFseXNpcyc6IHRydWUsXG4gICAgICAgICdpbmhpYml0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ25lY2Vzc2FyeSBzdGltdWxhdGlvbic6IHRydWUsXG4gICAgICAgICdsb2dpYyBhcmMnOiB0cnVlLFxuICAgICAgICAnZXF1aXZhbGVuY2UgYXJjJzogdHJ1ZSxcbiAgICAgICAgJ2FuZCBvcGVyYXRvcic6IHRydWUsXG4gICAgICAgICdvciBvcGVyYXRvcic6IHRydWUsXG4gICAgICAgICdub3Qgb3BlcmF0b3InOiB0cnVlLFxuICAgICAgICAnYW5kJzogdHJ1ZSxcbiAgICAgICAgJ29yJzogdHJ1ZSxcbiAgICAgICAgJ25vdCc6IHRydWUsXG4gICAgICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSBtdWx0aW1lcic6IHRydWUsXG4gICAgICAgICdtYWNyb21vbGVjdWxlIG11bHRpbWVyJzogdHJ1ZSxcbiAgICAgICAgJ3NpbXBsZSBjaGVtaWNhbCBtdWx0aW1lcic6IHRydWUsXG4gICAgICAgICdjb21wbGV4IG11bHRpbWVyJzogdHJ1ZSxcbiAgICAgICAgJ2NvbXBhcnRtZW50JzogdHJ1ZSxcbiAgICAgICAgJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknOiB0cnVlLFxuICAgICAgICAnQkEgcGxhaW4nOiB0cnVlLFxuICAgICAgICAnQkEgdW5zcGVjaWZpZWQgZW50aXR5JzogdHJ1ZSxcbiAgICAgICAgJ0JBIHNpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgICAgICdCQSBtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAgICAgJ0JBIG51Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAgICAgJ0JBIHBlcnR1cmJpbmcgYWdlbnQnOiB0cnVlLFxuICAgICAgICAnQkEgY29tcGxleCc6IHRydWUsXG4gICAgICAgICdkZWxheSc6IHRydWUsXG4gICAgICAgICd1bmtub3duIGluZmx1ZW5jZSc6IHRydWUsXG4gICAgICAgICdwb3NpdGl2ZSBpbmZsdWVuY2UnOiB0cnVlLFxuICAgICAgICAnbmVnYXRpdmUgaW5mbHVlbmNlJzogdHJ1ZSxcbiAgICAgICAgJ3N1Ym1hcCc6IHRydWUsXG4gICAgfSxcbiAgICAvL3RoZSBmb2xsb3dpbmcgd2VyZSBtb3ZlZCBoZXJlIGZyb20gd2hhdCB1c2VkIHRvIGJlIHV0aWxpdGllcy9zYmduLWZpbHRlcmluZy5qc1xuICAgIHByb2Nlc3NUeXBlcyA6IFsncHJvY2VzcycsICdvbWl0dGVkIHByb2Nlc3MnLCAndW5jZXJ0YWluIHByb2Nlc3MnLFxuICAgICAgICAnYXNzb2NpYXRpb24nLCAnZGlzc29jaWF0aW9uJ10sXG4gICAgXG4gICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IG9yIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIGNsYXNzIGNhbiBoYXZlIHBvcnRzLlxuICAgIGNhbkhhdmVQb3J0cyA6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgdmFyIHNiZ25jbGFzcyA9IHR5cGVvZiBlbGUgPT09ICdzdHJpbmcnID8gZWxlIDogZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICByZXR1cm4gKCQuaW5BcnJheShzYmduY2xhc3MsIHRoaXMucHJvY2Vzc1R5cGVzKSA+PSAwIHx8ICBzYmduY2xhc3MgPT0gJ2FuZCcgfHwgc2JnbmNsYXNzID09ICdvcicgfHwgc2JnbmNsYXNzID09ICdub3QnKTtcbiAgICB9LFxuICAgICAgXG4gICAgLy8gU2VjdGlvbiBTdGFydFxuICAgIC8vIEdlbmVyYWwgRWxlbWVudCBVdGlsaXRpZXNcblxuICAgIC8vdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZXMgbm9uIG9mIHdob3NlIGFuY2VzdG9ycyBpcyBub3QgaW4gZ2l2ZW4gbm9kZXNcbiAgICBnZXRUb3BNb3N0Tm9kZXM6IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbm9kZXNNYXBbbm9kZXNbaV0uaWQoKV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb290cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgICAgICAgICAgd2hpbGUocGFyZW50ICE9IG51bGwpe1xuICAgICAgICAgICAgICBpZihub2Rlc01hcFtwYXJlbnQuaWQoKV0pe1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJvb3RzO1xuICAgIH0sXG4gICAgLy9UaGlzIG1ldGhvZCBjaGVja3MgaWYgYWxsIG9mIHRoZSBnaXZlbiBub2RlcyBoYXZlIHRoZSBzYW1lIHBhcmVudCBhc3N1bWluZyB0aGF0IHRoZSBzaXplIFxuICAgIC8vb2YgIG5vZGVzIGlzIG5vdCAwXG4gICAgYWxsSGF2ZVRoZVNhbWVQYXJlbnQ6IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnQgPSBub2Rlc1swXS5kYXRhKFwicGFyZW50XCIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGF0YShcInBhcmVudFwiKSAhPSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBtb3ZlTm9kZXM6IGZ1bmN0aW9uKHBvc2l0aW9uRGlmZiwgbm9kZXMsIG5vdENhbGNUb3BNb3N0Tm9kZXMpIHtcbiAgICAgIHZhciB0b3BNb3N0Tm9kZXMgPSBub3RDYWxjVG9wTW9zdE5vZGVzID8gbm9kZXMgOiB0aGlzLmdldFRvcE1vc3ROb2Rlcyhub2Rlcyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcE1vc3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IHRvcE1vc3ROb2Rlc1tpXTtcbiAgICAgICAgdmFyIG9sZFggPSBub2RlLnBvc2l0aW9uKFwieFwiKTtcbiAgICAgICAgdmFyIG9sZFkgPSBub2RlLnBvc2l0aW9uKFwieVwiKTtcbiAgICAgICAgbm9kZS5wb3NpdGlvbih7XG4gICAgICAgICAgeDogb2xkWCArIHBvc2l0aW9uRGlmZi54LFxuICAgICAgICAgIHk6IG9sZFkgKyBwb3NpdGlvbkRpZmYueVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbigpO1xuICAgICAgICB0aGlzLm1vdmVOb2Rlcyhwb3NpdGlvbkRpZmYsIGNoaWxkcmVuLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnZlcnRUb01vZGVsUG9zaXRpb246IGZ1bmN0aW9uIChyZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcblxuICAgICAgdmFyIHggPSAocmVuZGVyZWRQb3NpdGlvbi54IC0gcGFuLngpIC8gem9vbTtcbiAgICAgIHZhciB5ID0gKHJlbmRlcmVkUG9zaXRpb24ueSAtIHBhbi55KSAvIHpvb207XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH07XG4gICAgfSxcbiAgICBcbiAgICAvLyBTZWN0aW9uIEVuZFxuICAgIC8vIEdlbmVyYWwgRWxlbWVudCBVdGlsaXRpZXNcblxuICAgIC8vIFNlY3Rpb24gU3RhcnRcbiAgICAvLyBFbGVtZW50IEZpbHRlcmluZyBVdGlsaXRpZXNcbiAgICBcbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGdldFByb2Nlc3Nlc09mU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzZWxlY3RlZEVsZXMgPSBjeS5lbGVtZW50cyhcIjpzZWxlY3RlZFwiKTtcbiAgICAgICAgc2VsZWN0ZWRFbGVzID0gdGhpcy5leHRlbmROb2RlTGlzdChzZWxlY3RlZEVsZXMpO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRFbGVzO1xuICAgIH0sXG4gICAgZ2V0TmVpZ2hib3Vyc09mU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzZWxlY3RlZEVsZXMgPSBjeS5lbGVtZW50cyhcIjpzZWxlY3RlZFwiKTtcbiAgICAgICAgdmFyIGVsZXNUb0hpZ2hsaWdodCA9IHRoaXMuZ2V0TmVpZ2hib3Vyc09mTm9kZXMoc2VsZWN0ZWRFbGVzKTtcbiAgICAgICAgcmV0dXJuIGVsZXNUb0hpZ2hsaWdodDtcbiAgICB9LFxuICAgIGdldE5laWdoYm91cnNPZk5vZGVzOiBmdW5jdGlvbihfbm9kZXMpe1xuICAgICAgICB2YXIgbm9kZXMgPSBfbm9kZXMubm9kZXMoKTsgLy8gRW5zdXJlIHRoYXQgbm9kZXMgbGlzdCBqdXN0IGluY2x1ZGUgbm9kZXNcbiAgICAgICAgbm9kZXMgPSBub2Rlcy5hZGQobm9kZXMucGFyZW50cyhcIm5vZGVbY2xhc3NePSdjb21wbGV4J11cIikpO1xuICAgICAgICBub2RlcyA9IG5vZGVzLmFkZChub2Rlcy5kZXNjZW5kYW50cygpKTtcbiAgICAgICAgdmFyIG5laWdoYm9yaG9vZEVsZXMgPSBub2Rlcy5uZWlnaGJvcmhvb2QoKTtcbiAgICAgICAgdmFyIGVsZXNUb1JldHVybiA9IG5vZGVzLmFkZChuZWlnaGJvcmhvb2RFbGVzKTtcbiAgICAgICAgZWxlc1RvUmV0dXJuID0gZWxlc1RvUmV0dXJuLmFkZChlbGVzVG9SZXR1cm4uZGVzY2VuZGFudHMoKSk7XG4gICAgICAgIHJldHVybiBlbGVzVG9SZXR1cm47XG4gICAgfSxcbiAgICBleHRlbmROb2RlTGlzdDogZnVuY3Rpb24obm9kZXNUb1Nob3cpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vYWRkIGNoaWxkcmVuXG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5vZGVzVG9TaG93Lm5vZGVzKCkuZGVzY2VuZGFudHMoKSk7XG4gICAgICAgIC8vYWRkIHBhcmVudHNcbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobm9kZXNUb1Nob3cucGFyZW50cygpKTtcbiAgICAgICAgLy9hZGQgY29tcGxleCBjaGlsZHJlblxuICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChub2Rlc1RvU2hvdy5ub2RlcyhcIm5vZGVbY2xhc3NePSdjb21wbGV4J11cIikuZGVzY2VuZGFudHMoKSk7XG5cbiAgICAgICAgLy8gdmFyIHByb2Nlc3NlcyA9IG5vZGVzVG9TaG93Lm5vZGVzKFwibm9kZVtjbGFzcz0ncHJvY2VzcyddXCIpO1xuICAgICAgICAvLyB2YXIgbm9uUHJvY2Vzc2VzID0gbm9kZXNUb1Nob3cubm9kZXMoXCJub2RlW2NsYXNzIT0ncHJvY2VzcyddXCIpO1xuICAgICAgICAvLyB2YXIgbmVpZ2hib3JQcm9jZXNzZXMgPSBub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKFwibm9kZVtjbGFzcz0ncHJvY2VzcyddXCIpO1xuICAgICAgICBcbiAgICAgICAgZXh0ZW5kTm9kZVR5cGVzID0gWydwcm9jZXNzJywgJ29taXR0ZWQgcHJvY2VzcycsICd1bmNlcnRhaW4gcHJvY2VzcycsXG4gICAgICAgICdhc3NvY2lhdGlvbicsICdkaXNzb2NpYXRpb24nLCAncGhlbm90eXBlJywgJ2FuZCcsICdvcicsICdub3QnLCAnZGVsYXknXTtcbiAgICBcbiAgICAgICAgLy9IZXJlLCBsb2dpY2FsIG9wZXJhdG9ycyBhcmUgYWxzbyBjb25zaWRlcmVkIGFzIHByb2Nlc3Nlcywgc2luY2UgdGhleSBhbHNvIGdldCBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICAgICAgdmFyIHByb2Nlc3NlcyA9IG5vZGVzVG9TaG93LmZpbHRlcihmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShlbGUuX3ByaXZhdGUuZGF0YS5jbGFzcywgZXh0ZW5kTm9kZVR5cGVzKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG5vblByb2Nlc3NlcyA9IG5vZGVzVG9TaG93LmZpbHRlcihmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShlbGUuX3ByaXZhdGUuZGF0YS5jbGFzcywgZXh0ZW5kTm9kZVR5cGVzKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbmVpZ2hib3JQcm9jZXNzZXMgPSBub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKCkudW5pb24ocHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpKS5maWx0ZXIoZnVuY3Rpb24oZWxlLCBpKXtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgZWxlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkLmluQXJyYXkoZWxlLl9wcml2YXRlLmRhdGEuY2xhc3MsIGV4dGVuZE5vZGVUeXBlcykgPj0gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vRm9yIEFGIHN1cHBvcnQsIHN1YmplY3QgdG8gY2hhbmdlXG4gICAgICAgIHZhciBuZWlnaGJvck5vblByb2Nlc3NlcyA9IG5vblByb2Nlc3Nlcy51bmlvbihub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKFwiOmhpZGRlblwiKSkuZmlsdGVyKGZ1bmN0aW9uKGVsZSwgaSl7XG4gICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC5pbkFycmF5KGVsZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLCBleHRlbmROb2RlVHlwZXMpID09PSAtMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQocHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpKTtcbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobmVpZ2hib3JQcm9jZXNzZXMpO1xuICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChuZWlnaGJvclByb2Nlc3Nlcy5uZWlnaGJvcmhvb2QoKSk7XG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5laWdoYm9yTm9uUHJvY2Vzc2VzKTtcbiAgICAgICAgXG4gICAgICAgIG5laWdoYm9yUHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpLmZvckVhY2goZnVuY3Rpb24oZWxlKXtcbiAgICAgICAgICAgIGlmKGpRdWVyeS5pbkFycmF5KGVsZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLCBleHRlbmROb2RlVHlwZXMpID49IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChlbGUubmVpZ2hib3Job29kKCkpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvL2FkZCBwYXJlbnRzXG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5vZGVzVG9TaG93Lm5vZGVzKCkucGFyZW50cygpKTtcbiAgICAgICAgLy9hZGQgY2hpbGRyZW5cbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobm9kZXNUb1Nob3cubm9kZXMoXCJub2RlW2NsYXNzXj0nY29tcGxleCddXCIpLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgIHJldHVybiBub2Rlc1RvU2hvdztcbiAgICB9LFxuICAgIGV4dGVuZFJlbWFpbmluZ05vZGVzIDogZnVuY3Rpb24obm9kZXNUb0ZpbHRlciwgYWxsTm9kZXMpe1xuICAgICAgICBub2Rlc1RvRmlsdGVyID0gdGhpcy5leHRlbmROb2RlTGlzdChub2Rlc1RvRmlsdGVyKTtcbiAgICAgICAgdmFyIG5vZGVzVG9TaG93ID0gYWxsTm9kZXMubm90KG5vZGVzVG9GaWx0ZXIpO1xuICAgICAgICBub2Rlc1RvU2hvdyA9IHRoaXMuZXh0ZW5kTm9kZUxpc3Qobm9kZXNUb1Nob3cpO1xuICAgICAgICByZXR1cm4gbm9kZXNUb1Nob3c7XG4gICAgfSxcbiAgICBnZXRQcm9jZXNzZXNPZk5vZGVzOiBmdW5jdGlvbihub2Rlcykge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kTm9kZUxpc3Qobm9kZXMpO1xuICAgIH0sXG4gICAgLy8gZ2VuZXJhbCB1dGlsaXRpZXNcbiAgICBub25lSXNOb3RIaWdobGlnaHRlZDogZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIGhpZ2hsaWdodGVkTm9kZXMgPSBjeS5ub2RlcyhcIjp2aXNpYmxlXCIpLm5vZGVzKFwiLmhpZ2hsaWdodGVkXCIpO1xuICAgICAgICB2YXIgaGlnaGxpZ2h0ZWRFZGdlcyA9IGN5LmVkZ2VzKFwiOnZpc2libGVcIikuZWRnZXMoXCIuaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgcmV0dXJuIGhpZ2hsaWdodGVkTm9kZXMubGVuZ3RoICsgaGlnaGxpZ2h0ZWRFZGdlcy5sZW5ndGggPT09IDA7XG4gICAgfSxcbiAgICBcbiAgICAvLyBTZWN0aW9uIEVuZFxuICAgIC8vIEVsZW1lbnQgRmlsdGVyaW5nIFV0aWxpdGllc1xuXG4gICAgLy8gU2VjdGlvbiBTdGFydFxuICAgIC8vIEFkZCByZW1vdmUgdXRpbGl0aWVzXG5cbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGRlbGV0ZU5vZGVzU21hcnQ6IGZ1bmN0aW9uIChfbm9kZXMpIHtcbiAgICAgIHZhciBub2RlcyA9IF9ub2Rlcy5ub2RlcygpOyAvLyBFbnN1cmUgdGhhdCBub2RlcyBsaXN0IGp1c3QgaW5jbHVkZSBub2Rlc1xuICAgICAgXG4gICAgICB2YXIgYWxsTm9kZXMgPSBjeS5ub2RlcygpO1xuICAgICAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xuICAgICAgdmFyIG5vZGVzVG9LZWVwID0gdGhpcy5leHRlbmRSZW1haW5pbmdOb2Rlcyhub2RlcywgYWxsTm9kZXMpO1xuICAgICAgdmFyIG5vZGVzTm90VG9LZWVwID0gYWxsTm9kZXMubm90KG5vZGVzVG9LZWVwKTtcbiAgICAgIHJldHVybiBub2Rlc05vdFRvS2VlcC5yZW1vdmUoKTtcbiAgICB9LFxuICAgIGRlbGV0ZUVsZXNTaW1wbGU6IGZ1bmN0aW9uIChlbGVzKSB7XG4gICAgICBjeS5lbGVtZW50cygpLnVuc2VsZWN0KCk7XG4gICAgICByZXR1cm4gZWxlcy5yZW1vdmUoKTtcbiAgICB9LFxuICAgIC8vIGdlbmVyYWwgdXRpbGl0aWVzXG4gICAgcmVzdG9yZUVsZXM6IGZ1bmN0aW9uIChlbGVzKSB7XG4gICAgICAgIGVsZXMucmVzdG9yZSgpO1xuICAgICAgICByZXR1cm4gZWxlcztcbiAgICB9LFxuICAgIFxuICAgIC8vIFNlY3Rpb24gRW5kXG4gICAgLy8gQWRkIHJlbW92ZSB1dGlsaXRpZXNcblxuICAgIC8vIFNlY3Rpb24gU3RhcnRcbiAgICAvLyBTdHlsZXNoZWV0IGhlbHBlcnNcbiAgICBcbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGdldEN5U2hhcGU6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICB2YXIgX2NsYXNzID0gZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgIC8vIEdldCByaWQgb2YgcmVjdGFuZ2xlIHBvc3RmaXggdG8gaGF2ZSB0aGUgYWN0dWFsIG5vZGUgY2xhc3NcbiAgICAgICAgaWYgKF9jbGFzcy5lbmRzV2l0aCgnIG11bHRpbWVyJykpIHtcbiAgICAgICAgICAgIF9jbGFzcyA9IF9jbGFzcy5yZXBsYWNlKCcgbXVsdGltZXInLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NsYXNzID09ICdjb21wYXJ0bWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnY29tcGFydG1lbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3BoZW5vdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiAnaGV4YWdvbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAncGVydHVyYmluZyBhZ2VudCcgfHwgX2NsYXNzID09ICd0YWcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jbGFzcy5zdGFydHNXaXRoKCdCQScpKXtcbiAgICAgICAgICAgIHJldHVybiAnYmlvbG9naWNhbCBhY3Rpdml0eSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NsYXNzID09ICdzdWJtYXAnKXtcbiAgICAgICAgICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZpbmUgbmV3IG5vZGUgc2hhcGVzIHdpdGggdGhlaXIgY2xhc3MgbmFtZXMgZm9yIHRoZXNlIG5vZGVzXG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3NvdXJjZSBhbmQgc2luaycgfHwgX2NsYXNzID09ICdudWNsZWljIGFjaWQgZmVhdHVyZScgfHwgX2NsYXNzID09ICdtYWNyb21vbGVjdWxlJyBcbiAgICAgICAgICAgICAgICB8fCBfY2xhc3MgPT0gJ3NpbXBsZSBjaGVtaWNhbCcgfHwgX2NsYXNzID09ICdjb21wbGV4JyB8fCBfY2xhc3MgPT0gJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBUaGVzZSBzaGFwZXMgY2FuIGhhdmUgcG9ydHMuIElmIHRoZXkgaGF2ZSBwb3J0cyB3ZSByZXByZXNlbnQgdGhlbSBieSBwb2x5Z29ucywgZWxzZSB0aGV5IGFyZSByZXByZXNlbnRlZCBieSBlbGxpcHNlcyBvciByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNvbmRpdGlvbmFsbHkuXG4gICAgICAgIGlmICggdGhpcy5jYW5IYXZlUG9ydHMoX2NsYXNzKSApIHtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmIGVsZS5kYXRhKCdwb3J0cycpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuICdwb2x5Z29uJzsgLy8gVGhlIG5vZGUgaGFzIHBvcnRzIHJlcHJlc2VudCBpdCBieSBwb2x5Z29uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAncHJvY2VzcycgfHwgX2NsYXNzID09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IF9jbGFzcyA9PSAndW5jZXJ0YWluIHByb2Nlc3MnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JlY3RhbmdsZSc7IC8vIElmIG5vZGUgaGFzIG5vIHBvcnQgYW5kIGhhcyBvbmUgb2YgdGhlc2UgY2xhc3NlcyBpdCBzaG91bGQgYmUgaW4gYSByZWN0YW5nbGUgc2hhcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuICdlbGxpcHNlJzsgLy8gT3RoZXIgbm9kZXMgd2l0aCBubyBwb3J0IHNob3VsZCBiZSBpbiBhbiBlbGxpcHNlIHNoYXBlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRoZSByZW1haW5pbmcgbm9kZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGVsbGlwc2Ugc2hhcGVcbiAgICAgICAgcmV0dXJuICdlbGxpcHNlJztcbiAgICB9LFxuICAgIGdldEN5QXJyb3dTaGFwZTogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAgIHZhciBfY2xhc3MgPSBlbGUuZGF0YSgnY2xhc3MnKTtcbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnbmVjZXNzYXJ5IHN0aW11bGF0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICd0cmlhbmdsZS1jcm9zcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnaW5oaWJpdGlvbicgfHwgX2NsYXNzID09ICduZWdhdGl2ZSBpbmZsdWVuY2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RlZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnY2F0YWx5c2lzJykge1xuICAgICAgICAgICAgcmV0dXJuICdjaXJjbGUnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3N0aW11bGF0aW9uJyB8fCBfY2xhc3MgPT0gJ3Byb2R1Y3Rpb24nIHx8IF9jbGFzcyA9PSAncG9zaXRpdmUgaW5mbHVlbmNlJykge1xuICAgICAgICAgICAgcmV0dXJuICd0cmlhbmdsZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnbW9kdWxhdGlvbicgfHwgX2NsYXNzID09ICd1bmtub3duIGluZmx1ZW5jZScpIHtcbiAgICAgICAgICAgIHJldHVybiAnZGlhbW9uZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9LFxuICAgIGdldEVsZW1lbnRDb250ZW50OiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgdmFyIF9jbGFzcyA9IGVsZS5kYXRhKCdjbGFzcycpO1xuXG4gICAgICAgIGlmIChfY2xhc3MuZW5kc1dpdGgoJyBtdWx0aW1lcicpKSB7XG4gICAgICAgICAgICBfY2xhc3MgPSBfY2xhc3MucmVwbGFjZSgnIG11bHRpbWVyJywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgICBpZiAoX2NsYXNzID09ICdtYWNyb21vbGVjdWxlJyB8fCBfY2xhc3MgPT0gJ3NpbXBsZSBjaGVtaWNhbCdcbiAgICAgICAgICAgIHx8IF9jbGFzcyA9PSAncGhlbm90eXBlJ1xuICAgICAgICAgICAgfHwgX2NsYXNzID09ICd1bnNwZWNpZmllZCBlbnRpdHknIHx8IF9jbGFzcyA9PSAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnXG4gICAgICAgICAgICB8fCBfY2xhc3MgPT0gJ3BlcnR1cmJpbmcgYWdlbnQnIHx8IF9jbGFzcyA9PSAndGFnJ1xuICAgICAgICAgICAgfHwgX2NsYXNzID09ICdiaW9sb2dpY2FsIGFjdGl2aXR5JyB8fCBfY2xhc3Muc3RhcnRzV2l0aCgnQkEnKVxuICAgICAgICAgICAgfHwgX2NsYXNzID09ICdzdWJtYXAnKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2xhYmVsJykgPyBlbGUuZGF0YSgnbGFiZWwnKSA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihfY2xhc3MgPT0gJ2NvbXBhcnRtZW50Jyl7XG4gICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2xhYmVsJykgPyBlbGUuZGF0YSgnbGFiZWwnKSA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihfY2xhc3MgPT0gJ2NvbXBsZXgnKXtcbiAgICAgICAgICAgIGlmKGVsZS5jaGlsZHJlbigpLmxlbmd0aCA9PSAwIHx8IG9wdGlvbnMuc2hvd0NvbXBsZXhOYW1lKXtcbiAgICAgICAgICAgICAgICBpZihlbGUuZGF0YSgnbGFiZWwnKSl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBlbGUuZGF0YSgnbGFiZWwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZihlbGUuZGF0YSgnaW5mb0xhYmVsJykpe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2luZm9MYWJlbCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdhbmQnKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gJ0FORCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdvcicpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnT1InO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnbm90Jykge1xuICAgICAgICAgICAgY29udGVudCA9ICdOT1QnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnb21pdHRlZCBwcm9jZXNzJykge1xuICAgICAgICAgICAgY29udGVudCA9ICdcXFxcXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICd1bmNlcnRhaW4gcHJvY2VzcycpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnPyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdkaXNzb2NpYXRpb24nKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gJ28nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnZGVsYXknKXtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnXFx1MDNDNCc7IC8vIHRhdVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRXaWR0aCA9IGVsZS5vdXRlcldpZHRoKCkgfHwgZWxlLmRhdGEoJ2Jib3gnKS53O1xuXG4gICAgICAgIHZhciB0ZXh0UHJvcCA9IHtcbiAgICAgICAgICAgIGxhYmVsOiBjb250ZW50LFxuICAgICAgICAgICAgd2lkdGg6ICggX2NsYXNzID09ICdwZXJ0dXJiaW5nIGFnZW50JyA/IHRleHRXaWR0aCAvIDIgOiB0ZXh0V2lkdGgpXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGZvbnQgPSBwYXJzZUludChlbGUuY3NzKCdmb250LXNpemUnKSkgKyBcInB4IEFyaWFsXCI7XG4gICAgICAgIHJldHVybiB0cnVuY2F0ZVRleHQodGV4dFByb3AsIGZvbnQpOyAvL2Z1bmMuIGluIHRoZSBjeXRvc2NhcGUucmVuZGVyZXIuY2FudmFzLnNiZ24tcmVuZGVyZXIuanNcbiAgICB9LFxuICAgIGdldExhYmVsVGV4dFNpemU6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHZhciBfY2xhc3MgPSBlbGUuZGF0YSgnY2xhc3MnKTtcbiAgICAgIC8vIFRoZXNlIHR5cGVzIG9mIG5vZGVzIGNhbm5vdCBoYXZlIGxhYmVsIGJ1dCB0aGlzIGlzIHN0YXRlbWVudCBpcyBuZWVkZWQgYXMgYSB3b3JrYXJvdW5kXG4gICAgICBpZiAoX2NsYXNzID09PSAnYXNzb2NpYXRpb24nKSB7XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2FuSGF2ZVBvcnRzKF9jbGFzcykpIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMTsgLy8gVGhlIGR5bmFtaWMgbGFiZWwgc2l6ZSBjb2VmZmljaWVudCBmb3IgdGhlc2UgcHNldWRvIGxhYmVscywgaXQgaXMgMSBmb3IgbG9naWNhbCBvcGVyYXRvcnNcbiAgICAgICAgXG4gICAgICAgIC8vIENvZWZmIGlzIHN1cHBvc2VkIHRvIGJlIDIgZm9yIGRpc3NvY2lhdGlvbiBhbmQgMS41IGZvciBvdGhlciBwcm9jZXNzZXNcbiAgICAgICAgaWYgKF9jbGFzcyA9PT0gJ2Rpc3NvY2lhdGlvbicpIHtcbiAgICAgICAgICBjb2VmZiA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzLmVuZHNXaXRoKCdwcm9jZXNzJykpIHtcbiAgICAgICAgICBjb2VmZiA9IDEuNTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHBvcnRzID0gZWxlLmRhdGEoJ3BvcnRzJyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmIHBvcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwb3J0cyBhcmUgc3ltbWV0cmljIHRvIHRoZSBub2RlIGNlbnRlciBzbyB1c2luZyBqdXN0IG9uZSBvZiB0aGUgcG9ydHMgaXMgZW5vdWdoXG4gICAgICAgICAgdmFyIHBvcnQgPSBwb3J0c1swXTtcbiAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBwb3J0LnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJhdGlvIG9mIHRoZSBhcmVhIG9jY3VwaWVkIHdpdGggcG9ydHMgb3ZlciB3aXRob3V0IHBvcnRzXG4gICAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0LnkpIC8gNTAgOiBNYXRoLmFicyhwb3J0LngpIC8gNTA7XG4gICAgICAgICAgY29lZmYgLz0gcmF0aW87IC8vIERpdmlkZSB0aGUgY29lZmYgYnkgcmF0aW8gdG8gZml0IGludG8gdGhlIGJib3ggb2YgdGhlIGFjdHVhbCBzaGFwZSAoZGlzY2x1ZGluZyBwb3J0cylcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RHluYW1pY0xhYmVsVGV4dFNpemUoZWxlLCBjb2VmZik7XG4gICAgICB9XG5cbiAgICAgIGlmIChfY2xhc3MgPT09ICdkZWxheScpe1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREeW5hbWljTGFiZWxUZXh0U2l6ZShlbGUsIDIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXREeW5hbWljTGFiZWxUZXh0U2l6ZShlbGUpO1xuICAgIH0sXG4gICAgZ2V0Q2FyZGluYWxpdHlEaXN0YW5jZTogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIHNyY1BvcyA9IGVsZS5zb3VyY2UoKS5wb3NpdGlvbigpO1xuICAgICAgdmFyIHRndFBvcyA9IGVsZS50YXJnZXQoKS5wb3NpdGlvbigpO1xuXG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coKHNyY1Bvcy54IC0gdGd0UG9zLngpLCAyKSArIE1hdGgucG93KChzcmNQb3MueSAtIHRndFBvcy55KSwgMikpO1xuICAgICAgcmV0dXJuIGRpc3RhbmNlICogMC4xNTtcbiAgICB9LFxuICAgIGdldEluZm9MYWJlbDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLyogSW5mbyBsYWJlbCBvZiBhIGNvbGxhcHNlZCBub2RlIGNhbm5vdCBiZSBjaGFuZ2VkIGlmXG4gICAgICAqIHRoZSBub2RlIGlzIGNvbGxhcHNlZCByZXR1cm4gdGhlIGFscmVhZHkgZXhpc3RpbmcgaW5mbyBsYWJlbCBvZiBpdFxuICAgICAgKi9cbiAgICAgIGlmIChub2RlLl9wcml2YXRlLmRhdGEuY29sbGFwc2VkQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5kYXRhLmluZm9MYWJlbDtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIElmIHRoZSBub2RlIGlzIHNpbXBsZSB0aGVuIGl0J3MgaW5mb2xhYmVsIGlzIGVxdWFsIHRvIGl0J3MgbGFiZWxcbiAgICAgICAqL1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4oKSA9PSBudWxsIHx8IG5vZGUuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKCk7XG4gICAgICB2YXIgaW5mb0xhYmVsID0gXCJcIjtcbiAgICAgIC8qXG4gICAgICAgKiBHZXQgdGhlIGluZm8gbGFiZWwgb2YgdGhlIGdpdmVuIG5vZGUgYnkgaXQncyBjaGlsZHJlbiBpbmZvIHJlY3Vyc2l2ZWx5XG4gICAgICAgKi9cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHZhciBjaGlsZEluZm8gPSB0aGlzLmdldEluZm9MYWJlbChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZm8gPT0gbnVsbCB8fCBjaGlsZEluZm8gPT0gXCJcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm9MYWJlbCAhPSBcIlwiKSB7XG4gICAgICAgICAgaW5mb0xhYmVsICs9IFwiOlwiO1xuICAgICAgICB9XG4gICAgICAgIGluZm9MYWJlbCArPSBjaGlsZEluZm87XG4gICAgICB9XG5cbiAgICAgIC8vcmV0dXJuIGluZm8gbGFiZWxcbiAgICAgIHJldHVybiBpbmZvTGFiZWw7XG4gICAgfSxcbiAgICBnZXRRdGlwQ29udGVudDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLyogQ2hlY2sgdGhlIGxhYmVsIG9mIHRoZSBub2RlIGlmIGl0IGlzIG5vdCB2YWxpZFxuICAgICAgKiB0aGVuIGNoZWNrIHRoZSBpbmZvbGFiZWwgaWYgaXQgaXMgYWxzbyBub3QgdmFsaWQgZG8gbm90IHNob3cgcXRpcFxuICAgICAgKi9cbiAgICAgIHZhciBsYWJlbCA9IG5vZGUuZGF0YSgnbGFiZWwnKTtcbiAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsID09IFwiXCIpIHtcbiAgICAgICAgbGFiZWwgPSB0aGlzLmdldEluZm9MYWJlbChub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsID09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY29udGVudEh0bWwgPSBcIjxiIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTZweDsnPlwiICsgbGFiZWwgKyBcIjwvYj5cIjtcbiAgICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVzYW5kaW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNiZ25zdGF0ZWFuZGluZm8gPSBzdGF0ZXNhbmRpbmZvc1tpXTtcbiAgICAgICAgaWYgKHNiZ25zdGF0ZWFuZGluZm8uY2xhenogPT0gXCJzdGF0ZSB2YXJpYWJsZVwiKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gc2JnbnN0YXRlYW5kaW5mby5zdGF0ZS52YWx1ZTtcbiAgICAgICAgICB2YXIgdmFyaWFibGUgPSBzYmduc3RhdGVhbmRpbmZvLnN0YXRlLnZhcmlhYmxlO1xuICAgICAgICAgIHZhciBzdGF0ZUxhYmVsID0gKHZhcmlhYmxlID09IG51bGwgLyp8fCB0eXBlb2Ygc3RhdGVWYXJpYWJsZSA9PT0gdW5kZWZpbmVkICovKSA/IHZhbHVlIDpcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgXCJAXCIgKyB2YXJpYWJsZTtcbiAgICAgICAgICBpZiAoc3RhdGVMYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZUxhYmVsID0gXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudEh0bWwgKz0gXCI8ZGl2IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTRweDsnPlwiICsgc3RhdGVMYWJlbCArIFwiPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2JnbnN0YXRlYW5kaW5mby5jbGF6eiA9PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIikge1xuICAgICAgICAgIHZhciBzdGF0ZUxhYmVsID0gc2JnbnN0YXRlYW5kaW5mby5sYWJlbC50ZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZUxhYmVsID09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlTGFiZWwgPSBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50SHRtbCArPSBcIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxNHB4Oyc+XCIgKyBzdGF0ZUxhYmVsICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnRIdG1sO1xuICAgIH0sXG4gICAgLy8gZ2VuZXJhbCB1dGlsaXRpZXNcbiAgICBnZXREeW5hbWljTGFiZWxUZXh0U2l6ZTogZnVuY3Rpb24gKGVsZSwgZHluYW1pY0xhYmVsU2l6ZUNvZWZmaWNpZW50KSB7XG4gICAgICB2YXIgZHluYW1pY0xhYmVsU2l6ZSA9IG9wdGlvbnMuZHluYW1pY0xhYmVsU2l6ZTtcbiAgICAgIGR5bmFtaWNMYWJlbFNpemUgPSB0eXBlb2YgZHluYW1pY0xhYmVsU2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IGR5bmFtaWNMYWJlbFNpemUuY2FsbCgpIDogZHluYW1pY0xhYmVsU2l6ZTtcblxuICAgICAgaWYgKGR5bmFtaWNMYWJlbFNpemVDb2VmZmljaWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkeW5hbWljTGFiZWxTaXplID09ICdzbWFsbCcpIHtcbiAgICAgICAgICBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKS5zdGFydHNXaXRoKFwiY29tcGxleFwiKSlcbiAgICAgICAgICAgIHJldHVybiAxMDtcbiAgICAgICAgICBlbHNlIGlmIChlbGUuZGF0YShcImNsYXNzXCIpID09IFwiY29tcGFydG1lbnRcIiB8fCBlbGUuZGF0YShcImNsYXNzXCIpID09IFwic3VibWFwXCIpXG4gICAgICAgICAgICByZXR1cm4gMTI7XG5cbiAgICAgICAgICBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQgPSAwLjc1O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWNMYWJlbFNpemUgPT0gJ3JlZ3VsYXInKSB7XG4gICAgICAgICAgaWYgKGVsZS5kYXRhKFwiY2xhc3NcIikuc3RhcnRzV2l0aChcImNvbXBsZXhcIikpXG4gICAgICAgICAgICByZXR1cm4gMTE7XG4gICAgICAgICAgZWxzZSBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIgfHwgZWxlLmRhdGEoXCJjbGFzc1wiKSA9PSBcInN1Ym1hcFwiKVxuICAgICAgICAgICAgcmV0dXJuIDE0O1xuXG4gICAgICAgICAgZHluYW1pY0xhYmVsU2l6ZUNvZWZmaWNpZW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljTGFiZWxTaXplID09ICdsYXJnZScpIHtcbiAgICAgICAgICBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKS5zdGFydHNXaXRoKFwiY29tcGxleFwiKSlcbiAgICAgICAgICAgIHJldHVybiAxMjtcbiAgICAgICAgICBlbHNlIGlmIChlbGUuZGF0YShcImNsYXNzXCIpID09IFwiY29tcGFydG1lbnRcIiB8fCBlbGUuZGF0YShcImNsYXNzXCIpID09IFwic3VibWFwXCIpXG4gICAgICAgICAgICByZXR1cm4gMTY7XG5cbiAgICAgICAgICBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQgPSAxLjI1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciBoID0gZWxlLmhlaWdodCgpO1xuICAgICAgdmFyIHRleHRIZWlnaHQgPSBwYXJzZUludChoIC8gMi40NSkgKiBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQ7XG5cbiAgICAgIHJldHVybiB0ZXh0SGVpZ2h0O1xuICAgIH0sXG4gICAgLypcbiAgICAqIEdldCBzb3VyY2UvdGFyZ2V0IGVuZCBwb2ludCBvZiBlZGdlIGluICd4LXZhbHVlJSB5LXZhbHVlJScgZm9ybWF0LiBJdCByZXR1cm5zICdvdXRzaWRlLXRvLW5vZGUnIGlmIHRoZXJlIGlzIG5vIHNvdXJjZS90YXJnZXQgcG9ydC5cbiAgICAqL1xuICAgIGdldEVuZFBvaW50OiBmdW5jdGlvbihlZGdlLCBzb3VyY2VPclRhcmdldCkge1xuICAgICAgdmFyIHBvcnRJZCA9IHNvdXJjZU9yVGFyZ2V0ID09PSAnc291cmNlJyA/IGVkZ2UuZGF0YSgncG9ydHNvdXJjZScpIDogZWRnZS5kYXRhKCdwb3J0dGFyZ2V0Jyk7XG5cbiAgICAgIGlmIChwb3J0SWQgPT0gbnVsbCB8fCAhZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiAnb3V0c2lkZS10by1ub2RlJzsgLy8gSWYgdGhlcmUgaXMgbm8gcG9ydHNvdXJjZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgJ291dHNpZGUtdG8tbm9kZSdcbiAgICAgIH1cblxuICAgICAgdmFyIGVuZE5vZGUgPSBzb3VyY2VPclRhcmdldCA9PT0gJ3NvdXJjZScgPyBlZGdlLnNvdXJjZSgpIDogZWRnZS50YXJnZXQoKTtcbiAgICAgIHZhciBwb3J0cyA9IGVuZE5vZGUuZGF0YSgncG9ydHMnKTtcbiAgICAgIHZhciBwb3J0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9ydHNbaV0uaWQgPT09IHBvcnRJZCkge1xuICAgICAgICAgIHBvcnQgPSBwb3J0c1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnb3V0c2lkZS10by1ub2RlJzsgLy8gSWYgcG9ydCBpcyBub3QgZm91bmQgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHdoaWNoIGlzICdvdXRzaWRlLXRvLW5vZGUnXG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciB4LCB5O1xuICAgICAgLy8gTm90ZSB0aGF0IGZvciBkcmF3aW5nIHBvcnRzIHdlIHJlcHJlc2VudCB0aGUgd2hvbGUgc2hhcGUgYnkgYSBwb2x5Z29uIGFuZCBwb3J0cyBhcmUgYWx3YXlzIDUwJSBhd2F5IGZyb20gdGhlIG5vZGUgY2VudGVyXG4gICAgICBpZiAocG9ydC54ICE9IDApIHtcbiAgICAgICAgeCA9IE1hdGguc2lnbihwb3J0LngpICogNTA7XG4gICAgICAgIHkgPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHggPSAwO1xuICAgICAgICB5ID0gTWF0aC5zaWduKHBvcnQueSkgKiA1MDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuICcnICsgeCArICclICcgKyB5ICsgJyUnO1xuICAgIH0sXG4gICAgLypcbiAgICAgKiBSZXR1cm4gb3JkZXJpbmcgb2YgcG9ydHMgb2YgYSBub2RlLlxuICAgICAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlICdMLXRvLVInLCAnUi10by1MJywgJ1QtdG8tQicsICdCLXRvLVQnLCAnbm9uZSdcbiAgICAgKi9cbiAgICBnZXRQb3J0c09yZGVyaW5nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCBwb3J0c29yZGVyaW5nIGlmIGV4aXN0c1xuICAgICAgaWYgKG5vZGUuZGF0YSgncG9ydHNvcmRlcmluZycpKSB7XG4gICAgICAgIHJldHVybiBub2RlLmRhdGEoJ3BvcnRzb3JkZXJpbmcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIHBvcnRzID0gbm9kZS5kYXRhKCdwb3J0cycpO1xuICAgICAgaWYgKHBvcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBub2RlLmRhdGEoJ3BvcnRzb3JkZXJpbmcnLCAnbm9uZScpOyAvLyBDYWNoZSB0aGUgcG9ydHMgb3JkZXJpbmdcbiAgICAgICAgcmV0dXJuICdub25lJzsgLy8gTm9kZXMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgMiBub2RlcyBvciBub25lXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8qXG4gICAgICAgKiBSZXR1cnNuIGlmIHRoZSBnaXZlbiBwb3J0SWQgaXMgcG9ydHRhcmdldCBvZiBhbnkgb2YgdGhlIGdpdmVuIGVkZ2VzLlxuICAgICAgICogVGhlc2UgZWRnZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHRoZSBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcG9ydC5cbiAgICAgICAqL1xuICAgICAgdmFyIGlzUG9ydFRhcmdldE9mQW55RWRnZSA9IGZ1bmN0aW9uKGVkZ2VzLCBwb3J0SWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlZGdlc1tpXS5kYXRhKCdwb3J0dGFyZ2V0JykgPT09IHBvcnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBJZiB0aGUgcG9ydHMgYXJlIGxvY2F0ZWQgYWJvdmUvYmVsb3cgb2YgdGhlIG5vZGUgdGhlbiB0aGUgb3JpZW50YXRpb24gaXMgJ3ZlcnRpY2FsJyBlbHNlIGl0IGlzICdob3Jpem9udGFsJy5cbiAgICAgIHZhciBvcmllbnRhdGlvbiA9IHBvcnRzWzBdLnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgLy8gV2UgbmVlZCB0aGUgY29ubmVjdGVkIGVkZ2VzIG9mIHRoZSBub2RlIHRvIGZpbmQgb3V0IGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBwb3J0IG9yIGFuIG91dHB1dCBwb3J0XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBcbiAgICAgIHZhciBwb3J0c29yZGVyaW5nO1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgdmFyIGxlZnRQb3J0SWQgPSBwb3J0c1swXS54IDwgMCA/IHBvcnRzWzBdLmlkIDogcG9ydHNbMV0uaWQ7IC8vIExlZnQgcG9ydCBpcyB0aGUgcG9ydCB3aG9zZSB4IHZhbHVlIGlzIG5lZ2F0aXZlXG4gICAgICAgIC8vIElmIGxlZnQgcG9ydCBpcyBwb3J0IHRhcmdldCBmb3IgYW55IG9mIGNvbm5lY3RlZCBlZGdlcyB0aGVuIHRoZSBvcmRlcmluZyBpcyAnTC10by1SJyBlbHNlIGl0IGlzICdSLXRvLUwnXG4gICAgICAgIGlmIChpc1BvcnRUYXJnZXRPZkFueUVkZ2UoY29ubmVjdGVkRWRnZXMsIGxlZnRQb3J0SWQpKSB7XG4gICAgICAgICAgcG9ydHNvcmRlcmluZyA9ICdMLXRvLVInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHBvcnRzb3JkZXJpbmcgPSAnUi10by1MJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB0b3BQb3J0SWQgPSBwb3J0c1swXS55IDwgMCA/IHBvcnRzWzBdLmlkIDogcG9ydHNbMV0uaWQ7IC8vIFRvcCBwb3J0IGlzIHRoZSBwb3J0IHdob3NlIHkgdmFsdWUgaXMgbmVnYXRpdmVcbiAgICAgICAgLy8gSWYgdG9wICBwb3J0IGlzIHBvcnQgdGFyZ2V0IGZvciBhbnkgb2YgY29ubmVjdGVkIGVkZ2VzIHRoZW4gdGhlIG9yZGVyaW5nIGlzICdULXRvLUInIGVsc2UgaXQgaXMgJ0ItdG8tVCdcbiAgICAgICAgaWYgKGlzUG9ydFRhcmdldE9mQW55RWRnZShjb25uZWN0ZWRFZGdlcywgdG9wUG9ydElkKSkge1xuICAgICAgICAgIHBvcnRzb3JkZXJpbmcgPSAnVC10by1CJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBwb3J0c29yZGVyaW5nID0gJ0ItdG8tVCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgdGhlIHBvcnRzb3JkZXJpbmcgYW5kIHJldHVybiBpdC5cbiAgICAgIG5vZGUuZGF0YSgncG9ydHNvcmRlcmluZycsIHBvcnRzb3JkZXJpbmcpO1xuICAgICAgcmV0dXJuIHBvcnRzb3JkZXJpbmc7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICogU2V0cyB0aGUgb3JkZXJpbmcgb2YgdGhlIGdpdmVuIG5vZGVzLlxuICAgICogT3JkZXJpbmcgb3B0aW9ucyBhcmUgJ0wtdG8tUicsICdSLXRvLUwnLCAnVC10by1CJywgJ0ItdG8tVCcsICdub25lJy5cbiAgICAqIElmIGEgbm9kZSBkb2VzIG5vdCBoYXZlIGFueSBwb3J0IGJlZm9yZSB0aGUgb3BlcmF0aW9uIGFuZCBpdCBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgYWZ0ZXIgb3BlcmF0aW9uIHRoZSBwb3J0RGlzdGFuY2UgcGFyYW1ldGVyIGlzIFxuICAgICogdXNlZCB0byBzZXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGUgY2VudGVyIGFuZCB0aGUgcG9ydHMuIFRoZSBkZWZhdWx0IHBvcnQgZGlzdGFuY2UgaXMgNjAuXG4gICAgKi9cbiAgICBzZXRQb3J0c09yZGVyaW5nOiBmdW5jdGlvbiggbm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UgKSB7XG4gICAgICAvKlxuICAgICAgKiBSZXR1cnNuIGlmIHRoZSBnaXZlbiBwb3J0SWQgaXMgcG9ydHRhcmdldCBvZiBhbnkgb2YgdGhlIGdpdmVuIGVkZ2VzLlxuICAgICAgKiBUaGVzZSBlZGdlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgdGhlIGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwb3J0LlxuICAgICAgKi9cbiAgICAgIHZhciBpc1BvcnRUYXJnZXRPZkFueUVkZ2UgPSBmdW5jdGlvbihlZGdlcywgcG9ydElkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZWRnZXNbaV0uZGF0YSgncG9ydHRhcmdldCcpID09PSBwb3J0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIHBvcnREaXN0YW5jZSA9IHBvcnREaXN0YW5jZSA/IHBvcnREaXN0YW5jZSA6IDcwOyAvLyBUaGUgZGVmYXVsdCBwb3J0IGRpc3RhbmNlIGlzIDYwXG5cbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcblxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBjdXJyZW50T3JkZXJpbmcgPSBzYmdudml6LmVsZW1lbnRVdGlsaXRpZXMuZ2V0UG9ydHNPcmRlcmluZyhub2RlKTsgLy8gVGhlIGN1cnJlbnQgcG9ydHMgb3JkZXJpbmcgb2YgdGhlIG5vZGVcblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBvcmRlcmluZyBpcyBhbHJlYWR5IGVxdWFsIHRvIHRoZSBkZXNpcmVkIG9yZGVyaW5nIHBhc3MgdGhpcyBub2RlIGRpcmVjdGx5XG4gICAgICAgIGlmICggb3JkZXJpbmcgPT09IGN1cnJlbnRPcmRlcmluZyApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggb3JkZXJpbmcgPT09ICdub25lJyApIHsgLy8gSWYgdGhlIG9yZGVyaW5nIGlzICdub25lJyByZW1vdmUgdGhlIHBvcnRzIG9mIHRoZSBub2RlXG4gICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5yZW1vdmVQb3J0cyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICggY3VycmVudE9yZGVyaW5nID09PSAnbm9uZScgKSB7IC8vIElmIHRoZSBkZXNpcmVkIG9yZGVyaW5nIGlzIG5vdCAnbm9uZScgYnV0IHRoZSBjdXJyZW50IG9uZSBpcyAnbm9uZScgYWRkIHBvcnRzIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRQb3J0cyhub2RlLCBvcmRlcmluZywgcG9ydERpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gRWxzZSBjaGFuZ2UgdGhlIG9yZGVyaW5nIGJ5IGFsdGVyaW5nIG5vZGUgJ3BvcnRzJ1xuICAgICAgICAgIHZhciBwb3J0cyA9IG5vZGUuZGF0YSgncG9ydHMnKTsgLy8gUG9ydHMgb2YgdGhlIG5vZGVcbiAgICAgICAgICAvLyBJZiBjdXJyZW50T3JkZXJpbmcgaXMgJ25vbmUnIHVzZSB0aGUgcG9ydERpc3RhbmNlIGdpdmVuIGJ5IHBhcmFtZXRlciBlbHNlIHVzZSB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICAgICAgdmFyIGRpc3QgPSBjdXJyZW50T3JkZXJpbmcgPT09ICdub25lJyA/IHBvcnREaXN0YW5jZSA6ICggTWF0aC5hYnMoIHBvcnRzWzBdLnggKSB8fCBNYXRoLmFicyggcG9ydHNbMF0ueSApICk7XG4gICAgICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpOyAvLyBUaGUgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBub2RlXG4gICAgICAgICAgdmFyIHBvcnRzb3VyY2UsIHBvcnR0YXJnZXQ7IC8vIFRoZSBwb3J0cyB3aGljaCBhcmUgcG9ydHNvdXJjZS9wb3J0dGFyZ2V0IG9mIHRoZSBjb25uZWN0ZWQgZWRnZXNcblxuICAgICAgICAgIC8vIERldGVybWluZSB0aGUgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldFxuICAgICAgICAgIGlmICggaXNQb3J0VGFyZ2V0T2ZBbnlFZGdlKGNvbm5lY3RlZEVkZ2VzLCBwb3J0c1swXS5pZCkgKSB7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0ID0gcG9ydHNbMF07XG4gICAgICAgICAgICBwb3J0c291cmNlID0gcG9ydHNbMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9ydHRhcmdldCA9IHBvcnRzWzFdO1xuICAgICAgICAgICAgcG9ydHNvdXJjZSA9IHBvcnRzWzBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICggb3JkZXJpbmcgPT09ICdMLXRvLVInICkge1xuICAgICAgICAgICAgLy8gSWYgb3JkZXJpbmcgaXMgJ0wtdG8tUicgdGhlIHBvcnR0YXJnZXQgc2hvdWxkIGJlIHRoZSBsZWZ0IG1vc3QgcG9ydCBhbmQgdGhlIHBvcnRzb3VyY2Ugc2hvdWxkIGJlIHRoZSByaWdodCBtb3N0IHBvcnRcbiAgICAgICAgICAgIHBvcnR0YXJnZXQueCA9IC0xICogZGlzdDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueCA9IGRpc3Q7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnkgPSAwO1xuICAgICAgICAgICAgcG9ydHNvdXJjZS55ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIG9yZGVyaW5nID09PSAnUi10by1MJyApIHtcbiAgICAgICAgICAgIC8vIElmIG9yZGVyaW5nIGlzICdSLXRvLUwnIHRoZSBwb3J0dGFyZ2V0IHNob3VsZCBiZSB0aGUgcmlnaHQgbW9zdCBwb3J0IGFuZCB0aGUgcG9ydHNvdXJjZSBzaG91bGQgYmUgdGhlIGxlZnQgbW9zdCBwb3J0XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnggPSBkaXN0O1xuICAgICAgICAgICAgcG9ydHNvdXJjZS54ID0gLTEgKiBkaXN0O1xuICAgICAgICAgICAgcG9ydHRhcmdldC55ID0gMDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCBvcmRlcmluZyA9PT0gJ1QtdG8tQicgKSB7XG4gICAgICAgICAgICAvLyBJZiBvcmRlcmluZyBpcyAnVC10by1CJyB0aGUgcG9ydHRhcmdldCBzaG91bGQgYmUgdGhlIHRvcCBtb3N0IHBvcnQgYW5kIHRoZSBwb3J0c291cmNlIHNob3VsZCBiZSB0aGUgYm90dG9tIG1vc3QgcG9ydFxuICAgICAgICAgICAgcG9ydHRhcmdldC54ID0gMDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueCA9IDA7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnkgPSAtMSAqIGRpc3Q7XG4gICAgICAgICAgICBwb3J0c291cmNlLnkgPSBkaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlICB7IC8vaWYgb3JkZXJpbmcgaXMgJ0ItdG8tVCdcbiAgICAgICAgICAgIC8vIElmIG9yZGVyaW5nIGlzICdCLXRvLVQnIHRoZSBwb3J0dGFyZ2V0IHNob3VsZCBiZSB0aGUgYm90dG9tIG1vc3QgcG9ydCBhbmQgdGhlIHBvcnRzb3VyY2Ugc2hvdWxkIGJlIHRoZSB0b3AgbW9zdCBwb3J0XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnggPSAwO1xuICAgICAgICAgICAgcG9ydHNvdXJjZS54ID0gMDtcbiAgICAgICAgICAgIHBvcnR0YXJnZXQueSA9IGRpc3Q7XG4gICAgICAgICAgICBwb3J0c291cmNlLnkgPSAtMSAqIGRpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5kYXRhKCdwb3J0cycsIHBvcnRzKTsgLy8gUmVzZXQgdGhlIG5vZGUgcG9ydHNcbiAgICAgIH1cblxuICAgICAgbm9kZXMuZGF0YSgncG9ydHNvcmRlcmluZycsIG9yZGVyaW5nKTsgLy8gVXBkYXRlIHRoZSBjYWNoZWQgb3JkZXJpbmdzIG9mIHRoZSBub2Rlc1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgKiBBZGQgcG9ydHMgdG8gdGhlIGdpdmVuIG5vZGUsIHdpdGggZ2l2ZW4gb3JkZXJpbmcgYW5kIHBvcnQgZGlzdGFuY2UuXG4gICAgKi9cbiAgICBhZGRQb3J0czogZnVuY3Rpb24obm9kZSwgb3JkZXJpbmcsIHBvcnREaXN0YW5jZSkge1xuICAgICAgdmFyIGZpcnN0UG9ydElkID0gbm9kZS5pZCgpICsgXCIuMVwiOyAvLyBJZCBvZiBmaXJzdCBwb3J0XG4gICAgICB2YXIgc2Vjb25kUG9ydElkID0gbm9kZS5pZCgpICsgXCIuMlwiOyAvLyBJZCBvZiBzZWNvbmYgcG9ydFxuICAgICAgLy8gRmlyc3QgcG9ydCBvYmplY3QgeCBhbmQgeSB3aWxsIGJlIGZpbGxlZCBhY2NvcmRpbmcgdG8gb3JkZXJpbmcsIHRoZSBmaXJzdCBwb3J0IGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBsZWZ0IG1vc3Qgb3IgdGhlIHRvcCBtb3N0IG9uZVxuICAgICAgdmFyIGZpcnN0UG9ydCA9IHsgaWQ6IGZpcnN0UG9ydElkIH07XG4gICAgICAvLyBTZWNvbmQgcG9ydCBvYmplY3QgeCBhbmQgeSB3aWxsIGJlIGZpbGxlZCBhY2NvcmRpbmcgdG8gb3JkZXJpbmcsIHRoZSBzZWNvbmQgcG9ydCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgcmlnaHQgbW9zdCBvciB0aGUgYm90dG9tIG1vc3Qgb25lXG4gICAgICB2YXIgc2Vjb25kUG9ydCA9IHsgaWQ6IHNlY29uZFBvcnRJZCB9O1xuXG4gICAgICAvLyBDb21wbGV0ZSBwb3J0IG9iamVjdHMgYWNjb3JkaW5nIHRvIG9yZGVyaW5nXG4gICAgICBpZiAoIG9yZGVyaW5nID09PSAnTC10by1SJyB8fCBvcmRlcmluZyA9PT0gJ1ItdG8tTCcgKSB7XG4gICAgICAgIC8vIElmIG9yZGVyaW5nIGlzIGluIGhvcml6b250YWwgYXhpcyBmaXJzdCBwb3J0IGlzIHRoZSBsZWZ0IG1vc3Qgb25lIGFuZCB0aGUgc2Vjb25kIHBvcnQgaXMgdGhlIHJpZ2h0IG1vc3Qgb25lXG4gICAgICAgIGZpcnN0UG9ydC54ID0gLTEgKiBwb3J0RGlzdGFuY2U7XG4gICAgICAgIHNlY29uZFBvcnQueCA9IHBvcnREaXN0YW5jZTtcbiAgICAgICAgZmlyc3RQb3J0LnkgPSAwO1xuICAgICAgICBzZWNvbmRQb3J0LnkgPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSB7IC8vIElmIG9yZGVyaW5nIGlzICdULXRvLUInIG9yICdCLXRvLVQnXG4gICAgICAgICAvLyBJZiBvcmRlcmluZyBpcyBpbiB2ZXJ0aWNhbCBheGlzIGZpcnN0IHBvcnQgaXMgdGhlIHRvcCBtb3N0IG9uZSBhbmQgdGhlIHNlY29uZCBwb3J0IGlzIHRoZSBib3R0b20gbW9zdCBvbmVcbiAgICAgICAgZmlyc3RQb3J0LnkgPSAtMSAqIHBvcnREaXN0YW5jZTtcbiAgICAgICAgc2Vjb25kUG9ydC55ID0gcG9ydERpc3RhbmNlO1xuICAgICAgICBmaXJzdFBvcnQueCA9IDA7XG4gICAgICAgIHNlY29uZFBvcnQueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBmcm9tTG9yVCA9IG9yZGVyaW5nID09PSAnTC10by1SJyB8fCBvcmRlcmluZyA9PT0gJ1QtdG8tQic7IC8vIENoZWNrIGlmIG9yZGVyaW5nIHN0YXJ0cyBmcm9tIGxlZnQgb3IgdG9wXG4gICAgICB2YXIgcG9ydHMgPSBbZmlyc3RQb3J0LCBzZWNvbmRQb3J0XTsgLy8gUG9ydHMgYXJyYXkgZm9yIHRoZSBub2RlXG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7IC8vIFRoZSBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIG5vZGVcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICBub2RlLmRhdGEoJ3BvcnRzJywgcG9ydHMpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldCBmb3IgZWFjaCBlZGdlIGNvbm5lY3RlZCB0byB0aGUgbm9kZVxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkRWRnZXNbaV07XG4gICAgICAgIHZhciBlZGdlQ2xhc3MgPSBlZGdlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIElmIHRoZSBub2RlIGlzIHRoZSBlZGdlIHRhcmdldCB3ZSBtYXkgbmVlZCB0byBzZXQgdGhlIHBvcnR0YXJnZXQgb2YgdGhlIGVkZ2UgdG8gdGhlIGlucHV0IHBvcnQgb2YgdGhlIG5vZGUgKEZpcnN0IG9yIHNlY29uZCBwb3J0IGFjY29yaW5nIHRvIHRoZSBvcmllbnRhdGlvbilcbiAgICAgICAgICogaWYgaXQgaXMgdGhlIGVkZ2Ugc29ydWNlIHdlIG1heSBuZWVkIHRvIHNldCB0aGUgcG9ydHNvdXJjZSBvZiB0aGUgZWRnZSB0byB0aGUgb3V0cHV0IHBvcnQgc2ltaWxhcmx5LlxuICAgICAgICAgKiBOb3RlIHRoYXQgaWYgZnJvbiBsZWZ0IG9yIHRvcCAoZnJvbUxvclQpIGlzIHRydWUgdGhlbiB0aGUgZmlyc3QgcG9ydCBpcyB0aGUgc291cmNlIHBvcnQgYW5kIHNlY29uZCBwb3J0IGlzIHRoZSB0YXJnZXQgcG9ydCxcbiAgICAgICAgICogZWxzZSBpdCBpcyB2aWNlIHZlcnNhLlxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgICAgIGlmICggZWRnZS5kYXRhKCd0YXJnZXQnKSA9PT0gbm9kZS5pZCgpICkge1xuICAgICAgICAgIGlmIChlZGdlQ2xhc3MgPT09ICdwcm9kdWN0aW9uJyB8fCB0aGlzLmlzTW9kdWxhdGlvbkFyY0NsYXNzKGVkZ2VDbGFzcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBwcm9kdWN0aW9uIG9yIG1vZHVsYXRpb24gdHlwZSBvZiBlZGdlcyBjYW5ub3QgYmUgY29ubmVjdGVkIHRvIGFueSBwb3J0IG9mIHRhcmdldCBub2RlIChBIHByb2R1Y3Rpb24gY2FuIGhhdmUgYSBwcm9jZXNzIGFzIHRhcmdldCBub2RlIGJ1dCBpdCBpcyBzdXBwb3NlZCB0byBiZSBjb25uZWN0ZWQgdG8gdGhhdCBub2RlIGZyb20gaXRzIGJvZHksIG5vdCBmcm9tIGEgcG9ydClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCBmcm9tTG9yVCApIHtcbiAgICAgICAgICAgIGVkZ2UuZGF0YSgncG9ydHRhcmdldCcsIGZpcnN0UG9ydElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnR0YXJnZXQnLCBzZWNvbmRQb3J0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoZWRnZUNsYXNzID09PSAnY29uc3VtcHRpb24nKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gY29uc3VtcGl0b24gZWRnZSBjYW5ub3QgYmUgY29ubmVjdGVkIHRvIGFueSBwb3J0IG9mIHNvdXJjZSBub2RlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICggZnJvbUxvclQgKSB7XG4gICAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnRzb3VyY2UnLCBzZWNvbmRQb3J0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVkZ2UuZGF0YSgncG9ydHNvdXJjZScsIGZpcnN0UG9ydElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAqIFJlbW92ZSB0aGUgcG9ydHMgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAqL1xuICAgIHJlbW92ZVBvcnRzOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuXG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICAgIC8vIFJlc2V0IHBvcnRzb3VyY2Ugb3IgcG9ydHRhcmdldCBvZiB0aGUgY29ubmVjdGVkIGVkZ2VzIHRvIHRoZSBub2RlIGlkXG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcbiAgICAgICAgaWYgKCBlZGdlLmRhdGEoJ3NvdXJjZScpID09PSBub2RlSWQgKSB7XG4gICAgICAgICAgZWRnZS5kYXRhKCdwb3J0c291cmNlJywgbm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnR0YXJnZXQnLCBub2RlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUuZGF0YSgncG9ydHMnLCBbXSk7IC8vIENsZWFyIHBvcnRzIGRhdGFcblxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuXG4gICAgY2hhbmdlUG9ydHNPcmllbnRhdGlvbkFmdGVyTGF5b3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy9DaGVjayBhbGwgcHJvY2Vzc2VzIGFuZCBsb2dpY2FsIG9wZXJhdG9ycyB3aXRoIHBvcnRzXG4gICAgICAgIGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgICAgICAgICAgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAncHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAndW5jZXJ0YWluIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnYXNzb2NpYXRpb24nIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnZGlzc29jaWF0aW9uJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ2FuZCcgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvcicgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdub3QnKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICggZWxlLmRhdGEoJ3BvcnRzJykubGVuZ3RoID09PSAyIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiZXN0T3JpZW50YXRpb24gPSBlbGVtZW50VXRpbGl0aWVzLmNoYW5nZVBvcnRzT3JpZW50YXRpb24oZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zZXRQb3J0c09yZGVyaW5nKGVsZSwgYmVzdE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaW1wcm92ZS1mbG93IGlzIGNoZWNrZWQgd2UgZG8gdGhlIHN3YXBpbmcgb2Ygc2ltcGxlIG5vZGVzIHdpdGggZWFjaCBvdGhlclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wcm92ZUZsb3cgPSBvcHRpb25zLmltcHJvdmVGbG93O1xuICAgICAgICAgICAgICAgICAgICBpbXByb3ZlRmxvdyA9IHR5cGVvZiBpbXByb3ZlRmxvdyA9PT0gJ2Z1bmN0aW9uJyA/IGltcHJvdmVGbG93LmNhbGwoKSA6IGltcHJvdmVGbG93O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wcm92ZUZsb3cpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMucG9zdENoYW5nZVBvcnRzT3JpZW50YXRpb24oZWxlLCBiZXN0T3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbiAgICB9LFxuICAgIC8qXG4gICAgIENhbGN1bGF0ZXMgdGhlIGJlc3Qgb3JpZW50YXRpb24gZm9yIGFuICdlbGUnIHdpdGggcG9ydCAocHJvY2VzcyBvciBsb2dpY2FsIG9wZXJhdG9yKSBhbmQgcmV0dXJucyBpdC5cbiAgICAgKi9cbiAgICBjaGFuZ2VQb3J0c09yaWVudGF0aW9uOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NJZCA9IGVsZS5pZCgpO1xuICAgICAgICB2YXIgb3JpZW50YXRpb24gPSB7J0wtdG8tUic6IDAsICdSLXRvLUwnIDogMCwgJ1QtdG8tQicgOiAwLCAnQi10by1UJyA6IDB9O1xuICAgICAgICB2YXIgdGFyZ2V0aW5nRWRnZXMgPSBjeS5lZGdlcyhcIlt0YXJnZXQ9J1wiK3Byb2Nlc3NJZCtcIiddXCIpOyAvLyBIb2xkcyBlZGdlcyB3aG8gaGF2ZSB0aGUgaW5wdXQgcG9ydCBhcyBhIHRhcmdldFxuICAgICAgICB2YXIgc291cmNpbmdFZGdlcyA9IGN5LmVkZ2VzKFwiW3NvdXJjZT0nXCIrcHJvY2Vzc0lkK1wiJ11cIik7IC8vIEhvbGRzIGVkZ2VzIHdobyBoYXZlIHRoZSBvdXRwdXQgcG9ydCBhcyBhIHNvdXJjZVxuICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBvcnRzIGJlbG9uZyB0byBhIHByb2Nlc3Mgb3IgbG9naWFsIG9wZXJhdG9yLCBpdCBkb2VzIHRoZSBjYWxjdWxhdGlvbnMgYmFzZWQgb24gdGhlIGVkZ2VzIGNvbm5lY3RlZCB0byBpdHMgcG9ydHNcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAncHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAndW5jZXJ0YWluIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnYXNzb2NpYXRpb24nIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnZGlzc29jaWF0aW9uJylcbiAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0aW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbihlZGdlKXtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY29uc3VtcHRpb24nKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgnc291cmNlJykpOyAvL0hvbGRzIHRoZSBlbGVtZW50IGZyb20gdGhlIG90aGVyIHNpZGUgb2YgZWRnZVxuICAgICAgICAgICAgICAgICAgICB2YXIgc2ltcGxlID0gZmFsc2U7IC8vQ2hlY2tzIGlmIGl0IGlzIGEgc2ltcGxlIG5vZGUgLSBjb25uZWN0ZWQgd2l0aCBvbmx5IDEgZWRnZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgc291cmNlLCBvcmllbnRhdGlvbiwgJ0wtdG8tUicsICdSLXRvLUwnLCAneCcsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHNvdXJjZSwgb3JpZW50YXRpb24sICdULXRvLUInLCAnQi10by1UJywgJ3knLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc291cmNpbmdFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgdGFyZ2V0LCBvcmllbnRhdGlvbiwgJ1ItdG8tTCcsICdMLXRvLVInLCAneCcsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHRhcmdldCwgb3JpZW50YXRpb24sICdCLXRvLVQnLCAnVC10by1CJywgJ3knLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAnYW5kJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29yJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ25vdCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldGluZ0VkZ2VzLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2xvZ2ljIGFyYycpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gY3kuZ2V0RWxlbWVudEJ5SWQoZWRnZS5kYXRhKCdzb3VyY2UnKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzaW1wbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHNvdXJjZSwgb3JpZW50YXRpb24sICdMLXRvLVInLCAnUi10by1MJywgJ3gnLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNhbGN1bGF0ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBzb3VyY2UsIG9yaWVudGF0aW9uLCAnVC10by1CJywgJ0ItdG8tVCcsICd5Jywgc2ltcGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIGlmIChlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdtb2R1bGF0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdzdGltdWxhdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY2F0YWx5c2lzJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdpbmhpYml0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICduZWNlc3Nhcnkgc3RpbXVsYXRpb24nIHx8IGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2xvZ2ljIGFyYycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgndGFyZ2V0JykpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2ltcGxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNhbGN1bGF0ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCB0YXJnZXQsIG9yaWVudGF0aW9uLCAnUi10by1MJywgJ0wtdG8tUicsICd4Jywgc2ltcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgdGFyZ2V0LCBvcmllbnRhdGlvbiwgJ0ItdG8tVCcsICdULXRvLUInLCAneScsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DYWxjdWxhdGVzIHRoZSBiZXN0IG9yaWVudGF0aW9uIGZyb20gYWxsIG9yaWVudGF0aW9uIHNjb3Jlc1xuICAgICAgICB2YXIgYmVzdE9yaWVudGF0aW9uID0gXCJMLXRvLVJcIjtcbiAgICAgICAgdmFyIGJlc3RTY29yZSA9IG9yaWVudGF0aW9uWydMLXRvLVInXTsvL1RoZSBzY29yZSBvZiB0aGUgYmVzdCBvcmllbnRhdGlvbiBpcyBhbHdheXMgcG9zaXRpdmVcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbltwcm9wZXJ0eV0gPiBiZXN0U2NvcmUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gb3JpZW50YXRpb25bcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGJlc3RPcmllbnRhdGlvbiA9IHByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0T3JpZW50YXRpb247XG4gICAgfSxcbiAgICAvKlxuICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNjb3JlcyBmb3IgZWFjaCBvcmllbnRhdGlvblxuICAgICBAcGFyYW0gZWxlIC0gaXMgdGhlIG5vZGUgKHByb2Nlc3MsIGxvZ2ljYWwgb3BlcmF0b3IpIHdob3NlIG9yaWVudGF0aW9uIHdpbGwgYmUgY2hhbmdlZC4gSXQgY2FuIGJlIHByb2Nlc3Msb21pdHRlZCBwcm9jZXNzLFxuICAgICB1bmNlcnRhaW4gcHJvY2VzcywgYXNzb2NpYXRpb24sIGRpc3NvY2lhdGlvbiwgbG9naWNhbCBvcGVyYXRvclxuICAgICBAcGFyYW0gb3RoZXIgLSBpcyB0aGUgb3RoZXIgbm9kZSwgYW5kIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBzY29yZXMgYXJlIGdpdmVuIHRvIG9yaWVudGF0aW9uc1xuICAgICBAcGFyYW0gb3JpZW50YXRpb24gLSBob2xkcyBzY29yZXMgZm9yIGVhY2ggb3JpZW50YXRpb25cbiAgICAgQHBhcmFtIGZpcnN0T3JpZW50YXRpb24gLSBjYW4gYmUgTC10by1SIG9yIFQtdG8tQlxuICAgICBAcGFyYW0gb3Bwb3NpdGVPcmllbnRhdGlvbiAtIG9wcG9zaXRlIG9mIHRoZSB1cHBlciBvcmllbnRhdGlvbiAoUi10by1MICwgQi10by1UKVxuICAgICBAcGFyYW0gcG9zIC0gY2FuIGJlICd4JyBvciAneScgKGJhc2VkIG9uIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZGlyZWN0aW9uIG9mIHBvcnRzKVxuICAgICBAcGFyYW0gc2ltcGxlIC0gY2hlY2tzIGlmICdvdGhlcicgbm9kZSBpcyBzaW1wbGUgbm9kZSAod2l0aCBkZWdyZWUgMSlcbiAgICAgKi9cbiAgICBjYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlOiBmdW5jdGlvbihlbGUsIG90aGVyLCBvcmllbnRhdGlvbiwgZmlyc3RPcmllbnRhdGlvbiwgb3Bwb3NpdGVPcmllbnRhdGlvbiwgcG9zLCBzaW1wbGUpIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMC41O1xuICAgICAgICB2YXIgc2NvcmUgPSAyO1xuICAgICAgICBpZiAoc2ltcGxlKVxuICAgICAgICAgICAgc2NvcmUgPSAxOyAvLyBJZiBpdCBpcyBhIHNpbXBsZSBub2RlLCBpdHMgc2NvcmUgc2hvdWxkIGFmZmVjdCBsZXNzXG4gICAgICAgIHZhciBub2RlV2lkdGhPckhlaWdodCA9IDA7XG4gICAgICAgIGlmIChwb3MgPT09ICd4JylcbiAgICAgICAgICAgIG5vZGVXaWR0aE9ySGVpZ2h0ID0gZWxlLndpZHRoKCkvMjtcbiAgICAgICAgZWxzZSBpZiAocG9zID09PSd5JylcbiAgICAgICAgICAgIG5vZGVXaWR0aE9ySGVpZ2h0ID0gZWxlLmhlaWdodCgpLzI7XG4gICAgICAgIGlmIChvdGhlci5wb3NpdGlvbihwb3MpIDwgZWxlLnBvc2l0aW9uKHBvcykgLSBub2RlV2lkdGhPckhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgb3JpZW50YXRpb25bZmlyc3RPcmllbnRhdGlvbl0gKz0gc2NvcmU7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltvcHBvc2l0ZU9yaWVudGF0aW9uXSAtPSBzY29yZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbihwb3MpID49IGVsZS5wb3NpdGlvbihwb3MpIC0gbm9kZVdpZHRoT3JIZWlnaHQgJiYgb3RoZXIucG9zaXRpb24ocG9zKSA8PSBlbGUucG9zaXRpb24ocG9zKSArIG5vZGVXaWR0aE9ySGVpZ2h0KVxuICAgICAgICB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltmaXJzdE9yaWVudGF0aW9uXSArPSAoZWxlLnBvc2l0aW9uKHBvcykgLSBvdGhlci5wb3NpdGlvbihwb3MpKS9ub2RlV2lkdGhPckhlaWdodCpjb2VmZjtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uW29wcG9zaXRlT3JpZW50YXRpb25dIC09IChlbGUucG9zaXRpb24ocG9zKSAtIG90aGVyLnBvc2l0aW9uKHBvcykpL25vZGVXaWR0aE9ySGVpZ2h0KmNvZWZmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG90aGVyLnBvc2l0aW9uKHBvcykgPiAgZWxlLnBvc2l0aW9uKHBvcykgKyBub2RlV2lkdGhPckhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgb3JpZW50YXRpb25bZmlyc3RPcmllbnRhdGlvbl0gLT0gc2NvcmU7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltvcHBvc2l0ZU9yaWVudGF0aW9uXSArPSBzY29yZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLypcbiAgICAgQWZ0ZXIgYSBwcm9jZXNzIGlzIG9yaWVudGVkLCBmb3IgZWFjaCBzaW1wbGUgbm9kZSB0aGF0IGlzIG9uIHRoZSB3cm9uZyBzaWRlIG9mIHRoZSBwb3J0LFxuICAgICB3ZSB0cnkgdG8gZmluZCBhbm90aGVyIHNpbXBsZSBub2RlIG9mIGRlZ3JlZSAwIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIGFuZCBzd2FwIHRoZW0gYWZ0ZXJ3YXJkcy5cbiAgICAgSWYgZnJvbSB0aGUgb3Bwb3NpZGUgc2lkZSB3ZSBjYW5ub3QgZmluZCBzdWNoIGEgbm9kZSB0aGVuIHdlIHRyeSB0byBzd2FwIGl0IHdpdGggYW4gZWZmZWN0b3Igbm9kZSBvZiBkZWdyZWUgMVxuICAgICAqL1xuICAgIHBvc3RDaGFuZ2VQb3J0c09yaWVudGF0aW9uOiBmdW5jdGlvbihlbGUsIGJlc3RPcmllbnRhdGlvbikge1xuICAgICAgICB2YXIgcHJvY2Vzc0lkID0gZWxlLmlkKCk7XG4gICAgICAgIHZhciBpbnB1dFBvcnQgPSBbXTsgLy8gSG9sZHMgYWxsIHNpbXBsZSBub2RlcyBjb25uZWN0ZWQgd2l0aCBpbnB1dCBwb3J0XG4gICAgICAgIHZhciBvdXRwdXRQb3J0ID0gW107IC8vIEhvbGRzIGFsbCBzaW1wbGUgbm9kZXMgY29ubmVjdGVkIHdpdGggb3V0cHV0IHBvcnRcbiAgICAgICAgdmFyIG5vdENvbm5lY3RlZFRvUG9ydCA9IFtdOyAvLyBIb2xkcyBhbGwgc2ltcGxlIG5vZGVzIG5vdCBjb25uZWN0ZWQgd2l0aCBpbnB1dCBvciBvdXRwdXQgcG9ydFxuICAgICAgICB2YXIgdGFyZ2V0aW5nRWRnZXMgPSBjeS5lZGdlcyhcIlt0YXJnZXQ9J1wiK3Byb2Nlc3NJZCtcIiddXCIpO1xuICAgICAgICB2YXIgc291cmNpbmdFZGdlcyA9IGN5LmVkZ2VzKFwiW3NvdXJjZT0nXCIrcHJvY2Vzc0lkK1wiJ11cIik7XG4gICAgICAgIC8vIENoZWNrcyBzaW1wbGUgbm9kZXMgYW5kIGFkZCB0aGVtIHRvIG9uZSBvZiB0aGUgYXJyYXlzIG1lbnRpb25lZCBhYm92ZVxuICAgICAgICBpZiAoZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdwcm9jZXNzJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29taXR0ZWQgcHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICd1bmNlcnRhaW4gcHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdhc3NvY2lhdGlvbicgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdkaXNzb2NpYXRpb24nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXRpbmdFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3NvdXJjZScpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY29uc3VtcHRpb24nKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHNvdXJjZSwgYmVzdE9yaWVudGF0aW9uLCBpbnB1dFBvcnQsIFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuYWRkU2ltcGxlTm9kZVRvQXJyYXkoZWxlLCBzb3VyY2UsIGJlc3RPcmllbnRhdGlvbiwgbm90Q29ubmVjdGVkVG9Qb3J0LCBcIm5vdENvbm5lY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBvdXRwdXRQb3J0LCBcIm91dHB1dFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBub3RDb25uZWN0ZWRUb1BvcnQsIFwibm90Q29ubmVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAnYW5kJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29yJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ25vdCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldGluZ0VkZ2VzLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgnc291cmNlJykpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdsb2dpYyBhcmMnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHNvdXJjZSwgYmVzdE9yaWVudGF0aW9uLCBpbnB1dFBvcnQsIFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuYWRkU2ltcGxlTm9kZVRvQXJyYXkoZWxlLCBzb3VyY2UsIGJlc3RPcmllbnRhdGlvbiwgbm90Q29ubmVjdGVkVG9Qb3J0LCBcIm5vdENvbm5lY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnbW9kdWxhdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnc3RpbXVsYXRpb24nIHx8IGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2NhdGFseXNpcycgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnaW5oaWJpdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnbmVjZXNzYXJ5IHN0aW11bGF0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdsb2dpYyBhcmMnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBvdXRwdXRQb3J0LCBcIm91dHB1dFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBub3RDb25uZWN0ZWRUb1BvcnQsIFwibm90Q29ubmVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vVGhlIGFycmF5cyBhcmUgc29ydGVkIGluIG9yZGVyIHRvIGtlZXAgdGhlIGhpZ2ggcHJpb3JpdHkgb2Ygbm9kZXMgcG9zaXRpb25lZCBjb21wbGV0ZWx5IHRvIHRoZSBvdGhlciBzaWRlXG4gICAgICAgIGlucHV0UG9ydC5zb3J0KGZ1bmN0aW9uKGEsIGIpe3JldHVybiBiLnNjb3JlIC0gYS5zY29yZX0pO1xuICAgICAgICBvdXRwdXRQb3J0LnNvcnQoZnVuY3Rpb24oYSwgYil7cmV0dXJuIGIuc2NvcmUgLSBhLnNjb3JlfSk7XG4gICAgICAgIG5vdENvbm5lY3RlZFRvUG9ydC5zb3J0KGZ1bmN0aW9uKGEsIGIpe3JldHVybiBhLnNjb3JlIC0gYi5zY29yZX0pO1xuICAgICAgICAvL0ZpcnN0IHdlIGNoZWNrIGZvciBkaXJlY3Qgc3dhcGluZyBiZXR3ZWVuIG5vZGVzIGZyb20gZGlmZmVyZW50IHBvcnRzIHBvc2l0aW9uZWQgdG8gdGhlIHdyb25nIHNpZGVcbiAgICAgICAgdmFyIG1pbkxlbmd0aCA9IGlucHV0UG9ydC5sZW5ndGg7XG4gICAgICAgIGlmIChvdXRwdXRQb3J0Lmxlbmd0aCA8IG1pbkxlbmd0aClcbiAgICAgICAgICAgIG1pbkxlbmd0aCA9IG91dHB1dFBvcnQubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluTGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpbnB1dFBvcnRFbGUgPSBpbnB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICB2YXIgb3V0cHV0UG9ydEVsZSA9IG91dHB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICAvL0NoZWNrcyBpZiBmcmVlIG5vZGVzIGJlbG9uZyB0byB0aGUgc2FtZSBjb21wb3VuZFxuICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlucHV0UG9ydEVsZS5pZCk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKG91dHB1dFBvcnRFbGUuaWQpO1xuICAgICAgICAgICAgaWYgKGZpcnN0Tm9kZS5kYXRhKCdwYXJlbnQnKSAhPT0gc2Vjb25kTm9kZS5kYXRhKCdwYXJlbnQnKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuc3dhcEVsZW1lbnRzKGlucHV0UG9ydEVsZSwgb3V0cHV0UG9ydEVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgIEFmdGVyIHRoYXQgd2UgaXRlcmF0ZSBvdmVyIGVhY2ggZWxlbWVudCBvZiBlZmZlY3RvciBub2RlcyBhbmQgc2VlIHRoZSBzY29yZXMgaXQgcHJvZHVjZXMgYnkgc3dhcGluZ1xuICAgICAgICAgd2l0aCBub2RlcyBjb25uZWN0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0IHBvcnRzXG4gICAgICAgICAqL1xuICAgICAgICBmb3IgKGkgPSBub3RDb25uZWN0ZWRUb1BvcnQubGVuZ3RoIC0xOyBpID49IDAgOyBpLS0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBlZmZlY3RvciA9IG5vdENvbm5lY3RlZFRvUG9ydFtpXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRQb3J0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0T3V0cHV0ID0gb3V0cHV0UG9ydFtvdXRwdXRQb3J0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIC8vQ2hlY2tzIGlmIGZyZWUgbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIGNvbXBvdW5kXG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVmZmVjdG9yLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGZpcnN0T3V0cHV0LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb2RlLmRhdGEoJ3BhcmVudCcpICE9PSBzZWNvbmROb2RlLmRhdGEoJ3BhcmVudCcpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zd2FwRWxlbWVudHMoZWZmZWN0b3IsIGZpcnN0T3V0cHV0KTtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPdXRwdXRTY29yZSA9IC1lbGVtZW50VXRpbGl0aWVzLmNoZWNrTmVnYXRpdmVPcmllbnRhdGlvblNjb3JlKGVsZSwgY3kuZ2V0RWxlbWVudEJ5SWQoZmlyc3RPdXRwdXQuaWQpLCBiZXN0T3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIGlmICggZmlyc3RPdXRwdXRTY29yZSA+IGZpcnN0T3V0cHV0LnNjb3JlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLnN3YXBFbGVtZW50cyhlZmZlY3RvciwgZmlyc3RPdXRwdXQpOyAvL3N3YXAgYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRQb3J0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0SW5wdXQgPSBpbnB1dFBvcnRbaW5wdXRQb3J0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIC8vQ2hlY2tzIGlmIGZyZWUgbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIGNvbXBvdW5kXG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVmZmVjdG9yLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGZpcnN0SW5wdXQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdE5vZGUuZGF0YSgncGFyZW50JykgIT09IHNlY29uZE5vZGUuZGF0YSgncGFyZW50JykpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLnN3YXBFbGVtZW50cyhlZmZlY3RvciwgZmlyc3RJbnB1dCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0SW5wdXRTY29yZSA9IGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBjeS5nZXRFbGVtZW50QnlJZChmaXJzdElucHV0LmlkKSwgYmVzdE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoIGZpcnN0SW5wdXRTY29yZSA+IGZpcnN0SW5wdXQuc2NvcmUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zd2FwRWxlbWVudHMoZWZmZWN0b3IsIGZpcnN0SW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKlxuICAgICAqIEFkZHMgc2ltcGxlIG5vZGVzIHdoZW4gdGhleSBoYXZlIG5lZ2F0aXZlIHNjb3JlIHRvIGlucHV0UG9ydCwgb3V0cHV0UG9ydCBvciBub3RDb25uZWN0ZWRQb3J0IGFycmF5c1xuICAgICAqICovXG4gICAgYWRkU2ltcGxlTm9kZVRvQXJyYXk6IGZ1bmN0aW9uKGVsZSwgb3RoZXIsIG9yaWVudGF0aW9uLCBhcnJheSwgY29ubmVjdGVkVG8pIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbm9kZVNjb3JlO1xuICAgICAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFRvID09PSBcIm5vdENvbm5lY3RlZFwiKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5vZGVTY29yZSA9IE1hdGguYWJzKGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBvdGhlciwgb3JpZW50YXRpb24pKTtcbiAgICAgICAgICAgICAgICBvYmpbJ2lkJ10gPSBvdGhlci5pZCgpO1xuICAgICAgICAgICAgICAgIG9ialsnc2NvcmUnXSA9IG5vZGVTY29yZTtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFRvID09PSBcImlucHV0XCIpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY29yZSA9IGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBvdGhlciwgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbm5lY3RlZFRvID09PSBcIm91dHB1dFwiKVxuICAgICAgICAgICAgICAgICAgICBub2RlU2NvcmUgPSAtZWxlbWVudFV0aWxpdGllcy5jaGVja05lZ2F0aXZlT3JpZW50YXRpb25TY29yZShlbGUsIG90aGVyLCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVTY29yZSA8IDApIC8vaWYgaXQgaXMgaW4gdGhlIHdyb25nIHNpZGUgd2UgYWRkIGl0IHRvIHRoZSBpbnB1dCBhcnJheVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydpZCddID0gb3RoZXIuaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydzY29yZSddID0gbm9kZVNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKlxuICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNjb3JlIG9mIGEgbm9kZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIGEgcHJvY2Vzcy9sb2dpY2FsIG9wZXJhdG9yXG4gICAgIEBwYXJhbSBlbGUgLSBpcyB0aGUgbm9kZSB3aXRoIHRoZSBwb3J0cy4gSXQgY2FuIGJlIHByb2Nlc3Msb21pdHRlZCBwcm9jZXNzLFxuICAgICB1bmNlcnRhaW4gcHJvY2VzcywgYXNzb2NpYXRpb24sIGRpc3NvY2lhdGlvbiwgbG9naWNhbCBvcGVyYXRvclxuICAgICBAcGFyYW0gb3RoZXIgLSBpcyB0aGUgb3RoZXIgbm9kZSwgYW5kIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBzY29yZSBvZiBhIG5vZGUgaXMgY2FsY3VsYXRlZFxuICAgICBAcGFyYW0gb3JpZW50YXRpb24gLSBBIHN0cmluZyB3aGljaCBob2xkcyBjdXJyZW50IGJlc3Qgb3JpZW50YXRpb25cbiAgICAgKi9cbiAgICBjaGVja05lZ2F0aXZlT3JpZW50YXRpb25TY29yZTogZnVuY3Rpb24oZWxlLCBvdGhlciwgb3JpZW50YXRpb24pIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMC41O1xuICAgICAgICB2YXIgc2NvcmUgPSAxO1xuICAgICAgICBpZiAob3JpZW50YXRpb24gPT09ICdMLXRvLVInIHx8IG9yaWVudGF0aW9uID09PSAnUi10by1MJylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vZGVXaWR0aCA9IGVsZS53aWR0aCgpLzI7XG4gICAgICAgICAgICBpZiAob3RoZXIucG9zaXRpb24oJ3gnKSA8IGVsZS5wb3NpdGlvbigneCcpIC0gbm9kZVdpZHRoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0wtdG8tUicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzY29yZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmllbnRhdGlvbiA9PT0gJ1ItdG8tTCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbigneCcpID49IGVsZS5wb3NpdGlvbigneCcpIC0gbm9kZVdpZHRoICYmIG90aGVyLnBvc2l0aW9uKCd4JykgPD0gZWxlLnBvc2l0aW9uKCd4JykgKyBub2RlV2lkdGgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnTC10by1SJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGUucG9zaXRpb24oJ3gnKSAtIG90aGVyLnBvc2l0aW9uKCd4JykpL25vZGVXaWR0aCpjb2VmZjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmllbnRhdGlvbiA9PT0gJ1ItdG8tTCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtKGVsZS5wb3NpdGlvbigneCcpIC0gb3RoZXIucG9zaXRpb24oJ3gnKSkvbm9kZVdpZHRoKmNvZWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIucG9zaXRpb24oJ3gnKSA+IGVsZS5wb3NpdGlvbigneCcpICsgbm9kZVdpZHRoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0wtdG8tUicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdSLXRvLUwnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnVC10by1CJyB8fCBvcmllbnRhdGlvbiA9PT0gJ0ItdG8tVCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBub2RlSGVpZ2h0ID0gZWxlLmhlaWdodCgpLzI7XG4gICAgICAgICAgICBpZiAob3RoZXIucG9zaXRpb24oJ3knKSA8IGVsZS5wb3NpdGlvbigneScpIC0gbm9kZUhlaWdodClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT09ICdULXRvLUInKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXNjb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIucG9zaXRpb24oJ3knKSA+PSBlbGUucG9zaXRpb24oJ3knKSAtIG5vZGVIZWlnaHQgJiYgb3RoZXIucG9zaXRpb24oJ3knKSA8PSBlbGUucG9zaXRpb24oJ3knKSArIG5vZGVIZWlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnVC10by1CJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGUucG9zaXRpb24oJ3knKSAtIG90aGVyLnBvc2l0aW9uKCd5JykpL25vZGVIZWlnaHQqY29lZmY7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLShlbGUucG9zaXRpb24oJ3knKSAtIG90aGVyLnBvc2l0aW9uKCd5JykpL25vZGVIZWlnaHQqY29lZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbigneScpID4gZWxlLnBvc2l0aW9uKCd5JykgKyBub2RlSGVpZ2h0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ1QtdG8tQicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qXG4gICAgIFN3YXBzIHRoZSBwb3NpdGlvbnMgb2YgMiBlbGVtZW50c1xuICAgICAqL1xuICAgIHN3YXBFbGVtZW50czogZnVuY3Rpb24oZmlyc3RFbGUsIHNlY29uZEVsZSkge1xuICAgICAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoZmlyc3RFbGUuaWQpO1xuICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKHNlY29uZEVsZS5pZCk7XG4gICAgICAgIHZhciB0ZW1weCA9IGZpcnN0Tm9kZS5wb3NpdGlvbigneCcpO1xuICAgICAgICB2YXIgdGVtcHkgPSBmaXJzdE5vZGUucG9zaXRpb24oJ3knKTtcbiAgICAgICAgZmlyc3ROb2RlLnBvc2l0aW9uKCd4Jywgc2Vjb25kTm9kZS5wb3NpdGlvbigneCcpKTtcbiAgICAgICAgZmlyc3ROb2RlLnBvc2l0aW9uKCd5Jywgc2Vjb25kTm9kZS5wb3NpdGlvbigneScpKTtcbiAgICAgICAgc2Vjb25kTm9kZS5wb3NpdGlvbigneCcsIHRlbXB4KTtcbiAgICAgICAgc2Vjb25kTm9kZS5wb3NpdGlvbigneScsIHRlbXB5KTtcbiAgICB9LFxuXG4gICAgLy8gdXNlZCBmb3IgaGFuZGxpbmcgdGhlIHZhcmlhYmxlIHByb3BlcnR5IG9mIGNvbXBsZXhlc1xuICAgIGdldENvbXBsZXhQYWRkaW5nOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgIC8vIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQ6XG4gICAgICAvLyAtIHByZXNlbmNlIG9mIGEgbGFiZWxcbiAgICAgIC8vIC0gb3B0aW9uIHRvIGRpc3BsYXkgY29tcGxleCBsYWJlbHNcbiAgICAgIC8vIC0gcHJlc2VuY2Ugb2Ygc3RhdGVzIGFuZCBpbmZvIGJveCBvbiB0aGUgYm90dG9tXG4gICAgICB2YXIgcGFkZGluZyA9IGdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MoKTtcbiAgICAgIGlmIChvcHRpb25zLnNob3dDb21wbGV4TmFtZSAmJiBlbGVtZW50VXRpbGl0aWVzLmdldEVsZW1lbnRDb250ZW50KGVsZSkpIHtcbiAgICAgICAgcGFkZGluZyArPSBvcHRpb25zLmV4dHJhQ29tcGxleFBhZGRpbmcgKiAwLjU7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBvbiB0aGUgYm90dG9tIHNpZGVcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpICYmIGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpLmJvdHRvbSAmJiBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20udW5pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhZGRpbmcgKz0gb3B0aW9ucy5leHRyYUNvbXBsZXhQYWRkaW5nICogMC41O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHBhZGRpbmcgaXMgdGhlIHRpZ2h0ZXN0LCB3ZSBuZWVkIGEgYml0IG9mIGV4dHJhIHNwYWNlXG4gICAgICAvLyB0byBhdm9pZCB0b3VjaGluZyB0aGUgaW5mb2JveGVzIG9mIHRoZSBjb21wbGV4XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYWRkaW5nICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwYWRkaW5nO1xuICAgIH0sXG5cbiAgICAvLyB1c2VkIGZvciBoYW5kbGluZyB0aGUgdmFyaWFibGUgcHJvcGVydHkgb2YgY29tcGxleGVzXG4gICAgZ2V0Q29tcGxleE1hcmdpbjogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAvLyB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50OlxuICAgICAgLy8gLSBwcmVzZW5jZSBvZiBhIGxhYmVsXG4gICAgICAvLyAtIG9wdGlvbiB0byBkaXNwbGF5IGNvbXBsZXggbGFiZWxzXG4gICAgICAvLyAtIHByZXNlbmNlIG9mIHN0YXRlcyBhbmQgaW5mbyBib3ggb24gdGhlIGJvdHRvbVxuICAgICAgdmFyIG1hcmdpbiA9ICAtMSAqIG9wdGlvbnMuZXh0cmFDb21wbGV4UGFkZGluZztcbiAgICAgIGlmIChvcHRpb25zLnNob3dDb21wbGV4TmFtZSAmJlxuICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RWxlbWVudENvbnRlbnQoZWxlKSAmJlxuICAgICAgICAgIGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpICYmIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBvbiB0aGUgYm90dG9tIHNpZGVcbiAgICAgICAgICBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20gJiZcbiAgICAgICAgICBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20udW5pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXJnaW4gLT0gb3B0aW9ucy5leHRyYUNvbXBsZXhQYWRkaW5nICogMC41O1xuICAgICAgfVxuICAgIGlmIChlbGUuY3NzKFwiZm9udC1zaXplXCIpID09IFwiMTRweFwiKVxuICAgICAgICAgIG1hcmdpbiAtPSAyO1xuICAgICAgcmV0dXJuIG1hcmdpbjtcbiAgICB9XG4gICAgXG4gICAgLy8gU2VjdGlvbiBFbmRcbiAgICAvLyBTdHlsZXNoZWV0IGhlbHBlcnNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZWxlbWVudFV0aWxpdGllcztcbiIsIi8qXG4gKiBGaWxlIFV0aWxpdGllczogVG8gYmUgdXNlZCBvbiByZWFkL3dyaXRlIGZpbGUgb3BlcmF0aW9uXG4gKi9cblxudmFyIHNiZ25tbFRvSnNvbiA9IHJlcXVpcmUoJy4vc2Jnbm1sLXRvLWpzb24tY29udmVydGVyJyk7XG52YXIganNvblRvU2Jnbm1sID0gcmVxdWlyZSgnLi9qc29uLXRvLXNiZ25tbC1jb252ZXJ0ZXInKTtcbnZhciB1aVV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdWktdXRpbGl0aWVzJyk7XG52YXIgZ3JhcGhVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIHVwZGF0ZUdyYXBoID0gZ3JhcGhVdGlsaXRpZXMudXBkYXRlR3JhcGguYmluZChncmFwaFV0aWxpdGllcyk7XG5cbnZhciBsaWJzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBzYXZlQXMgPSBsaWJzLnNhdmVBcztcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBTdGFydFxuLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTYyNDU3NjcvY3JlYXRpbmctYS1ibG9iLWZyb20tYS1iYXNlNjQtc3RyaW5nLWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGI2NHRvQmxvYihiNjREYXRhLCBjb250ZW50VHlwZSwgc2xpY2VTaXplKSB7XG4gIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgfHwgJyc7XG4gIHNsaWNlU2l6ZSA9IHNsaWNlU2l6ZSB8fCA1MTI7XG5cbiAgdmFyIGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgdmFyIGJ5dGVBcnJheXMgPSBbXTtcblxuICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IG9mZnNldCArPSBzbGljZVNpemUpIHtcbiAgICB2YXIgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICB2YXIgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgdmFyIGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcblxuICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICB9XG5cbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7dHlwZTogY29udGVudFR5cGV9KTtcbiAgcmV0dXJuIGJsb2I7XG59XG5cbmZ1bmN0aW9uIGxvYWRYTUxEb2MoZnVsbEZpbGVQYXRoKSB7XG4gIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICB4aHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB9XG4gIGVsc2Uge1xuICAgIHhodHRwID0gbmV3IEFjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MSFRUUFwiKTtcbiAgfVxuICB4aHR0cC5vcGVuKFwiR0VUXCIsIGZ1bGxGaWxlUGF0aCwgZmFsc2UpO1xuICB4aHR0cC5zZW5kKCk7XG4gIHJldHVybiB4aHR0cC5yZXNwb25zZVhNTDtcbn1cblxuLy8gU2hvdWxkIHRoaXMgYmUgZXhwb3NlZCBvciBzaG91bGQgdGhpcyBiZSBtb3ZlZCB0byB0aGUgaGVscGVyIGZ1bmN0aW9ucyBzZWN0aW9uP1xuZnVuY3Rpb24gdGV4dFRvWG1sT2JqZWN0KHRleHQpIHtcbiAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgdmFyIGRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7XG4gICAgZG9jLmFzeW5jID0gJ2ZhbHNlJztcbiAgICBkb2MubG9hZFhNTCh0ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xuICB9XG4gIHJldHVybiBkb2M7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIEVuZFxuXG5mdW5jdGlvbiBmaWxlVXRpbGl0aWVzKCkge31cbmZpbGVVdGlsaXRpZXMubG9hZFhNTERvYyA9IGxvYWRYTUxEb2M7XG5cbmZpbGVVdGlsaXRpZXMuc2F2ZUFzUG5nID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgdmFyIHBuZ0NvbnRlbnQgPSBjeS5wbmcoe3NjYWxlOiAzLCBmdWxsOiB0cnVlfSk7XG5cbiAgLy8gdGhpcyBpcyB0byByZW1vdmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgcG5nQ29udGVudDogZGF0YTppbWcvcG5nO2Jhc2U2NCxcbiAgdmFyIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG4gIHNhdmVBcyhiNjR0b0Jsb2IoYjY0ZGF0YSwgXCJpbWFnZS9wbmdcIiksIGZpbGVuYW1lIHx8IFwibmV0d29yay5wbmdcIik7XG59O1xuXG5maWxlVXRpbGl0aWVzLnNhdmVBc0pwZyA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHZhciBqcGdDb250ZW50ID0gY3kuanBnKHtzY2FsZTogMywgZnVsbDogdHJ1ZX0pO1xuXG4gIC8vIHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBuZ0NvbnRlbnQ6IGRhdGE6aW1nL3BuZztiYXNlNjQsXG4gIHZhciBiNjRkYXRhID0ganBnQ29udGVudC5zdWJzdHIoanBnQ29udGVudC5pbmRleE9mKFwiLFwiKSArIDEpO1xuICBzYXZlQXMoYjY0dG9CbG9iKGI2NGRhdGEsIFwiaW1hZ2UvanBnXCIpLCBmaWxlbmFtZSB8fCBcIm5ldHdvcmsuanBnXCIpO1xufTtcblxuZmlsZVV0aWxpdGllcy5zYXZlQXNTdmcgPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICB2YXIgc3ZnQ29udGVudCA9IGN5LnN2Zyh7c2NhbGU6IDEsIGZ1bGw6IHRydWV9KTtcbiAgc2F2ZUFzKG5ldyBCbG9iKFtzdmdDb250ZW50XSwge3R5cGU6XCJpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLThcIn0pLCBmaWxlbmFtZSB8fCBcIm5ldHdvcmsuc3ZnXCIpO1xufTtcblxuZmlsZVV0aWxpdGllcy5sb2FkU2FtcGxlID0gZnVuY3Rpb24oZmlsZW5hbWUsIGZvbGRlcnBhdGgpIHtcbiAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICBcbiAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYSBzYW1wbGUgaXMgYmVpbmcgbG9hZGVkXG4gIC8vIFRyaWdnZXIgYW4gZXZlbnQgZm9yIHRoaXMgcHVycG9zZSBhbmQgc3BlY2lmeSB0aGUgJ2ZpbGVuYW1lJyBhcyBhbiBldmVudCBwYXJhbWV0ZXJcbiAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInNiZ252aXpMb2FkU2FtcGxlXCIsIFsgZmlsZW5hbWUgXSApOyAvLyBBbGlhc2VzIGZvciBzYmdudml6TG9hZFNhbXBsZVN0YXJ0XG4gICQoIGRvY3VtZW50ICkudHJpZ2dlciggXCJzYmdudml6TG9hZFNhbXBsZVN0YXJ0XCIsIFsgZmlsZW5hbWUgXSApO1xuICBcbiAgLy8gbG9hZCB4bWwgZG9jdW1lbnQgdXNlIGRlZmF1bHQgZm9sZGVyIHBhdGggaWYgaXQgaXMgbm90IHNwZWNpZmllZFxuICB2YXIgeG1sT2JqZWN0ID0gbG9hZFhNTERvYygoZm9sZGVycGF0aCB8fCAnc2FtcGxlLWFwcC9zYW1wbGVzLycpICsgZmlsZW5hbWUpO1xuICBcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlR3JhcGgoc2Jnbm1sVG9Kc29uLmNvbnZlcnQoeG1sT2JqZWN0KSk7XG4gICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwic2JnbnZpekxvYWRTYW1wbGVFbmRcIiwgWyBmaWxlbmFtZSBdICk7IC8vIFRyaWdnZXIgYW4gZXZlbnQgc2lnbmFsaW5nIHRoYXQgYSBzYW1wbGUgaXMgbG9hZGVkXG4gIH0sIDApO1xufTtcblxuLypcbiAgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiByZW1vdGVseSBkZWZpbmVkIHRvIGFkZCBzcGVjaWZpYyBiZWhhdmlvciB0aGF0IGlzbid0IGltcGxlbWVudGVkIGhlcmUuXG4gIGl0IGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuXG4gIHNpZ25hdHVyZTogY2FsbGJhY2sodGV4dFhtbClcbiovXG5maWxlVXRpbGl0aWVzLmxvYWRTQkdOTUxGaWxlID0gZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2sxLCBjYWxsYmFjazIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB1aVV0aWxpdGllcy5zdGFydFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgXG4gIHZhciB0ZXh0VHlwZSA9IC90ZXh0LiovO1xuXG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ZXh0ID0gdGhpcy5yZXN1bHQ7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sxICE9PSAndW5kZWZpbmVkJykgY2FsbGJhY2sxKHRleHQpO1xuICAgICAgdmFyIGN5R3JhcGg7XG4gICAgICB0cnkge1xuICAgICAgICBjeUdyYXBoID0gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHQpKTtcbiAgICAgICAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYW4gZXh0ZXJuYWwgZmlsZSBpcyBiZWluZyBsb2FkZWRcbiAgICAgICAgLy8gVHJpZ2dlciBhbiBldmVudCBmb3IgdGhpcyBwdXJwb3NlIGFuZCBzcGVjaWZ5IHRoZSAnZmlsZW5hbWUnIGFzIGFuIGV2ZW50IHBhcmFtZXRlclxuICAgICAgICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwic2JnbnZpekxvYWRGaWxlXCIsIFsgZmlsZS5uYW1lIF0gKTsgLy8gQWxpYXNlcyBmb3Igc2JnbnZpekxvYWRGaWxlU3RhcnRcbiAgICAgICAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInNiZ252aXpMb2FkRmlsZVN0YXJ0XCIsIFsgZmlsZS5uYW1lIF0gKTsgXG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazIgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVHcmFwaChjeUdyYXBoKTtcbiAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICAgICQoIGRvY3VtZW50ICkudHJpZ2dlciggXCJzYmdudml6TG9hZEZpbGVFbmRcIiwgWyBmaWxlLm5hbWUgXSApOyAvLyBUcmlnZ2VyIGFuIGV2ZW50IHNpZ25hbGluZyB0aGF0IGEgZmlsZSBpcyBsb2FkZWRcbiAgICB9LCAwKTtcbiAgfTtcblxuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn07XG5maWxlVXRpbGl0aWVzLmxvYWRTQkdOTUxUZXh0ID0gZnVuY3Rpb24odGV4dERhdGEpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB1cGRhdGVHcmFwaChzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dERhdGEpKSk7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICB9LCAwKTtcblxufTtcblxuZmlsZVV0aWxpdGllcy5zYXZlQXNTYmdubWwgPSBmdW5jdGlvbihmaWxlbmFtZSwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcykge1xuICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoZmlsZW5hbWUsIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMpO1xuICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzYmdubWxUZXh0XSwge1xuICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICB9KTtcbiAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbn07XG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUZXh0VG9Kc29uID0gZnVuY3Rpb24oc2Jnbm1sVGV4dCl7XG4gICAgcmV0dXJuIHNiZ25tbFRvSnNvbi5jb252ZXJ0KHRleHRUb1htbE9iamVjdChzYmdubWxUZXh0KSk7XG59O1xuXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb24gPSBmdW5jdGlvbihqc29uKXtcbiAgICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoKTtcbiAgICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHNiZ25tbFRleHQpKTtcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWxlVXRpbGl0aWVzO1xuIiwiLypcbiAqIENvbW1vbiB1dGlsaXRpZXMgZm9yIHNiZ252aXogZ3JhcGhzXG4gKi9cblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xudmFyIGxpYnMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG5mdW5jdGlvbiBncmFwaFV0aWxpdGllcygpIHt9XG5cbi8vIFRPRE8gbWFrZSB0aGVzZSBpbml0aWFsIHZhbHVlcyB1c2VyIG9wdGlvbnMgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZW0gaGVyZVxuZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID0gdHJ1ZTtcbmdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkID0gZmFsc2U7XG5cbmdyYXBoVXRpbGl0aWVzLmRpc2FibGVQb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5wb3J0c0VuYWJsZWQgPSBmYWxzZTtcbiAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmVuYWJsZVBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCA9IHRydWU7XG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG5ncmFwaFV0aWxpdGllcy5hcmVQb3J0c0VuYWJsZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZDtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmNvbnNpZGVyQ29tcG91bmRTaXplcyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5jb21wb3VuZFNpemVzQ29uc2lkZXJlZCA9IHRydWU7XG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG5ncmFwaFV0aWxpdGllcy5vbWl0Q29tcG91bmRTaXplcyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5jb21wb3VuZFNpemVzQ29uc2lkZXJlZCA9IGZhbHNlO1xuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xufTtcblxuZ3JhcGhVdGlsaXRpZXMuYXJlQ29tcG91bmRTaXplc0NvbnNpZGVyZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkID0gdHJ1ZTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLnVwZGF0ZUdyYXBoID0gZnVuY3Rpb24oY3lHcmFwaCkge1xuICBjb25zb2xlLmxvZygnY3kgdXBkYXRlIGNhbGxlZCcpO1xuICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwidXBkYXRlR3JhcGhTdGFydFwiICk7XG4gIC8vIFJlc2V0IHVuZG8vcmVkbyBzdGFjayBhbmQgYnV0dG9ucyB3aGVuIGEgbmV3IGdyYXBoIGlzIGxvYWRlZFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkucmVzZXQoKTtcbi8vICAgIHRoaXMucmVzZXRVbmRvUmVkb0J1dHRvbnMoKTtcbiAgfVxuXG4gIGN5LnN0YXJ0QmF0Y2goKTtcbiAgLy8gY2xlYXIgZGF0YVxuICBjeS5yZW1vdmUoJyonKTtcbiAgY3kuYWRkKGN5R3JhcGgpO1xuXG4gIC8vYWRkIHBvc2l0aW9uIGluZm9ybWF0aW9uIHRvIGRhdGEgZm9yIHByZXNldCBsYXlvdXRcbiAgdmFyIHBvc2l0aW9uTWFwID0ge307XG4gIGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHhQb3MgPSBub2RlLmRhdGEoJ2Jib3gnKS54O1xuICAgIHZhciB5UG9zID0gbm9kZS5kYXRhKCdiYm94JykueTtcbiAgICBwb3NpdGlvbk1hcFtub2RlLmRhdGEoJ2lkJyldID0geyd4JzogeFBvcywgJ3knOiB5UG9zfTtcblxuICAgIC8vIGFzc2lnbiBjb3JyZWN0IHBhcmVudHMgdG8gaW5mbyBib3hlc1xuICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKTtcbiAgICBmb3IgKHZhciBqPTA7IGogPCBzdGF0ZXNhbmRpbmZvcy5sZW5ndGg7IGorKykge1xuICAgICAgc3RhdGVzYW5kaW5mb3Nbal0ucGFyZW50ID0gbm9kZTtcbiAgICB9XG4gIH0pO1xuXG5cbiAgdGhpcy5yZWZyZXNoUGFkZGluZ3MoKTsgLy8gUmVjYWxjdWxhdGVzL3JlZnJlc2hlcyB0aGUgY29tcG91bmQgcGFkZGluZ3NcbiAgY3kuZW5kQmF0Y2goKTtcbiAgXG4gIHZhciBsYXlvdXQgPSBjeS5sYXlvdXQoe1xuICAgIG5hbWU6ICdwcmVzZXQnLFxuICAgIHBvc2l0aW9uczogcG9zaXRpb25NYXAsXG4gICAgZml0OiB0cnVlLFxuICAgIHBhZGRpbmc6IDUwXG4gIH0pO1xuICBcbiAgLy8gQ2hlY2sgdGhpcyBmb3IgY3l0b3NjYXBlLmpzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgaWYgKGxheW91dCAmJiBsYXlvdXQucnVuKSB7XG4gICAgbGF5b3V0LnJ1bigpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBzdHlsZVxuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xuICAvLyBJbml0aWxpemUgdGhlIGJlbmQgcG9pbnRzIG9uY2UgdGhlIGVsZW1lbnRzIGFyZSBjcmVhdGVkXG4gIGlmIChjeS5lZGdlQmVuZEVkaXRpbmcgJiYgY3kuZWRnZUJlbmRFZGl0aW5nKCdpbml0aWFsaXplZCcpKSB7XG4gICAgY3kuZWRnZUJlbmRFZGl0aW5nKCdnZXQnKS5pbml0QmVuZFBvaW50cyhjeS5lZGdlcygpKTtcbiAgfVxuICBcbiAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInVwZGF0ZUdyYXBoRW5kXCIgKTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZVBhZGRpbmdzID0gZnVuY3Rpb24ocGFkZGluZ1BlcmNlbnQpIHtcbiAgLy9BcyBkZWZhdWx0IHVzZSB0aGUgY29tcG91bmQgcGFkZGluZyB2YWx1ZVxuICBpZiAoIXBhZGRpbmdQZXJjZW50KSB7XG4gICAgdmFyIGNvbXBvdW5kUGFkZGluZyA9IG9wdGlvbnMuY29tcG91bmRQYWRkaW5nO1xuICAgIHBhZGRpbmdQZXJjZW50ID0gdHlwZW9mIGNvbXBvdW5kUGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IGNvbXBvdW5kUGFkZGluZy5jYWxsKCkgOiBjb21wb3VuZFBhZGRpbmc7XG4gIH1cblxuICB2YXIgbm9kZXMgPSBjeS5ub2RlcygpO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbnVtT2ZTaW1wbGVzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aGVOb2RlID0gbm9kZXNbaV07XG4gICAgaWYgKHRoZU5vZGUuY2hpbGRyZW4oKSA9PSBudWxsIHx8IHRoZU5vZGUuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdG90YWwgKz0gTnVtYmVyKHRoZU5vZGUud2lkdGgoKSk7XG4gICAgICB0b3RhbCArPSBOdW1iZXIodGhlTm9kZS5oZWlnaHQoKSk7XG4gICAgICBudW1PZlNpbXBsZXMrKztcbiAgICB9XG4gIH1cblxuICB2YXIgY2FsY19wYWRkaW5nID0gKHBhZGRpbmdQZXJjZW50IC8gMTAwKSAqIE1hdGguZmxvb3IodG90YWwgLyAoMiAqIG51bU9mU2ltcGxlcykpO1xuICBpZiAoY2FsY19wYWRkaW5nIDwgNSkge1xuICAgIGNhbGNfcGFkZGluZyA9IDU7XG4gIH1cblxuICByZXR1cm4gY2FsY19wYWRkaW5nO1xufTtcblxuZ3JhcGhVdGlsaXRpZXMucmVjYWxjdWxhdGVQYWRkaW5ncyA9IGdyYXBoVXRpbGl0aWVzLnJlZnJlc2hQYWRkaW5ncyA9IGZ1bmN0aW9uKCkge1xuICAvLyB0aGlzLmNhbGN1bGF0ZWRQYWRkaW5ncyBpcyBub3Qgd29ya2luZyBoZXJlIFxuICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgcmVmZXJlbmNlIHdpdGggdGhpcy5jYWxjdWxhdGVkUGFkZGluZ3Mgb25jZSB0aGUgcmVhc29uIGlzIGZpZ3VyZWQgb3V0XG4gIGdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZWRQYWRkaW5ncyA9IHRoaXMuY2FsY3VsYXRlUGFkZGluZ3MoKTtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZWRQYWRkaW5ncztcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MgPSBmdW5jdGlvbigpIHtcbiAgLy8gUmV0dXJuIGNhbGN1bGF0ZWQgcGFkZGluZ3MgaW4gY2FzZSBvZiB0aGF0IGRhdGEgaXMgaW52YWxpZCByZXR1cm4gNVxuICByZXR1cm4gZ3JhcGhVdGlsaXRpZXMuY2FsY3VsYXRlZFBhZGRpbmdzIHx8IDU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdyYXBoVXRpbGl0aWVzOyIsInZhciB0eHRVdGlsID0gcmVxdWlyZSgnLi90ZXh0LXV0aWxpdGllcycpO1xudmFyIGVsZW1lbnRVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2VsZW1lbnQtdXRpbGl0aWVzJyk7XG52YXIgbGlic2JnbmpzID0gcmVxdWlyZSgnbGlic2Jnbi5qcycpO1xudmFyIHJlbmRlckV4dGVuc2lvbiA9IGxpYnNiZ25qcy5yZW5kZXI7XG52YXIgYW5ub3QgPSBsaWJzYmduanMuYW5ub3Q7XG52YXIgcGtnVmVyc2lvbiA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247IC8vIG5lZWQgaW5mbyBhYm91dCBzYmdudml6IHRvIHB1dCBpbiB4bWxcbnZhciBwa2dOYW1lID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykubmFtZTtcbnZhciBwcmV0dHlwcmludCA9IHJlcXVpcmUoJ3ByZXR0eS1kYXRhJykucGQ7XG52YXIgZ3JhcGhVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpO1xudmFyIG1hcFByb3BlcnRpZXNCdWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtyb290TmFtZTogXCJtYXBQcm9wZXJ0aWVzXCJ9KTtcblxudmFyIGpzb25Ub1NiZ25tbCA9IHtcbiAgICAvKlxuICAgICAgICB0YWtlcyByZW5kZXJJbmZvIGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LiBJdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBzYXZlXG4gICAgICAgIHRoZSBzdHlsZSBhbmQgY29sb3JzIHRvIHRoZSByZW5kZXIgZXh0ZW5zaW9uLiBTZWUgbmV3dC9hcHAtdXRpbGl0aWVzIGdldEFsbFN0eWxlcygpXG4gICAgICAgIFN0cnVjdHVyZToge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogdGhlIG1hcCBiYWNrZ3JvdW5kIGNvbG9yLFxuICAgICAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgICAgIHZhbGlkWG1sVmFsdWU6IGNvbG9yX2lkXG4gICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgIHN0eWxlS2V5MToge1xuICAgICAgICAgICAgICAgICAgICBpZExpc3Q6IGxpc3Qgb2YgdGhlIG5vZGVzIGlkcyB0aGF0IGhhdmUgdGhpcyBzdHlsZVxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlS2V5MjogLi4uXG4gICAgICAgICAgICAgICAgLi4uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAqL1xuICAgIGNyZWF0ZVNiZ25tbCA6IGZ1bmN0aW9uKGZpbGVuYW1lLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgbWFwSUQgPSB0eHRVdGlsLmdldFhNTFZhbGlkSWQoZmlsZW5hbWUpO1xuICAgICAgICB2YXIgaGFzRXh0ZW5zaW9uID0gZmFsc2U7XG4gICAgICAgIHZhciBoYXNSZW5kZXJFeHRlbnNpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiByZW5kZXJJbmZvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaGFzRXh0ZW5zaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGhhc1JlbmRlckV4dGVuc2lvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWFwTGFuZ3VhZ2U7XG4gICAgICAgIGlmKGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSA9PSBcIlBEXCIpIHtcbiAgICAgICAgICAgIG1hcExhbmd1YWdlID0gXCJwcm9jZXNzIGRlc2NyaXB0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGUgPT0gXCJBRlwiKSB7XG4gICAgICAgICAgICBtYXBMYW5ndWFnZSA9IFwiYWN0aXZpdHkgZmxvd1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2FzZSBvZiBhIG1peGVkIG1hcCB3aXRoIGJpdHMgb2YgQUYgYW5kIFBEIGZvciBleGFtcGxlXG4gICAgICAgICAgICBtYXBMYW5ndWFnZSA9IFwidW5rbm93blwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgaGVhZGVyc1xuICAgICAgICB4bWxIZWFkZXIgPSBcIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSd5ZXMnPz5cXG5cIjtcbiAgICAgICAgdmFyIHNiZ24gPSBuZXcgbGlic2JnbmpzLlNiZ24oe3htbG5zOiAnaHR0cDovL3NiZ24ub3JnL2xpYnNiZ24vMC4zJ30pO1xuICAgICAgICB2YXIgbWFwID0gbmV3IGxpYnNiZ25qcy5NYXAoe2xhbmd1YWdlOiBtYXBMYW5ndWFnZSwgaWQ6IG1hcElEfSk7XG4gICAgICAgIGlmIChoYXNFeHRlbnNpb24pIHsgLy8gZXh0ZW5zaW9uIGlzIHRoZXJlXG4gICAgICAgICAgICB2YXIgZXh0ZW5zaW9uID0gbmV3IGxpYnNiZ25qcy5FeHRlbnNpb24oKTtcbiAgICAgICAgICAgIGlmIChoYXNSZW5kZXJFeHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkKHNlbGYuZ2V0UmVuZGVyRXh0ZW5zaW9uU2Jnbm1sKHJlbmRlckluZm8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcC5zZXRFeHRlbnNpb24oZXh0ZW5zaW9uKTtcbiAgICAgICAgICAgIGlmIChtYXBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHhtbCA9IG1hcFByb3BlcnRpZXNCdWlsZGVyLmJ1aWxkT2JqZWN0KG1hcFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIG1hcC5leHRlbnNpb24uYWRkKHhtbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChtYXBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBtYXAuc2V0RXh0ZW5zaW9uKG5ldyBsaWJzYmduanMuRXh0ZW5zaW9uKCkpO1xuICAgICAgICAgICAgbWFwLmV4dGVuc2lvbi5hZGQobWFwUHJvcGVydGllc0J1aWxkZXIuYnVpbGRPYmplY3QobWFwUHJvcGVydGllcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IGFsbCBnbHlwaHNcbiAgICAgICAgdmFyIGdseXBoTGlzdCA9IFtdO1xuICAgICAgICAvLyBiZSBjYXJlZnVsZSB0aGF0IDp2aXNpYmxlIGlzIGFsc28gdXNlZCBkdXJpbmcgcmVjdXJzaXZlIHNlYXJjaCBvZiBub2Rlc1xuICAgICAgICAvLyBpbiB0aGUgZ2V0R2x5cGhTYmdubWwgZnVuY3Rpb24uIElmIG5vdCBzZXQgYWNjb3JkaW5nbHksIGRpc2NyZXBhbmNpZXMgd2lsbCBvY2N1ci5cbiAgICAgICAgY3kubm9kZXMoXCI6dmlzaWJsZVwiKS5lYWNoKGZ1bmN0aW9uKGVsZSwgaSl7XG4gICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZighZWxlLmlzQ2hpbGQoKSlcbiAgICAgICAgICAgICAgICBnbHlwaExpc3QgPSBnbHlwaExpc3QuY29uY2F0KHNlbGYuZ2V0R2x5cGhTYmdubWwoZWxlKSk7IC8vIHJldHVybnMgcG90ZW50aWFsbHkgbW9yZSB0aGFuIDEgZ2x5cGhcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSBtYXBcbiAgICAgICAgZm9yKHZhciBpPTA7IGk8Z2x5cGhMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtYXAuYWRkR2x5cGgoZ2x5cGhMaXN0W2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCBhbGwgYXJjc1xuICAgICAgICBjeS5lZGdlcyhcIjp2aXNpYmxlXCIpLmVhY2goZnVuY3Rpb24oZWxlLCBpKXtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgZWxlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcC5hZGRBcmMoc2VsZi5nZXRBcmNTYmdubWwoZWxlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNiZ24uYWRkTWFwKG1hcCk7XG4gICAgICAgIHJldHVybiBwcmV0dHlwcmludC54bWwoeG1sSGVhZGVyICsgc2Jnbi50b1hNTCgpKTtcbiAgICB9LFxuXG4gICAgLy8gc2VlIGNyZWF0ZVNiZ25tbCBmb3IgaW5mbyBvbiB0aGUgc3RydWN0dXJlIG9mIHJlbmRlckluZm9cbiAgICBnZXRSZW5kZXJFeHRlbnNpb25TYmdubWwgOiBmdW5jdGlvbihyZW5kZXJJbmZvKSB7XG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIG1haW4gY29udGFpbmVyXG4gICAgICAgIHZhciByZW5kZXJJbmZvcm1hdGlvbiA9IG5ldyByZW5kZXJFeHRlbnNpb24uUmVuZGVySW5mb3JtYXRpb24oeyBpZDogJ3JlbmRlckluZm9ybWF0aW9uJywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHJlbmRlckluZm8uYmFja2dyb3VuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1OYW1lOiBwa2dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbVZlcnNpb246IHBrZ1ZlcnNpb24gfSk7XG5cbiAgICAgICAgLy8gcG9wdWxhdGUgbGlzdCBvZiBjb2xvcnNcbiAgICAgICAgdmFyIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnMgPSBuZXcgcmVuZGVyRXh0ZW5zaW9uLkxpc3RPZkNvbG9yRGVmaW5pdGlvbnMoKTtcbiAgICAgICAgZm9yICh2YXIgY29sb3IgaW4gcmVuZGVySW5mby5jb2xvcnMpIHtcbiAgICAgICAgICAgIHZhciBjb2xvckRlZmluaXRpb24gPSBuZXcgcmVuZGVyRXh0ZW5zaW9uLkNvbG9yRGVmaW5pdGlvbih7aWQ6IHJlbmRlckluZm8uY29sb3JzW2NvbG9yXSwgdmFsdWU6IGNvbG9yfSk7XG4gICAgICAgICAgICBsaXN0T2ZDb2xvckRlZmluaXRpb25zLmFkZENvbG9yRGVmaW5pdGlvbihjb2xvckRlZmluaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckluZm9ybWF0aW9uLnNldExpc3RPZkNvbG9yRGVmaW5pdGlvbnMobGlzdE9mQ29sb3JEZWZpbml0aW9ucyk7XG5cbiAgICAgICAgLy8gcG9wdWxhdGVzIHN0eWxlc1xuICAgICAgICB2YXIgbGlzdE9mU3R5bGVzID0gbmV3IHJlbmRlckV4dGVuc2lvbi5MaXN0T2ZTdHlsZXMoKTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHJlbmRlckluZm8uc3R5bGVzKSB7XG4gICAgICAgICAgICB2YXIgc3R5bGUgPSByZW5kZXJJbmZvLnN0eWxlc1trZXldO1xuICAgICAgICAgICAgdmFyIHhtbFN0eWxlID0gbmV3IHJlbmRlckV4dGVuc2lvbi5TdHlsZSh7aWQ6IHR4dFV0aWwuZ2V0WE1MVmFsaWRJZChrZXkpLCBpZExpc3Q6IHN0eWxlLmlkTGlzdC5qb2luKCcgJyl9KTtcbiAgICAgICAgICAgIHZhciBnID0gbmV3IHJlbmRlckV4dGVuc2lvbi5SZW5kZXJHcm91cCh7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLnByb3BlcnRpZXMuZm9udFNpemUsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogc3R5bGUucHJvcGVydGllcy5mb250RmFtaWx5LFxuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHN0eWxlLnByb3BlcnRpZXMuZm9udFdlaWdodCxcbiAgICAgICAgICAgICAgICBmb250U3R5bGU6IHN0eWxlLnByb3BlcnRpZXMuZm9udFN0eWxlLFxuICAgICAgICAgICAgICAgIGZpbGw6IHN0eWxlLnByb3BlcnRpZXMuZmlsbCwgLy8gZmlsbCBjb2xvclxuICAgICAgICAgICAgICAgIHN0cm9rZTogc3R5bGUucHJvcGVydGllcy5zdHJva2UsIC8vIHN0cm9rZSBjb2xvclxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBzdHlsZS5wcm9wZXJ0aWVzLnN0cm9rZVdpZHRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHhtbFN0eWxlLnNldFJlbmRlckdyb3VwKGcpO1xuICAgICAgICAgICAgbGlzdE9mU3R5bGVzLmFkZFN0eWxlKHhtbFN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXJJbmZvcm1hdGlvbi5zZXRMaXN0T2ZTdHlsZXMobGlzdE9mU3R5bGVzKTtcblxuICAgICAgICByZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG4gICAgfSxcblxuICAgIGdldEFubm90YXRpb25FeHRlbnNpb246IGZ1bmN0aW9uKGN5RWxlbWVudCkge1xuICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSBjeUVsZW1lbnQuZGF0YSgnYW5ub3RhdGlvbnMnKTtcbiAgICAgICAgdmFyIGFubm90RXh0ID0gbmV3IGFubm90LkFubm90YXRpb24oKTtcbiAgICAgICAgdmFyIHJkZkVsZW1lbnQgPSBuZXcgYW5ub3QuUmRmRWxlbWVudCgpO1xuICAgICAgICBmb3IgKHZhciBhbm5vdElEIGluIGFubm90YXRpb25zKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudEFubm90ID0gYW5ub3RhdGlvbnNbYW5ub3RJRF07XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHZhbGlkaXR5IG9mIGFubm90YXRpb25cbiAgICAgICAgICAgIGlmKGN1cnJlbnRBbm5vdC5zdGF0dXMgIT0gJ3ZhbGlkYXRlZCcgfHwgIWN1cnJlbnRBbm5vdC5zZWxlY3RlZERCIHx8ICFjdXJyZW50QW5ub3QuYW5ub3RhdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHVuY29udHJvbGxlZCB2b2NhYnVsYXJ5XG4gICAgICAgICAgICBpZihjdXJyZW50QW5ub3Quc2VsZWN0ZWRSZWxhdGlvbiA9PSBcInNpbzpTSU9fMDAwMjIzXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgICAgICAgICAgb2JqW2N1cnJlbnRBbm5vdC5zZWxlY3RlZERCXSA9IGN1cnJlbnRBbm5vdC5hbm5vdGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgcmRmRWxlbWVudC5hZGRDdXN0b21Qcm9wZXJ0eSgnIycrY3lFbGVtZW50LmRhdGEoJ2lkJykgLCBvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICAgICAgICAgIG9ialtjdXJyZW50QW5ub3Quc2VsZWN0ZWRSZWxhdGlvbl0gPSBjdXJyZW50QW5ub3QuYW5ub3RhdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIHJkZkVsZW1lbnQuYWRkUmVzb3VyY2UoJyMnK2N5RWxlbWVudC5kYXRhKCdpZCcpICwgb2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhbm5vdEV4dC5zZXRSZGZFbGVtZW50KHJkZkVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gYW5ub3RFeHQ7XG4gICAgfSxcblxuICAgIGdldEdseXBoU2Jnbm1sIDogZnVuY3Rpb24obm9kZSl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIG5vZGVDbGFzcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcztcbiAgICAgICAgdmFyIGdseXBoTGlzdCA9IFtdO1xuXG4gICAgICAgIGlmKCBub2RlQ2xhc3Muc3RhcnRzV2l0aCgnQkEnKSkge1xuICAgICAgICAgICAgbm9kZUNsYXNzID0gXCJiaW9sb2dpY2FsIGFjdGl2aXR5XCI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ2x5cGggPSBuZXcgbGlic2JnbmpzLkdseXBoKHtpZDogbm9kZS5fcHJpdmF0ZS5kYXRhLmlkLCBjbGFzc186IG5vZGVDbGFzc30pO1xuXG4gICAgICAgIC8vIGFzc2lnbiBjb21wYXJ0bWVudFJlZlxuICAgICAgICBpZihub2RlLnBhcmVudCgpLmlzUGFyZW50KCkpe1xuICAgICAgICAgICAgaWYobm9kZUNsYXNzID09PSBcImNvbXBhcnRtZW50XCIpe1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIGdseXBoLmNvbXBhcnRtZW50UmVmID0gbm9kZS5fcHJpdmF0ZS5kYXRhLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudCgpWzBdO1xuICAgICAgICAgICAgICAgIGlmKHBhcmVudC5fcHJpdmF0ZS5kYXRhLmNsYXNzID09IFwiY29tcGFydG1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGguY29tcGFydG1lbnRSZWYgPSBwYXJlbnQuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1pc2MgaW5mb3JtYXRpb25cbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgICBpZih0eXBlb2YgbGFiZWwgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICBnbHlwaC5zZXRMYWJlbChuZXcgbGlic2JnbmpzLkxhYmVsKHt0ZXh0OiBsYWJlbH0pKTtcbiAgICAgICAgLy9hZGQgY2xvbmUgaW5mb3JtYXRpb25cbiAgICAgICAgaWYodHlwZW9mIG5vZGUuX3ByaXZhdGUuZGF0YS5jbG9uZW1hcmtlciAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIGdseXBoLnNldENsb25lKG5ldyBsaWJzYmduanMuQ2xvbmVUeXBlKCkpO1xuICAgICAgICAvL2FkZCBiYm94IGluZm9ybWF0aW9uXG4gICAgICAgIGdseXBoLnNldEJib3godGhpcy5hZGRHbHlwaEJib3gobm9kZSkpO1xuICAgICAgICAvL2FkZCBwb3J0IGluZm9ybWF0aW9uXG4gICAgICAgIHZhciBwb3J0cyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5wb3J0cztcbiAgICAgICAgZm9yKHZhciBpID0gMCA7IGkgPCBwb3J0cy5sZW5ndGggOyBpKyspe1xuICAgICAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gcG9ydHNbaV0ueCA9PT0gMCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByYXRpbyBvZiB0aGUgYXJlYSBvY2N1cGllZCBmb3IgcG9ydHMgb3ZlciB0aGUgd2hvbGUgc2hhcGVcbiAgICAgICAgICAgIHZhciByYXRpbyA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gTWF0aC5hYnMocG9ydHNbaV0ueSkgLyA1MCA6IE1hdGguYWJzKHBvcnRzW2ldLngpIC8gNTA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERpdmlkZSB0aGUgbm9kZSBzaXplcyBieSB0aGUgcmF0aW8gYmVjYXVzZSB0aGF0IHNpemVzIGluY2x1ZGVzIHBvcnRzIGFzIHdlbGxcbiAgICAgICAgICAgIHZhciB4ID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54ICsgcG9ydHNbaV0ueCAqICggbm9kZS53aWR0aCgpIC8gcmF0aW8gKSAvIDEwMDtcbiAgICAgICAgICAgIHZhciB5ID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55ICsgcG9ydHNbaV0ueSAqICggbm9kZS5oZWlnaHQoKSAvIHJhdGlvICkgLyAxMDA7XG5cbiAgICAgICAgICAgIGdseXBoLmFkZFBvcnQobmV3IGxpYnNiZ25qcy5Qb3J0KHtpZDogcG9ydHNbaV0uaWQsIHg6IHgsIHk6IHl9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9hZGQgc3RhdGUgYW5kIGluZm8gYm94IGluZm9ybWF0aW9uXG4gICAgICAgIGZvcih2YXIgaSA9IDAgOyBpIDwgbm9kZS5fcHJpdmF0ZS5kYXRhLnN0YXRlc2FuZGluZm9zLmxlbmd0aCA7IGkrKyl7XG4gICAgICAgICAgICB2YXIgYm94R2x5cGggPSBub2RlLl9wcml2YXRlLmRhdGEuc3RhdGVzYW5kaW5mb3NbaV07XG4gICAgICAgICAgICB2YXIgc3RhdGVzYW5kaW5mb3NJZCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5pZCtcIl9cIitpO1xuICAgICAgICAgICAgaWYoYm94R2x5cGguY2xhenogPT09IFwic3RhdGUgdmFyaWFibGVcIil7XG4gICAgICAgICAgICAgICAgZ2x5cGguYWRkR2x5cGhNZW1iZXIodGhpcy5hZGRTdGF0ZUJveEdseXBoKGJveEdseXBoLCBzdGF0ZXNhbmRpbmZvc0lkLCBub2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKGJveEdseXBoLmNsYXp6ID09PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIil7XG4gICAgICAgICAgICAgICAgZ2x5cGguYWRkR2x5cGhNZW1iZXIodGhpcy5hZGRJbmZvQm94R2x5cGgoYm94R2x5cGgsIHN0YXRlc2FuZGluZm9zSWQsIG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgYW5ub3RhdGlvbnNcbiAgICAgICAgaWYgKG5vZGUuZGF0YSgnYW5ub3RhdGlvbnMnKSAmJiAhJC5pc0VtcHR5T2JqZWN0KG5vZGUuZGF0YSgnYW5ub3RhdGlvbnMnKSkpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBzZWxmLmdldE9yQ3JlYXRlRXh0ZW5zaW9uKGdseXBoKTtcbiAgICAgICAgICAgIHZhciBhbm5vdEV4dCA9IHNlbGYuZ2V0QW5ub3RhdGlvbkV4dGVuc2lvbihub2RlKTtcbiAgICAgICAgICAgIGV4dGVuc2lvbi5hZGQoYW5ub3RFeHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGdseXBoIG1lbWJlcnMgdGhhdCBhcmUgbm90IHN0YXRlIHZhcmlhYmxlcyBvciB1bml0IG9mIGluZm86IHN1YnVuaXRzXG4gICAgICAgIGlmKG5vZGVDbGFzcyA9PT0gXCJjb21wbGV4XCIgfHwgbm9kZUNsYXNzID09PSBcInN1Ym1hcFwiKXtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKGVsZSwgaSl7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgZWxlID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGdseXBoTWVtYmVyTGlzdCA9IHNlbGYuZ2V0R2x5cGhTYmdubWwoZWxlKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBnbHlwaE1lbWJlckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGguYWRkR2x5cGhNZW1iZXIoZ2x5cGhNZW1iZXJMaXN0W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXd0RXh0U3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhhc05ld3RFeHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBhZGQgaW5mbyBmb3IgY29sbGFwc2VkIG5vZGVzXG4gICAgICAgIGlmKG5vZGUuZGF0YSgnY29sbGFwc2VkQ2hpbGRyZW4nKSkge1xuICAgICAgICAgICAgbmV3dEV4dFN0cmluZyArPSBcIjxjb2xsYXBzZWQvPlwiO1xuICAgICAgICAgICAgaGFzTmV3dEV4dCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgaW5mbyBmb3IgaGlkZGVuIG5vZGVzXG4gICAgICAgIGlmKG5vZGUuaGlkZGVuKCkpIHtcbiAgICAgICAgICAgIG5ld3RFeHRTdHJpbmcgKz0gXCI8aGlkZGVuLz5cIjtcbiAgICAgICAgICAgIGhhc05ld3RFeHQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHN0cmluZyB0byBhIG5ldyBleHRlbnNpb24gZm9yIHRoaXMgZ2x5cGhcbiAgICAgICAgaWYoaGFzTmV3dEV4dCkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IHNlbGYuZ2V0T3JDcmVhdGVFeHRlbnNpb24oZ2x5cGgpO1xuICAgICAgICAgICAgZXh0ZW5zaW9uLmxpc3RbXCJuZXd0XCJdID0galF1ZXJ5LnBhcnNlWE1MKFwiPG5ld3Q+XCIrbmV3dEV4dFN0cmluZytcIjwvbmV3dD5cIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleHRlbnNpb24udG9YTUwoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjdXJyZW50IGdseXBoIGlzIGRvbmVcbiAgICAgICAgZ2x5cGhMaXN0LnB1c2goZ2x5cGgpO1xuXG4gICAgICAgIC8vIGtlZXAgZ29pbmcgd2l0aCBhbGwgdGhlIGluY2x1ZGVkIGdseXBoc1xuICAgICAgICBpZihub2RlQ2xhc3MgPT09IFwiY29tcGFydG1lbnRcIil7XG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuKFwiOnZpc2libGVcIikuZWFjaChmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdseXBoTGlzdCA9IGdseXBoTGlzdC5jb25jYXQoc2VsZi5nZXRHbHlwaFNiZ25tbChlbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICBnbHlwaExpc3Q7XG4gICAgfSxcblxuICAgIC8vIGVsZW1lbnQ6IGEgbGlic2Jnbi5qcyBnbHlwaCBvciBlZGdlIG9iamVjdFxuICAgIGdldE9yQ3JlYXRlRXh0ZW5zaW9uOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHZhciBleHRlbnNpb247XG4gICAgICAgIGlmKGVsZW1lbnQuZXh0ZW5zaW9uKSB7IC8vIGFuIGV4dGVuc2lvbiBpcyBhbHJlYWR5IHRoZXJlIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IGVsZW1lbnQuZXh0ZW5zaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXh0ZW5zaW9uID0gbmV3IGxpYnNiZ25qcy5FeHRlbnNpb24oKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjtcbiAgICB9LFxuXG4gICAgZ2V0QXJjU2Jnbm1sIDogZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgLy9UZW1wb3JhcnkgaGFjayB0byByZXNvbHZlIFwidW5kZWZpbmVkXCIgYXJjIHNvdXJjZSBhbmQgdGFyZ2V0c1xuICAgICAgICB2YXIgYXJjVGFyZ2V0ID0gZWRnZS5fcHJpdmF0ZS5kYXRhLnBvcnR0YXJnZXQ7XG4gICAgICAgIHZhciBhcmNTb3VyY2UgPSBlZGdlLl9wcml2YXRlLmRhdGEucG9ydHNvdXJjZTtcblxuICAgICAgICBpZiAoYXJjU291cmNlID09IG51bGwgfHwgYXJjU291cmNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIGFyY1NvdXJjZSA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgaWYgKGFyY1RhcmdldCA9PSBudWxsIHx8IGFyY1RhcmdldC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICBhcmNUYXJnZXQgPSBlZGdlLl9wcml2YXRlLmRhdGEudGFyZ2V0O1xuXG4gICAgICAgIHZhciBhcmNJZCA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGFyYyA9IG5ldyBsaWJzYmduanMuQXJjKHtpZDogYXJjSWQsIHNvdXJjZTogYXJjU291cmNlLCB0YXJnZXQ6IGFyY1RhcmdldCwgY2xhc3NfOiBlZGdlLl9wcml2YXRlLmRhdGEuY2xhc3N9KTtcblxuICAgICAgICBhcmMuc2V0U3RhcnQobmV3IGxpYnNiZ25qcy5TdGFydFR5cGUoe3g6IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2guc3RhcnRYLCB5OiBlZGdlLl9wcml2YXRlLnJzY3JhdGNoLnN0YXJ0WX0pKTtcblxuICAgICAgICAvLyBFeHBvcnQgYmVuZCBwb2ludHMgaWYgZWRnZUJlbmRFZGl0aW5nRXh0ZW5zaW9uIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgaWYgKGN5LmVkZ2VCZW5kRWRpdGluZyAmJiBjeS5lZGdlQmVuZEVkaXRpbmcoJ2luaXRpYWxpemVkJykpIHtcbiAgICAgICAgICB2YXIgc2VncHRzID0gY3kuZWRnZUJlbmRFZGl0aW5nKCdnZXQnKS5nZXRTZWdtZW50UG9pbnRzKGVkZ2UpO1xuICAgICAgICAgIGlmKHNlZ3B0cyl7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBzZWdwdHMgJiYgaSA8IHNlZ3B0cy5sZW5ndGg7IGkgPSBpICsgMil7XG4gICAgICAgICAgICAgIHZhciBiZW5kWCA9IHNlZ3B0c1tpXTtcbiAgICAgICAgICAgICAgdmFyIGJlbmRZID0gc2VncHRzW2kgKyAxXTtcblxuICAgICAgICAgICAgICBhcmMuYWRkTmV4dChuZXcgbGlic2JnbmpzLk5leHRUeXBlKHt4OiBiZW5kWCwgeTogYmVuZFl9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXJjLnNldEVuZChuZXcgbGlic2JnbmpzLkVuZFR5cGUoe3g6IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2guZW5kWCwgeTogZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lbmRZfSkpO1xuXG4gICAgICAgIHZhciBjYXJkaW5hbGl0eSA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5jYXJkaW5hbGl0eTtcbiAgICAgICAgaWYodHlwZW9mIGNhcmRpbmFsaXR5ICE9ICd1bmRlZmluZWQnICYmIGNhcmRpbmFsaXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFyYy5hZGRHbHlwaChuZXcgbGlic2JnbmpzLkdseXBoKHtcbiAgICAgICAgICAgICAgICBpZDogYXJjLmlkKydfY2FyZCcsXG4gICAgICAgICAgICAgICAgY2xhc3NfOiAnY2FyZGluYWxpdHknLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgbGlic2JnbmpzLkxhYmVsKHt0ZXh0OiBjYXJkaW5hbGl0eX0pLFxuICAgICAgICAgICAgICAgIGJib3g6IG5ldyBsaWJzYmduanMuQmJveCh7eDogMCwgeTogMCwgdzogMCwgaDogMH0pIC8vIGR1bW15IGJib3gsIG5lZWRlZCBmb3IgZm9ybWF0IGNvbXBsaWFuY2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgYW5ub3RhdGlvbnNcbiAgICAgICAgaWYgKGVkZ2UuZGF0YSgnYW5ub3RhdGlvbnMnKSAmJiAhJC5pc0VtcHR5T2JqZWN0KGVkZ2UuZGF0YSgnYW5ub3RhdGlvbnMnKSkpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBzZWxmLmdldE9yQ3JlYXRlRXh0ZW5zaW9uKGFyYyk7XG4gICAgICAgICAgICB2YXIgYW5ub3RFeHQgPSB0aGlzLmdldEFubm90YXRpb25FeHRlbnNpb24oZWRnZSk7XG4gICAgICAgICAgICBleHRlbnNpb24uYWRkKGFubm90RXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBpbmZvIGZvciBoaWRkZW4gZWRnZXNcbiAgICAgICAgaWYoZWRnZS5oaWRkZW4oKSkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IHNlbGYuZ2V0T3JDcmVhdGVFeHRlbnNpb24oYXJjKTtcbiAgICAgICAgICAgIGV4dGVuc2lvbi5saXN0W1wibmV3dFwiXSA9IGpRdWVyeS5wYXJzZVhNTChcIjxuZXd0PjxoaWRkZW4vPjwvbmV3dD5cIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleHRlbnNpb24udG9YTUwoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBhZGRHbHlwaEJib3ggOiBmdW5jdGlvbihub2RlKXtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBfY2xhc3MgPSBub2RlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGUgbm9kZSBjYW4gaGF2ZSBwb3J0cyBhbmQgaXQgaGFzIGV4YWN0bHkgMiBwb3J0cyB0aGVuIGl0IGlzIHJlcHJlc2VudGVkIGJ5IGEgYmlnZ2VyIGJib3guXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSByZXByZXNlbnQgaXQgYXMgYSBwb2x5Z29uIGFuZCBzbyB0aGUgd2hvbGUgc2hhcGUgaW5jbHVkaW5nIHRoZSBwb3J0cyBhcmUgcmVuZGVyZWQgaW4gdGhlIG5vZGUgYmJveC5cbiAgICAgICAgaWYgKGVsZW1lbnRVdGlsaXRpZXMuY2FuSGF2ZVBvcnRzKF9jbGFzcykpIHtcbiAgICAgICAgICBpZiAobm9kZS5kYXRhKCdwb3J0cycpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHBvcnRzIGFyZSBzeW1tZXRyaWMgdG8gdGhlIG5vZGUgY2VudGVyIHNvIHVzaW5nIGp1c3Qgb25lIG9mIHRoZSBwb3J0cyBpcyBlbm91Z2hcbiAgICAgICAgICAgIHZhciBwb3J0ID0gbm9kZS5kYXRhKCdwb3J0cycpWzBdO1xuICAgICAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gcG9ydC54ID09PSAwID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJhdGlvIG9mIHRoZSBhcmVhIG9jY3VwaWVkIHdpdGggcG9ydHMgb3ZlciB3aXRob3V0IHBvcnRzXG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IE1hdGguYWJzKHBvcnQueSkgLyA1MCA6IE1hdGguYWJzKHBvcnQueCkgLyA1MDtcbiAgICAgICAgICAgIC8vIERpdmlkZSB0aGUgYmJveCB0byB0aGUgY2FsY3VsYXRlZCByYXRpbyB0byBnZXQgdGhlIGJib3ggb2YgdGhlIGFjdHVhbCBzaGFwZSBkaXNjbHVkaW5nIHRoZSBwb3J0c1xuICAgICAgICAgICAgd2lkdGggLz0gcmF0aW87XG4gICAgICAgICAgICBoZWlnaHQgLz0gcmF0aW87XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgeCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueCAtIHdpZHRoLzI7XG4gICAgICAgIHZhciB5ID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55IC0gaGVpZ2h0LzI7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3IGxpYnNiZ25qcy5CYm94KHt4OiB4LCB5OiB5LCB3OiB3aWR0aCwgaDogaGVpZ2h0fSk7XG4gICAgfSxcblxuICAgIGFkZFN0YXRlQW5kSW5mb0Jib3ggOiBmdW5jdGlvbihub2RlLCBib3hHbHlwaCl7XG4gICAgICAgIGJveEJib3ggPSBib3hHbHlwaC5iYm94O1xuXG4gICAgICAgIHZhciB4ID0gYm94QmJveC54IC8gMTAwICogbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgeSA9IGJveEJib3gueSAvIDEwMCAqIG5vZGUuaGVpZ2h0KCk7XG5cbiAgICAgICAgeCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueCArICh4IC0gYm94QmJveC53LzIpO1xuICAgICAgICB5ID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55ICsgKHkgLSBib3hCYm94LmgvMik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBsaWJzYmduanMuQmJveCh7eDogeCwgeTogeSwgdzogYm94QmJveC53LCBoOiBib3hCYm94Lmh9KTtcbiAgICB9LFxuXG4gICAgYWRkU3RhdGVCb3hHbHlwaCA6IGZ1bmN0aW9uKG5vZGUsIGlkLCBtYWluR2x5cGgpe1xuXG4gICAgICAgIHZhciBnbHlwaCA9IG5ldyBsaWJzYmduanMuR2x5cGgoe2lkOiBpZCwgY2xhc3NfOiAnc3RhdGUgdmFyaWFibGUnfSk7XG4gICAgICAgIHZhciBzdGF0ZSA9IG5ldyBsaWJzYmduanMuU3RhdGVUeXBlKCk7XG4gICAgICAgIGlmKHR5cGVvZiBub2RlLnN0YXRlLnZhbHVlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgc3RhdGUudmFsdWUgPSBub2RlLnN0YXRlLnZhbHVlO1xuICAgICAgICBpZih0eXBlb2Ygbm9kZS5zdGF0ZS52YXJpYWJsZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHN0YXRlLnZhcmlhYmxlID0gbm9kZS5zdGF0ZS52YXJpYWJsZTtcbiAgICAgICAgZ2x5cGguc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICBnbHlwaC5zZXRCYm94KHRoaXMuYWRkU3RhdGVBbmRJbmZvQmJveChtYWluR2x5cGgsIG5vZGUpKTtcblxuICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfSxcblxuICAgIGFkZEluZm9Cb3hHbHlwaCA6IGZ1bmN0aW9uKG5vZGUsIGlkLCBtYWluR2x5cGgpe1xuICAgICAgICB2YXIgZ2x5cGggPSBuZXcgbGlic2JnbmpzLkdseXBoKHtpZDogaWQsIGNsYXNzXzogJ3VuaXQgb2YgaW5mb3JtYXRpb24nfSk7XG4gICAgICAgIHZhciBsYWJlbCA9IG5ldyBsaWJzYmduanMuTGFiZWwoKTtcbiAgICAgICAgaWYodHlwZW9mIG5vZGUubGFiZWwudGV4dCAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIGxhYmVsLnRleHQgPSBub2RlLmxhYmVsLnRleHQ7XG4gICAgICAgIGdseXBoLnNldExhYmVsKGxhYmVsKTtcbiAgICAgICAgZ2x5cGguc2V0QmJveCh0aGlzLmFkZFN0YXRlQW5kSW5mb0Jib3gobWFpbkdseXBoLCBub2RlKSk7XG5cbiAgICAgICAgLy8gYXNzaWduIGNvcnJlY3QgZW50aXR5IHRhZyBmb3IgQUYgY2FzZVxuICAgICAgICB2YXIgZW50aXR5TmFtZSA9IG51bGw7XG4gICAgICAgIHN3aXRjaChtYWluR2x5cGguX3ByaXZhdGUuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgY2FzZSAnQkEgdW5zcGVjaWZpZWQgZW50aXR5JzogICBlbnRpdHlOYW1lID0gXCJ1bnNwZWNpZmllZCBlbnRpdHlcIjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQSBzaW1wbGUgY2hlbWljYWwnOiAgICAgIGVudGl0eU5hbWUgPSBcInNpbXBsZSBjaGVtaWNhbFwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBIG1hY3JvbW9sZWN1bGUnOiAgICAgICAgZW50aXR5TmFtZSA9IFwibWFjcm9tb2xlY3VsZVwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBIG51Y2xlaWMgYWNpZCBmZWF0dXJlJzogZW50aXR5TmFtZSA9IFwibnVjbGVpYyBhY2lkIGZlYXR1cmVcIjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQSBwZXJ0dXJiaW5nIGFnZW50JzogICAgIGVudGl0eU5hbWUgPSBcInBlcnR1cmJhdGlvblwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBIGNvbXBsZXgnOiAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IFwiY29tcGxleFwiOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnRpdHkgdGFnIGFyZW4ndCBhbHdheXMgdGhlcmUsIG9ubHkgZm9yIEFGXG4gICAgICAgIC8vIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGtlZXAgdGhpcyBpbmZvcm1hdGlvbiBmb3IgdW5rbm93biBtYXAgdHlwZVxuICAgICAgICBpZihlbnRpdHlOYW1lKSB7XG4gICAgICAgICAgICBnbHlwaC5zZXRFbnRpdHkobmV3IGxpYnNiZ25qcy5FbnRpdHlUeXBlKHtuYW1lOiBlbnRpdHlOYW1lfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ganNvblRvU2Jnbm1sO1xuIiwiLypcbiAqIExpc3RlbiBkb2N1bWVudCBmb3Iga2V5Ym9hcmQgaW5wdXRzIGFuZCBleHBvcnRzIHRoZSB1dGlsaXRpZXMgdGhhdCBpdCBtYWtlcyB1c2Ugb2ZcbiAqL1xudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xuXG52YXIgbGlicyA9IHJlcXVpcmUoJy4vbGliLXV0aWxpdGllcycpLmdldExpYnMoKTtcbnZhciBqUXVlcnkgPSAkID0gbGlicy5qUXVlcnk7XG5cbnZhciBrZXlib2FyZElucHV0VXRpbGl0aWVzID0ge1xuICBpc051bWJlcktleTogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiAoIGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcgKSB8fCAoIGUua2V5Q29kZSA+PSA5NiAmJiBlLmtleUNvZGUgPD0gMTA1ICk7XG4gIH0sXG4gIGlzRG90S2V5OiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMTkwO1xuICB9LFxuICBpc01pbnVzU2lnbktleTogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBlLmtleUNvZGUgPT09IDEwOSB8fCBlLmtleUNvZGUgPT09IDE4OTtcbiAgfSxcbiAgaXNMZWZ0S2V5OiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMzc7XG4gIH0sXG4gIGlzUmlnaHRLZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS5rZXlDb2RlID09PSAzOTtcbiAgfSxcbiAgaXNCYWNrc3BhY2VLZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS5rZXlDb2RlID09PSA4O1xuICB9LFxuICBpc1RhYktleTogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBlLmtleUNvZGUgPT09IDk7XG4gIH0sXG4gIGlzRW50ZXJLZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS5rZXlDb2RlID09PSAxMztcbiAgfSxcbiAgaXNJbnRlZ2VyRmllbGRJbnB1dDogZnVuY3Rpb24odmFsdWUsIGUpIHtcbiAgICByZXR1cm4gdGhpcy5pc0N0cmxPckNvbW1hbmRQcmVzc2VkKGUpIHx8IHRoaXMuaXNNaW51c1NpZ25LZXkoZSkgfHwgdGhpcy5pc051bWJlcktleShlKSBcbiAgICAgICAgICAgIHx8IHRoaXMuaXNCYWNrc3BhY2VLZXkoZSkgfHwgdGhpcy5pc1RhYktleShlKSB8fCB0aGlzLmlzTGVmdEtleShlKSB8fCB0aGlzLmlzUmlnaHRLZXkoZSkgfHwgdGhpcy5pc0VudGVyS2V5KGUpO1xuICB9LFxuICBpc0Zsb2F0RmllbGRJbnB1dDogZnVuY3Rpb24odmFsdWUsIGUpIHtcbiAgICByZXR1cm4gdGhpcy5pc0ludGVnZXJGaWVsZElucHV0KHZhbHVlLCBlKSB8fCB0aGlzLmlzRG90S2V5KGUpO1xuICB9LFxuICBpc0N0cmxPckNvbW1hbmRQcmVzc2VkOiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XG4gIH1cbn07XG5cbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnLmludGVnZXItaW5wdXQnLCBmdW5jdGlvbihlKXtcbiAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLmF0dHIoJ3ZhbHVlJyk7XG4gICAgcmV0dXJuIGtleWJvYXJkSW5wdXRVdGlsaXRpZXMuaXNJbnRlZ2VyRmllbGRJbnB1dCh2YWx1ZSwgZSk7XG4gIH0pO1xuICBcbiAgJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnLmZsb2F0LWlucHV0JywgZnVuY3Rpb24oZSl7XG4gICAgdmFyIHZhbHVlID0gJCh0aGlzKS5hdHRyKCd2YWx1ZScpO1xuICAgIHJldHVybiBrZXlib2FyZElucHV0VXRpbGl0aWVzLmlzRmxvYXRGaWVsZElucHV0KHZhbHVlLCBlKTtcbiAgfSk7XG4gIFxuICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJy5pbnRlZ2VyLWlucHV0LC5mbG9hdC1pbnB1dCcsIGZ1bmN0aW9uKGUpe1xuICAgIHZhciBtaW4gICA9ICQodGhpcykuYXR0cignbWluJyk7XG4gICAgdmFyIG1heCAgID0gJCh0aGlzKS5hdHRyKCdtYXgnKTtcbiAgICB2YXIgdmFsdWUgPSBwYXJzZUZsb2F0KCQodGhpcykudmFsKCkpO1xuICAgIFxuICAgIGlmKG1pbiAhPSBudWxsKSB7XG4gICAgICBtaW4gPSBwYXJzZUZsb2F0KG1pbik7XG4gICAgfVxuICAgIFxuICAgIGlmKG1heCAhPSBudWxsKSB7XG4gICAgICBtYXggPSBwYXJzZUZsb2F0KG1heCk7XG4gICAgfVxuICAgIFxuICAgIGlmKG1pbiAhPSBudWxsICYmIHZhbHVlIDwgbWluKSB7XG4gICAgICB2YWx1ZSA9IG1pbjtcbiAgICB9XG4gICAgZWxzZSBpZihtYXggIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkge1xuICAgICAgdmFsdWUgPSBtYXg7XG4gICAgfVxuICAgIFxuICAgIGlmKGlzTmFOKHZhbHVlKSkge1xuICAgICAgaWYobWluICE9IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBtaW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmKG1heCAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gbWF4O1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgJCh0aGlzKS52YWwoXCJcIiArIHZhbHVlKTtcbiAgfSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZXlib2FyZElucHV0VXRpbGl0aWVzO1xuIiwiLyogXG4gKiBVdGlsaXR5IGZpbGUgdG8gZ2V0IGFuZCBzZXQgdGhlIGxpYnJhcmllcyB0byB3aGljaCBzYmdudml6IGlzIGRlcGVuZGVudCBmcm9tIGFueSBmaWxlLlxuICovXG5cbnZhciBsaWJVdGlsaXRpZXMgPSBmdW5jdGlvbigpe1xufTtcblxubGliVXRpbGl0aWVzLnNldExpYnMgPSBmdW5jdGlvbihsaWJzKSB7XG4gIHRoaXMubGlicyA9IGxpYnM7XG59O1xuXG5saWJVdGlsaXRpZXMuZ2V0TGlicyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5saWJzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBsaWJVdGlsaXRpZXM7XG5cbiIsIi8qIFxuICogVGhlc2UgYXJlIHRoZSBtYWluIHV0aWxpdGllcyB0byBiZSBkaXJlY3RseSB1dGlsaXplZCBieSB0aGUgdXNlciBpbnRlcmFjdGlvbnMuXG4gKiBJZGVhbHksIHRoaXMgZmlsZSBpcyBqdXN0IHJlcXVpcmVkIGJ5IGluZGV4LmpzXG4gKi9cblxudmFyIGVsZW1lbnRVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2VsZW1lbnQtdXRpbGl0aWVzJyk7XG52YXIganNvblRvU2Jnbm1sID0gcmVxdWlyZSgnLi9qc29uLXRvLXNiZ25tbC1jb252ZXJ0ZXInKTtcbnZhciBzYmdubWxUb0pzb24gPSByZXF1aXJlKCcuL3NiZ25tbC10by1qc29uLWNvbnZlcnRlcicpO1xudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9ncmFwaC11dGlsaXRpZXMnKTtcblxudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xudmFyIGxpYnMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG4vLyBIZWxwZXJzIHN0YXJ0XG5mdW5jdGlvbiBiZWZvcmVQZXJmb3JtTGF5b3V0KCkge1xuICB2YXIgcGFyZW50cyA9IGN5Lm5vZGVzKCc6cGFyZW50Jyk7XG4gIHZhciBlZGdlcyA9IGN5LmVkZ2VzKCk7XG4gIFxuICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgLy8gZ3JhcGhVdGlsaXRpZXMuZGlzYWJsZVBvcnRzKCk7XG5cbiAgLy8gVE9ETyBkbyB0aGlzIGJ5IHVzaW5nIGV4dGVuc2lvbiBBUElcbiAgY3kuJCgnLmVkZ2ViZW5kZWRpdGluZy1oYXNiZW5kcG9pbnRzJykucmVtb3ZlQ2xhc3MoJ2VkZ2ViZW5kZWRpdGluZy1oYXNiZW5kcG9pbnRzJyk7XG4gIGVkZ2VzLnNjcmF0Y2goJ2N5ZWRnZWJlbmRlZGl0aW5nV2VpZ2h0cycsIFtdKTtcbiAgZWRnZXMuc2NyYXRjaCgnY3llZGdlYmVuZGVkaXRpbmdEaXN0YW5jZXMnLCBbXSk7XG4gIFxuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbldpZHRoJyk7XG4gIHBhcmVudHMucmVtb3ZlRGF0YSgnbWluSGVpZ2h0Jyk7XG4gIHBhcmVudHMucmVtb3ZlRGF0YSgnbWluV2lkdGhCaWFzTGVmdCcpO1xuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbldpZHRoQmlhc1JpZ2h0Jyk7XG4gIHBhcmVudHMucmVtb3ZlRGF0YSgnbWluSGVpZ2h0Qmlhc1RvcCcpO1xuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbkhlaWdodEJpYXNCb3R0b20nKTtcbiAgXG4gIGN5LmVuZEJhdGNoKCk7XG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuLy8gSGVscGVycyBlbmRcblxuZnVuY3Rpb24gbWFpblV0aWxpdGllcygpIHt9XG5cbi8vIEV4cGFuZCBnaXZlbiBub2Rlcy4gUmVxdWlyZXMgZXhwYW5kQ29sbGFwc2UgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxubWFpblV0aWxpdGllcy5leHBhbmROb2RlcyA9IGZ1bmN0aW9uKG5vZGVzKSB7XG4gIC8vIEdldCBleHBhbmRDb2xsYXBzZSBhcGlcbiAgdmFyIGV4cGFuZENvbGxhcHNlID0gY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpO1xuICBcbiAgdmFyIG5vZGVzVG9FeHBhbmQgPSBleHBhbmRDb2xsYXBzZS5leHBhbmRhYmxlTm9kZXMobm9kZXMpO1xuICBpZiAobm9kZXNUb0V4cGFuZC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImV4cGFuZFwiLCB7XG4gICAgICBub2Rlczogbm9kZXNUb0V4cGFuZCxcbiAgICB9KTtcbiAgfVxuICBlbHNlIHtcbiAgICBleHBhbmRDb2xsYXBzZS5leHBhbmQobm9kZXMpO1xuICB9XG59O1xuXG4vLyBDb2xsYXBzZSBnaXZlbiBub2Rlcy4gUmVxdWlyZXMgZXhwYW5kQ29sbGFwc2UgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxubWFpblV0aWxpdGllcy5jb2xsYXBzZU5vZGVzID0gZnVuY3Rpb24obm9kZXMpIHtcbiAgLy8gR2V0IGV4cGFuZENvbGxhcHNlIGFwaVxuICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBjeS5leHBhbmRDb2xsYXBzZSgnZ2V0Jyk7XG4gIFxuICBpZiAoZXhwYW5kQ29sbGFwc2UuY29sbGFwc2libGVOb2Rlcyhub2RlcykubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiY29sbGFwc2VcIiwge1xuICAgICAgbm9kZXM6IG5vZGVzXG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZXhwYW5kQ29sbGFwc2UuY29sbGFwc2Uobm9kZXMpO1xuICB9XG59O1xuXG4vLyBDb2xsYXBzZSBhbGwgY29tcGxleGVzIHJlY3Vyc2l2ZWx5LiBSZXF1aXJlcyBleHBhbmRDb2xsYXBzZSBleHRlbnNpb24gYW5kIGNvbnNpZGVycyB1bmRvYWJsZSBvcHRpb24uXG5tYWluVXRpbGl0aWVzLmNvbGxhcHNlQ29tcGxleGVzID0gZnVuY3Rpb24oKSB7XG4gIC8vIEdldCBleHBhbmRDb2xsYXBzZSBhcGlcbiAgdmFyIGV4cGFuZENvbGxhcHNlID0gY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpO1xuICBcbiAgdmFyIGNvbXBsZXhlcyA9IGN5Lm5vZGVzKFwiW2NsYXNzXj0nY29tcGxleCddXCIpO1xuICBpZiAoZXhwYW5kQ29sbGFwc2UuY29sbGFwc2libGVOb2Rlcyhjb21wbGV4ZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIsIHtcbiAgICAgIG5vZGVzOiBjb21wbGV4ZXNcbiAgICB9KTtcbiAgfVxuICBlbHNlIHtcbiAgICBleHBhbmRDb2xsYXBzZS5jb2xsYXBzZVJlY3Vyc2l2ZWx5KGNvbXBsZXhlcyk7XG4gIH1cbn07XG5cbi8vIEV4cGFuZCBhbGwgY29tcGxleGVzIHJlY3Vyc2l2ZWx5LiBSZXF1aXJlcyBleHBhbmRDb2xsYXBzZSBleHRlbnNpb24gYW5kIGNvbnNpZGVycyB1bmRvYWJsZSBvcHRpb24uXG5tYWluVXRpbGl0aWVzLmV4cGFuZENvbXBsZXhlcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBHZXQgZXhwYW5kQ29sbGFwc2UgYXBpXG4gIHZhciBleHBhbmRDb2xsYXBzZSA9IGN5LmV4cGFuZENvbGxhcHNlKCdnZXQnKTtcbiAgXG4gIHZhciBub2RlcyA9IGV4cGFuZENvbGxhcHNlLmV4cGFuZGFibGVOb2RlcyhjeS5ub2RlcygpLmZpbHRlcihcIltjbGFzc149J2NvbXBsZXgnXVwiKSk7XG4gIGlmIChub2Rlcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiZXhwYW5kUmVjdXJzaXZlbHlcIiwge1xuICAgICAgbm9kZXM6IG5vZGVzXG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZXhwYW5kQ29sbGFwc2UuZXhwYW5kUmVjdXJzaXZlbHkobm9kZXMpO1xuICB9XG59O1xuXG4vLyBDb2xsYXBzZSBhbGwgbm9kZXMgcmVjdXJzaXZlbHkuIFJlcXVpcmVzIGV4cGFuZENvbGxhcHNlIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzIHVuZG9hYmxlIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuY29sbGFwc2VBbGwgPSBmdW5jdGlvbigpIHtcbiAgLy8gR2V0IGV4cGFuZENvbGxhcHNlIGFwaVxuICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBjeS5leHBhbmRDb2xsYXBzZSgnZ2V0Jyk7XG4gIFxuICB2YXIgbm9kZXMgPSBjeS5ub2RlcygnOnZpc2libGUnKTtcbiAgaWYgKGV4cGFuZENvbGxhcHNlLmNvbGxhcHNpYmxlTm9kZXMobm9kZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIsIHtcbiAgICAgIG5vZGVzOiBub2Rlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGV4cGFuZENvbGxhcHNlLmNvbGxhcHNlUmVjdXJzaXZlbHkobm9kZXMpO1xuICB9XG59O1xuXG4vLyBFeHBhbmQgYWxsIG5vZGVzIHJlY3Vyc2l2ZWx5LiBSZXF1aXJlcyBleHBhbmRDb2xsYXBzZSBleHRlbnNpb24gYW5kIGNvbnNpZGVycyB1bmRvYWJsZSBvcHRpb24uXG5tYWluVXRpbGl0aWVzLmV4cGFuZEFsbCA9IGZ1bmN0aW9uKCkge1xuICAvLyBHZXQgZXhwYW5kQ29sbGFwc2UgYXBpXG4gIHZhciBleHBhbmRDb2xsYXBzZSA9IGN5LmV4cGFuZENvbGxhcHNlKCdnZXQnKTtcbiAgXG4gIHZhciBub2RlcyA9IGV4cGFuZENvbGxhcHNlLmV4cGFuZGFibGVOb2RlcyhjeS5ub2RlcygnOnZpc2libGUnKSk7XG4gIGlmIChub2Rlcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiZXhwYW5kUmVjdXJzaXZlbHlcIiwge1xuICAgICAgbm9kZXM6IG5vZGVzXG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZXhwYW5kQ29sbGFwc2UuZXhwYW5kUmVjdXJzaXZlbHkobm9kZXMpO1xuICB9XG59O1xuXG4vLyBJbmNyZWFzZSBib3JkZXIgd2lkdGggdG8gc2hvdyBub2RlcyB3aXRoIGhpZGRlbiBuZWlnaGJvcnNcbm1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlciA9IGZ1bmN0aW9uKGVsZXMpe1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24oIGVsZSApe1xuICAgIHZhciBkZWZhdWx0Qm9yZGVyV2lkdGggPSBOdW1iZXIoZWxlLmRhdGEoXCJib3JkZXItd2lkdGhcIikpO1xuICAgIGVsZS5kYXRhKFwiYm9yZGVyLXdpZHRoXCIsIGRlZmF1bHRCb3JkZXJXaWR0aCArIDIpO1xuICB9KTtcbiAgZWxlcy5kYXRhKFwidGhpY2tCb3JkZXJcIiwgdHJ1ZSk7XG4gIHJldHVybiBlbGVzO1xufVxuLy8gRGVjcmVhc2UgYm9yZGVyIHdpZHRoIHdoZW4gaGlkZGVuIG5laWdoYm9ycyBvZiB0aGUgbm9kZXMgYmVjb21lIHZpc2libGVcbm1haW5VdGlsaXRpZXMudGhpbkJvcmRlciA9IGZ1bmN0aW9uKGVsZXMpe1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24oIGVsZSApe1xuICAgIHZhciBkZWZhdWx0Qm9yZGVyV2lkdGggPSBOdW1iZXIoZWxlLmRhdGEoXCJib3JkZXItd2lkdGhcIikpO1xuICAgIGVsZS5kYXRhKFwiYm9yZGVyLXdpZHRoXCIsIGRlZmF1bHRCb3JkZXJXaWR0aCAtIDIpO1xuICB9KTtcbiAgZWxlcy5yZW1vdmVEYXRhKFwidGhpY2tCb3JkZXJcIik7XG4gIHJldHVybiBlbGVzO1xufVxuXG4vLyBFeHRlbmRzIHRoZSBnaXZlbiBub2RlcyBsaXN0IGluIGEgc21hcnQgd2F5IHRvIGxlYXZlIHRoZSBtYXAgaW50YWN0IGFuZCBoaWRlcyB0aGUgcmVzdWx0aW5nIGxpc3QuIFxuLy8gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuaGlkZU5vZGVzU21hcnQgPSBmdW5jdGlvbihfbm9kZXMpIHtcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgdmFyIG5vZGVzID0gX25vZGVzLm5vZGVzKCk7IC8vIEVuc3VyZSB0aGF0IG5vZGVzIGxpc3QganVzdCBpbmNsdWRlIG5vZGVzXG4gIFxuICB2YXIgYWxsTm9kZXMgPSBjeS5ub2RlcyhcIjp2aXNpYmxlXCIpO1xuICB2YXIgbm9kZXNUb1Nob3cgPSBlbGVtZW50VXRpbGl0aWVzLmV4dGVuZFJlbWFpbmluZ05vZGVzKG5vZGVzLCBhbGxOb2Rlcyk7XG4gIHZhciBub2Rlc1RvSGlkZSA9IGFsbE5vZGVzLm5vdChub2Rlc1RvU2hvdyk7XG5cbiAgaWYgKG5vZGVzVG9IaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIFxuICAgIHZhciB1ciA9IGN5LnVuZG9SZWRvKCk7XG4gICAgdXIuYWN0aW9uKFwidGhpY2tlbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcik7XG4gICAgdXIuYWN0aW9uKFwidGhpbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcik7XG4gICAgXG4gICAgLy8gQmF0Y2hpbmdcbiAgICB2YXIgYWN0aW9ucyA9IFtdOyBcbiAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoKS5pbnRlcnNlY3Rpb24obm9kZXNUb0hpZGUpO1xuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJ0aGluQm9yZGVyXCIsIHBhcmFtOiBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcn0pOyBcbiAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwiaGlkZVwiLCBwYXJhbTogbm9kZXNUb0hpZGV9KTtcbiAgICBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IG5vZGVzVG9IaWRlLm5laWdoYm9yaG9vZChcIjp2aXNpYmxlXCIpXG4gICAgICAgICAgICAubm9kZXMoKS5kaWZmZXJlbmNlKG5vZGVzVG9IaWRlKS5kaWZmZXJlbmNlKGN5Lm5vZGVzKFwiW3RoaWNrQm9yZGVyXVwiKSk7XG4gICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInRoaWNrZW5Cb3JkZXJcIiwgcGFyYW06IG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yfSk7ICBcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiYmF0Y2hcIiwgYWN0aW9ucyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCc6dmlzaWJsZScpO1xuICAgIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gICAgdmlld1V0aWxpdGllcy5oaWRlKG5vZGVzVG9IaWRlKTtcbiAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoJzp2aXNpYmxlJyk7XG4gICAgbWFpblV0aWxpdGllcy50aGlja2VuQm9yZGVyKG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yKTtcbiAgfVxufTtcblxuLy8gRXh0ZW5kcyB0aGUgZ2l2ZW4gbm9kZXMgbGlzdCBpbiBhIHNtYXJ0IHdheSB0byBsZWF2ZSB0aGUgbWFwIGludGFjdC4gXG4vLyBUaGVuIHVuaGlkZXMgdGhlIHJlc3VsdGluZyBsaXN0IGFuZCBoaWRlcyBvdGhlcnMuIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNob3dOb2Rlc1NtYXJ0ID0gZnVuY3Rpb24oX25vZGVzKSB7XG4gIC8vIElmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIHdlIGNhbiBhc3N1bWUgdGhhdCB2aWV3IHV0aWxpdGllcyBleHRlbnNpb24gaXMgb24gdXNlXG4gIHZhciB2aWV3VXRpbGl0aWVzID0gY3kudmlld1V0aWxpdGllcygnZ2V0Jyk7XG4gIHZhciBub2RlcyA9IF9ub2Rlcy5ub2RlcygpOyAvLyBFbnN1cmUgdGhhdCBub2RlcyBsaXN0IGp1c3QgaW5jbHVkZSBub2Rlc1xuICBcbiAgdmFyIGFsbE5vZGVzID0gY3kuZWxlbWVudHMoKTtcbiAgdmFyIG5vZGVzVG9TaG93ID0gZWxlbWVudFV0aWxpdGllcy5leHRlbmROb2RlTGlzdChub2Rlcyk7XG4gIHZhciBub2Rlc1RvSGlkZSA9IGFsbE5vZGVzLm5vdChub2Rlc1RvU2hvdyk7XG4gIFxuICBpZiAobm9kZXNUb0hpZGUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGlja2VuQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGluQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGlja2VuQm9yZGVyKTtcbiAgICBcbiAgICAvLyBCYXRjaGluZ1xuICAgIHZhciBhY3Rpb25zID0gW107ICAgIFxuICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwidGhpbkJvcmRlclwiLCBwYXJhbTogbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3J9KTsgIFxuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJoaWRlXCIsIHBhcmFtOiBub2Rlc1RvSGlkZX0pO1xuICAgIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gbm9kZXNUb0hpZGUubmVpZ2hib3Job29kKFwiOnZpc2libGVcIilcbiAgICAgICAgICAgIC5ub2RlcygpLmRpZmZlcmVuY2Uobm9kZXNUb0hpZGUpO1xuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJ0aGlja2VuQm9yZGVyXCIsIHBhcmFtOiBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcn0pOyAgXG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImJhdGNoXCIsIGFjdGlvbnMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIobm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IpO1xuICAgIHZpZXdVdGlsaXRpZXMuaGlkZShub2Rlc1RvSGlkZSk7XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCc6dmlzaWJsZScpO1xuICAgIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gIH1cbn07XG5cbi8vIFVuaGlkZXMgZWxlbWVudHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuc2hvd0VsZXMgPSBmdW5jdGlvbihlbGVzKSB7XG4gICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICAgIGlmKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICAgICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcbiAgICAgICAgdXIuYWN0aW9uKFwidGhpY2tlbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcik7XG4gICAgICAgIHVyLmFjdGlvbihcInRoaW5Cb3JkZXJcIiwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyLCBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIpO1xuICAgICAgICB2YXIgbm9kZXNUb1RoaW5Cb3JkZXIgPSBlbGVzLm5laWdoYm9yaG9vZChcIjp2aXNpYmxlXCIpLm5vZGVzKFwiW3RoaWNrQm9yZGVyXVwiKTtcbiAgICAgICAgdmFyIG5vZGVzVG9UaGlja2VuQm9yZGVyID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmRpZmZlcmVuY2UoZWxlcy5lZGdlcygpKS5jb25uZWN0ZWROb2RlcygpLmludGVyc2VjdGlvbihlbGVzLm5vZGVzKCkpO1xuICAgICAgICAvLyBCYXRjaGluZ1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwidGhpbkJvcmRlclwiLCBwYXJhbTogbm9kZXNUb1RoaW5Cb3JkZXJ9KTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInNob3dcIiwgcGFyYW06IGVsZXN9KTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInRoaWNrZW5Cb3JkZXJcIiwgcGFyYW06IG5vZGVzVG9UaGlja2VuQm9yZGVyfSk7XG4gICAgICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJiYXRjaFwiLCBhY3Rpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICAgICAgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yKTtcbiAgICAgICAgdmlld1V0aWxpdGllcy5zaG93KGVsZXMpO1xuICAgICAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoJzp2aXNpYmxlJyk7XG4gICAgICAgIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gICAgfVxufTtcblxuLy8gVW5oaWRlcyBhbGwgZWxlbWVudHMuIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNob3dBbGwgPSBmdW5jdGlvbigpIHtcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgXG4gIGlmIChjeS5lbGVtZW50cygpLmxlbmd0aCA9PT0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGlja2VuQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGluQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGlja2VuQm9yZGVyKTtcbiAgICBcbiAgICAvLyBCYXRjaGluZyAgIFxuICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kubm9kZXMoXCJbdGhpY2tCb3JkZXJdXCIpO1xuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJ0aGluQm9yZGVyXCIsIHBhcmFtOiBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcn0pOyAgXG4gICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInNob3dcIiwgcGFyYW06IGN5LmVsZW1lbnRzKCl9KTtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiYmF0Y2hcIiwgYWN0aW9ucyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCc6dmlzaWJsZScpO1xuICAgIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gICAgdmlld1V0aWxpdGllcy5zaG93KGN5LmVsZW1lbnRzKCkpO1xuICB9XG59O1xuXG4vLyBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50cyBpbiBhIHNpbXBsZSB3YXkuIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuZGVsZXRlRWxlc1NpbXBsZSA9IGZ1bmN0aW9uKGVsZXMpIHtcbiAgaWYgKGVsZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImRlbGV0ZUVsZXNTaW1wbGVcIiwge1xuICAgICAgZWxlczogZWxlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGVsZXMucmVtb3ZlKCk7XG4gIH1cbn07XG5cbi8vIEV4dGVuZHMgdGhlIGdpdmVuIG5vZGVzIGxpc3QgaW4gYSBzbWFydCB3YXkgdG8gbGVhdmUgdGhlIG1hcCBpbnRhY3QgYW5kIHJlbW92ZXMgdGhlIHJlc3VsdGluZyBsaXN0LiBcbi8vIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuZGVsZXRlTm9kZXNTbWFydCA9IGZ1bmN0aW9uKF9ub2Rlcykge1xuICB2YXIgbm9kZXMgPSBfbm9kZXMubm9kZXMoKTtcbiAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImRlbGV0ZU5vZGVzU21hcnRcIiwge1xuICAgICAgZmlyc3RUaW1lOiB0cnVlLFxuICAgICAgZWxlczogbm9kZXNcbiAgICB9KTtcbiAgfVxuICBlbHNlIHtcbiAgICBlbGVtZW50VXRpbGl0aWVzLmRlbGV0ZU5vZGVzU21hcnQobm9kZXMpO1xuICB9XG59O1xuXG4vLyBIaWdobGlnaHRzIHNlbGVjdGVkIGVsZW1lbnRzLiBSZXF1aXJlcyB2aWV3VXRpbGl0aWVzIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5oaWdobGlnaHRTZWxlY3RlZCA9IGZ1bmN0aW9uKF9lbGVzKSB7XG5cbiAgdmFyIGVsZXNUb0hpZ2hsaWdodCA9IF9lbGVzO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbm90SGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoXCIubm90aGlnaGxpZ2h0ZWRcIikuZmlsdGVyKFwiOnZpc2libGVcIik7XG4gIHZhciBoaWdobGlnaHRlZEVsZXMgPSBjeS5lbGVtZW50cygnOnZpc2libGUnKS5kaWZmZXJlbmNlKG5vdEhpZ2hsaWdodGVkRWxlcyk7XG4gIGlmIChlbGVzVG9IaWdobGlnaHQuc2FtZShoaWdobGlnaHRlZEVsZXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiaGlnaGxpZ2h0XCIsIGVsZXNUb0hpZ2hsaWdodCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmlld1V0aWxpdGllcy5oaWdobGlnaHQoZWxlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBcbiAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xufTtcblxuLy8gSGlnaGxpZ2h0cyBuZWlnaGJvdXJzIG9mIHRoZSBnaXZlbiBub2Rlcy4gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuaGlnaGxpZ2h0TmVpZ2hib3VycyA9IGZ1bmN0aW9uKF9ub2Rlcykge1xuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgdmFyIG5vZGVzID0gX25vZGVzLm5vZGVzKCk7IC8vIEVuc3VyZSB0aGF0IG5vZGVzIGxpc3QganVzdCBpbmNsdWRlIG5vZGVzXG4gIHZhciBlbGVzVG9IaWdobGlnaHQgPSBlbGVtZW50VXRpbGl0aWVzLmdldE5laWdoYm91cnNPZk5vZGVzKG5vZGVzKTtcbiAgaWYgKGVsZXNUb0hpZ2hsaWdodC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdEhpZ2hsaWdodGVkRWxlcyA9IGN5LmVsZW1lbnRzKFwiLm5vdGhpZ2hsaWdodGVkXCIpLmZpbHRlcihcIjp2aXNpYmxlXCIpO1xuICB2YXIgaGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykuZGlmZmVyZW5jZShub3RIaWdobGlnaHRlZEVsZXMpO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0LnNhbWUoaGlnaGxpZ2h0ZWRFbGVzKSAmJiAhY3kuZWxlbWVudHMoXCI6dW5zZWxlY3RlZFwiKS5lbXB0eSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJoaWdobGlnaHRcIiwgZWxlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLmhpZ2hsaWdodChlbGVzVG9IaWdobGlnaHQpO1xuICB9XG4gIFxuICBjeS5lbGVtZW50cygpLnVuc2VsZWN0KCk7XG59O1xuXG4vLyBGaW5kcyB0aGUgZWxlbWVudHMgd2hvc2UgbGFiZWwgaW5jbHVkZXMgdGhlIGdpdmVuIGxhYmVsIGFuZCBoaWdobGlnaHRzIHByb2Nlc3NlcyBvZiB0aG9zZSBlbGVtZW50cy5cbi8vIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNlYXJjaEJ5TGFiZWwgPSBmdW5jdGlvbihsYWJlbCkge1xuICBpZiAobGFiZWwubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIHZhciBub2Rlc1RvSGlnaGxpZ2h0ID0gY3kubm9kZXMoXCI6dmlzaWJsZVwiKS5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGVsZSA9IGk7XG4gICAgfVxuICAgIGlmIChlbGUuZGF0YShcImxhYmVsXCIpICYmIGVsZS5kYXRhKFwibGFiZWxcIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKGxhYmVsKSA+PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICBpZiAobm9kZXNUb0hpZ2hsaWdodC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcblxuICBub2Rlc1RvSGlnaGxpZ2h0ID0gZWxlbWVudFV0aWxpdGllcy5leHRlbmROb2RlTGlzdChub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImhpZ2hsaWdodFwiLCBub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLmhpZ2hsaWdodChub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBcbiAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xufTtcblxuLy8gSGlnaGxpZ2h0cyBwcm9jZXNzZXMgb2YgdGhlIGdpdmVuIG5vZGVzLiBSZXF1aXJlcyB2aWV3VXRpbGl0aWVzIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5oaWdobGlnaHRQcm9jZXNzZXMgPSBmdW5jdGlvbihfbm9kZXMpIHtcbiAgdmFyIG5vZGVzID0gX25vZGVzLm5vZGVzKCk7IC8vIEVuc3VyZSB0aGF0IG5vZGVzIGxpc3QganVzdCBpbmNsdWRlIG5vZGVzXG4gIHZhciBlbGVzVG9IaWdobGlnaHQgPSBlbGVtZW50VXRpbGl0aWVzLmV4dGVuZE5vZGVMaXN0KG5vZGVzKTtcbiAgaWYgKGVsZXNUb0hpZ2hsaWdodC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdEhpZ2hsaWdodGVkRWxlcyA9IGN5LmVsZW1lbnRzKFwiLm5vdGhpZ2hsaWdodGVkXCIpLmZpbHRlcihcIjp2aXNpYmxlXCIpO1xuICB2YXIgaGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykuZGlmZmVyZW5jZShub3RIaWdobGlnaHRlZEVsZXMpO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0LnNhbWUoaGlnaGxpZ2h0ZWRFbGVzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImhpZ2hsaWdodFwiLCBlbGVzVG9IaWdobGlnaHQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZpZXdVdGlsaXRpZXMuaGlnaGxpZ2h0KGVsZXNUb0hpZ2hsaWdodCk7XG4gIH1cbiAgXG4gIGN5LmVsZW1lbnRzKCkudW5zZWxlY3QoKTtcbn07XG5cbi8vIFVuaGlnaGxpZ2h0cyBhbnkgaGlnaGxpZ2h0ZWQgZWxlbWVudC4gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMucmVtb3ZlSGlnaGxpZ2h0cyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoZWxlbWVudFV0aWxpdGllcy5ub25lSXNOb3RIaWdobGlnaHRlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwicmVtb3ZlSGlnaGxpZ2h0c1wiKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLnJlbW92ZUhpZ2hsaWdodHMoKTtcbiAgfVxuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xufTtcblxuLy8gUGVyZm9ybXMgbGF5b3V0IGJ5IGdpdmVuIGxheW91dE9wdGlvbnMuIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi4gSG93ZXZlciwgYnkgc2V0dGluZyBub3RVbmRvYWJsZSBwYXJhbWV0ZXJcbi8vIHRvIGEgdHJ1dGh5IHZhbHVlIHlvdSBjYW4gZm9yY2UgYW4gdW5kYWJsZSBsYXlvdXQgb3BlcmF0aW9uIGluZGVwZW5kYW50IG9mICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5wZXJmb3JtTGF5b3V0ID0gZnVuY3Rpb24obGF5b3V0T3B0aW9ucywgbm90VW5kb2FibGUpIHtcbiAgLy8gVGhpbmdzIHRvIGRvIGJlZm9yZSBwZXJmb3JtaW5nIGxheW91dFxuICBiZWZvcmVQZXJmb3JtTGF5b3V0KCk7XG4gIFxuICBpZiAoIW9wdGlvbnMudW5kb2FibGUgfHwgbm90VW5kb2FibGUpIHsgLy8gJ25vdFVuZG9hYmxlJyBmbGFnIGNhbiBiZSB1c2VkIHRvIGhhdmUgY29tcG9zaXRlIGFjdGlvbnMgaW4gdW5kby9yZWRvIHN0YWNrXG4gICAgdmFyIGxheW91dCA9IGN5LmVsZW1lbnRzKCkuZmlsdGVyKCc6dmlzaWJsZScpLmxheW91dChsYXlvdXRPcHRpb25zKTtcbiAgICBcbiAgICAvLyBDaGVjayB0aGlzIGZvciBjeXRvc2NhcGUuanMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LnJ1bikge1xuICAgICAgbGF5b3V0LnJ1bigpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwibGF5b3V0XCIsIHtcbiAgICAgIG9wdGlvbnM6IGxheW91dE9wdGlvbnMsXG4gICAgICBlbGVzOiBjeS5lbGVtZW50cygpLmZpbHRlcignOnZpc2libGUnKVxuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGVzIGFuIHNiZ25tbCBmaWxlIGNvbnRlbnQgZnJvbSB0aGUgZXhpc2luZyBncmFwaCBhbmQgcmV0dXJucyBpdC5cbm1haW5VdGlsaXRpZXMuY3JlYXRlU2Jnbm1sID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKCk7XG59O1xuXG4vLyBDb252ZXJ0cyBnaXZlbiBzYmdubWwgZGF0YSB0byBhIGpzb24gb2JqZWN0IGluIGEgc3BlY2lhbCBmb3JtYXQgXG4vLyAoaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI25vdGF0aW9uL2VsZW1lbnRzLWpzb24pIGFuZCByZXR1cm5zIGl0LlxubWFpblV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9Kc29uID0gZnVuY3Rpb24oZGF0YSkge1xuICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQoZGF0YSk7XG59O1xuXG4vLyBDcmVhdGUgdGhlIHF0aXAgY29udGVudHMgb2YgdGhlIGdpdmVuIG5vZGUgYW5kIHJldHVybnMgaXQuXG5tYWluVXRpbGl0aWVzLmdldFF0aXBDb250ZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRRdGlwQ29udGVudChub2RlKTtcbn07XG5cbi8vIENoYW5nZSBvcHRpb25cbm1haW5VdGlsaXRpZXMuc2V0U2hvd0NvbXBsZXhOYW1lID0gZnVuY3Rpb24oc2hvd0NvbXBsZXhOYW1lKSB7XG4gIG9wdGlvbnMuc2hvd0NvbXBsZXhOYW1lID0gc2hvd0NvbXBsZXhOYW1lO1xuICAvLyBtYWtlIGNoYW5nZSBhY3RpdmUgYnkgdHJpZ2dlcmluZyBkYXRhIHdoaWNoIHdpbGwgdHJpZ2dlciBzdHlsZSB1cGRhdGVcbiAgY3kubm9kZXMoJ1tjbGFzc149XCJjb21wbGV4XCJdJykuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgIGVsZS50cmlnZ2VyKFwiZGF0YVwiKTtcbiAgfSk7XG59O1xuXG4vKlxuICogU2V0cyB0aGUgb3JkZXJpbmcgb2YgdGhlIGdpdmVuIG5vZGVzLlxuICogT3JkZXJpbmcgb3B0aW9ucyBhcmUgJ0wtdG8tUicsICdSLXRvLUwnLCAnVC10by1CJywgJ0ItdG8tVCcsICdub25lJy5cbiAqIElmIGEgbm9kZSBkb2VzIG5vdCBoYXZlIGFueSBwb3J0IGJlZm9yZSB0aGUgb3BlcmF0aW9uIGFuZCBpdCBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgYWZ0ZXIgb3BlcmF0aW9uIHRoZSBwb3J0RGlzdGFuY2UgcGFyYW1ldGVyIGlzIFxuICogdXNlZCB0byBzZXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGUgY2VudGVyIGFuZCB0aGUgcG9ydHMuIFRoZSBkZWZhdWx0IHBvcnQgZGlzdGFuY2UgaXMgNjAuXG4gKiBDb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxuICovXG5tYWluVXRpbGl0aWVzLnNldFBvcnRzT3JkZXJpbmcgPSBmdW5jdGlvbiAobm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UpIHtcbiAgaWYgKCBub2Rlcy5sZW5ndGggPT09IDAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAoIW9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBlbGVtZW50VXRpbGl0aWVzLnNldFBvcnRzT3JkZXJpbmcobm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBwYXJhbSA9IHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIG9yZGVyaW5nOiBvcmRlcmluZyxcbiAgICAgIHBvcnREaXN0YW5jZTogcG9ydERpc3RhbmNlXG4gICAgfTtcbiAgICBcbiAgICBjeS51bmRvUmVkbygpLmRvKFwic2V0UG9ydHNPcmRlcmluZ1wiLCBwYXJhbSk7XG4gIH1cbiAgXG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG4vKipcbiAqIEdldCBtYXAgcHJvcGVydGllcyBmcm9tIFNCR05NTCBmaWxlXG4gKiBOZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZmlsZSBpcyBsb2FkZWQgLSBzYmdudml6TG9hZEZpbGVFbmQgZXZlbnRcbiAqIHJldHVybjogbWFwIHByb3BlcnRpZXMgYXMgb2JqZWN0XG4gKi9cbm1haW5VdGlsaXRpZXMuZ2V0TWFwUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gc2Jnbm1sVG9Kc29uLm1hcFByb3BlcnRpZXNUb09iaigpO1xuIH1cblxubW9kdWxlLmV4cG9ydHMgPSBtYWluVXRpbGl0aWVzO1xuIiwiLypcbiAqICBFeHRlbmQgZGVmYXVsdCBvcHRpb25zIGFuZCBnZXQgY3VycmVudCBvcHRpb25zIGJ5IHVzaW5nIHRoaXMgZmlsZSBcbiAqL1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbnZhciBkZWZhdWx0cyA9IHtcbiAgLy8gVGhlIHBhdGggb2YgY29yZSBsaWJyYXJ5IGltYWdlcyB3aGVuIHNiZ252aXogaXMgcmVxdWlyZWQgZnJvbSBucG0gYW5kIHRoZSBpbmRleCBodG1sIFxuICAvLyBmaWxlIGFuZCBub2RlX21vZHVsZXMgYXJlIHVuZGVyIHRoZSBzYW1lIGZvbGRlciB0aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGZpbmVcbiAgaW1nUGF0aDogJ25vZGVfbW9kdWxlcy9zYmdudml6L3NyYy9pbWcnLFxuICAvLyBXaGV0aGVyIHRvIGZpdCBsYWJlbHMgdG8gbm9kZXNcbiAgZml0TGFiZWxzVG9Ob2RlczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZml0TGFiZWxzVG9JbmZvYm94ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGR5bmFtaWMgbGFiZWwgc2l6ZSBpdCBtYXkgYmUgJ3NtYWxsJywgJ3JlZ3VsYXInLCAnbGFyZ2UnXG4gIGR5bmFtaWNMYWJlbFNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ3JlZ3VsYXInO1xuICB9LFxuICAvLyBwZXJjZW50YWdlIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvdW5kIHBhZGRpbmdzXG4gIGNvbXBvdW5kUGFkZGluZzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAxMDtcbiAgfSxcbiAgaW1wcm92ZUZsb3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBleHRyYSBwYWRkaW5nIGZvciBjb21wYXJ0bWVudCBhbmQgY29tcGxleGVzXG4gIGV4dHJhQ29tcGFydG1lbnRQYWRkaW5nOiAxMCxcbiAgZXh0cmFDb21wbGV4UGFkZGluZzogMTAsXG4gIC8vIFdldGhlciB0byBkaXNwbGF5IHRoZSBjb21wbGV4J3MgbGFiZWxzLCBsaWtlIGNvbXBhcnRtZW50cy5cbiAgLy8gV2lsbCBhbHNvIGluY3JlYXNlIHRoZSBwYWRkaW5ncyBieSBleHRyYUNvbXBvdW5kUGFkZGluZyB0byBtYWtlIHJvb20gZm9yIHRoZSBuYW1lLlxuICBzaG93Q29tcGxleE5hbWU6IGZhbHNlLFxuICAvLyBUaGUgc2VsZWN0b3Igb2YgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBzYmduIG5ldHdvcmtcbiAgbmV0d29ya0NvbnRhaW5lclNlbGVjdG9yOiAnI3NiZ24tbmV0d29yay1jb250YWluZXInLFxuICAvLyBXaGV0aGVyIHRoZSBhY3Rpb25zIGFyZSB1bmRvYWJsZSwgcmVxdWlyZXMgY3l0b3NjYXBlLXVuZG8tcmVkbyBleHRlbnNpb25cbiAgdW5kb2FibGU6IHRydWVcbn07XG5cbnZhciBvcHRpb25VdGlsaXRpZXMgPSBmdW5jdGlvbiAoKSB7XG59O1xuXG4vLyBFeHRlbmQgdGhlIGRlZmF1bHRzIG9wdGlvbnMgd2l0aCB0aGUgdXNlciBvcHRpb25zXG5vcHRpb25VdGlsaXRpZXMuZXh0ZW5kT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRzKSB7XG4gICAgcmVzdWx0W3Byb3BdID0gZGVmYXVsdHNbcHJvcF07XG4gIH1cbiAgXG4gIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykge1xuICAgIHJlc3VsdFtwcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gIH1cblxuICBvcHRpb25VdGlsaXRpZXMub3B0aW9ucyA9IHJlc3VsdDtcblxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbm9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gb3B0aW9uVXRpbGl0aWVzLm9wdGlvbnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGlvblV0aWxpdGllcztcbiIsInZhciBlbGVtZW50VXRpbGl0aWVzID0gcmVxdWlyZSgnLi9lbGVtZW50LXV0aWxpdGllcycpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xudmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9ncmFwaC11dGlsaXRpZXMnKTtcbnZhciBsaWJzYmduanMgPSByZXF1aXJlKCdsaWJzYmduLmpzJyk7XG52YXIgbGlicyA9IHJlcXVpcmUoJy4vbGliLXV0aWxpdGllcycpLmdldExpYnMoKTtcbnZhciBwYXJzZVN0cmluZyA9IHJlcXVpcmUoJ3htbDJqcycpLnBhcnNlU3RyaW5nO1xuXG52YXIgc2Jnbm1sVG9Kc29uID0ge1xuICBpbnNlcnRlZE5vZGVzOiB7fSxcbiAgbWFwOiB1bmRlZmluZWQsXG4gIGdldEFsbENvbXBhcnRtZW50czogZnVuY3Rpb24gKGdseXBoTGlzdCkge1xuICAgIHZhciBjb21wYXJ0bWVudHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZ2x5cGhMaXN0W2ldLmNsYXNzXyA9PSAnY29tcGFydG1lbnQnKSB7XG4gICAgICAgIHZhciBjb21wYXJ0bWVudCA9IGdseXBoTGlzdFtpXTtcbiAgICAgICAgdmFyIGJib3ggPSBjb21wYXJ0bWVudC5iYm94O1xuICAgICAgICBjb21wYXJ0bWVudHMucHVzaCh7XG4gICAgICAgICAgJ3gnOiBwYXJzZUZsb2F0KGJib3gueCksXG4gICAgICAgICAgJ3knOiBwYXJzZUZsb2F0KGJib3gueSksXG4gICAgICAgICAgJ3cnOiBwYXJzZUZsb2F0KGJib3gudyksXG4gICAgICAgICAgJ2gnOiBwYXJzZUZsb2F0KGJib3guaCksXG4gICAgICAgICAgJ2lkJzogY29tcGFydG1lbnQuaWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgICAgaWYgKGMxLmggKiBjMS53IDwgYzIuaCAqIGMyLncpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGMxLmggKiBjMS53ID4gYzIuaCAqIGMyLncpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wYXJ0bWVudHM7XG4gIH0sXG4gIGlzSW5Cb3VuZGluZ0JveDogZnVuY3Rpb24gKGJib3gxLCBiYm94Mikge1xuICAgIGlmIChiYm94MS54ID4gYmJveDIueCAmJlxuICAgICAgICBiYm94MS55ID4gYmJveDIueSAmJlxuICAgICAgICBiYm94MS54ICsgYmJveDEudyA8IGJib3gyLnggKyBiYm94Mi53ICYmXG4gICAgICAgIGJib3gxLnkgKyBiYm94MS5oIDwgYmJveDIueSArIGJib3gyLmgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGJib3hQcm9wOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGJib3ggPSB7fTtcbiAgICBiYm94LnggPSBlbGUuYmJveC54O1xuICAgIGJib3gueSA9IGVsZS5iYm94Lnk7XG4gICAgYmJveC53ID0gZWxlLmJib3gudztcbiAgICBiYm94LmggPSBlbGUuYmJveC5oO1xuICAgIFxuICAgIHZhciBjaGlsZE5vZGVzID0gZWxlLmdseXBoTWVtYmVycztcbiAgICB2YXIgbWluTGVmdCwgbWF4UmlnaHQsIG1pblRvcCwgbWF4Qm90dG9tLCBjaGlsZHJlbkJib3hXLCBjaGlsZHJlbkJib3hIO1xuICAgIHZhciBjb21wb3VuZDtcblxuICAgIC8vIFRyYXZlcnNlIHRoZSBvdGhlciBjaGlsZHJlbiBhbmQgdXBkYXRlIHRoZSBleHRyZW1lIHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZE5vZGUuY2xhc3NfID09PSAnc3RhdGUgdmFyaWFibGUnIHx8IGNoaWxkTm9kZS5jbGFzc18gPT09ICd1bml0IG9mIGluZm9ybWF0aW9uJykge1xuICAgICAgICBjb250aW51ZTsgLy8gRWxlbWluYXRlIHN0YXRlIHZhcmlhYmxlcyBhbmQgaW5mbyBib3hlc1xuICAgICAgfVxuXG4gICAgICBjb21wb3VuZCA9IHRydWU7XG5cbiAgICAgIHZhciBjaGlsZE5vZGVCYm94ID0gY2hpbGROb2RlLmJib3g7XG4gICAgICB2YXIgbGVmdCA9IGNoaWxkTm9kZUJib3gueDtcbiAgICAgIHZhciByaWdodCA9IGNoaWxkTm9kZUJib3gueCArIGNoaWxkTm9kZUJib3gudztcbiAgICAgIHZhciB0b3AgPSBjaGlsZE5vZGVCYm94Lnk7XG4gICAgICB2YXIgYm90dG9tID0gY2hpbGROb2RlQmJveC55ICsgY2hpbGROb2RlQmJveC5oO1xuXG4gICAgICBpZiAobWluTGVmdCA9PT0gdW5kZWZpbmVkIHx8IGxlZnQgPCBtaW5MZWZ0KSB7XG4gICAgICAgIG1pbkxlZnQgPSBsZWZ0O1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4UmlnaHQgPT09IHVuZGVmaW5lZCB8fCByaWdodCA+IG1heFJpZ2h0KSB7XG4gICAgICAgIG1heFJpZ2h0ID0gcmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaW5Ub3AgPT09IHVuZGVmaW5lZCB8fCB0b3AgPCBtaW5Ub3ApIHtcbiAgICAgICAgbWluVG9wID0gdG9wO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4Qm90dG9tID09PSB1bmRlZmluZWQgfHwgYm90dG9tID4gbWF4Qm90dG9tKSB7XG4gICAgICAgIG1heEJvdHRvbSA9IGJvdHRvbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29tcG91bmQpIHtcbiAgICAgIC8vIFRoZSBzaXplcyBvZiBjaGlsZHJlbiBiYm94IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGV4dHJlbWUgY29vcmRpbmF0ZXNcbiAgICAgIGNoaWxkcmVuQmJveFcgPSBtYXhSaWdodCAtIG1pbkxlZnQ7XG4gICAgICBjaGlsZHJlbkJib3hIID0gbWF4Qm90dG9tIC0gbWluVG9wO1xuXG4gICAgICAvLyBJZiBjaGlsZHJlbiBiYm94IHdpZHRoIGlzIGJpZ2dlciB0aGFuIG5vZGUgYmJveCB3aWR0aCBzZXQgbWluV2lkdGgsIGFuZCBob3Jpem9udGFsIGJpYXNlc1xuICAgICAgaWYgKGNoaWxkcmVuQmJveFcgPCBiYm94LncpIHtcbiAgICAgICAgZWxlLm1pbldpZHRoID0gYmJveC53O1xuICAgICAgICB2YXIgZXh0cmFMZWZ0ID0gIG1pbkxlZnQgLSBiYm94Lng7XG4gICAgICAgIHZhciBleHRyYVJpZ2h0ID0gKGJib3gueCArIGJib3gudykgLSBtYXhSaWdodDtcblxuICAgICAgICBlbGUubWluV2lkdGhCaWFzTGVmdCA9IGV4dHJhTGVmdCAvIChleHRyYUxlZnQgKyBleHRyYVJpZ2h0KSAqIDEwMDtcbiAgICAgICAgZWxlLm1pbldpZHRoQmlhc1JpZ2h0ID0gMTAwIC0gZWxlLm1pbldpZHRoQmlhc0xlZnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGNoaWxkcmVuIGJib3ggaGVpZ2h0IGlzIGJpZ2dlciB0aGFuIG5vZGUgYmJveCBoZWlnaHQgc2V0IG1pbkhlaWdodCwgYW5kIHZlcnRpY2FsIGJpYXNlc1xuICAgICAgaWYgKGNoaWxkcmVuQmJveEggPCBiYm94LmgpIHtcbiAgICAgICAgZWxlLm1pbkhlaWdodCA9IGJib3guaDtcbiAgICAgICAgdmFyIGV4dHJhVG9wID0gbWluVG9wIC0gYmJveC55O1xuICAgICAgICB2YXIgZXh0cmFCb3R0b20gPSAoYmJveC55ICsgYmJveC5oKSAtIG1heEJvdHRvbTtcblxuICAgICAgICBlbGUubWluSGVpZ2h0Qmlhc1RvcCA9IGV4dHJhVG9wIC8gKGV4dHJhVG9wICsgZXh0cmFCb3R0b20pICogMTAwO1xuICAgICAgICBlbGUubWluSGVpZ2h0Qmlhc0JvdHRvbSA9IDEwMCAtIGVsZS5taW5IZWlnaHRCaWFzVG9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCBwb3NpdGlvbnMgYXMgY2VudGVyXG4gICAgYmJveC54ID0gcGFyc2VGbG9hdChiYm94LngpICsgcGFyc2VGbG9hdChiYm94LncpIC8gMjtcbiAgICBiYm94LnkgPSBwYXJzZUZsb2F0KGJib3gueSkgKyBwYXJzZUZsb2F0KGJib3guaCkgLyAyO1xuXG4gICAgcmV0dXJuIGJib3g7XG4gIH0sXG4gIHN0YXRlQW5kSW5mb0Jib3hQcm9wOiBmdW5jdGlvbiAoZWxlLCBwYXJlbnRCYm94KSB7XG4gICAgdmFyIHhQb3MgPSBwYXJzZUZsb2F0KHBhcmVudEJib3gueCk7XG4gICAgdmFyIHlQb3MgPSBwYXJzZUZsb2F0KHBhcmVudEJib3gueSk7XG5cbiAgICAvLyBkb24ndCBjb3B5IGRpcmVjdGx5IGVsZS5ib3ggYmVjYXVzZSBpdCBjb250YWlucyBvdGhlciB0aGluZ3MgdGhhbiB4IHkgdyBoXG4gICAgdmFyIGJib3ggPSB7fTtcbiAgICBiYm94LnggPSBlbGUuYmJveC54O1xuICAgIGJib3gueSA9IGVsZS5iYm94Lnk7XG4gICAgYmJveC53ID0gZWxlLmJib3gudztcbiAgICBiYm94LmggPSBlbGUuYmJveC5oO1xuXG4gICAgLy8gc2V0IHBvc2l0aW9ucyBhcyBjZW50ZXJcbiAgICBiYm94LnggPSBwYXJzZUZsb2F0KGJib3gueCkgKyBwYXJzZUZsb2F0KGJib3gudykgLyAyIC0geFBvcztcbiAgICBiYm94LnkgPSBwYXJzZUZsb2F0KGJib3gueSkgKyBwYXJzZUZsb2F0KGJib3guaCkgLyAyIC0geVBvcztcblxuICAgIGJib3gueCA9IGJib3gueCAvIHBhcnNlRmxvYXQocGFyZW50QmJveC53KSAqIDEwMDtcbiAgICBiYm94LnkgPSBiYm94LnkgLyBwYXJzZUZsb2F0KHBhcmVudEJib3guaCkgKiAxMDA7XG5cbiAgICByZXR1cm4gYmJveDtcbiAgfSxcbiAgZmluZENoaWxkTm9kZXM6IGZ1bmN0aW9uIChlbGUsIGNoaWxkVGFnTmFtZSkge1xuICAgIC8vIGZpbmQgY2hpbGQgbm9kZXMgYXQgZGVwdGggbGV2ZWwgb2YgMSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudFxuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IGVsZS5jaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmIGNoaWxkLnRhZ05hbWUgPT09IGNoaWxkVGFnTmFtZSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9LFxuICBmaW5kQ2hpbGROb2RlOiBmdW5jdGlvbiAoZWxlLCBjaGlsZFRhZ05hbWUpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmZpbmRDaGlsZE5vZGVzKGVsZSwgY2hpbGRUYWdOYW1lKTtcbiAgICByZXR1cm4gbm9kZXMubGVuZ3RoID4gMCA/IG5vZGVzWzBdIDogdW5kZWZpbmVkO1xuICB9LFxuICBzdGF0ZUFuZEluZm9Qcm9wOiBmdW5jdGlvbiAoZWxlLCBwYXJlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHBhcmVudEJib3ggPSBwYXJlbnQuYmJveDtcbiAgICB2YXIgc3RhdGVBbmRJbmZvQXJyYXkgPSBbXTtcblxuICAgIHZhciBjaGlsZEdseXBocyA9IGVsZS5nbHlwaE1lbWJlcnM7IC8vIHRoaXMuZmluZENoaWxkTm9kZXMoZWxlLCAnZ2x5cGgnKTtcblxuICAgIC8vIGlmIGEgYmlvbG9naWNhbCBhY3Rpdml0eSBub2RlIGhhcyBubyB1bml0IG9mIGluZm8sIGl0IG11c3QgYmUgYSBCQSBwbGFpblxuICAgIGlmKHBhcmVudC5jbGFzcyA9PSBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIiAmJiBjaGlsZEdseXBocy5sZW5ndGggPT0gMCkge1xuICAgICAgcGFyZW50LmNsYXNzID0gXCJCQSBwbGFpblwiO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRHbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGNoaWxkR2x5cGhzW2ldO1xuICAgICAgdmFyIGluZm8gPSB7fTtcblxuICAgICAgaWYgKGdseXBoLmNsYXNzXyA9PT0gJ3VuaXQgb2YgaW5mb3JtYXRpb24nKSB7XG4gICAgICAgIHZhciB1bml0T2ZJbmZvcm1hdGlvbiA9IG5ldyBjbGFzc2VzLlVuaXRPZkluZm9ybWF0aW9uKCk7XG4gICAgICAgIGlmKGdseXBoLmVudGl0eSkge1xuICAgICAgICAgIC8vIGNoYW5nZSB0aGUgcGFyZW50IGNsYXNzIGFjY29yZGluZyB0byBpdHMgdHJ1ZSBjbGFzcyBvZiBiaW9sb2dpY2FsIGFjdGl2aXR5XG4gICAgICAgICAgc3dpdGNoKGdseXBoLmVudGl0eS5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICd1bnNwZWNpZmllZCBlbnRpdHknOiAgICBwYXJlbnQuY2xhc3MgPSBcIkJBIHVuc3BlY2lmaWVkIGVudGl0eVwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NpbXBsZSBjaGVtaWNhbCc6ICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWFjcm9tb2xlY3VsZSc6ICAgICAgICAgcGFyZW50LmNsYXNzID0gXCJCQSBtYWNyb21vbGVjdWxlXCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnOiAgcGFyZW50LmNsYXNzID0gXCJCQSBudWNsZWljIGFjaWQgZmVhdHVyZVwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BlcnR1cmJhdGlvbic6ICAgICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgcGVydHVyYmluZyBhZ2VudFwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXgnOiAgICAgICAgICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgY29tcGxleFwiOyBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5pdE9mSW5mb3JtYXRpb24uc2hhcGVGbiA9IGxpYnMuY3l0b3NjYXBlLnNiZ24uQWZTaGFwZUZuO1xuICAgICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLnNoYXBlQXJnc0ZuID0gbGlicy5jeXRvc2NhcGUuc2Jnbi5BZlNoYXBlQXJnc0ZuO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pdE9mSW5mb3JtYXRpb24uaWQgPSBnbHlwaC5pZCB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLmxhYmVsID0ge1xuICAgICAgICAgICd0ZXh0JzogKGdseXBoLmxhYmVsICYmIGdseXBoLmxhYmVsLnRleHQpIHx8IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB1bml0T2ZJbmZvcm1hdGlvbi5iYm94ID0gc2VsZi5zdGF0ZUFuZEluZm9CYm94UHJvcChnbHlwaCwgcGFyZW50QmJveCk7XG4gICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLnNldEFuY2hvclNpZGUoKTtcbiAgICAgICAgc3RhdGVBbmRJbmZvQXJyYXkucHVzaCh1bml0T2ZJbmZvcm1hdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKGdseXBoLmNsYXNzXyA9PT0gJ3N0YXRlIHZhcmlhYmxlJykge1xuICAgICAgICB2YXIgc3RhdGVWYXJpYWJsZSA9IG5ldyBjbGFzc2VzLlN0YXRlVmFyaWFibGUoKTtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5pZCA9IGdseXBoLmlkIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2x5cGguc3RhdGU7XG4gICAgICAgIHN0YXRlVmFyaWFibGUuc3RhdGUudmFsdWUgPSAoc3RhdGUgJiYgc3RhdGUudmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5zdGF0ZS52YXJpYWJsZSA9IChzdGF0ZSAmJiBzdGF0ZS52YXJpYWJsZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBzdGF0ZVZhcmlhYmxlLmJib3ggPSBzZWxmLnN0YXRlQW5kSW5mb0Jib3hQcm9wKGdseXBoLCBwYXJlbnRCYm94KTtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5zZXRBbmNob3JTaWRlKCk7XG4gICAgICAgIHN0YXRlQW5kSW5mb0FycmF5LnB1c2goc3RhdGVWYXJpYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlQW5kSW5mb0FycmF5O1xuICB9LFxuICBhZGRQYXJlbnRJbmZvVG9Ob2RlOiBmdW5jdGlvbiAoZWxlLCBub2RlT2JqLCBwYXJlbnQsIGNvbXBhcnRtZW50cykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY29tcGFydG1lbnRSZWYgPSBlbGUuY29tcGFydG1lbnRSZWY7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBub2RlT2JqLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFydG1lbnRSZWYpIHtcbiAgICAgIG5vZGVPYmoucGFyZW50ID0gY29tcGFydG1lbnRSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVPYmoucGFyZW50ID0gJyc7XG5cbiAgICAgIC8vIGFkZCBjb21wYXJ0bWVudCBhY2NvcmRpbmcgdG8gZ2VvbWV0cnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcGFydG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiYm94ID0ge1xuICAgICAgICAgICd4JzogcGFyc2VGbG9hdChlbGUuYmJveC54KSxcbiAgICAgICAgICAneSc6IHBhcnNlRmxvYXQoZWxlLmJib3gueSksXG4gICAgICAgICAgJ3cnOiBwYXJzZUZsb2F0KGVsZS5iYm94LncpLFxuICAgICAgICAgICdoJzogcGFyc2VGbG9hdChlbGUuYmJveC5oKSxcbiAgICAgICAgICAnaWQnOiBlbGUuaWRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNlbGYuaXNJbkJvdW5kaW5nQm94KGJib3gsIGNvbXBhcnRtZW50c1tpXSkpIHtcbiAgICAgICAgICBub2RlT2JqLnBhcmVudCA9IGNvbXBhcnRtZW50c1tpXS5pZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYWRkQ3l0b3NjYXBlSnNOb2RlOiBmdW5jdGlvbiAoZWxlLCBqc29uQXJyYXksIHBhcmVudCwgY29tcGFydG1lbnRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBub2RlT2JqID0ge307XG5cbiAgICAvLyBhZGQgaWQgaW5mb3JtYXRpb25cbiAgICBub2RlT2JqLmlkID0gZWxlLmlkO1xuICAgIC8vIGFkZCBub2RlIGJvdW5kaW5nIGJveCBpbmZvcm1hdGlvblxuICAgIG5vZGVPYmouYmJveCA9IHNlbGYuYmJveFByb3AoZWxlKTtcbiAgICBcbiAgICBpZiAoZWxlLm1pbldpZHRoKSB7XG4gICAgICBub2RlT2JqLm1pbldpZHRoID0gZWxlLm1pbldpZHRoO1xuICAgICAgbm9kZU9iai5taW5XaWR0aEJpYXNMZWZ0ID0gZWxlLm1pbldpZHRoQmlhc0xlZnQ7XG4gICAgICBub2RlT2JqLm1pbldpZHRoQmlhc1JpZ2h0ID0gZWxlLm1pbldpZHRoQmlhc1JpZ2h0O1xuICAgIH1cbiAgICBcbiAgICBpZiAoZWxlLm1pbkhlaWdodCkge1xuICAgICAgbm9kZU9iai5taW5IZWlnaHQgPSBlbGUubWluSGVpZ2h0O1xuICAgICAgbm9kZU9iai5taW5IZWlnaHRCaWFzVG9wID0gZWxlLm1pbkhlaWdodEJpYXNUb3A7XG4gICAgICBub2RlT2JqLm1pbkhlaWdodEJpYXNCb3R0b20gPSBlbGUubWluSGVpZ2h0Qmlhc0JvdHRvbTtcbiAgICB9XG4gICAgXG4gICAgLy8gYWRkIGNsYXNzIGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5jbGFzcyA9IGVsZS5jbGFzc187XG4gICAgLy8gYWRkIGxhYmVsIGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5sYWJlbCA9IChlbGUubGFiZWwgJiYgZWxlLmxhYmVsLnRleHQpIHx8IHVuZGVmaW5lZDtcbiAgICAvLyBhZGQgc3RhdGUgYW5kIGluZm8gYm94IGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5zdGF0ZXNhbmRpbmZvcyA9IHNlbGYuc3RhdGVBbmRJbmZvUHJvcChlbGUsIG5vZGVPYmopO1xuICAgIC8vIGFkZGluZyBwYXJlbnQgaW5mb3JtYXRpb25cbiAgICBzZWxmLmFkZFBhcmVudEluZm9Ub05vZGUoZWxlLCBub2RlT2JqLCBwYXJlbnQsIGNvbXBhcnRtZW50cyk7XG4gICAgLy8gYWRkIGxhbmd1YWdlIGluZm8sIHRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIG1hcFR5cGVcbiAgICBub2RlT2JqLmxhbmd1YWdlID0gZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlO1xuXG4gICAgLy8gYWRkIGNsb25lIGluZm9ybWF0aW9uXG4gICAgaWYgKGVsZS5jbG9uZSkge1xuICAgICAgbm9kZU9iai5jbG9uZW1hcmtlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVPYmouY2xvbmVtYXJrZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gYWRkIHBvcnQgaW5mb3JtYXRpb25cbiAgICB2YXIgcG9ydHMgPSBbXTtcbiAgICB2YXIgcG9ydEVsZW1lbnRzID0gZWxlLnBvcnRzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3J0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwb3J0RWwgPSBwb3J0RWxlbWVudHNbaV07XG4gICAgICB2YXIgaWQgPSBwb3J0RWwuaWQ7XG4gICAgICB2YXIgcmVsYXRpdmVYUG9zID0gcGFyc2VGbG9hdChwb3J0RWwueCkgLSBub2RlT2JqLmJib3gueDtcbiAgICAgIHZhciByZWxhdGl2ZVlQb3MgPSBwYXJzZUZsb2F0KHBvcnRFbC55KSAtIG5vZGVPYmouYmJveC55O1xuXG4gICAgICByZWxhdGl2ZVhQb3MgPSByZWxhdGl2ZVhQb3MgLyBwYXJzZUZsb2F0KG5vZGVPYmouYmJveC53KSAqIDEwMDtcbiAgICAgIHJlbGF0aXZlWVBvcyA9IHJlbGF0aXZlWVBvcyAvIHBhcnNlRmxvYXQobm9kZU9iai5iYm94LmgpICogMTAwO1xuICAgICAgXG4gICAgICAvLyBXZSBhc3N1bWUgdGhhdCBwb3J0cyBhcmUgbm90IGluc2lkZSB0aGUgbm9kZSBzaGFwZS4gXG4gICAgICAvLyBUaGVyZWZvcmUsIGFicy4gdmFsdWUgb2YgdGhlaXIgcmVsYXRpdmUgeCBhbmQgeSBjb29yZGluYXRlcyAocmVsYXRpdmUgdG8gbm9kZSBjZW50ZXIpIHNob3VsZCBiZSBiaWdnZXIgdGhhbiA1MC5cbiAgICAgIGlmIChNYXRoLmFicyhyZWxhdGl2ZVhQb3MpIDwgNTApIHtcbiAgICAgICAgcmVsYXRpdmVYUG9zID0gMDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlWVBvcykgPCA1MCkge1xuICAgICAgICByZWxhdGl2ZVlQb3MgPSAwO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAocmVsYXRpdmVYUG9zID09PSAwICYmIHJlbGF0aXZlWVBvcyA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcG9ydHMucHVzaCh7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgeDogcmVsYXRpdmVYUG9zLFxuICAgICAgICB5OiByZWxhdGl2ZVlQb3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5vZGVPYmoucG9ydHMgPSBwb3J0cztcbiAgICBcbiAgICB2YXIgX2NsYXNzID0gbm9kZU9iai5jbGFzcztcbiAgICAvLyBJZiB0aGUgbm9kZSBjYW4gaGF2ZSBwb3J0cyBhbmQgaXQgaGFzIGV4YWN0bHkgMiBwb3J0cyB0aGVuIGl0IHNob3VsZCBiZSByZXByZXNlbnRlZCBieSBhIGJpZ2dlciBiYm94LlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSByZXByZXNlbnQgaXQgYXMgYSBwb2x5Z29uIGFuZCBzbyB0aGUgd2hvbGUgc2hhcGUgaW5jbHVkaW5nIHRoZSBwb3J0cyBhcmUgcmVuZGVyZWQgaW4gdGhlIG5vZGUgYmJveC5cbiAgICBpZiAoZWxlbWVudFV0aWxpdGllcy5jYW5IYXZlUG9ydHMoX2NsYXNzKSkge1xuICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCAmJiBwb3J0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHBvcnRzIGFyZSBzeW1tZXRyaWMgdG8gdGhlIG5vZGUgY2VudGVyIHNvIHVzaW5nIGp1c3Qgb25lIG9mIHRoZSBwb3J0cyBpcyBlbm91Z2hcbiAgICAgICAgdmFyIHBvcnQgPSBwb3J0c1swXTtcbiAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gcG9ydC54ID09PSAwID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmF0aW8gb2YgdGhlIGFyZWEgb2NjdXBpZWQgd2l0aCBwb3J0cyBvdmVyIHdpdGhvdXQgcG9ydHNcbiAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0LnkpIC8gNTAgOiBNYXRoLmFicyhwb3J0LngpIC8gNTA7XG4gICAgICAgIC8vIE11bHRpcGx5IHRoZSBiYm94IHdpdGggdGhlIGNhbGN1bGF0ZWQgcmF0aW9cbiAgICAgICAgbm9kZU9iai5iYm94LncgPSBwYXJzZUZsb2F0KG5vZGVPYmouYmJveC53KSAqIHJhdGlvO1xuICAgICAgICBub2RlT2JqLmJib3guaCA9IHBhcnNlRmxvYXQobm9kZU9iai5iYm94LmgpICogcmF0aW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZS5leHRlbnNpb24gJiYgZWxlLmV4dGVuc2lvbi5oYXMoJ2Fubm90YXRpb24nKSkgeyAvLyBhbm5vdGF0aW9uIGV4dGVuc2lvbiB3YXMgZm91bmRcbiAgICAgIHZhciByZGZFbGVtZW50ID0gZWxlLmV4dGVuc2lvbi5nZXQoJ2Fubm90YXRpb24nKS5yZGZFbGVtZW50O1xuICAgICAgbm9kZU9iaiA9IHNlbGYuaGFuZGxlQW5ub3RhdGlvbnMobm9kZU9iaiwgcmRmRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdmFyIGN5dG9zY2FwZUpzTm9kZSA9IHtkYXRhOiBub2RlT2JqfTtcbiAgICBqc29uQXJyYXkucHVzaChjeXRvc2NhcGVKc05vZGUpO1xuICB9LFxuICAvKipcbiAgICogZ2l2ZW4gYSBmdXR1cmUgY3kgb2JqZWN0LCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCdzIGxpYnNiZ25qcycgZXh0ZW5zaW9uLCBwb3B1bGF0ZXMgdGhlIGFubm90YXRpb25zIGZpZWxkXG4gICAqL1xuICBoYW5kbGVBbm5vdGF0aW9uczogZnVuY3Rpb24oY3lPYmplY3QsIHJkZkVsZW1lbnQpIHtcbiAgICAvLyBsb2NhbCB1dGlsaXR5IGZ1bmN0aW9uXG4gICAgZnVuY3Rpb24gZGJGcm9tVXJsKHVybCkge1xuICAgICAgdmFyIHJlZ2V4cCA9IC9eaHR0cDpcXC9cXC9pZGVudGlmaWVycy5vcmdcXC8oLis/KVxcLy4rJC87XG4gICAgICByZXR1cm4gdXJsLnJlcGxhY2UocmVnZXhwLCAnJDEnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWxsRWxlbWVudERhdGFBbm5vdGF0aW9uKGN5T2JqZWN0LCBhbm5vdGF0aW9uSW5kZXgsIHN0YXR1cywgc2VsZWN0ZWREQiwgc2VsZWN0ZWRSZWxhdGlvbiwgYW5ub3RhdGlvblZhbHVlKSB7XG4gICAgICBpZighY3lPYmplY3QuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgY3lPYmplY3QuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBhbm5vdElkID0gY3lPYmplY3QuaWQrXCItYW5ub3QtXCIrYW5ub3RhdGlvbkluZGV4O1xuXG4gICAgICBjeU9iamVjdC5hbm5vdGF0aW9uc1thbm5vdElkXSA9IHtcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtYXkgYmUgaGF6YXJkb3VzLiBCdXQgc2V0dGluZyBpdCBhcyB1bmNoZWNrZWQgbGVhdmUgdGhlIGFubm90YXRpb24gb3V0IGlmIHRoZSBmaWxlIGlzIHNhdmVkLlxuICAgICAgICAvLyBUaGlzIHdvdWxkIGxlYWQgdG8gdGhlIHVzZXIgbG9zaW5nIGFubm90YXRpb25zIHdpdGhvdXQga25vd2luZyBpdC5cbiAgICAgICAgc3RhdHVzOiBzdGF0dXMsIC8vIDwtLSB3ZSB0cnVzdCB0aGF0IHdoYXQncyBiZWVuIGxvYWRlZCBpcyB2YWxpZC5cbiAgICAgICAgc2VsZWN0ZWREQjogc2VsZWN0ZWREQixcbiAgICAgICAgc2VsZWN0ZWRSZWxhdGlvbjogc2VsZWN0ZWRSZWxhdGlvbixcbiAgICAgICAgYW5ub3RhdGlvblZhbHVlOiBhbm5vdGF0aW9uVmFsdWVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3lPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhlIGlkIG9mIHRoZSByZGY6YWJvdXQgZmllbGQgaXMgdGhlIG9uZSBvZiB0aGUgY3VycmVudCBub2RlLCBhbmQgdGhhdCB0aGVyZSdzIG9ubHkgMSBkZXNjcmlwdGlvblxuICAgIHZhciBpZCA9IHJkZkVsZW1lbnQuZ2V0QWxsSWRzKClbMF07XG4gICAgdmFyIHJlc291cmNlcyA9IHJkZkVsZW1lbnQuZ2V0UmVzb3VyY2VzT2ZJZChpZCk7XG4gICAgdmFyIGN1c3RvbVByb3BlcnRpZXMgPSByZGZFbGVtZW50LmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkKTtcblxuICAgIHZhciBnbG9iYWxBbm5vdEluZGV4ID0gMDtcbiAgICAvLyBoYW5kbGUgY29udHJvbGxlZCBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgZnVsbFF1YWxpZmllciBpbiByZXNvdXJjZXMpIHtcbiAgICAgIHZhciByZWxhdGlvbiA9IGxpYnNiZ25qcy5hbm5vdC5VdGlsLnJlZHVjZVByZWZpeChmdWxsUXVhbGlmaWVyKTtcbiAgICAgIGZvcih2YXIgaT0wOyBpPHJlc291cmNlc1tmdWxsUXVhbGlmaWVyXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsdWUgPSByZXNvdXJjZXNbZnVsbFF1YWxpZmllcl1baV07XG4gICAgICAgIHZhciBzZWxlY3RlZERCID0gZGJGcm9tVXJsKHZhbHVlKTtcbiAgICAgICAgY3lPYmplY3QgPSBmaWxsRWxlbWVudERhdGFBbm5vdGF0aW9uKGN5T2JqZWN0LCBnbG9iYWxBbm5vdEluZGV4LCBcInZhbGlkYXRlZFwiLCBzZWxlY3RlZERCLCByZWxhdGlvbiwgdmFsdWUpO1xuICAgICAgICBnbG9iYWxBbm5vdEluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGhhbmRsZSBjdXN0b20gcHJvcGVydGllc1xuICAgIGZvciAodmFyIGtleSBpbiBjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBjdXN0b21Qcm9wZXJ0aWVzW2tleV07XG4gICAgICBjeU9iamVjdCA9IGZpbGxFbGVtZW50RGF0YUFubm90YXRpb24oY3lPYmplY3QsIGdsb2JhbEFubm90SW5kZXgsIFwidmFsaWRhdGVkXCIsIGtleSwgXCJzaW86U0lPXzAwMDIyM1wiLCB2YWx1ZSk7XG4gICAgICBnbG9iYWxBbm5vdEluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN5T2JqZWN0O1xuICB9LFxuICB0cmF2ZXJzZU5vZGVzOiBmdW5jdGlvbiAoZWxlLCBqc29uQXJyYXksIHBhcmVudCwgY29tcGFydG1lbnRzKSB7XG4gICAgdmFyIGVsSWQgPSBlbGUuaWQ7XG4gICAgaWYgKCFlbGVtZW50VXRpbGl0aWVzLmhhbmRsZWRFbGVtZW50c1tlbGUuY2xhc3NfXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluc2VydGVkTm9kZXNbZWxJZF0gPSB0cnVlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBhZGQgY29tcGxleCBub2RlcyBoZXJlXG5cbiAgICB2YXIgZWxlQ2xhc3MgPSBlbGUuY2xhc3NfO1xuXG4gICAgaWYgKGVsZUNsYXNzID09PSAnY29tcGxleCcgfHwgZWxlQ2xhc3MgPT09ICdjb21wbGV4IG11bHRpbWVyJyB8fCBlbGVDbGFzcyA9PT0gJ3N1Ym1hcCcpIHtcbiAgICAgIHNlbGYuYWRkQ3l0b3NjYXBlSnNOb2RlKGVsZSwganNvbkFycmF5LCBwYXJlbnQsIGNvbXBhcnRtZW50cyk7XG5cbiAgICAgIHZhciBjaGlsZEdseXBocyA9IGVsZS5nbHlwaE1lbWJlcnM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkR2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IGNoaWxkR2x5cGhzW2ldO1xuICAgICAgICB2YXIgZ2x5cGhDbGFzcyA9IGdseXBoLmNsYXNzXztcbiAgICAgICAgaWYgKGdseXBoQ2xhc3MgIT09ICdzdGF0ZSB2YXJpYWJsZScgJiYgZ2x5cGhDbGFzcyAhPT0gJ3VuaXQgb2YgaW5mb3JtYXRpb24nKSB7XG4gICAgICAgICAgc2VsZi50cmF2ZXJzZU5vZGVzKGdseXBoLCBqc29uQXJyYXksIGVsSWQsIGNvbXBhcnRtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5hZGRDeXRvc2NhcGVKc05vZGUoZWxlLCBqc29uQXJyYXksIHBhcmVudCwgY29tcGFydG1lbnRzKTtcbiAgICB9XG4gIH0sXG4gIGdldFBvcnRzOiBmdW5jdGlvbiAoeG1sT2JqZWN0KSB7XG4gICAgcmV0dXJuICggeG1sT2JqZWN0Ll9jYWNoZWRQb3J0cyA9IHhtbE9iamVjdC5fY2FjaGVkUG9ydHMgfHwgeG1sT2JqZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ3BvcnQnKSk7XG4gIH0sXG4gIGdldEdseXBoczogZnVuY3Rpb24gKHhtbE9iamVjdCkge1xuICAgIHZhciBnbHlwaHMgPSB4bWxPYmplY3QuX2NhY2hlZEdseXBocztcblxuICAgIGlmICghZ2x5cGhzKSB7XG4gICAgICBnbHlwaHMgPSB4bWxPYmplY3QuX2NhY2hlZEdseXBocyA9IHhtbE9iamVjdC5fY2FjaGVkR2x5cGhzIHx8IHhtbE9iamVjdC5xdWVyeVNlbGVjdG9yQWxsKCdnbHlwaCcpO1xuXG4gICAgICB2YXIgaWQyZ2x5cGggPSB4bWxPYmplY3QuX2lkMmdseXBoID0ge307XG5cbiAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdmFyIGcgPSBnbHlwaHNbaV07XG4gICAgICAgIHZhciBpZCA9IGcuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgICAgIGlkMmdseXBoWyBpZCBdID0gZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9LFxuICBnZXRHbHlwaEJ5SWQ6IGZ1bmN0aW9uICh4bWxPYmplY3QsIGlkKSB7XG4gICAgdGhpcy5nZXRHbHlwaHMoeG1sT2JqZWN0KTsgLy8gbWFrZSBzdXJlIGNhY2hlIGlzIGJ1aWx0XG5cbiAgICByZXR1cm4geG1sT2JqZWN0Ll9pZDJnbHlwaFtpZF07XG4gIH0sXG4gIGdldEFyY1NvdXJjZUFuZFRhcmdldDogZnVuY3Rpb24gKGFyYywgeG1sT2JqZWN0KSB7XG4gICAgLy8gc291cmNlIGFuZCB0YXJnZXQgY2FuIGJlIGluc2lkZSBvZiBhIHBvcnRcbiAgICB2YXIgc291cmNlID0gYXJjLnNvdXJjZTtcbiAgICB2YXIgdGFyZ2V0ID0gYXJjLnRhcmdldDtcbiAgICB2YXIgc291cmNlTm9kZUlkO1xuICAgIHZhciB0YXJnZXROb2RlSWQ7XG5cbiAgICB2YXIgc291cmNlRXhpc3RzID0gdGhpcy5nZXRHbHlwaEJ5SWQoeG1sT2JqZWN0LCBzb3VyY2UpO1xuICAgIHZhciB0YXJnZXRFeGlzdHMgPSB0aGlzLmdldEdseXBoQnlJZCh4bWxPYmplY3QsIHRhcmdldCk7XG5cbiAgICBpZiAoc291cmNlRXhpc3RzKSB7XG4gICAgICBzb3VyY2VOb2RlSWQgPSBzb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldEV4aXN0cykge1xuICAgICAgdGFyZ2V0Tm9kZUlkID0gdGFyZ2V0O1xuICAgIH1cblxuXG4gICAgdmFyIGk7XG4gICAgdmFyIHBvcnRFbHMgPSB0aGlzLmdldFBvcnRzKHhtbE9iamVjdCk7XG4gICAgdmFyIHBvcnQ7XG4gICAgaWYgKHNvdXJjZU5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydEVscy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgcG9ydCA9IHBvcnRFbHNbaV07XG4gICAgICAgIGlmIChwb3J0LmdldEF0dHJpYnV0ZSgnaWQnKSA9PT0gc291cmNlKSB7XG4gICAgICAgICAgc291cmNlTm9kZUlkID0gcG9ydC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXROb2RlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHBvcnRFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcG9ydCA9IHBvcnRFbHNbaV07XG4gICAgICAgIGlmIChwb3J0LmdldEF0dHJpYnV0ZSgnaWQnKSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0Tm9kZUlkID0gcG9ydC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7J3NvdXJjZSc6IHNvdXJjZU5vZGVJZCwgJ3RhcmdldCc6IHRhcmdldE5vZGVJZH07XG4gIH0sXG5cbiAgZ2V0QXJjQmVuZFBvaW50UG9zaXRpb25zOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGJlbmRQb2ludFBvc2l0aW9ucyA9IFtdO1xuXG4gICAgdmFyIGNoaWxkcmVuID0gZWxlLm5leHRzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBvc1ggPSBjaGlsZHJlbltpXS54O1xuICAgICAgdmFyIHBvc1kgPSBjaGlsZHJlbltpXS55O1xuXG4gICAgICBiZW5kUG9pbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIHg6IHBvc1gsXG4gICAgICAgIHk6IHBvc1lcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBiZW5kUG9pbnRQb3NpdGlvbnM7XG4gIH0sXG4gIGFkZEN5dG9zY2FwZUpzRWRnZTogZnVuY3Rpb24gKGVsZSwganNvbkFycmF5LCB4bWxPYmplY3QpIHtcbiAgICBpZiAoIWVsZW1lbnRVdGlsaXRpZXMuaGFuZGxlZEVsZW1lbnRzW2VsZS5jbGFzc19dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzb3VyY2VBbmRUYXJnZXQgPSBzZWxmLmdldEFyY1NvdXJjZUFuZFRhcmdldChlbGUsIHhtbE9iamVjdCk7XG5cbiAgICBpZiAoIXRoaXMuaW5zZXJ0ZWROb2Rlc1tzb3VyY2VBbmRUYXJnZXQuc291cmNlXSB8fCAhdGhpcy5pbnNlcnRlZE5vZGVzW3NvdXJjZUFuZFRhcmdldC50YXJnZXRdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVkZ2VPYmogPSB7fTtcbiAgICB2YXIgYmVuZFBvaW50UG9zaXRpb25zID0gc2VsZi5nZXRBcmNCZW5kUG9pbnRQb3NpdGlvbnMoZWxlKTtcblxuICAgIGVkZ2VPYmouaWQgPSBlbGUuaWQgfHwgdW5kZWZpbmVkO1xuICAgIGVkZ2VPYmouY2xhc3MgPSBlbGUuY2xhc3NfO1xuICAgIGVkZ2VPYmouYmVuZFBvaW50UG9zaXRpb25zID0gYmVuZFBvaW50UG9zaXRpb25zO1xuICAgIC8vIGFkZCBsYW5ndWFnZSBpbmZvLCB0aGlzIHdpbGwgYWx3YXlzIGJlIHRoZSBtYXBUeXBlXG4gICAgZWRnZU9iai5sYW5ndWFnZSA9IGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZTtcblxuICAgIGVkZ2VPYmouY2FyZGluYWxpdHkgPSAwO1xuICAgIGlmIChlbGUuZ2x5cGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlLmdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZWxlLmdseXBoc1tpXS5jbGFzc18gPT09ICdjYXJkaW5hbGl0eScpIHtcbiAgICAgICAgICB2YXIgbGFiZWwgPSBlbGUuZ2x5cGhzW2ldLmxhYmVsO1xuICAgICAgICAgIGVkZ2VPYmouY2FyZGluYWxpdHkgPSBsYWJlbC50ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGVkZ2VPYmouc291cmNlID0gc291cmNlQW5kVGFyZ2V0LnNvdXJjZTtcbiAgICBlZGdlT2JqLnRhcmdldCA9IHNvdXJjZUFuZFRhcmdldC50YXJnZXQ7XG5cbiAgICBlZGdlT2JqLnBvcnRzb3VyY2UgPSBlbGUuc291cmNlO1xuICAgIGVkZ2VPYmoucG9ydHRhcmdldCA9IGVsZS50YXJnZXQ7XG5cbiAgICBpZiAoZWxlLmV4dGVuc2lvbiAmJiBlbGUuZXh0ZW5zaW9uLmhhcygnYW5ub3RhdGlvbicpKSB7IC8vIGFubm90YXRpb24gZXh0ZW5zaW9uIHdhcyBmb3VuZFxuICAgICAgdmFyIHJkZkVsZW1lbnQgPSBlbGUuZXh0ZW5zaW9uLmdldCgnYW5ub3RhdGlvbicpLnJkZkVsZW1lbnQ7XG4gICAgICBlZGdlT2JqID0gc2VsZi5oYW5kbGVBbm5vdGF0aW9ucyhlZGdlT2JqLCByZGZFbGVtZW50KTtcbiAgICB9XG5cbiAgICB2YXIgY3l0b3NjYXBlSnNFZGdlID0ge2RhdGE6IGVkZ2VPYmp9O1xuICAgIGpzb25BcnJheS5wdXNoKGN5dG9zY2FwZUpzRWRnZSk7XG4gIH0sXG4gIGFwcGx5U3R5bGU6IGZ1bmN0aW9uIChyZW5kZXJJbmZvcm1hdGlvbiwgbm9kZXMsIGVkZ2VzKSB7XG4gICAgLy8gZ2V0IGFsbCBjb2xvciBpZCByZWZlcmVuY2VzIHRvIHRoZWlyIHZhbHVlXG4gICAgdmFyIGNvbG9yTGlzdCA9IHJlbmRlckluZm9ybWF0aW9uLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuY29sb3JEZWZpbml0aW9ucztcbiAgICB2YXIgY29sb3JJRFRvVmFsdWUgPSB7fTtcbiAgICBmb3IgKHZhciBpPTA7IGkgPCBjb2xvckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbG9ySURUb1ZhbHVlW2NvbG9yTGlzdFtpXS5pZF0gPSBjb2xvckxpc3RbaV0udmFsdWU7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBzdHlsZSBsaXN0IHRvIGVsZW1lbnRJZC1pbmRleGVkIG9iamVjdCBwb2ludGluZyB0byBzdHlsZVxuICAgIC8vIGFsc28gY29udmVydCBjb2xvciByZWZlcmVuY2VzIHRvIGNvbG9yIHZhbHVlc1xuICAgIHZhciBzdHlsZUxpc3QgPSByZW5kZXJJbmZvcm1hdGlvbi5saXN0T2ZTdHlsZXMuc3R5bGVzO1xuICAgIHZhciBlbGVtZW50SURUb1N0eWxlID0ge307XG4gICAgZm9yICh2YXIgaT0wOyBpIDwgc3R5bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZUxpc3RbaV07XG4gICAgICB2YXIgcmVuZGVyR3JvdXAgPSBzdHlsZS5yZW5kZXJHcm91cDtcblxuICAgICAgLy8gY29udmVydCBjb2xvciByZWZlcmVuY2VzXG4gICAgICBpZiAocmVuZGVyR3JvdXAuc3Ryb2tlICE9IG51bGwpIHtcbiAgICAgICAgcmVuZGVyR3JvdXAuc3Ryb2tlID0gY29sb3JJRFRvVmFsdWVbcmVuZGVyR3JvdXAuc3Ryb2tlXTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW5kZXJHcm91cC5maWxsICE9IG51bGwpIHtcbiAgICAgICAgcmVuZGVyR3JvdXAuZmlsbCA9IGNvbG9ySURUb1ZhbHVlW3JlbmRlckdyb3VwLmZpbGxdO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWRMaXN0ID0gc3R5bGUuaWRMaXN0LnNwbGl0KCcgJyk7XG4gICAgICBmb3IgKHZhciBqPTA7IGogPCBpZExpc3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGlkID0gaWRMaXN0W2pdO1xuICAgICAgICBlbGVtZW50SURUb1N0eWxlW2lkXSA9IHJlbmRlckdyb3VwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhleFRvRGVjaW1hbCAoaGV4KSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUludCgnMHgnK2hleCkgLyAyNTUgKiAxMDApIC8gMTAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnZlcnRIZXhDb2xvciAoaGV4KSB7XG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PSA3KSB7IC8vIG5vIG9wYWNpdHkgcHJvdmlkZWRcbiAgICAgICAgcmV0dXJuIHtvcGFjaXR5OiBudWxsLCBjb2xvcjogaGV4fTtcbiAgICAgIH1cbiAgICAgIGVsc2UgeyAvLyBsZW5ndGggb2YgOVxuICAgICAgICB2YXIgY29sb3IgPSBoZXguc2xpY2UoMCw3KTtcbiAgICAgICAgdmFyIG9wYWNpdHkgPSBoZXhUb0RlY2ltYWwoaGV4LnNsaWNlKC0yKSk7XG4gICAgICAgIHJldHVybiB7b3BhY2l0eTogb3BhY2l0eSwgY29sb3I6IGNvbG9yfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBseSB0aGUgc3R5bGUgdG8gbm9kZXMgYW5kIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBzdHlsZVxuICAgIGZvciAodmFyIGk9MDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBjb2xvciBwcm9wZXJ0aWVzLCB3ZSBuZWVkIHRvIGNoZWNrIG9wYWNpdHlcbiAgICAgIHZhciBiZ0NvbG9yID0gZWxlbWVudElEVG9TdHlsZVtub2RlLmRhdGFbJ2lkJ11dLmZpbGw7XG4gICAgICBpZiAoYmdDb2xvcikge1xuICAgICAgICB2YXIgcmVzID0gY29udmVydEhleENvbG9yKGJnQ29sb3IpO1xuICAgICAgICBub2RlLmRhdGFbJ2JhY2tncm91bmQtY29sb3InXSA9IHJlcy5jb2xvcjtcbiAgICAgICAgbm9kZS5kYXRhWydiYWNrZ3JvdW5kLW9wYWNpdHknXSA9IHJlcy5vcGFjaXR5O1xuICAgICAgfVxuXG4gICAgICB2YXIgYm9yZGVyQ29sb3IgPSBlbGVtZW50SURUb1N0eWxlW25vZGUuZGF0YVsnaWQnXV0uc3Ryb2tlO1xuICAgICAgaWYgKGJvcmRlckNvbG9yKSB7XG4gICAgICAgIHZhciByZXMgPSBjb252ZXJ0SGV4Q29sb3IoYm9yZGVyQ29sb3IpO1xuICAgICAgICBub2RlLmRhdGFbJ2JvcmRlci1jb2xvciddID0gcmVzLmNvbG9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgYm9yZGVyV2lkdGggPSBlbGVtZW50SURUb1N0eWxlW25vZGUuZGF0YVsnaWQnXV0uc3Ryb2tlV2lkdGg7XG4gICAgICBpZiAoYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgbm9kZS5kYXRhWydib3JkZXItd2lkdGgnXSA9IGJvcmRlcldpZHRoO1xuICAgICAgfVxuXG4gICAgICB2YXIgZm9udFNpemUgPSBlbGVtZW50SURUb1N0eWxlW25vZGUuZGF0YVsnaWQnXV0uZm9udFNpemU7XG4gICAgICBpZiAoZm9udFNpemUpIHtcbiAgICAgICAgbm9kZS5kYXRhWydmb250LXNpemUnXSA9IGZvbnRTaXplO1xuICAgICAgfVxuXG4gICAgICB2YXIgZm9udEZhbWlseSA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5mb250RmFtaWx5O1xuICAgICAgaWYgKGZvbnRGYW1pbHkpIHtcbiAgICAgICAgbm9kZS5kYXRhWydmb250LWZhbWlseSddID0gZm9udEZhbWlseTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvbnRTdHlsZSA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5mb250U3R5bGU7XG4gICAgICBpZiAoZm9udFN0eWxlKSB7XG4gICAgICAgIG5vZGUuZGF0YVsnZm9udC1zdHlsZSddID0gZm9udFN0eWxlO1xuICAgICAgfVxuXG4gICAgICB2YXIgZm9udFdlaWdodCA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5mb250V2VpZ2h0O1xuICAgICAgaWYgKGZvbnRXZWlnaHQpIHtcbiAgICAgICAgbm9kZS5kYXRhWydmb250LXdlaWdodCddID0gZm9udFdlaWdodDtcbiAgICAgIH1cblxuICAgICAgdmFyIHRleHRBbmNob3IgPSBlbGVtZW50SURUb1N0eWxlW25vZGUuZGF0YVsnaWQnXV0udGV4dEFuY2hvcjtcbiAgICAgIGlmICh0ZXh0QW5jaG9yKSB7XG4gICAgICAgIG5vZGUuZGF0YVsndGV4dC1oYWxpZ24nXSA9IHRleHRBbmNob3I7XG4gICAgICB9XG5cbiAgICAgIHZhciB2dGV4dEFuY2hvciA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS52dGV4dEFuY2hvcjtcbiAgICAgIGlmICh2dGV4dEFuY2hvcikge1xuICAgICAgICBub2RlLmRhdGFbJ3RleHQtdmFsaWduJ10gPSB2dGV4dEFuY2hvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkbyB0aGUgc2FtZSBmb3IgZWRnZXNcbiAgICBmb3IgKHZhciBpPTA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcblxuICAgICAgdmFyIGxpbmVDb2xvciA9IGVsZW1lbnRJRFRvU3R5bGVbZWRnZS5kYXRhWydpZCddXS5zdHJva2U7XG4gICAgICBpZiAobGluZUNvbG9yKSB7XG4gICAgICAgIHZhciByZXMgPSBjb252ZXJ0SGV4Q29sb3IobGluZUNvbG9yKTtcbiAgICAgICAgZWRnZS5kYXRhWydsaW5lLWNvbG9yJ10gPSByZXMuY29sb3I7XG4gICAgICB9XG5cbiAgICAgIHZhciB3aWR0aCA9IGVsZW1lbnRJRFRvU3R5bGVbZWRnZS5kYXRhWydpZCddXS5zdHJva2VXaWR0aDtcbiAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICBlZGdlLmRhdGFbJ3dpZHRoJ10gPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG1hcFByb3BlcnRpZXNUb09iajogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMubWFwLmV4dGVuc2lvbiAmJiB0aGlzLm1hcC5leHRlbnNpb24uaGFzKCdtYXBQcm9wZXJ0aWVzJykpIHsgLy8gcmVuZGVyIGV4dGVuc2lvbiB3YXMgZm91bmRcbiAgICAgICB2YXIgeG1sID0gdGhpcy5tYXAuZXh0ZW5zaW9uLmdldCgnbWFwUHJvcGVydGllcycpO1xuICAgICAgIHZhciBvYmo7XG4gICAgICAgcGFyc2VTdHJpbmcoeG1sLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICBvYmogPSByZXN1bHQ7XG4gICAgICAgfSk7XG4gICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH0sXG4gIGNvbnZlcnQ6IGZ1bmN0aW9uICh4bWxPYmplY3QpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN5dG9zY2FwZUpzTm9kZXMgPSBbXTtcbiAgICB2YXIgY3l0b3NjYXBlSnNFZGdlcyA9IFtdO1xuICAgIHZhciBjb21wYXJ0bWVudENoaWxkcmVuTWFwID0ge307IC8vIE1hcCBjb21wYXJ0bWVudHMgY2hpbGRyZW4gdGVtcG9yYXJpbHlcblxuICAgIHZhciBzYmduO1xuICAgIHRyeSB7XG4gICAgICB2YXIgeG1sU3RyaW5nID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxPYmplY3QpO1xuICAgICAgc2JnbiA9IGxpYnNiZ25qcy5TYmduLmZyb21YTUwoeG1sU3RyaW5nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHBhcnNlIHNiZ25tbC4gXCIrIGVycik7XG4gICAgfVxuXG4gICAgdmFyIG1hcDtcbiAgICBpZihzYmduLm1hcHMubGVuZ3RoIDwgMSkgeyAvLyBlbXB0eSBzYmduXG4gICAgICByZXR1cm4ge25vZGVzOiBbXSwgZWRnZXM6IFtdfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtYXAgPSBzYmduLm1hcHNbMF07IC8vIHRha2UgZmlyc3QgbWFwIG9mIHRoZSBmaWxlIGFzIHRoZSBtYWluIG1hcFxuICAgIH1cblxuICAgIHRoaXMubWFwID0gbWFwO1xuICAgIGlmKG1hcC5sYW5ndWFnZSA9PSBcInByb2Nlc3MgZGVzY3JpcHRpb25cIikge1xuICAgICAgZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlID0gXCJQRFwiO1xuICAgIH1cbiAgICBlbHNlIGlmKG1hcC5sYW5ndWFnZSA9PSBcImFjdGl2aXR5IGZsb3dcIikge1xuICAgICAgZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlID0gXCJBRlwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSA9IFwiVW5rbm93blwiO1xuICAgIH1cblxuICAgIHZhciBjb21wYXJ0bWVudHMgPSBzZWxmLmdldEFsbENvbXBhcnRtZW50cyhtYXAuZ2x5cGhzKTtcblxuICAgIHZhciBnbHlwaHMgPSBtYXAuZ2x5cGhzO1xuICAgIHZhciBhcmNzID0gbWFwLmFyY3M7XG5cbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBcbiAgICAgIC8vIGxpYnNiZ24gbGlicmFyeSBsaXN0cyB0aGUgZ2x5cGhzIG9mIGNvbXBsZXhlcyBpbiBlbGUuZ2x5cGhNZW1iZXJzIGJ1dCBpdCBkb2VzIG5vdCBzdG9yZSB0aGUgZ2x5cGhzIG9mIGNvbXBhcnRtZW50c1xuICAgICAgLy8gc3RvcmUgZ2x5cGggbWVtYmVycyBvZiBjb21wYXJ0bWVudHMgaGVyZS5cbiAgICAgIHZhciBjb21wYXJ0bWVudFJlZiA9IGdseXBoLmNvbXBhcnRtZW50UmVmO1xuICAgICAgXG4gICAgICBpZiAoZ2x5cGguY2xhc3NfID09PSAnY29tcGFydG1lbnQnKSB7XG4gICAgICAgIGlmIChjb21wYXJ0bWVudENoaWxkcmVuTWFwW2dseXBoLmlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29tcGFydG1lbnRDaGlsZHJlbk1hcFtnbHlwaC5pZF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZ2x5cGguZ2x5cGhNZW1iZXJzID0gY29tcGFydG1lbnRDaGlsZHJlbk1hcFtnbHlwaC5pZF07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChjb21wYXJ0bWVudFJlZikge1xuICAgICAgICBpZiAoY29tcGFydG1lbnRDaGlsZHJlbk1hcFtjb21wYXJ0bWVudFJlZl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbXBhcnRtZW50Q2hpbGRyZW5NYXBbY29tcGFydG1lbnRSZWZdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgY29tcGFydG1lbnRDaGlsZHJlbk1hcFtjb21wYXJ0bWVudFJlZl0ucHVzaChnbHlwaCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIHNlbGYudHJhdmVyc2VOb2RlcyhnbHlwaCwgY3l0b3NjYXBlSnNOb2RlcywgJycsIGNvbXBhcnRtZW50cyk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGFyY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhcmMgPSBhcmNzW2ldO1xuICAgICAgc2VsZi5hZGRDeXRvc2NhcGVKc0VkZ2UoYXJjLCBjeXRvc2NhcGVKc0VkZ2VzLCB4bWxPYmplY3QpO1xuICAgIH1cblxuICAgIGlmIChtYXAuZXh0ZW5zaW9uICYmIG1hcC5leHRlbnNpb24uaGFzKCdyZW5kZXJJbmZvcm1hdGlvbicpKSB7IC8vIHJlbmRlciBleHRlbnNpb24gd2FzIGZvdW5kXG4gICAgICBzZWxmLmFwcGx5U3R5bGUobWFwLmV4dGVuc2lvbi5nZXQoJ3JlbmRlckluZm9ybWF0aW9uJyksIGN5dG9zY2FwZUpzTm9kZXMsIGN5dG9zY2FwZUpzRWRnZXMpO1xuICAgIH1cblxuICAgIHZhciBjeXRvc2NhcGVKc0dyYXBoID0ge307XG4gICAgY3l0b3NjYXBlSnNHcmFwaC5ub2RlcyA9IGN5dG9zY2FwZUpzTm9kZXM7XG4gICAgY3l0b3NjYXBlSnNHcmFwaC5lZGdlcyA9IGN5dG9zY2FwZUpzRWRnZXM7XG5cbiAgICB0aGlzLmluc2VydGVkTm9kZXMgPSB7fTtcblxuICAgIHJldHVybiBjeXRvc2NhcGVKc0dyYXBoO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNiZ25tbFRvSnNvbjtcbiIsIi8qXG4gKiBUZXh0IHV0aWxpdGllcyBmb3IgY29tbW9uIHVzYWdlXG4gKi9cblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xuXG52YXIgdGV4dFV0aWxpdGllcyA9IHtcbiAgLy9UT0RPOiB1c2UgQ1NTJ3MgXCJ0ZXh0LW92ZXJmbG93OmVsbGlwc2lzXCIgc3R5bGUgaW5zdGVhZCBvZiBmdW5jdGlvbiBiZWxvdz9cbiAgdHJ1bmNhdGVUZXh0OiBmdW5jdGlvbiAodGV4dFByb3AsIGZvbnQpIHtcbiAgICB2YXIgY29udGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmZvbnQgPSBmb250O1xuICAgIFxuICAgIHZhciBmaXRMYWJlbHNUb05vZGVzID0gb3B0aW9ucy5maXRMYWJlbHNUb05vZGVzO1xuICAgIGZpdExhYmVsc1RvTm9kZXMgPSB0eXBlb2YgZml0TGFiZWxzVG9Ob2RlcyA9PT0gJ2Z1bmN0aW9uJyA/IGZpdExhYmVsc1RvTm9kZXMuY2FsbCgpIDogZml0TGFiZWxzVG9Ob2RlcztcbiAgICBcbiAgICB2YXIgdGV4dCA9IHRleHRQcm9wLmxhYmVsIHx8IFwiXCI7XG4gICAgLy9JZiBmaXQgbGFiZWxzIHRvIG5vZGVzIGlzIGZhbHNlIGRvIG5vdCB0cnVuY2F0ZVxuICAgIGlmIChmaXRMYWJlbHNUb05vZGVzID09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgdmFyIHdpZHRoO1xuICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aDtcbiAgICB2YXIgZWxsaXBzaXMgPSBcIi4uXCI7XG4gICAgdmFyIHRleHRXaWR0aCA9ICh0ZXh0UHJvcC53aWR0aCA+IDMwKSA/IHRleHRQcm9wLndpZHRoIC0gMTYgOiB0ZXh0UHJvcC53aWR0aDtcbiAgICB3aGlsZSAoKHdpZHRoID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aCkgPiB0ZXh0V2lkdGgpIHtcbiAgICAgIC0tbGVuO1xuICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGxlbikgKyBlbGxpcHNpcztcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH0sXG5cbiAgLy8gc2FtZSBwdXJwb3NlIGFzIHByZXZpb3VzIG9uZSwgYnV0IHdpdGggY2xlYXJlciByZXNwb25zaWJpbGl0eVxuICB0cnVuY2F0ZTogZnVuY3Rpb24odGV4dCwgZm9udCwgd2lkdGgpIHtcbiAgICB2YXIgY29udGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb250ZXh0LmZvbnQgPSBmb250O1xuICAgIC8vIGNoZWNrIHRyaXZpYWwgY2FzZSBmaXJzdCwgd2hlbiBlbnRpcmUgdGV4dCBpcyBhbHJlYWR5IHNtYWxsIGVub3VnaFxuICAgIGlmKGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGggPCB3aWR0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIGVsbGlwc2lzID0gXCIuLlwiO1xuICAgICAgLy8gaWYgZWxsaXBzaXMgYWxvbmUgaXMgYWxyZWFkeSB0b28gbGFyZ2VcbiAgICAgIGlmKGNvbnRleHQubWVhc3VyZVRleHQoZWxsaXBzaXMpLndpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5hbExlbmd0aDsgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGhhdmUgYSB2YWx1ZSBhZnRlciB0aGUgbG9vcFxuICAgICAgZm9yKHZhciBpPTA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdWJ0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaSkgKyBlbGxpcHNpcztcbiAgICAgICAgaWYgKGNvbnRleHQubWVhc3VyZVRleHQoc3VidGV4dCkud2lkdGggPiB3aWR0aCkgeyAvLyB3ZSdyZSB0b28gZmFyLCB0YWtlIHRoZSBwcmV2aW91cyBpbmRleFxuICAgICAgICAgIGZpbmFsTGVuZ3RoID0gaSA+IDAgPyBpLTEgOiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgZmluYWxMZW5ndGgpICsgZWxsaXBzaXM7XG4gICAgfVxuICB9LFxuXG4gIC8vIGVuc3VyZSB0aGF0IHJldHVybmVkIHN0cmluZyBmb2xsb3dzIHhzZDpJRCBzdGFuZGFyZFxuICAvLyBzaG91bGQgZm9sbG93IHInXlthLXpBLVpfXVtcXHcuLV0qJCdcbiAgZ2V0WE1MVmFsaWRJZDogZnVuY3Rpb24ob3JpZ2luYWxJZCkge1xuICAgIHZhciBuZXdJZCA9IFwiXCI7XG4gICAgdmFyIHhtbFZhbGlkUmVnZXggPSAvXlthLXpBLVpfXVtcXHcuLV0qJC87XG4gICAgaWYgKCEgeG1sVmFsaWRSZWdleC50ZXN0KG9yaWdpbmFsSWQpKSB7IC8vIGRvZXNuJ3QgY29tcGx5XG4gICAgICBuZXdJZCA9IG9yaWdpbmFsSWQ7XG4gICAgICBuZXdJZCA9IG5ld0lkLnJlcGxhY2UoL1teXFx3Li1dL2csIFwiXCIpO1xuICAgICAgaWYgKCEgeG1sVmFsaWRSZWdleC50ZXN0KG5ld0lkKSkgeyAvLyBzdGlsbCBkb2Vzbid0IGNvbXBseVxuICAgICAgICBuZXdJZCA9IFwiX1wiICsgbmV3SWQ7XG4gICAgICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChuZXdJZCkpIHsgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIG5ldmVyIGVudGVyIHRoaXNcbiAgICAgICAgICAvLyBpZiBmb3Igc29tZSBvYnNjdXJlIHJlYXNvbiB3ZSBzdGlsbCBkb24ndCBjb21wbHksIHRocm93IGVycm9yLlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IG1ha2UgaWRlbnRpZmVyIGNvbXBseSB0byB4c2Q6SUQgcmVxdWlyZW1lbnRzOiBcIituZXdJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdJZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxJZDtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB0ZXh0VXRpbGl0aWVzO1xuIiwiLypcbiAqIENvbW1vbmx5IG5lZWRlZCBVSSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgb3B0aW9uVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9vcHRpb24tdXRpbGl0aWVzJyk7XG52YXIgb3B0aW9ucyA9IG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zKCk7XG52YXIgbGlicyA9IHJlcXVpcmUoJy4vbGliLXV0aWxpdGllcycpLmdldExpYnMoKTtcbnZhciBqUXVlcnkgPSAkID0gbGlicy5qUXVlcnk7XG5cbnZhciB1aVV0aWxpdGllcyA9IHtcbiAgc3RhcnRTcGlubmVyOiBmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZSA9ICdkZWZhdWx0LWNsYXNzJztcbiAgICB9XG4gICAgXG4gICAgaWYgKCQoJy4nICsgY2xhc3NOYW1lKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHZhciBjb250YWluZXJXaWR0aCA9ICQob3B0aW9ucy5uZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IpLndpZHRoKCk7XG4gICAgICB2YXIgY29udGFpbmVySGVpZ2h0ID0gJChvcHRpb25zLm5ldHdvcmtDb250YWluZXJTZWxlY3RvcikuaGVpZ2h0KCk7XG4gICAgICAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yICsgJzpwYXJlbnQnKS5wcmVwZW5kKCc8aSBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogOTk5OTk5OTsgbGVmdDogJyArIGNvbnRhaW5lcldpZHRoIC8gMiArICdweDsgdG9wOiAnICsgY29udGFpbmVySGVpZ2h0IC8gMiArICdweDtcIiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpbiBmYS0zeCBmYS1mdyAnICsgY2xhc3NOYW1lICsgJ1wiPjwvaT4nKTtcbiAgICB9XG4gIH0sXG4gIGVuZFNwaW5uZXI6IGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gJ2RlZmF1bHQtY2xhc3MnO1xuICAgIH1cbiAgICBcbiAgICBpZiAoJCgnLicgKyBjbGFzc05hbWUpLmxlbmd0aCA+IDApIHtcbiAgICAgICQoJy4nICsgY2xhc3NOYW1lKS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdWlVdGlsaXRpZXM7XG5cblxuIiwiLypcbiAqIFRoaXMgZmlsZSBleHBvcnRzIHRoZSBmdW5jdGlvbnMgdG8gYmUgdXRpbGl6ZWQgaW4gdW5kb3JlZG8gZXh0ZW5zaW9uIGFjdGlvbnMgXG4gKi9cbnZhciBlbGVtZW50VXRpbGl0aWVzID0gcmVxdWlyZSgnLi9lbGVtZW50LXV0aWxpdGllcycpO1xuXG52YXIgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMgPSB7XG4gIGRlbGV0ZUVsZXNTaW1wbGU6IGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmRlbGV0ZUVsZXNTaW1wbGUocGFyYW0uZWxlcyk7XG4gIH0sXG4gIHJlc3RvcmVFbGVzOiBmdW5jdGlvbiAoZWxlcykge1xuICAgIHZhciBwYXJhbSA9IHt9O1xuICAgIHBhcmFtLmVsZXMgPSBlbGVtZW50VXRpbGl0aWVzLnJlc3RvcmVFbGVzKGVsZXMpO1xuICAgIHJldHVybiBwYXJhbTtcbiAgfSxcbiAgZGVsZXRlTm9kZXNTbWFydDogZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgaWYgKHBhcmFtLmZpcnN0VGltZSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZGVsZXRlTm9kZXNTbWFydChwYXJhbS5lbGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZGVsZXRlRWxlc1NpbXBsZShwYXJhbS5lbGVzKTtcbiAgfSxcbiAgc2V0UG9ydHNPcmRlcmluZzogZnVuY3Rpb24ocGFyYW0pIHtcbiAgICB2YXIgbm9kZXMgPSBwYXJhbS5ub2RlcztcbiAgICB2YXIgb3JkZXJpbmcgPSBwYXJhbS5vcmRlcmluZztcbiAgICB2YXIgcG9ydERpc3RhbmNlID0gcGFyYW0ucG9ydERpc3RhbmNlO1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGVzLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgdmFyIG5vZGVQcm9wTWFwID0ge307IC8vIE5vZGUgcHJvcCBtYXAgZm9yIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBub2RlcyBpdCBpcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgcmVzdWx0IG1hcC4gSXQgaW5jbHVkZXMgbm9kZSBjdXJyZW50IHBvcnQgb3JkZXJpbmcgYW5kIGN1cnJlbnQgcG9ydHMuXG4gICAgdmFyIGVkZ2VQcm9wTWFwID0ge307IC8vIEVkZ2UgcHJvcCBtYXAgZm9yIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBub2RlcyBpdCBpcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgcmVzdWx0IG1hcC4gSXQgaW5jbHVkZXMgZWRnZSBwb3J0c291cmNlIGFuZCBwb3J0dGFyZ2V0LlxuXG4gICAgLy8gRmlsbCBub2RlL2VkZ2UgcHJvcCBtYXBzIGZvciB1bmRvL3JlZG8gYWN0aW9uc1xuXG4gICAgLy8gTm9kZSBwcm9wIG1hcCBpbmNsdWRlcyBhIGNvcHkgb2Ygbm9kZSBwb3J0c1xuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBwb3J0cyA9IG5vZGUuZGF0YSgncG9ydHMnKTtcbiAgICAgIHZhciBjdXJyZW50T3JkZXJpbmcgPSBzYmdudml6LmVsZW1lbnRVdGlsaXRpZXMuZ2V0UG9ydHNPcmRlcmluZyhub2RlKTsgLy8gR2V0IHRoZSBjdXJyZW50IG5vZGUgcG9ydHMgb3JkZXJpbmdcbiAgICAgIHZhciBwb3J0c0NvcHkgPSBwb3J0cy5sZW5ndGggPT09IDIgPyBbIHsgaWQ6IHBvcnRzWzBdLmlkLCB4OiBwb3J0c1swXS54LCB5OiBwb3J0c1swXS55IH0sIHsgaWQ6IHBvcnRzWzFdLmlkLCB4OiBwb3J0c1sxXS54LCB5OiBwb3J0c1sxXS55IH0gXSA6IFtdO1xuICAgICAgbm9kZVByb3BNYXBbbm9kZS5pZCgpXSA9IHsgb3JkZXJpbmc6IGN1cnJlbnRPcmRlcmluZywgcG9ydHM6IHBvcnRzQ29weSB9O1xuICAgIH1cblxuICAgIC8vIE5vZGUgcHJvcCBtYXAgaW5jbHVkZXMgZWRnZSBwb3J0c291cmNlIGFuZCBwb3J0dGFyZ2V0XG4gICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2ldO1xuICAgICAgZWRnZVByb3BNYXBbZWRnZS5pZCgpXSA9IHsgcG9ydHNvdXJjZTogZWRnZS5kYXRhKCdwb3J0c291cmNlJyksIHBvcnR0YXJnZXQ6IGVkZ2UuZGF0YSgncG9ydHRhcmdldCcpIH07XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIG5vZGVQcm9wTWFwOiBub2RlUHJvcE1hcCxcbiAgICAgIGVkZ2VQcm9wTWFwOiBlZGdlUHJvcE1hcFxuICAgIH07XG5cbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGNhbGwgcmVsYXRlZCBtZXRob2QgZnJvbSBlbGVtZW50IHV0aWxpdGllcyBlbHNlIGdvIGJhY2sgdG8gdGhlIHN0b3JlZCBwcm9wcyBvZiBub2Rlcy9lZGdlc1xuICAgIGlmICggcGFyYW0uZmlyc3RUaW1lICkge1xuICAgICAgZWxlbWVudFV0aWxpdGllcy5zZXRQb3J0c09yZGVyaW5nKG5vZGVzLCBvcmRlcmluZywgcG9ydERpc3RhbmNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICAgIC8vIEdvIGJhY2sgdG8gc3RvcmVkIG5vZGUgcG9ydHMgc3RhdGVcbiAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICB2YXIgcG9ydHNUb1JldHVybiA9IHBhcmFtLm5vZGVQcm9wTWFwW25vZGUuaWQoKV0ucG9ydHM7XG4gICAgICAgIHZhciBvcmRlcmluZ3NUb1JldHVybiA9IHBhcmFtLm5vZGVQcm9wTWFwW25vZGUuaWQoKV0ub3JkZXJpbmc7XG4gICAgICAgIG5vZGUuZGF0YSgncG9ydHMnLCBwb3J0c1RvUmV0dXJuKTtcbiAgICAgICAgbm9kZS5kYXRhKCdwb3J0c29yZGVyaW5nJywgb3JkZXJpbmdzVG9SZXR1cm4pOyAvLyBVcGRhdGUgdGhlIGNhY2hlZCBwb3J0cyBvcmRlcmluZ1xuICAgICAgfVxuXG4gICAgICAvLyBHbyBiYWNrIHRvIHN0b3JlZCBlZGdlIHBvcnRzb3VyY2UvcG9ydHRhcmdldHMgc3RhdGVcbiAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNvbm5lY3RlZEVkZ2VzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICB2YXIgZWRnZSA9IGNvbm5lY3RlZEVkZ2VzW2ldO1xuICAgICAgICB2YXIgcHJvcHMgPSBwYXJhbS5lZGdlUHJvcE1hcFtlZGdlLmlkKCldO1xuICAgICAgICBlZGdlLmRhdGEoJ3BvcnRzb3VyY2UnLCBwcm9wcy5wb3J0c291cmNlKTtcbiAgICAgICAgZWRnZS5kYXRhKCdwb3J0dGFyZ2V0JywgcHJvcHMucG9ydHRhcmdldCk7XG4gICAgICB9XG5cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9uczsiXX0= +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXN5bmMvbGliL2FzeW5jLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9saWIvYjY0LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2VzNi1wcm9taXNlL2Rpc3QvZXM2LXByb21pc2UuanMiLCJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9mb3JlYWNoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmRleG9mL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvaXMtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzb25sZC9icm93c2VyL2lnbm9yZS5qcyIsIm5vZGVfbW9kdWxlcy9qc29ubGQvanMvanNvbmxkLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbGlic2Jnbi5qcy9zcmMvYW5ub3RhdGlvbi11dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9saWJzYmduLmpzL3NyYy9saWJzYmduLWFubm90YXRpb25zLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvc3JjL2xpYnNiZ24tcmVuZGVyLmpzIiwibm9kZV9tb2R1bGVzL2xpYnNiZ24uanMvc3JjL2xpYnNiZ24uanMiLCJub2RlX21vZHVsZXMvbGlic2Jnbi5qcy9zcmMvdXRpbGl0aWVzLmpzIiwibm9kZV9tb2R1bGVzL24zL04zLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM0xleGVyLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM1BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9uMy9saWIvTjNTdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvbjMvbGliL04zU3RyZWFtV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL24zL2xpYi9OM1V0aWwuanMiLCJub2RlX21vZHVsZXMvbjMvbGliL04zV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwibm9kZV9tb2R1bGVzL3ByZXR0eS1kYXRhL3ByZXR0eS1kYXRhLmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZGVjb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvYmxhbmstbm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2NsYXNzLW9yZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvY29sbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9kYXRhLWZhY3RvcnkuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9kZWZhdWx0LWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvZW1wdHkuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9mZXRjaGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvZm9ybXVsYS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvaW5kZXhlZC1mb3JtdWxhLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvanNvbnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL2xpdGVyYWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9sb2cuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9uM3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL25hbWVkLW5vZGUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9uYW1lc3BhY2UuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9ub2RlLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvcGFyc2UuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9wYXRjaC1wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9xdWVyeS10by1zcGFycWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9xdWVyeS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3JkZmFwYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9yZGZ4bWxwYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9zZXJpYWxpemUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi9zZXJpYWxpemVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvc3BhcnFsLXRvLXF1ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvc3RhdGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9saWIvdXBkYXRlLW1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi91cGRhdGVzLXZpYS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3VyaS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL2xpYi92YXJpYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbGliL3hzZC5qcyIsIm5vZGVfbW9kdWxlcy9yZGZsaWIvbm9kZV9tb2R1bGVzL24zL2xpYi9OM0xleGVyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zUGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zU3RvcmUuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1QYXJzZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNTdHJlYW1Xcml0ZXIuanMiLCJub2RlX21vZHVsZXMvcmRmbGliL25vZGVfbW9kdWxlcy9uMy9saWIvTjNVdGlsLmpzIiwibm9kZV9tb2R1bGVzL3JkZmxpYi9ub2RlX21vZHVsZXMvbjMvbGliL04zV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9kdXBsZXgtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS1icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3NheC9saWIvc2F4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9jYXBhYmlsaXR5LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwibm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXNwb25zZS5qcyIsIm5vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwibm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL2JvbS5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL2J1aWxkZXIuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL3Byb2Nlc3NvcnMuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL2xpYi94bWwyanMuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvVXRpbGl0eS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxBdHRyaWJ1dGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ0RhdGEuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ29tbWVudC5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEVERBdHRMaXN0LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERUREVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRFRERW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERURE5vdGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERlY2xhcmF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERvY1R5cGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRG9jdW1lbnRDQi5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTE5vZGUuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFJhdy5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxTdHJlYW1Xcml0ZXIuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MU3RyaW5nV3JpdGVyLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFN0cmluZ2lmaWVyLmpzIiwibm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFRleHQuanMiLCJub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MV3JpdGVyQmFzZS5qcyIsIm5vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94bWxkb20vZG9tLXBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy94bWxkb20vZG9tLmpzIiwibm9kZV9tb2R1bGVzL3htbGRvbS9zYXguanMiLCJub2RlX21vZHVsZXMveG1saHR0cHJlcXVlc3QvbGliL1hNTEh0dHBSZXF1ZXN0LmpzIiwibm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsInBhY2thZ2UuanNvbiIsInNyYy9pbmRleC5qcyIsInNyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1pbnN0YW5jZS5qcyIsInNyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1yZW5kZXJlci5qcyIsInNyYy91dGlsaXRpZXMvY2xhc3Nlcy5qcyIsInNyYy91dGlsaXRpZXMvZWxlbWVudC11dGlsaXRpZXMuanMiLCJzcmMvdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9ncmFwaC11dGlsaXRpZXMuanMiLCJzcmMvdXRpbGl0aWVzL2pzb24tdG8tc2Jnbm1sLWNvbnZlcnRlci5qcyIsInNyYy91dGlsaXRpZXMva2V5Ym9hcmQtaW5wdXQtdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9saWItdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy9tYWluLXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLWpzb24tY29udmVydGVyLmpzIiwic3JjL3V0aWxpdGllcy90ZXh0LXV0aWxpdGllcy5qcyIsInNyYy91dGlsaXRpZXMvdWktdXRpbGl0aWVzLmpzIiwic3JjL3V0aWxpdGllcy91bmRvLXJlZG8tYWN0aW9uLWZ1bmN0aW9ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbm1DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVnREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1OEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvL1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNobEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4WkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4NEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2x4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcmhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hrREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaG5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxNEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4N0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9iQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDejdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzk3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFVBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOStCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDck5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkVBO0FBQ0E7Ozs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9RQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN0UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDbnNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcldBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNXRDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDem5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1bUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3Y0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0dkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNWpCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNod0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyohXG4gKiBhc3luY1xuICogaHR0cHM6Ly9naXRodWIuY29tL2Nhb2xhbi9hc3luY1xuICpcbiAqIENvcHlyaWdodCAyMDEwLTIwMTQgQ2FvbGFuIE1jTWFob25cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG4vKmpzaGludCBvbmV2YXI6IGZhbHNlLCBpbmRlbnQ6NCAqL1xuLypnbG9iYWwgc2V0SW1tZWRpYXRlOiBmYWxzZSwgc2V0VGltZW91dDogZmFsc2UsIGNvbnNvbGU6IGZhbHNlICovXG4oZnVuY3Rpb24gKCkge1xuXG4gICAgdmFyIGFzeW5jID0ge307XG5cbiAgICAvLyBnbG9iYWwgb24gdGhlIHNlcnZlciwgd2luZG93IGluIHRoZSBicm93c2VyXG4gICAgdmFyIHJvb3QsIHByZXZpb3VzX2FzeW5jO1xuXG4gICAgcm9vdCA9IHRoaXM7XG4gICAgaWYgKHJvb3QgIT0gbnVsbCkge1xuICAgICAgcHJldmlvdXNfYXN5bmMgPSByb290LmFzeW5jO1xuICAgIH1cblxuICAgIGFzeW5jLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJvb3QuYXN5bmMgPSBwcmV2aW91c19hc3luYztcbiAgICAgICAgcmV0dXJuIGFzeW5jO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvbmx5X29uY2UoZm4pIHtcbiAgICAgICAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsYmFjayB3YXMgYWxyZWFkeSBjYWxsZWQuXCIpO1xuICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZuLmFwcGx5KHJvb3QsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLy8vIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsaXR5IGZ1bmN0aW9ucyAvLy8vXG5cbiAgICB2YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuICAgIHZhciBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9O1xuXG4gICAgdmFyIF9lYWNoID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKGFycltpXSwgaSwgYXJyKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgX21hcCA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yKSB7XG4gICAgICAgIGlmIChhcnIubWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyLm1hcChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZXJhdG9yKHgsIGksIGEpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICB2YXIgX3JlZHVjZSA9IGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBtZW1vKSB7XG4gICAgICAgIGlmIChhcnIucmVkdWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyLnJlZHVjZShpdGVyYXRvciwgbWVtbyk7XG4gICAgICAgIH1cbiAgICAgICAgX2VhY2goYXJyLCBmdW5jdGlvbiAoeCwgaSwgYSkge1xuICAgICAgICAgICAgbWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHgsIGksIGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcblxuICAgIHZhciBfa2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cztcbiAgICB9O1xuXG4gICAgLy8vLyBleHBvcnRlZCBhc3luYyBtb2R1bGUgZnVuY3Rpb25zIC8vLy9cblxuICAgIC8vLy8gbmV4dFRpY2sgaW1wbGVtZW50YXRpb24gd2l0aCBicm93c2VyLWNvbXBhdGlibGUgZmFsbGJhY2sgLy8vL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIShwcm9jZXNzLm5leHRUaWNrKSkge1xuICAgICAgICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXN5bmMubmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAvLyBub3QgYSBkaXJlY3QgYWxpYXMgZm9yIElFMTAgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhc3luYy5uZXh0VGljayA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZSA9IGFzeW5jLm5leHRUaWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhc3luYy5uZXh0VGljayA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgIC8vIG5vdCBhIGRpcmVjdCBhbGlhcyBmb3IgSUUxMCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlID0gYXN5bmMubmV4dFRpY2s7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYy5lYWNoID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGlmICghYXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXBsZXRlZCA9IDA7XG4gICAgICAgIF9lYWNoKGFyciwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKHgsIG9ubHlfb25jZShkb25lKSApO1xuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYy5mb3JFYWNoID0gYXN5bmMuZWFjaDtcblxuICAgIGFzeW5jLmVhY2hTZXJpZXMgPSBmdW5jdGlvbiAoYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgaWYgKCFhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29tcGxldGVkID0gMDtcbiAgICAgICAgdmFyIGl0ZXJhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpdGVyYXRvcihhcnJbY29tcGxldGVkXSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID49IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaXRlcmF0ZSgpO1xuICAgIH07XG4gICAgYXN5bmMuZm9yRWFjaFNlcmllcyA9IGFzeW5jLmVhY2hTZXJpZXM7XG5cbiAgICBhc3luYy5lYWNoTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmbiA9IF9lYWNoTGltaXQobGltaXQpO1xuICAgICAgICBmbi5hcHBseShudWxsLCBbYXJyLCBpdGVyYXRvciwgY2FsbGJhY2tdKTtcbiAgICB9O1xuICAgIGFzeW5jLmZvckVhY2hMaW1pdCA9IGFzeW5jLmVhY2hMaW1pdDtcblxuICAgIHZhciBfZWFjaExpbWl0ID0gZnVuY3Rpb24gKGxpbWl0KSB7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29tcGxldGVkID0gMDtcbiAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDtcbiAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDtcblxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlcGxlbmlzaCAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nIDwgbGltaXQgJiYgc3RhcnRlZCA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yKGFycltzdGFydGVkIC0gMV0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsZW5pc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuXG4gICAgdmFyIGRvUGFyYWxsZWwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbYXN5bmMuZWFjaF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBkb1BhcmFsbGVsTGltaXQgPSBmdW5jdGlvbihsaW1pdCwgZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbX2VhY2hMaW1pdChsaW1pdCldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgZG9TZXJpZXMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBbYXN5bmMuZWFjaFNlcmllc10uY29uY2F0KGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG5cbiAgICB2YXIgX2FzeW5jTWFwID0gZnVuY3Rpb24gKGVhY2hmbiwgYXJyLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgYXJyID0gX21hcChhcnIsIGZ1bmN0aW9uICh4LCBpKSB7XG4gICAgICAgICAgICByZXR1cm4ge2luZGV4OiBpLCB2YWx1ZTogeH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAoZXJyLCB2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbeC5pbmRleF0gPSB2O1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgYXN5bmMubWFwID0gZG9QYXJhbGxlbChfYXN5bmNNYXApO1xuICAgIGFzeW5jLm1hcFNlcmllcyA9IGRvU2VyaWVzKF9hc3luY01hcCk7XG4gICAgYXN5bmMubWFwTGltaXQgPSBmdW5jdGlvbiAoYXJyLCBsaW1pdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfbWFwTGltaXQobGltaXQpKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgdmFyIF9tYXBMaW1pdCA9IGZ1bmN0aW9uKGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBkb1BhcmFsbGVsTGltaXQobGltaXQsIF9hc3luY01hcCk7XG4gICAgfTtcblxuICAgIC8vIHJlZHVjZSBvbmx5IGhhcyBhIHNlcmllcyB2ZXJzaW9uLCBhcyBkb2luZyByZWR1Y2UgaW4gcGFyYWxsZWwgd29uJ3RcbiAgICAvLyB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy5cbiAgICBhc3luYy5yZWR1Y2UgPSBmdW5jdGlvbiAoYXJyLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaFNlcmllcyhhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IobWVtbywgeCwgZnVuY3Rpb24gKGVyciwgdikge1xuICAgICAgICAgICAgICAgIG1lbW8gPSB2O1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBtZW1vKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBpbmplY3QgYWxpYXNcbiAgICBhc3luYy5pbmplY3QgPSBhc3luYy5yZWR1Y2U7XG4gICAgLy8gZm9sZGwgYWxpYXNcbiAgICBhc3luYy5mb2xkbCA9IGFzeW5jLnJlZHVjZTtcblxuICAgIGFzeW5jLnJlZHVjZVJpZ2h0ID0gZnVuY3Rpb24gKGFyciwgbWVtbywgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXZlcnNlZCA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0pLnJldmVyc2UoKTtcbiAgICAgICAgYXN5bmMucmVkdWNlKHJldmVyc2VkLCBtZW1vLCBpdGVyYXRvciwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgLy8gZm9sZHIgYWxpYXNcbiAgICBhc3luYy5mb2xkciA9IGFzeW5jLnJlZHVjZVJpZ2h0O1xuXG4gICAgdmFyIF9maWx0ZXIgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICBhcnIgPSBfbWFwKGFyciwgZnVuY3Rpb24gKHgsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiB7aW5kZXg6IGksIHZhbHVlOiB4fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeC52YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhc3luYy5maWx0ZXIgPSBkb1BhcmFsbGVsKF9maWx0ZXIpO1xuICAgIGFzeW5jLmZpbHRlclNlcmllcyA9IGRvU2VyaWVzKF9maWx0ZXIpO1xuICAgIC8vIHNlbGVjdCBhbGlhc1xuICAgIGFzeW5jLnNlbGVjdCA9IGFzeW5jLmZpbHRlcjtcbiAgICBhc3luYy5zZWxlY3RTZXJpZXMgPSBhc3luYy5maWx0ZXJTZXJpZXM7XG5cbiAgICB2YXIgX3JlamVjdCA9IGZ1bmN0aW9uIChlYWNoZm4sIGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgIGFyciA9IF9tYXAoYXJyLCBmdW5jdGlvbiAoeCwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIHtpbmRleDogaSwgdmFsdWU6IHh9O1xuICAgICAgICB9KTtcbiAgICAgICAgZWFjaGZuKGFyciwgZnVuY3Rpb24gKHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpdGVyYXRvcih4LnZhbHVlLCBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soX21hcChyZXN1bHRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhc3luYy5yZWplY3QgPSBkb1BhcmFsbGVsKF9yZWplY3QpO1xuICAgIGFzeW5jLnJlamVjdFNlcmllcyA9IGRvU2VyaWVzKF9yZWplY3QpO1xuXG4gICAgdmFyIF9kZXRlY3QgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGl0ZXJhdG9yLCBtYWluX2NhbGxiYWNrKSB7XG4gICAgICAgIGVhY2hmbihhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayh4KTtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbWFpbl9jYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFzeW5jLmRldGVjdCA9IGRvUGFyYWxsZWwoX2RldGVjdCk7XG4gICAgYXN5bmMuZGV0ZWN0U2VyaWVzID0gZG9TZXJpZXMoX2RldGVjdCk7XG5cbiAgICBhc3luYy5zb21lID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBtYWluX2NhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gYW55IGFsaWFzXG4gICAgYXN5bmMuYW55ID0gYXN5bmMuc29tZTtcblxuICAgIGFzeW5jLmV2ZXJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIG1haW5fY2FsbGJhY2spIHtcbiAgICAgICAgYXN5bmMuZWFjaChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXYpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jYWxsYmFjayhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIG1haW5fY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBtYWluX2NhbGxiYWNrKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIGFsbCBhbGlhc1xuICAgIGFzeW5jLmFsbCA9IGFzeW5jLmV2ZXJ5O1xuXG4gICAgYXN5bmMuc29ydEJ5ID0gZnVuY3Rpb24gKGFyciwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGFzeW5jLm1hcChhcnIsIGZ1bmN0aW9uICh4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaXRlcmF0b3IoeCwgZnVuY3Rpb24gKGVyciwgY3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7dmFsdWU6IHgsIGNyaXRlcmlhOiBjcml0ZXJpYX0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhLCBiID0gcmlnaHQuY3JpdGVyaWE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIF9tYXAocmVzdWx0cy5zb3J0KGZuKSwgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgudmFsdWU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXN5bmMuYXV0byA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgdmFyIGtleXMgPSBfa2V5cyh0YXNrcyk7XG4gICAgICAgIHZhciByZW1haW5pbmdUYXNrcyA9IGtleXMubGVuZ3RoXG4gICAgICAgIGlmICghcmVtYWluaW5nVGFza3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTtcblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gW107XG4gICAgICAgIHZhciBhZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoZm4pO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PT0gZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRhc2tDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlbWFpbmluZ1Rhc2tzLS1cbiAgICAgICAgICAgIF9lYWNoKGxpc3RlbmVycy5zbGljZSgwKSwgZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFkZExpc3RlbmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nVGFza3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGZpbmFsIGNhbGxiYWNrIGZyb20gY2FsbGluZyBpdHNlbGYgaWYgaXQgZXJyb3JzXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICAgICAgICAgIHRoZUNhbGxiYWNrKG51bGwsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBfZWFjaChrZXlzLCBmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSBfaXNBcnJheSh0YXNrc1trXSkgPyB0YXNrc1trXTogW3Rhc2tzW2tdXTtcbiAgICAgICAgICAgIHZhciB0YXNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzYWZlUmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBfZWFjaChfa2V5cyhyZXN1bHRzKSwgZnVuY3Rpb24ocmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNbcmtleV0gPSByZXN1bHRzW3JrZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2FmZVJlc3VsdHNba10gPSBhcmdzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHNhZmVSZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBzdWJzZXF1ZW50IGVycm9ycyBoaXR0aW5nIGNhbGxiYWNrIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJncztcbiAgICAgICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHRhc2tDb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciByZXF1aXJlcyA9IHRhc2suc2xpY2UoMCwgTWF0aC5hYnModGFzay5sZW5ndGggLSAxKSkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWR1Y2UocmVxdWlyZXMsIGZ1bmN0aW9uIChhLCB4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSAmJiByZXN1bHRzLmhhc093blByb3BlcnR5KHgpKTtcbiAgICAgICAgICAgICAgICB9LCB0cnVlKSAmJiAhcmVzdWx0cy5oYXNPd25Qcm9wZXJ0eShrKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVhZHkoKSkge1xuICAgICAgICAgICAgICAgIHRhc2tbdGFzay5sZW5ndGggLSAxXSh0YXNrQ2FsbGJhY2ssIHJlc3VsdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVhZHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFza1t0YXNrLmxlbmd0aCAtIDFdKHRhc2tDYWxsYmFjaywgcmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnJldHJ5ID0gZnVuY3Rpb24odGltZXMsIHRhc2ssIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBERUZBVUxUX1RJTUVTID0gNTtcbiAgICAgICAgdmFyIGF0dGVtcHRzID0gW107XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0cyBpZiB0aW1lcyBub3QgcGFzc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdGltZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gdGFzaztcbiAgICAgICAgICAgIHRhc2sgPSB0aW1lcztcbiAgICAgICAgICAgIHRpbWVzID0gREVGQVVMVF9USU1FUztcbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgdGltZXMgaXMgYSBudW1iZXJcbiAgICAgICAgdGltZXMgPSBwYXJzZUludCh0aW1lcywgMTApIHx8IERFRkFVTFRfVElNRVM7XG4gICAgICAgIHZhciB3cmFwcGVkVGFzayA9IGZ1bmN0aW9uKHdyYXBwZWRDYWxsYmFjaywgd3JhcHBlZFJlc3VsdHMpIHtcbiAgICAgICAgICAgIHZhciByZXRyeUF0dGVtcHQgPSBmdW5jdGlvbih0YXNrLCBmaW5hbEF0dGVtcHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2VyaWVzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGFzayhmdW5jdGlvbihlcnIsIHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXNDYWxsYmFjayghZXJyIHx8IGZpbmFsQXR0ZW1wdCwge2VycjogZXJyLCByZXN1bHQ6IHJlc3VsdH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCB3cmFwcGVkUmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3aGlsZSAodGltZXMpIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0cy5wdXNoKHJldHJ5QXR0ZW1wdCh0YXNrLCAhKHRpbWVzLT0xKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN5bmMuc2VyaWVzKGF0dGVtcHRzLCBmdW5jdGlvbihkb25lLCBkYXRhKXtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICh3cmFwcGVkQ2FsbGJhY2sgfHwgY2FsbGJhY2spKGRhdGEuZXJyLCBkYXRhLnJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhIGNhbGxiYWNrIGlzIHBhc3NlZCwgcnVuIHRoaXMgYXMgYSBjb250cm9sbCBmbG93XG4gICAgICAgIHJldHVybiBjYWxsYmFjayA/IHdyYXBwZWRUYXNrKCkgOiB3cmFwcGVkVGFza1xuICAgIH07XG5cbiAgICBhc3luYy53YXRlcmZhbGwgPSBmdW5jdGlvbiAodGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGlmICghX2lzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gd2F0ZXJmYWxsIG11c3QgYmUgYW4gYXJyYXkgb2YgZnVuY3Rpb25zJyk7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3cmFwSXRlcmF0b3IgPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh3cmFwSXRlcmF0b3IobmV4dCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHdyYXBJdGVyYXRvcihhc3luYy5pdGVyYXRvcih0YXNrcykpKCk7XG4gICAgfTtcblxuICAgIHZhciBfcGFyYWxsZWwgPSBmdW5jdGlvbihlYWNoZm4sIHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBpZiAoX2lzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgICBlYWNoZm4ubWFwKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307XG4gICAgICAgICAgICBlYWNoZm4uZWFjaChfa2V5cyh0YXNrcyksIGZ1bmN0aW9uIChrLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRhc2tzW2tdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trXSA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGFzeW5jLnBhcmFsbGVsID0gZnVuY3Rpb24gKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IGFzeW5jLm1hcCwgZWFjaDogYXN5bmMuZWFjaCB9LCB0YXNrcywgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBhc3luYy5wYXJhbGxlbExpbWl0ID0gZnVuY3Rpb24odGFza3MsIGxpbWl0LCBjYWxsYmFjaykge1xuICAgICAgICBfcGFyYWxsZWwoeyBtYXA6IF9tYXBMaW1pdChsaW1pdCksIGVhY2g6IF9lYWNoTGltaXQobGltaXQpIH0sIHRhc2tzLCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIGFzeW5jLnNlcmllcyA9IGZ1bmN0aW9uICh0YXNrcywgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgaWYgKF9pc0FycmF5KHRhc2tzKSkge1xuICAgICAgICAgICAgYXN5bmMubWFwU2VyaWVzKHRhc2tzLCBmdW5jdGlvbiAoZm4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKG51bGwsIGVyciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0ge307XG4gICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKF9rZXlzKHRhc2tzKSwgZnVuY3Rpb24gKGssIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGFza3Nba10oZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2tdID0gYXJncztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYXN5bmMuaXRlcmF0b3IgPSBmdW5jdGlvbiAodGFza3MpIHtcbiAgICAgICAgdmFyIG1ha2VDYWxsYmFjayA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza3NbaW5kZXhdLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmbi5uZXh0KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm4ubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGluZGV4IDwgdGFza3MubGVuZ3RoIC0gMSkgPyBtYWtlQ2FsbGJhY2soaW5kZXggKyAxKTogbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZm47XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIGFzeW5jLmFwcGx5ID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShcbiAgICAgICAgICAgICAgICBudWxsLCBhcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIF9jb25jYXQgPSBmdW5jdGlvbiAoZWFjaGZuLCBhcnIsIGZuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgciA9IFtdO1xuICAgICAgICBlYWNoZm4oYXJyLCBmdW5jdGlvbiAoeCwgY2IpIHtcbiAgICAgICAgICAgIGZuKHgsIGZ1bmN0aW9uIChlcnIsIHkpIHtcbiAgICAgICAgICAgICAgICByID0gci5jb25jYXQoeSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIHIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFzeW5jLmNvbmNhdCA9IGRvUGFyYWxsZWwoX2NvbmNhdCk7XG4gICAgYXN5bmMuY29uY2F0U2VyaWVzID0gZG9TZXJpZXMoX2NvbmNhdCk7XG5cbiAgICBhc3luYy53aGlsc3QgPSBmdW5jdGlvbiAodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0ZXN0KCkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3luYy53aGlsc3QodGVzdCwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBhc3luYy5kb1doaWxzdCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHtcbiAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgaWYgKHRlc3QuYXBwbHkobnVsbCwgYXJncykpIHtcbiAgICAgICAgICAgICAgICBhc3luYy5kb1doaWxzdChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnVudGlsID0gZnVuY3Rpb24gKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRlc3QoKSkge1xuICAgICAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzeW5jLnVudGlsKHRlc3QsIGl0ZXJhdG9yLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgYXN5bmMuZG9VbnRpbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spIHtcbiAgICAgICAgaXRlcmF0b3IoZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgaWYgKCF0ZXN0LmFwcGx5KG51bGwsIGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgYXN5bmMuZG9VbnRpbChpdGVyYXRvciwgdGVzdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzeW5jLnF1ZXVlID0gZnVuY3Rpb24gKHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgICAgICAgaWYgKGNvbmN1cnJlbmN5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBfaW5zZXJ0KHEsIGRhdGEsIHBvcywgY2FsbGJhY2spIHtcbiAgICAgICAgICBpZiAoIXEuc3RhcnRlZCl7XG4gICAgICAgICAgICBxLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAvLyBjYWxsIGRyYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyB0YXNrc1xuICAgICAgICAgICAgIHJldHVybiBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmIChxLmRyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykge1xuICAgICAgICAgICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIHEudGFza3MudW5zaGlmdChpdGVtKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxLnRhc2tzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAocS5zYXR1cmF0ZWQgJiYgcS50YXNrcy5sZW5ndGggPT09IHEuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgIHEuc2F0dXJhdGVkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKHEucHJvY2Vzcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd29ya2VycyA9IDA7XG4gICAgICAgIHZhciBxID0ge1xuICAgICAgICAgICAgdGFza3M6IFtdLFxuICAgICAgICAgICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgc2F0dXJhdGVkOiBudWxsLFxuICAgICAgICAgICAgZW1wdHk6IG51bGwsXG4gICAgICAgICAgICBkcmFpbjogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcGF1c2VkOiBmYWxzZSxcbiAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIGZhbHNlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2lsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBxLmRyYWluID0gbnVsbDtcbiAgICAgICAgICAgICAgcS50YXNrcyA9IFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICBfaW5zZXJ0KHEsIGRhdGEsIHRydWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFxLnBhdXNlZCAmJiB3b3JrZXJzIDwgcS5jb25jdXJyZW5jeSAmJiBxLnRhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHEudGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHEuZW1wdHkgJiYgcS50YXNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHEuZW1wdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3b3JrZXJzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VycyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmNhbGxiYWNrLmFwcGx5KHRhc2ssIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5kcmFpbiAmJiBxLnRhc2tzLmxlbmd0aCArIHdvcmtlcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBxLnByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gb25seV9vbmNlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIodGFzay5kYXRhLCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBxLnRhc2tzLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBydW5uaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtlcnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaWRsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHEudGFza3MubGVuZ3RoICsgd29ya2VycyA9PT0gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXVzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChxLnBhdXNlZCA9PT0gdHJ1ZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBxLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEucGF1c2VkID09PSBmYWxzZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBxLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FsbCBxLnByb2Nlc3Mgb25jZSBwZXIgY29uY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHdvcmtlciB0byBwcmVzZXJ2ZSBmdWxsIGNvbmN1cnJlbmN5IGFmdGVyIHBhdXNlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDE7IHcgPD0gcS5jb25jdXJyZW5jeTsgdysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jLnNldEltbWVkaWF0ZShxLnByb2Nlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfTtcblxuICAgIGFzeW5jLnByaW9yaXR5UXVldWUgPSBmdW5jdGlvbiAod29ya2VyLCBjb25jdXJyZW5jeSkge1xuXG4gICAgICAgIGZ1bmN0aW9uIF9jb21wYXJlVGFza3MoYSwgYil7XG4gICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIF9iaW5hcnlTZWFyY2goc2VxdWVuY2UsIGl0ZW0sIGNvbXBhcmUpIHtcbiAgICAgICAgICB2YXIgYmVnID0gLTEsXG4gICAgICAgICAgICAgIGVuZCA9IHNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgd2hpbGUgKGJlZyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IGJlZyArICgoZW5kIC0gYmVnICsgMSkgPj4+IDEpO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoaXRlbSwgc2VxdWVuY2VbbWlkXSkgPj0gMCkge1xuICAgICAgICAgICAgICBiZWcgPSBtaWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYmVnO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gX2luc2VydChxLCBkYXRhLCBwcmlvcml0eSwgY2FsbGJhY2spIHtcbiAgICAgICAgICBpZiAoIXEuc3RhcnRlZCl7XG4gICAgICAgICAgICBxLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAvLyBjYWxsIGRyYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGFyZSBubyB0YXNrc1xuICAgICAgICAgICAgIHJldHVybiBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgIGlmIChxLmRyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICBxLmRyYWluKCk7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2VhY2goZGF0YSwgZnVuY3Rpb24odGFzaykge1xuICAgICAgICAgICAgICB2YXIgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHRhc2ssXG4gICAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHksXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gY2FsbGJhY2sgOiBudWxsXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgcS50YXNrcy5zcGxpY2UoX2JpbmFyeVNlYXJjaChxLnRhc2tzLCBpdGVtLCBfY29tcGFyZVRhc2tzKSArIDEsIDAsIGl0ZW0pO1xuXG4gICAgICAgICAgICAgIGlmIChxLnNhdHVyYXRlZCAmJiBxLnRhc2tzLmxlbmd0aCA9PT0gcS5jb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgICAgICAgcS5zYXR1cmF0ZWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhc3luYy5zZXRJbW1lZGlhdGUocS5wcm9jZXNzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHdpdGggYSBub3JtYWwgcXVldWVcbiAgICAgICAgdmFyIHEgPSBhc3luYy5xdWV1ZSh3b3JrZXIsIGNvbmN1cnJlbmN5KTtcblxuICAgICAgICAvLyBPdmVycmlkZSBwdXNoIHRvIGFjY2VwdCBzZWNvbmQgcGFyYW1ldGVyIHJlcHJlc2VudGluZyBwcmlvcml0eVxuICAgICAgICBxLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgcHJpb3JpdHksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgX2luc2VydChxLCBkYXRhLCBwcmlvcml0eSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFJlbW92ZSB1bnNoaWZ0IGZ1bmN0aW9uXG4gICAgICAgIGRlbGV0ZSBxLnVuc2hpZnQ7XG5cbiAgICAgICAgcmV0dXJuIHE7XG4gICAgfTtcblxuICAgIGFzeW5jLmNhcmdvID0gZnVuY3Rpb24gKHdvcmtlciwgcGF5bG9hZCkge1xuICAgICAgICB2YXIgd29ya2luZyAgICAgPSBmYWxzZSxcbiAgICAgICAgICAgIHRhc2tzICAgICAgID0gW107XG5cbiAgICAgICAgdmFyIGNhcmdvID0ge1xuICAgICAgICAgICAgdGFza3M6IHRhc2tzLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgICAgIHNhdHVyYXRlZDogbnVsbCxcbiAgICAgICAgICAgIGVtcHR5OiBudWxsLFxuICAgICAgICAgICAgZHJhaW46IG51bGwsXG4gICAgICAgICAgICBkcmFpbmVkOiB0cnVlLFxuICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gW2RhdGFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZWFjaChkYXRhLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGFzayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNhcmdvLmRyYWluZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmdvLnNhdHVyYXRlZCAmJiB0YXNrcy5sZW5ndGggPT09IHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvLnNhdHVyYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXN5bmMuc2V0SW1tZWRpYXRlKGNhcmdvLnByb2Nlc3MpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIHByb2Nlc3MoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGNhcmdvLmRyYWluICYmICFjYXJnby5kcmFpbmVkKSBjYXJnby5kcmFpbigpO1xuICAgICAgICAgICAgICAgICAgICBjYXJnby5kcmFpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0cyA9IHR5cGVvZiBwYXlsb2FkID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFza3Muc3BsaWNlKDAsIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YXNrcy5zcGxpY2UoMCwgdGFza3MubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIHZhciBkcyA9IF9tYXAodHMsIGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLmRhdGE7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZihjYXJnby5lbXB0eSkgY2FyZ28uZW1wdHkoKTtcbiAgICAgICAgICAgICAgICB3b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3b3JrZXIoZHMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBfZWFjaCh0cywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jYWxsYmFjay5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5sZW5ndGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcnVubmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JraW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY2FyZ287XG4gICAgfTtcblxuICAgIHZhciBfY29uc29sZV9mbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29uc29sZVtuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2VhY2goYXJncywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW25hbWVdKHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XSkpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgYXN5bmMubG9nID0gX2NvbnNvbGVfZm4oJ2xvZycpO1xuICAgIGFzeW5jLmRpciA9IF9jb25zb2xlX2ZuKCdkaXInKTtcbiAgICAvKmFzeW5jLmluZm8gPSBfY29uc29sZV9mbignaW5mbycpO1xuICAgIGFzeW5jLndhcm4gPSBfY29uc29sZV9mbignd2FybicpO1xuICAgIGFzeW5jLmVycm9yID0gX2NvbnNvbGVfZm4oJ2Vycm9yJyk7Ki9cblxuICAgIGFzeW5jLm1lbW9pemUgPSBmdW5jdGlvbiAoZm4sIGhhc2hlcikge1xuICAgICAgICB2YXIgbWVtbyA9IHt9O1xuICAgICAgICB2YXIgcXVldWVzID0ge307XG4gICAgICAgIGhhc2hlciA9IGhhc2hlciB8fCBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB2YXIga2V5ID0gaGFzaGVyLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKGtleSBpbiBtZW1vKSB7XG4gICAgICAgICAgICAgICAgYXN5bmMubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBtZW1vW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5IGluIHF1ZXVlcykge1xuICAgICAgICAgICAgICAgIHF1ZXVlc1trZXldLnB1c2goY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdO1xuICAgICAgICAgICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcVtpXS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbWVtb2l6ZWQubWVtbyA9IG1lbW87XG4gICAgICAgIG1lbW9pemVkLnVubWVtb2l6ZWQgPSBmbjtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH07XG5cbiAgICBhc3luYy51bm1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoZm4udW5tZW1vaXplZCB8fCBmbikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGFzeW5jLnRpbWVzID0gZnVuY3Rpb24gKGNvdW50LCBpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvdW50ZXIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb3VudGVyLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzeW5jLm1hcChjb3VudGVyLCBpdGVyYXRvciwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBhc3luYy50aW1lc1NlcmllcyA9IGZ1bmN0aW9uIChjb3VudCwgaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBjb3VudGVyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY291bnRlci5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYy5tYXBTZXJpZXMoY291bnRlciwgaXRlcmF0b3IsIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgYXN5bmMuc2VxID0gZnVuY3Rpb24gKC8qIGZ1bmN0aW9ucy4uLiAqLykge1xuICAgICAgICB2YXIgZm5zID0gYXJndW1lbnRzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgICAgIGFzeW5jLnJlZHVjZShmbnMsIGFyZ3MsIGZ1bmN0aW9uIChuZXdhcmdzLCBmbiwgY2IpIHtcbiAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBuZXdhcmdzLmNvbmNhdChbZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICBjYihlcnIsIG5leHRhcmdzKTtcbiAgICAgICAgICAgICAgICB9XSkpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVyciwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoYXQsIFtlcnJdLmNvbmNhdChyZXN1bHRzKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgYXN5bmMuY29tcG9zZSA9IGZ1bmN0aW9uICgvKiBmdW5jdGlvbnMuLi4gKi8pIHtcbiAgICAgIHJldHVybiBhc3luYy5zZXEuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnJldmVyc2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgdmFyIF9hcHBseUVhY2ggPSBmdW5jdGlvbiAoZWFjaGZuLCBmbnMgLyphcmdzLi4uKi8pIHtcbiAgICAgICAgdmFyIGdvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCBmdW5jdGlvbiAoZm4sIGNiKSB7XG4gICAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncy5jb25jYXQoW2NiXSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgICAgICAgICByZXR1cm4gZ28uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ287XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jLmFwcGx5RWFjaCA9IGRvUGFyYWxsZWwoX2FwcGx5RWFjaCk7XG4gICAgYXN5bmMuYXBwbHlFYWNoU2VyaWVzID0gZG9TZXJpZXMoX2FwcGx5RWFjaCk7XG5cbiAgICBhc3luYy5mb3JldmVyID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBuZXh0KGVycikge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm4obmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgIH07XG5cbiAgICAvLyBOb2RlLmpzXG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gYXN5bmM7XG4gICAgfVxuICAgIC8vIEFNRCAvIFJlcXVpcmVKU1xuICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgIT09ICd1bmRlZmluZWQnICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlZCBkaXJlY3RseSB2aWEgPHNjcmlwdD4gdGFnXG4gICAgZWxzZSB7XG4gICAgICAgIHJvb3QuYXN5bmMgPSBhc3luYztcbiAgICB9XG5cbn0oKSk7XG4iLCJ2YXIgbG9va3VwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG47KGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuICB2YXIgQXJyID0gKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJylcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IEFycmF5XG5cblx0dmFyIFBMVVMgICA9ICcrJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSCAgPSAnLycuY2hhckNvZGVBdCgwKVxuXHR2YXIgTlVNQkVSID0gJzAnLmNoYXJDb2RlQXQoMClcblx0dmFyIExPV0VSICA9ICdhJy5jaGFyQ29kZUF0KDApXG5cdHZhciBVUFBFUiAgPSAnQScuY2hhckNvZGVBdCgwKVxuXHR2YXIgUExVU19VUkxfU0FGRSA9ICctJy5jaGFyQ29kZUF0KDApXG5cdHZhciBTTEFTSF9VUkxfU0FGRSA9ICdfJy5jaGFyQ29kZUF0KDApXG5cblx0ZnVuY3Rpb24gZGVjb2RlIChlbHQpIHtcblx0XHR2YXIgY29kZSA9IGVsdC5jaGFyQ29kZUF0KDApXG5cdFx0aWYgKGNvZGUgPT09IFBMVVMgfHxcblx0XHQgICAgY29kZSA9PT0gUExVU19VUkxfU0FGRSlcblx0XHRcdHJldHVybiA2MiAvLyAnKydcblx0XHRpZiAoY29kZSA9PT0gU0xBU0ggfHxcblx0XHQgICAgY29kZSA9PT0gU0xBU0hfVVJMX1NBRkUpXG5cdFx0XHRyZXR1cm4gNjMgLy8gJy8nXG5cdFx0aWYgKGNvZGUgPCBOVU1CRVIpXG5cdFx0XHRyZXR1cm4gLTEgLy9ubyBtYXRjaFxuXHRcdGlmIChjb2RlIDwgTlVNQkVSICsgMTApXG5cdFx0XHRyZXR1cm4gY29kZSAtIE5VTUJFUiArIDI2ICsgMjZcblx0XHRpZiAoY29kZSA8IFVQUEVSICsgMjYpXG5cdFx0XHRyZXR1cm4gY29kZSAtIFVQUEVSXG5cdFx0aWYgKGNvZGUgPCBMT1dFUiArIDI2KVxuXHRcdFx0cmV0dXJuIGNvZGUgLSBMT1dFUiArIDI2XG5cdH1cblxuXHRmdW5jdGlvbiBiNjRUb0J5dGVBcnJheSAoYjY0KSB7XG5cdFx0dmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcblxuXHRcdGlmIChiNjQubGVuZ3RoICUgNCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG5cdFx0fVxuXG5cdFx0Ly8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcblx0XHQvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG5cdFx0Ly8gcmVwcmVzZW50IG9uZSBieXRlXG5cdFx0Ly8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG5cdFx0Ly8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuXHRcdHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cdFx0cGxhY2VIb2xkZXJzID0gJz0nID09PSBiNjQuY2hhckF0KGxlbiAtIDIpID8gMiA6ICc9JyA9PT0gYjY0LmNoYXJBdChsZW4gLSAxKSA/IDEgOiAwXG5cblx0XHQvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblx0XHRhcnIgPSBuZXcgQXJyKGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuXHRcdC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblx0XHRsID0gcGxhY2VIb2xkZXJzID4gMCA/IGI2NC5sZW5ndGggLSA0IDogYjY0Lmxlbmd0aFxuXG5cdFx0dmFyIEwgPSAwXG5cblx0XHRmdW5jdGlvbiBwdXNoICh2KSB7XG5cdFx0XHRhcnJbTCsrXSA9IHZcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDE4KSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDEyKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMikpIDw8IDYpIHwgZGVjb2RlKGI2NC5jaGFyQXQoaSArIDMpKVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwMDApID4+IDE2KVxuXHRcdFx0cHVzaCgodG1wICYgMHhGRjAwKSA+PiA4KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH1cblxuXHRcdGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcblx0XHRcdHRtcCA9IChkZWNvZGUoYjY0LmNoYXJBdChpKSkgPDwgMikgfCAoZGVjb2RlKGI2NC5jaGFyQXQoaSArIDEpKSA+PiA0KVxuXHRcdFx0cHVzaCh0bXAgJiAweEZGKVxuXHRcdH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG5cdFx0XHR0bXAgPSAoZGVjb2RlKGI2NC5jaGFyQXQoaSkpIDw8IDEwKSB8IChkZWNvZGUoYjY0LmNoYXJBdChpICsgMSkpIDw8IDQpIHwgKGRlY29kZShiNjQuY2hhckF0KGkgKyAyKSkgPj4gMilcblx0XHRcdHB1c2goKHRtcCA+PiA4KSAmIDB4RkYpXG5cdFx0XHRwdXNoKHRtcCAmIDB4RkYpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFyclxuXHR9XG5cblx0ZnVuY3Rpb24gdWludDhUb0Jhc2U2NCAodWludDgpIHtcblx0XHR2YXIgaSxcblx0XHRcdGV4dHJhQnl0ZXMgPSB1aW50OC5sZW5ndGggJSAzLCAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXHRcdFx0b3V0cHV0ID0gXCJcIixcblx0XHRcdHRlbXAsIGxlbmd0aFxuXG5cdFx0ZnVuY3Rpb24gZW5jb2RlIChudW0pIHtcblx0XHRcdHJldHVybiBsb29rdXAuY2hhckF0KG51bSlcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuXHRcdFx0cmV0dXJuIGVuY29kZShudW0gPj4gMTggJiAweDNGKSArIGVuY29kZShudW0gPj4gMTIgJiAweDNGKSArIGVuY29kZShudW0gPj4gNiAmIDB4M0YpICsgZW5jb2RlKG51bSAmIDB4M0YpXG5cdFx0fVxuXG5cdFx0Ly8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHVpbnQ4Lmxlbmd0aCAtIGV4dHJhQnl0ZXM7IGkgPCBsZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0dGVtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcblx0XHRcdG91dHB1dCArPSB0cmlwbGV0VG9CYXNlNjQodGVtcClcblx0XHR9XG5cblx0XHQvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG5cdFx0c3dpdGNoIChleHRyYUJ5dGVzKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRlbXAgPSB1aW50OFt1aW50OC5sZW5ndGggLSAxXVxuXHRcdFx0XHRvdXRwdXQgKz0gZW5jb2RlKHRlbXAgPj4gMilcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA8PCA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSAnPT0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRlbXAgPSAodWludDhbdWludDgubGVuZ3RoIC0gMl0gPDwgOCkgKyAodWludDhbdWludDgubGVuZ3RoIC0gMV0pXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUodGVtcCA+PiAxMClcblx0XHRcdFx0b3V0cHV0ICs9IGVuY29kZSgodGVtcCA+PiA0KSAmIDB4M0YpXG5cdFx0XHRcdG91dHB1dCArPSBlbmNvZGUoKHRlbXAgPDwgMikgJiAweDNGKVxuXHRcdFx0XHRvdXRwdXQgKz0gJz0nXG5cdFx0XHRcdGJyZWFrXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG5cblx0ZXhwb3J0cy50b0J5dGVBcnJheSA9IGI2NFRvQnl0ZUFycmF5XG5cdGV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IHVpbnQ4VG9CYXNlNjRcbn0odHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnID8gKHRoaXMuYmFzZTY0anMgPSB7fSkgOiBleHBvcnRzKSlcbiIsbnVsbCwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG52YXIgcm9vdFBhcmVudCA9IHt9XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gU2FmYXJpIDUtNyBsYWNrcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgYE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3JgIHByb3BlcnR5XG4gKiAgICAgb24gb2JqZWN0cy5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIGZ1bmN0aW9uIEJhciAoKSB7fVxuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5mb28gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9XG4gICAgYXJyLmNvbnN0cnVjdG9yID0gQmFyXG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgYXJyLmNvbnN0cnVjdG9yID09PSBCYXIgJiYgLy8gY29uc3RydWN0b3IgY2FuIGJlIHNldFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG4vKipcbiAqIENsYXNzOiBCdWZmZXJcbiAqID09PT09PT09PT09PT1cbiAqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGFyZSBhdWdtZW50ZWRcbiAqIHdpdGggZnVuY3Rpb24gcHJvcGVydGllcyBmb3IgYWxsIHRoZSBub2RlIGBCdWZmZXJgIEFQSSBmdW5jdGlvbnMuIFdlIHVzZVxuICogYFVpbnQ4QXJyYXlgIHNvIHRoYXQgc3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXQgcmV0dXJuc1xuICogYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogQnkgYXVnbWVudGluZyB0aGUgaW5zdGFuY2VzLCB3ZSBjYW4gYXZvaWQgbW9kaWZ5aW5nIHRoZSBgVWludDhBcnJheWBcbiAqIHByb3RvdHlwZS5cbiAqL1xuZnVuY3Rpb24gQnVmZmVyIChhcmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAvLyBBdm9pZCBnb2luZyB0aHJvdWdoIGFuIEFyZ3VtZW50c0FkYXB0b3JUcmFtcG9saW5lIGluIHRoZSBjb21tb24gY2FzZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHJldHVybiBuZXcgQnVmZmVyKGFyZywgYXJndW1lbnRzWzFdKVxuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZylcbiAgfVxuXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmcm9tTnVtYmVyKHRoaXMsIGFyZylcbiAgfVxuXG4gIC8vIFNsaWdodGx5IGxlc3MgY29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoaXMsIGFyZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiAndXRmOCcpXG4gIH1cblxuICAvLyBVbnVzdWFsLlxuICByZXR1cm4gZnJvbU9iamVjdCh0aGlzLCBhcmcpXG59XG5cbmZ1bmN0aW9uIGZyb21OdW1iZXIgKHRoYXQsIGxlbmd0aCkge1xuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGxlbmd0aCkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgLy8gQXNzdW1wdGlvbjogYnl0ZUxlbmd0aCgpIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPCBrTWF4TGVuZ3RoLlxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcblxuICB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkpIHJldHVybiBmcm9tQnVmZmVyKHRoYXQsIG9iamVjdClcblxuICBpZiAoaXNBcnJheShvYmplY3QpKSByZXR1cm4gZnJvbUFycmF5KHRoYXQsIG9iamVjdClcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHN0YXJ0IHdpdGggbnVtYmVyLCBidWZmZXIsIGFycmF5IG9yIHN0cmluZycpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChvYmplY3QuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBmcm9tVHlwZWRBcnJheSh0aGF0LCBvYmplY3QpXG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCBvYmplY3QpXG4gICAgfVxuICB9XG5cbiAgaWYgKG9iamVjdC5sZW5ndGgpIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iamVjdClcblxuICByZXR1cm4gZnJvbUpzb25PYmplY3QodGhhdCwgb2JqZWN0KVxufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyICh0aGF0LCBidWZmZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYnVmZmVyLmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBhbGxvY2F0ZSh0aGF0LCBsZW5ndGgpXG4gIGJ1ZmZlci5jb3B5KHRoYXQsIDAsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5ICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLy8gRHVwbGljYXRlIG9mIGZyb21BcnJheSgpIHRvIGtlZXAgZnJvbUFycmF5KCkgbW9ub21vcnBoaWMuXG5mdW5jdGlvbiBmcm9tVHlwZWRBcnJheSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgLy8gVHJ1bmNhdGluZyB0aGUgZWxlbWVudHMgaXMgcHJvYmFibHkgbm90IHdoYXQgcGVvcGxlIGV4cGVjdCBmcm9tIHR5cGVkXG4gIC8vIGFycmF5cyB3aXRoIEJZVEVTX1BFUl9FTEVNRU5UID4gMSBidXQgaXQncyBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yXG4gIC8vIG9mIHRoZSBvbGQgQnVmZmVyIGNvbnN0cnVjdG9yLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICBhcnJheS5ieXRlTGVuZ3RoXG4gICAgdGhhdCA9IEJ1ZmZlci5fYXVnbWVudChuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tVHlwZWRBcnJheSh0aGF0LCBuZXcgVWludDhBcnJheShhcnJheSkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGFsbG9jYXRlKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8vIERlc2VyaWFsaXplIHsgdHlwZTogJ0J1ZmZlcicsIGRhdGE6IFsxLDIsMywuLi5dIH0gaW50byBhIEJ1ZmZlciBvYmplY3QuXG4vLyBSZXR1cm5zIGEgemVyby1sZW5ndGggYnVmZmVyIGZvciBpbnB1dHMgdGhhdCBkb24ndCBjb25mb3JtIHRvIHRoZSBzcGVjLlxuZnVuY3Rpb24gZnJvbUpzb25PYmplY3QgKHRoYXQsIG9iamVjdCkge1xuICB2YXIgYXJyYXlcbiAgdmFyIGxlbmd0aCA9IDBcblxuICBpZiAob2JqZWN0LnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqZWN0LmRhdGEpKSB7XG4gICAgYXJyYXkgPSBvYmplY3QuZGF0YVxuICAgIGxlbmd0aCA9IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgfVxuICB0aGF0ID0gYWxsb2NhdGUodGhhdCwgbGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxufSBlbHNlIHtcbiAgLy8gcHJlLXNldCBmb3IgdmFsdWVzIHRoYXQgbWF5IGV4aXN0IGluIHRoZSBmdXR1cmVcbiAgQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSB1bmRlZmluZWRcbiAgQnVmZmVyLnByb3RvdHlwZS5wYXJlbnQgPSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gYWxsb2NhdGUgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gQnVmZmVyLl9hdWdtZW50KG5ldyBVaW50OEFycmF5KGxlbmd0aCkpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhhdC5faXNCdWZmZXIgPSB0cnVlXG4gIH1cblxuICB2YXIgZnJvbVBvb2wgPSBsZW5ndGggIT09IDAgJiYgbGVuZ3RoIDw9IEJ1ZmZlci5wb29sU2l6ZSA+Pj4gMVxuICBpZiAoZnJvbVBvb2wpIHRoYXQucGFyZW50ID0gcm9vdFBhcmVudFxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAoc3ViamVjdCwgZW5jb2RpbmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNsb3dCdWZmZXIpKSByZXR1cm4gbmV3IFNsb3dCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG5cbiAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoc3ViamVjdCwgZW5jb2RpbmcpXG4gIGRlbGV0ZSBidWYucGFyZW50XG4gIHJldHVybiBidWZcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIHZhciBpID0gMFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgYnJlYWtcblxuICAgICsraVxuICB9XG5cbiAgaWYgKGkgIT09IGxlbikge1xuICAgIHggPSBhW2ldXG4gICAgeSA9IGJbaV1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAncmF3JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbGlzdCBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMuJylcblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldXG4gICAgaXRlbS5jb3B5KGJ1ZiwgcG9zKVxuICAgIHBvcyArPSBpdGVtLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHN0cmluZyA9ICcnICsgc3RyaW5nXG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgY2FzZSAncmF3cyc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgc3RhcnQgPSBzdGFydCB8IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID09PSBJbmZpbml0eSA/IHRoaXMubGVuZ3RoIDogZW5kIHwgMFxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG4gIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmIChlbmQgPD0gc3RhcnQpIHJldHVybiAnJ1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGJpbmFyeVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gMFxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYilcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0KSB7XG4gIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgYnl0ZU9mZnNldCA+Pj0gMFxuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG4gIGlmIChieXRlT2Zmc2V0ID49IHRoaXMubGVuZ3RoKSByZXR1cm4gLTFcblxuICAvLyBOZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoICsgYnl0ZU9mZnNldCwgMClcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xIC8vIHNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nIGFsd2F5cyBmYWlsc1xuICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodGhpcywgdmFsLCBieXRlT2Zmc2V0KVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKHRoaXMsIFsgdmFsIF0sIGJ5dGVPZmZzZXQpXG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0KSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAodmFyIGkgPSAwOyBieXRlT2Zmc2V0ICsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltieXRlT2Zmc2V0ICsgaV0gPT09IHZhbFtmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleF0pIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWwubGVuZ3RoKSByZXR1cm4gYnl0ZU9mZnNldCArIGZvdW5kSW5kZXhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbi8vIGBnZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5nZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLnJlYWRVSW50OChvZmZzZXQpXG59XG5cbi8vIGBzZXRgIGlzIGRlcHJlY2F0ZWRcbkJ1ZmZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0ICh2LCBvZmZzZXQpIHtcbiAgY29uc29sZS5sb2coJy5zZXQoKSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdXNpbmcgYXJyYXkgaW5kZXhlcyBpbnN0ZWFkLicpXG4gIHJldHVybiB0aGlzLndyaXRlVUludDgodiwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJpbmFyeVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3dhcCA9IGVuY29kaW5nXG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBvZmZzZXQgPSBsZW5ndGggfCAwXG4gICAgbGVuZ3RoID0gc3dhcFxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBiaW5hcnlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGJpbmFyeVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSBCdWZmZXIuX2F1Z21lbnQodGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSlcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyBpKyspIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXdCdWYubGVuZ3RoKSBuZXdCdWYucGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpc1xuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYnVmZmVyIG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCd2YWx1ZSBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSwgMClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyBpKyspIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgaSsrKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IHZhbHVlIDwgMCA/IDEgOiAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gdmFsdWUgPCAwID8gMSA6IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmFsdWUgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhcmdldC5fc2V0KHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSwgdGFyZ2V0U3RhcnQpXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIGZpbGwodmFsdWUsIHN0YXJ0PTAsIGVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCF2YWx1ZSkgdmFsdWUgPSAwXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCkgZW5kID0gdGhpcy5sZW5ndGhcblxuICBpZiAoZW5kIDwgc3RhcnQpIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmQgPCBzdGFydCcpXG5cbiAgLy8gRmlsbCAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm5cbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdGhpc1tpXSA9IHZhbHVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IHV0ZjhUb0J5dGVzKHZhbHVlLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIHRoaXNbaV0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlCdWZmZXJgIHdpdGggdGhlICpjb3BpZWQqIG1lbW9yeSBvZiB0aGUgYnVmZmVyIGluc3RhbmNlLlxuICogQWRkZWQgaW4gTm9kZSAwLjEyLiBPbmx5IGF2YWlsYWJsZSBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgQXJyYXlCdWZmZXIuXG4gKi9cbkJ1ZmZlci5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIgKCkge1xuICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gKG5ldyBCdWZmZXIodGhpcykpLmJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5sZW5ndGgpXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGJ1ZltpXSA9IHRoaXNbaV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0J1ZmZlci50b0FycmF5QnVmZmVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJylcbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBCUCA9IEJ1ZmZlci5wcm90b3R5cGVcblxuLyoqXG4gKiBBdWdtZW50IGEgVWludDhBcnJheSAqaW5zdGFuY2UqIChub3QgdGhlIFVpbnQ4QXJyYXkgY2xhc3MhKSB3aXRoIEJ1ZmZlciBtZXRob2RzXG4gKi9cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIF9hdWdtZW50IChhcnIpIHtcbiAgYXJyLmNvbnN0cnVjdG9yID0gQnVmZmVyXG4gIGFyci5faXNCdWZmZXIgPSB0cnVlXG5cbiAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgVWludDhBcnJheSBzZXQgbWV0aG9kIGJlZm9yZSBvdmVyd3JpdGluZ1xuICBhcnIuX3NldCA9IGFyci5zZXRcblxuICAvLyBkZXByZWNhdGVkXG4gIGFyci5nZXQgPSBCUC5nZXRcbiAgYXJyLnNldCA9IEJQLnNldFxuXG4gIGFyci53cml0ZSA9IEJQLndyaXRlXG4gIGFyci50b1N0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0xvY2FsZVN0cmluZyA9IEJQLnRvU3RyaW5nXG4gIGFyci50b0pTT04gPSBCUC50b0pTT05cbiAgYXJyLmVxdWFscyA9IEJQLmVxdWFsc1xuICBhcnIuY29tcGFyZSA9IEJQLmNvbXBhcmVcbiAgYXJyLmluZGV4T2YgPSBCUC5pbmRleE9mXG4gIGFyci5jb3B5ID0gQlAuY29weVxuICBhcnIuc2xpY2UgPSBCUC5zbGljZVxuICBhcnIucmVhZFVJbnRMRSA9IEJQLnJlYWRVSW50TEVcbiAgYXJyLnJlYWRVSW50QkUgPSBCUC5yZWFkVUludEJFXG4gIGFyci5yZWFkVUludDggPSBCUC5yZWFkVUludDhcbiAgYXJyLnJlYWRVSW50MTZMRSA9IEJQLnJlYWRVSW50MTZMRVxuICBhcnIucmVhZFVJbnQxNkJFID0gQlAucmVhZFVJbnQxNkJFXG4gIGFyci5yZWFkVUludDMyTEUgPSBCUC5yZWFkVUludDMyTEVcbiAgYXJyLnJlYWRVSW50MzJCRSA9IEJQLnJlYWRVSW50MzJCRVxuICBhcnIucmVhZEludExFID0gQlAucmVhZEludExFXG4gIGFyci5yZWFkSW50QkUgPSBCUC5yZWFkSW50QkVcbiAgYXJyLnJlYWRJbnQ4ID0gQlAucmVhZEludDhcbiAgYXJyLnJlYWRJbnQxNkxFID0gQlAucmVhZEludDE2TEVcbiAgYXJyLnJlYWRJbnQxNkJFID0gQlAucmVhZEludDE2QkVcbiAgYXJyLnJlYWRJbnQzMkxFID0gQlAucmVhZEludDMyTEVcbiAgYXJyLnJlYWRJbnQzMkJFID0gQlAucmVhZEludDMyQkVcbiAgYXJyLnJlYWRGbG9hdExFID0gQlAucmVhZEZsb2F0TEVcbiAgYXJyLnJlYWRGbG9hdEJFID0gQlAucmVhZEZsb2F0QkVcbiAgYXJyLnJlYWREb3VibGVMRSA9IEJQLnJlYWREb3VibGVMRVxuICBhcnIucmVhZERvdWJsZUJFID0gQlAucmVhZERvdWJsZUJFXG4gIGFyci53cml0ZVVJbnQ4ID0gQlAud3JpdGVVSW50OFxuICBhcnIud3JpdGVVSW50TEUgPSBCUC53cml0ZVVJbnRMRVxuICBhcnIud3JpdGVVSW50QkUgPSBCUC53cml0ZVVJbnRCRVxuICBhcnIud3JpdGVVSW50MTZMRSA9IEJQLndyaXRlVUludDE2TEVcbiAgYXJyLndyaXRlVUludDE2QkUgPSBCUC53cml0ZVVJbnQxNkJFXG4gIGFyci53cml0ZVVJbnQzMkxFID0gQlAud3JpdGVVSW50MzJMRVxuICBhcnIud3JpdGVVSW50MzJCRSA9IEJQLndyaXRlVUludDMyQkVcbiAgYXJyLndyaXRlSW50TEUgPSBCUC53cml0ZUludExFXG4gIGFyci53cml0ZUludEJFID0gQlAud3JpdGVJbnRCRVxuICBhcnIud3JpdGVJbnQ4ID0gQlAud3JpdGVJbnQ4XG4gIGFyci53cml0ZUludDE2TEUgPSBCUC53cml0ZUludDE2TEVcbiAgYXJyLndyaXRlSW50MTZCRSA9IEJQLndyaXRlSW50MTZCRVxuICBhcnIud3JpdGVJbnQzMkxFID0gQlAud3JpdGVJbnQzMkxFXG4gIGFyci53cml0ZUludDMyQkUgPSBCUC53cml0ZUludDMyQkVcbiAgYXJyLndyaXRlRmxvYXRMRSA9IEJQLndyaXRlRmxvYXRMRVxuICBhcnIud3JpdGVGbG9hdEJFID0gQlAud3JpdGVGbG9hdEJFXG4gIGFyci53cml0ZURvdWJsZUxFID0gQlAud3JpdGVEb3VibGVMRVxuICBhcnIud3JpdGVEb3VibGVCRSA9IEJQLndyaXRlRG91YmxlQkVcbiAgYXJyLmZpbGwgPSBCUC5maWxsXG4gIGFyci5pbnNwZWN0ID0gQlAuaW5zcGVjdFxuICBhcnIudG9BcnJheUJ1ZmZlciA9IEJQLnRvQXJyYXlCdWZmZXJcblxuICByZXR1cm4gYXJyXG59XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCIxMDBcIjogXCJDb250aW51ZVwiLFxuICBcIjEwMVwiOiBcIlN3aXRjaGluZyBQcm90b2NvbHNcIixcbiAgXCIxMDJcIjogXCJQcm9jZXNzaW5nXCIsXG4gIFwiMjAwXCI6IFwiT0tcIixcbiAgXCIyMDFcIjogXCJDcmVhdGVkXCIsXG4gIFwiMjAyXCI6IFwiQWNjZXB0ZWRcIixcbiAgXCIyMDNcIjogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICBcIjIwNFwiOiBcIk5vIENvbnRlbnRcIixcbiAgXCIyMDVcIjogXCJSZXNldCBDb250ZW50XCIsXG4gIFwiMjA2XCI6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIFwiMjA3XCI6IFwiTXVsdGktU3RhdHVzXCIsXG4gIFwiMzAwXCI6IFwiTXVsdGlwbGUgQ2hvaWNlc1wiLFxuICBcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gIFwiMzAyXCI6IFwiTW92ZWQgVGVtcG9yYXJpbHlcIixcbiAgXCIzMDNcIjogXCJTZWUgT3RoZXJcIixcbiAgXCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcbiAgXCIzMDVcIjogXCJVc2UgUHJveHlcIixcbiAgXCIzMDdcIjogXCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcbiAgXCIzMDhcIjogXCJQZXJtYW5lbnQgUmVkaXJlY3RcIixcbiAgXCI0MDBcIjogXCJCYWQgUmVxdWVzdFwiLFxuICBcIjQwMVwiOiBcIlVuYXV0aG9yaXplZFwiLFxuICBcIjQwMlwiOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgXCI0MDNcIjogXCJGb3JiaWRkZW5cIixcbiAgXCI0MDRcIjogXCJOb3QgRm91bmRcIixcbiAgXCI0MDVcIjogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgXCI0MDZcIjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICBcIjQwN1wiOiBcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXG4gIFwiNDA4XCI6IFwiUmVxdWVzdCBUaW1lLW91dFwiLFxuICBcIjQwOVwiOiBcIkNvbmZsaWN0XCIsXG4gIFwiNDEwXCI6IFwiR29uZVwiLFxuICBcIjQxMVwiOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICBcIjQxMlwiOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIixcbiAgXCI0MTNcIjogXCJSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2VcIixcbiAgXCI0MTRcIjogXCJSZXF1ZXN0LVVSSSBUb28gTGFyZ2VcIixcbiAgXCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIFwiNDE2XCI6IFwiUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFxuICBcIjQxN1wiOiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICBcIjQxOFwiOiBcIkknbSBhIHRlYXBvdFwiLFxuICBcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG4gIFwiNDIzXCI6IFwiTG9ja2VkXCIsXG4gIFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgXCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuICBcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcbiAgXCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgXCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICBcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcbiAgXCI1MDBcIjogXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIixcbiAgXCI1MDFcIjogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgXCI1MDJcIjogXCJCYWQgR2F0ZXdheVwiLFxuICBcIjUwM1wiOiBcIlNlcnZpY2UgVW5hdmFpbGFibGVcIixcbiAgXCI1MDRcIjogXCJHYXRld2F5IFRpbWUtb3V0XCIsXG4gIFwiNTA1XCI6IFwiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWRcIixcbiAgXCI1MDZcIjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICBcIjUwN1wiOiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIFwiNTA5XCI6IFwiQmFuZHdpZHRoIExpbWl0IEV4Y2VlZGVkXCIsXG4gIFwiNTEwXCI6IFwiTm90IEV4dGVuZGVkXCIsXG4gIFwiNTExXCI6IFwiTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiXG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvKiFcbiAqIEBvdmVydmlldyBlczYtcHJvbWlzZSAtIGEgdGlueSBpbXBsZW1lbnRhdGlvbiBvZiBQcm9taXNlcy9BKy5cbiAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDE0IFllaHVkYSBLYXR6LCBUb20gRGFsZSwgU3RlZmFuIFBlbm5lciBhbmQgY29udHJpYnV0b3JzIChDb252ZXJzaW9uIHRvIEVTNiBBUEkgYnkgSmFrZSBBcmNoaWJhbGQpXG4gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlXG4gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vamFrZWFyY2hpYmFsZC9lczYtcHJvbWlzZS9tYXN0ZXIvTElDRU5TRVxuICogQHZlcnNpb24gICAyLjMuMFxuICovXG5cbihmdW5jdGlvbigpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJG9iamVjdE9yRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nIHx8ICh0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZSh4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkdXRpbHMkJGlzQXJyYXkgPSBsaWIkZXM2JHByb21pc2UkdXRpbHMkJF9pc0FycmF5O1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkbGVuID0gMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQ7XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRjdXN0b21TY2hlZHVsZXJGbjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcCA9IGZ1bmN0aW9uIGFzYXAoY2FsbGJhY2ssIGFyZykge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2xpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW5dID0gY2FsbGJhY2s7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArIDFdID0gYXJnO1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbiArPSAyO1xuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPT09IDIpIHtcbiAgICAgICAgLy8gSWYgbGVuIGlzIDIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGFzeW5jIGZsdXNoLlxuICAgICAgICAvLyBJZiBhZGRpdGlvbmFsIGNhbGxiYWNrcyBhcmUgcXVldWVkIGJlZm9yZSB0aGUgcXVldWUgaXMgZmx1c2hlZCwgdGhleVxuICAgICAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgICAgIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4obGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkc2NoZWR1bGVGbHVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkY3VzdG9tU2NoZWR1bGVyRm4gPSBzY2hlZHVsZUZuO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwKGFzYXBGbikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAgPSBhc2FwRm47XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3NlcldpbmRvdyB8fCB7fTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBsaWIkZXM2JHByb21pc2UkYXNhcCQkYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuICAgIHZhciBsaWIkZXM2JHByb21pc2UkYXNhcCQkaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcblxuICAgIC8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuICAgIC8vIG5vZGVcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTmV4dFRpY2soKSB7XG4gICAgICB2YXIgbmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xuICAgICAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5XG4gICAgICAvLyBzZXRJbW1lZGlhdGUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBpbnN0ZWFkXG4gICAgICB2YXIgdmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5tYXRjaCgvXig/OihcXGQrKVxcLik/KD86KFxcZCspXFwuKT8oXFwqfFxcZCspJC8pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmVyc2lvbikgJiYgdmVyc2lvblsxXSA9PT0gJzAnICYmIHZlcnNpb25bMl0gPT09ICcxMCcpIHtcbiAgICAgICAgbmV4dFRpY2sgPSBzZXRJbW1lZGlhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5leHRUaWNrKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHZlcnR4XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZVZlcnR4VGltZXIoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR2ZXJ0eE5leHQobGliJGVzNiRwcm9taXNlJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgbGliJGVzNiRwcm9taXNlJGFzYXAkJEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCk7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5vZGUuZGF0YSA9IChpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHdlYiB3b3JrZXJcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2g7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChsaWIkZXM2JHByb21pc2UkYXNhcCQkZmx1c2gsIDEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlID0gbmV3IEFycmF5KDEwMDApO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRmbHVzaCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGliJGVzNiRwcm9taXNlJGFzYXAkJGxlbjsgaSs9Mikge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaV07XG4gICAgICAgIHZhciBhcmcgPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkcXVldWVbaSsxXTtcblxuICAgICAgICBjYWxsYmFjayhhcmcpO1xuXG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHF1ZXVlW2krMV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRsZW4gPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhdHRlbXB0VmVydGV4KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHIgPSByZXF1aXJlO1xuICAgICAgICB2YXIgdmVydHggPSByKCd2ZXJ0eCcpO1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkdmVydHhOZXh0ID0gdmVydHgucnVuT25Mb29wIHx8IHZlcnR4LnJ1bk9uQ29udGV4dDtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VWZXJ0eFRpbWVyKCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSRhc2FwJCR1c2VTZXRUaW1lb3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoO1xuICAgIC8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG4gICAgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc05vZGUpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU5leHRUaWNrKCk7XG4gICAgfSBlbHNlIGlmIChsaWIkZXM2JHByb21pc2UkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRpc1dvcmtlcikge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSRhc2FwJCRicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzY2hlZHVsZUZsdXNoID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGF0dGVtcHRWZXJ0ZXgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSBsaWIkZXM2JHByb21pc2UkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AoKSB7fVxuXG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcgICA9IHZvaWQgMDtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEID0gMTtcbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQgID0gMjtcblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUiA9IG5ldyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGdldFRoZW4ocHJvbWlzZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbjtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSwgdGhlbikge1xuICAgICAgIGxpYiRlczYkcHJvbWlzZSRhc2FwJCRhc2FwKGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgICAgdmFyIHNlYWxlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3IgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHRoZW5hYmxlLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGlmIChzZWFsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG5cbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSwgJ1NldHRsZTogJyArIChwcm9taXNlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTtcblxuICAgICAgICBpZiAoIXNlYWxlZCAmJiBlcnJvcikge1xuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgICAgIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHN1YnNjcmliZSh0aGVuYWJsZSwgdW5kZWZpbmVkLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKSB7XG4gICAgICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0aGVuID0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZ2V0VGhlbihtYXliZVRoZW5hYmxlKTtcblxuICAgICAgICBpZiAodGhlbiA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpYiRlczYkcHJvbWlzZSR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEXSA9IG9uRnVsZmlsbG1lbnQ7XG4gICAgICBzdWJzY3JpYmVyc1tsZW5ndGggKyBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkYXNhcCQkYXNhcChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRwdWJsaXNoLCBwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRFcnJvck9iamVjdCgpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHRyeUNhdGNoKGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgcHJvbWlzZSwgY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdmFyIGhhc0NhbGxiYWNrID0gbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgICAgIGZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3IgPSB2YWx1ZS5lcnJvcjtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgICAgfSBlbHNlIGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yKENvbnN0cnVjdG9yLCBpbnB1dCkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgICBlbnVtZXJhdG9yLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl92YWxpZGF0ZUlucHV0KGlucHV0KSkge1xuICAgICAgICBlbnVtZXJhdG9yLl9pbnB1dCAgICAgPSBpbnB1dDtcbiAgICAgICAgZW51bWVyYXRvci5sZW5ndGggICAgID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgICAgZW51bWVyYXRvci5faW5pdCgpO1xuXG4gICAgICAgIGlmIChlbnVtZXJhdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGZ1bGZpbGwoZW51bWVyYXRvci5wcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IubGVuZ3RoID0gZW51bWVyYXRvci5sZW5ndGggfHwgMDtcbiAgICAgICAgICBlbnVtZXJhdG9yLl9lbnVtZXJhdGUoKTtcbiAgICAgICAgICBpZiAoZW51bWVyYXRvci5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRmdWxmaWxsKGVudW1lcmF0b3IucHJvbWlzZSwgZW51bWVyYXRvci5fcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChlbnVtZXJhdG9yLnByb21pc2UsIGVudW1lcmF0b3IuX3ZhbGlkYXRpb25FcnJvcigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlSW5wdXQgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1dGlscyQkaXNBcnJheShpbnB1dCk7XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvcjtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICAgIHZhciBsZW5ndGggID0gZW51bWVyYXRvci5sZW5ndGg7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcbiAgICAgIHZhciBpbnB1dCAgID0gZW51bWVyYXRvci5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW51bWVyYXRvci5fZWFjaEVudHJ5KGlucHV0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGliJGVzNiRwcm9taXNlJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuICAgICAgdmFyIGMgPSBlbnVtZXJhdG9yLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuXG4gICAgICBpZiAobGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc01heWJlVGhlbmFibGUoZW50cnkpKSB7XG4gICAgICAgIGlmIChlbnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09IGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICBlbnRyeS5fb25lcnJvciA9IG51bGw7XG4gICAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW51bWVyYXRvci5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRyeSksIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtZXJhdG9yLl9yZW1haW5pbmctLTtcbiAgICAgICAgZW51bWVyYXRvci5fcmVzdWx0W2ldID0gZW50cnk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxpYiRlczYkcHJvbWlzZSRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24oc3RhdGUsIGksIHZhbHVlKSB7XG4gICAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IGVudW1lcmF0b3IucHJvbWlzZTtcblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3JlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudW1lcmF0b3IuX3Jlc3VsdFtpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbnVtZXJhdG9yLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBlbnVtZXJhdG9yLl9yZXN1bHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3dpbGxTZXR0bGVBdCA9IGZ1bmN0aW9uKHByb21pc2UsIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJEZVTEZJTExFRCwgaSwgdmFsdWUpO1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdChsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGwoZW50cmllcykge1xuICAgICAgcmV0dXJuIG5ldyBsaWIkZXM2JHByb21pc2UkZW51bWVyYXRvciQkZGVmYXVsdCh0aGlzLCBlbnRyaWVzKS5wcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRhbGw7XG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmFjZSQkcmFjZShlbnRyaWVzKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG5cbiAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuJykpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxtZW50KHZhbHVlKSB7XG4gICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkUEVORElORyAmJiBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJhY2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRyYWNlO1xuICAgIGZ1bmN0aW9uIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlc29sdmUkJHJlc29sdmUob2JqZWN0KSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVzb2x2ZSQkcmVzb2x2ZTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZWplY3QkJHJlamVjdChyZWFzb24pIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IobGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0ID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkcmVqZWN0JCRyZWplY3Q7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZTtcbiAgICAvKipcbiAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoXG4gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb25cbiAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBUZXJtaW5vbG9neVxuICAgICAgLS0tLS0tLS0tLS1cblxuICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC5cbiAgICAgIC0gYHZhbHVlYCBpcyBhbnkgbGVnYWwgSmF2YVNjcmlwdCB2YWx1ZSAoaW5jbHVkaW5nIHVuZGVmaW5lZCwgYSB0aGVuYWJsZSwgb3IgYSBwcm9taXNlKS5cbiAgICAgIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLlxuICAgICAgLSBgc2V0dGxlZGAgdGhlIGZpbmFsIHJlc3Rpbmcgc3RhdGUgb2YgYSBwcm9taXNlLCBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWRcbiAgICAgIHN0YXRlLiAgUHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFyZSBpbiB0aGVcbiAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gICAgICBQcm9taXNlcyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGFcbiAgICAgIHByb21pc2UsIHRoZW4gdGhlIG9yaWdpbmFsIHByb21pc2UncyBzZXR0bGVkIHN0YXRlIHdpbGwgbWF0Y2ggdGhlIHZhbHVlJ3NcbiAgICAgIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbFxuICAgICAgaXRzZWxmIGZ1bGZpbGwuXG5cblxuICAgICAgQmFzaWMgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgYGBganNcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gb24gZmFpbHVyZVxuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXNcbiAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICAgICAgYGBganNcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpXG4gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7XG4gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTlxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAY2xhc3MgUHJvbWlzZVxuICAgICAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgZnVuY3Rpb24gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX2lkID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIrKztcbiAgICAgIHRoaXMuX3N0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgICAgaWYgKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgICAgIGlmICghbGliJGVzNiRwcm9taXNlJHV0aWxzJCRpc0Z1bmN0aW9uKHJlc29sdmVyKSkge1xuICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UpKSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZSh0aGlzLCByZXNvbHZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuYWxsID0gbGliJGVzNiRwcm9taXNlJHByb21pc2UkYWxsJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJhY2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyYWNlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlc29sdmUgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0O1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlamVjdCA9IGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJHJlamVjdCQkZGVmYXVsdDtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0U2NoZWR1bGVyID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJHNldFNjaGVkdWxlcjtcbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5fc2V0QXNhcCA9IGxpYiRlczYkcHJvbWlzZSRhc2FwJCRzZXRBc2FwO1xuICAgIGxpYiRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLl9hc2FwID0gbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXA7XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UsXG5cbiAgICAvKipcbiAgICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLFxuICAgICAgd2hpY2ggcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGVcbiAgICAgIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAgICAgLy8gdXNlciBpcyBhdmFpbGFibGVcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBDaGFpbmluZ1xuICAgICAgLS0tLS0tLS1cblxuICAgICAgVGhlIHJldHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRoaXMgc2Vjb25kLCAnZG93bnN0cmVhbSdcbiAgICAgIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaXJzdCBwcm9taXNlJ3MgZnVsZmlsbG1lbnRcbiAgICAgIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiB1c2VyLm5hbWU7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7XG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgdXNlck5hbWVgIHdpbGwgYmUgdGhlIHVzZXIncyBuYW1lLCBvdGhlcndpc2UgaXRcbiAgICAgICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gICAgICB9KTtcblxuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVhc29uYCB3aWxsIGJlICdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScuXG4gICAgICAgIC8vIElmIGBmaW5kVXNlcmAgcmVqZWN0ZWQsIGByZWFzb25gIHdpbGwgYmUgJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknLlxuICAgICAgfSk7XG4gICAgICBgYGBcbiAgICAgIElmIHRoZSBkb3duc3RyZWFtIHByb21pc2UgZG9lcyBub3Qgc3BlY2lmeSBhIHJlamVjdGlvbiBoYW5kbGVyLCByZWplY3Rpb24gcmVhc29ucyB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciBkb3duc3RyZWFtLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFzc2ltaWxhdGlvblxuICAgICAgLS0tLS0tLS0tLS0tXG5cbiAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJvcGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlXG4gICAgICByZXRyaWV2ZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJldHVybmluZyBhIHByb21pc2UgaW4gdGhlXG4gICAgICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICAgICAgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQgKmFzc2ltaWxhdGlvbiouXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBhcmUgbm93IGF2YWlsYWJsZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgSWYgdGhlIGFzc2ltbGlhdGVkIHByb21pc2UgcmVqZWN0cywgdGhlbiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgYWxzbyByZWplY3QuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCBmdWxmaWxscywgd2UnbGwgaGF2ZSB0aGUgdmFsdWUgaGVyZVxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMsIHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBTaW1wbGUgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmaW5kUmVzdWx0KCk7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcbiAgICAgIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBZHZhbmNlZCBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciBhdXRob3IsIGJvb2tzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7XG4gICAgICAgIGJvb2tzICA9IGZpbmRCb29rc0J5QXV0aG9yKGF1dGhvcik7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH1cbiAgICAgIGBgYFxuXG4gICAgICBFcnJiYWNrIEV4YW1wbGVcblxuICAgICAgYGBganNcblxuICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29rcykge1xuXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZhaWx1cmUocmVhc29uKSB7XG5cbiAgICAgIH1cblxuICAgICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kQm9va3MoYm9va3MpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICBmYWlsdXJlKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgUHJvbWlzZSBFeGFtcGxlO1xuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICBmaW5kQXV0aG9yKCkuXG4gICAgICAgIHRoZW4oZmluZEJvb2tzQnlBdXRob3IpLlxuICAgICAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgICAgICAvLyBmb3VuZCBib29rc1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgdGhlblxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25GdWxmaWxsZWRcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuICAgICAgICB2YXIgc3RhdGUgPSBwYXJlbnQuX3N0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSBsaWIkZXM2JHByb21pc2UkJGludGVybmFsJCRSRUpFQ1RFRCAmJiAhb25SZWplY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJG5vb3ApO1xuICAgICAgICB2YXIgcmVzdWx0ID0gcGFyZW50Ll9yZXN1bHQ7XG5cbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzW3N0YXRlIC0gMV07XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJGFzYXAkJGFzYXAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxpYiRlczYkcHJvbWlzZSQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHN0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGliJGVzNiRwcm9taXNlJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH0sXG5cbiAgICAvKipcbiAgICAgIGBjYXRjaGAgaXMgc2ltcGx5IHN1Z2FyIGZvciBgdGhlbih1bmRlZmluZWQsIG9uUmVqZWN0aW9uKWAgd2hpY2ggbWFrZXMgaXQgdGhlIHNhbWVcbiAgICAgIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBmaW5kQXV0aG9yKCl7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvcicpO1xuICAgICAgfVxuXG4gICAgICAvLyBzeW5jaHJvbm91c1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmluZEF1dGhvcigpO1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH1cblxuICAgICAgLy8gYXN5bmMgd2l0aCBwcm9taXNlc1xuICAgICAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIGNhdGNoXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBsb2NhbCA9IGdsb2JhbDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbG9jYWwgPSBzZWxmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2NhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvbHlmaWxsIGZhaWxlZCBiZWNhdXNlIGdsb2JhbCBvYmplY3QgaXMgdW5hdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gICAgICBpZiAoUCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUC5yZXNvbHZlKCkpID09PSAnW29iamVjdCBQcm9taXNlXScgJiYgIVAuY2FzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvY2FsLlByb21pc2UgPSBsaWIkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdDtcbiAgICB9XG4gICAgdmFyIGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGxpYiRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkcG9seWZpbGw7XG5cbiAgICB2YXIgbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZSA9IHtcbiAgICAgICdQcm9taXNlJzogbGliJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGxpYiRlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpc1snRVM2UHJvbWlzZSddID0gbGliJGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG5cbiAgICBsaWIkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQoKTtcbn0pLmNhbGwodGhpcyk7XG5cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuJyk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG5cbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICB2YXIgbTtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IDA7XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW1pdHRlci5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSAxO1xuICBlbHNlXG4gICAgcmV0ID0gZW1pdHRlci5fZXZlbnRzW3R5cGVdLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIlxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZvckVhY2ggKG9iaiwgZm4sIGN0eCkge1xuICAgIGlmICh0b1N0cmluZy5jYWxsKGZuKSAhPT0gJ1tvYmplY3QgRnVuY3Rpb25dJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIGwgPSBvYmoubGVuZ3RoO1xuICAgIGlmIChsID09PSArbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgZm4uY2FsbChjdHgsIG9ialtpXSwgaSwgb2JqKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY3R4LCBvYmpba10sIGssIG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4iLCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxudmFyIGh0dHBzID0gbW9kdWxlLmV4cG9ydHM7XG5cbmZvciAodmFyIGtleSBpbiBodHRwKSB7XG4gICAgaWYgKGh0dHAuaGFzT3duUHJvcGVydHkoa2V5KSkgaHR0cHNba2V5XSA9IGh0dHBba2V5XTtcbn07XG5cbmh0dHBzLnJlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYikge1xuICAgIGlmICghcGFyYW1zKSBwYXJhbXMgPSB7fTtcbiAgICBwYXJhbXMuc2NoZW1lID0gJ2h0dHBzJztcbiAgICBwYXJhbXMucHJvdG9jb2wgPSAnaHR0cHM6JztcbiAgICByZXR1cm4gaHR0cC5yZXF1ZXN0LmNhbGwodGhpcywgcGFyYW1zLCBjYik7XG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIlxudmFyIGluZGV4T2YgPSBbXS5pbmRleE9mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFyciwgb2JqKXtcbiAgaWYgKGluZGV4T2YpIHJldHVybiBhcnIuaW5kZXhPZihvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgIGlmIChhcnJbaV0gPT09IG9iaikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufTsiLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIi8vIElnbm9yZSBtb2R1bGUgZm9yIGJyb3dzZXJpZnkgKHNlZSBwYWNrYWdlLmpzb24pIiwiLyoqXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpTT04tTEQgQVBJLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQGxpY2Vuc2UgQlNEIDMtQ2xhdXNlIExpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBEaWdpdGFsIEJhemFhciwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTXG4gKiBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuKGZ1bmN0aW9uKCkge1xuXG4vLyBkZXRlcm1pbmUgaWYgaW4tYnJvd3NlciBvciB1c2luZyBub2RlLmpzXG52YXIgX25vZGVqcyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcbnZhciBfYnJvd3NlciA9ICFfbm9kZWpzICYmXG4gICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpO1xuaWYoX2Jyb3dzZXIpIHtcbiAgaWYodHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZ2xvYmFsID0gd2luZG93O1xuICAgIH0gZWxzZSBpZih0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGdsb2JhbCA9IHNlbGY7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiAkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZ2xvYmFsID0gJDtcbiAgICB9XG4gIH1cbn1cblxuLy8gYXR0YWNoZXMganNvbmxkIEFQSSB0byB0aGUgZ2l2ZW4gb2JqZWN0XG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uKGpzb25sZCkge1xuXG4vKiBDb3JlIEFQSSAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIEpTT04tTEQgY29tcGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQgdG8gY29tcGFjdC5cbiAqIEBwYXJhbSBjdHggdGhlIGNvbnRleHQgdG8gY29tcGFjdCB3aXRoLlxuICogQHBhcmFtIFtvcHRpb25zXSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2NvbXBhY3RBcnJheXNdIHRydWUgdG8gY29tcGFjdCBhcnJheXMgdG8gc2luZ2xlIHZhbHVlcyB3aGVuXG4gKiAgICAgICAgICAgIGFwcHJvcHJpYXRlLCBmYWxzZSBub3QgdG8gKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW2dyYXBoXSB0cnVlIHRvIGFsd2F5cyBvdXRwdXQgYSB0b3AtbGV2ZWwgZ3JhcGggKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbc2tpcEV4cGFuc2lvbl0gdHJ1ZSB0byBhc3N1bWUgdGhlIGlucHV0IGlzIGV4cGFuZGVkIGFuZCBza2lwXG4gKiAgICAgICAgICAgIGV4cGFuc2lvbiwgZmFsc2Ugbm90IHRvLCBkZWZhdWx0cyB0byBmYWxzZS5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBjb21wYWN0ZWQsIGN0eCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5jb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNvbXBhY3QsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmKGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdUaGUgY29tcGFjdGlvbiBjb250ZXh0IG11c3Qgbm90IGJlIG51bGwuJyxcbiAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgbG9jYWwgY29udGV4dCd9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBub3RoaW5nIHRvIGNvbXBhY3RcbiAgaWYoaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmKCEoJ2Jhc2UnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5iYXNlID0gKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpID8gaW5wdXQgOiAnJztcbiAgfVxuICBpZighKCdjb21wYWN0QXJyYXlzJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuY29tcGFjdEFycmF5cyA9IHRydWU7XG4gIH1cbiAgaWYoISgnZ3JhcGgnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5ncmFwaCA9IGZhbHNlO1xuICB9XG4gIGlmKCEoJ3NraXBFeHBhbnNpb24nIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5za2lwRXhwYW5zaW9uID0gZmFsc2U7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cbiAgaWYoISgnbGluaycgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmxpbmsgPSBmYWxzZTtcbiAgfVxuICBpZihvcHRpb25zLmxpbmspIHtcbiAgICAvLyBmb3JjZSBza2lwIGV4cGFuc2lvbiB3aGVuIGxpbmtpbmcsIFwibGlua1wiIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWNcbiAgICAvLyBBUEksIGl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGZyYW1pbmdcbiAgICBvcHRpb25zLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICB9XG5cbiAgdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmKG9wdGlvbnMuc2tpcEV4cGFuc2lvbikge1xuICAgICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgaW5wdXQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGpzb25sZC5leHBhbmQoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfTtcblxuICAvLyBleHBhbmQgaW5wdXQgdGhlbiBkbyBjb21wYWN0aW9uXG4gIGV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBleHBhbmRlZCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIGNvbXBhY3Rpb24uJyxcbiAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzIGNvbnRleHRcbiAgICB2YXIgYWN0aXZlQ3R4ID0gX2dldEluaXRpYWxDb250ZXh0KG9wdGlvbnMpO1xuICAgIGpzb25sZC5wcm9jZXNzQ29udGV4dChhY3RpdmVDdHgsIGN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBhY3RpdmVDdHgpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgcHJvY2VzcyBjb250ZXh0IGJlZm9yZSBjb21wYWN0aW9uLicsXG4gICAgICAgICAgJ2pzb25sZC5Db21wYWN0RXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBhY3RlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGRvIGNvbXBhY3Rpb25cbiAgICAgICAgY29tcGFjdGVkID0gbmV3IFByb2Nlc3NvcigpLmNvbXBhY3QoYWN0aXZlQ3R4LCBudWxsLCBleHBhbmRlZCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFudXAobnVsbCwgY29tcGFjdGVkLCBhY3RpdmVDdHgsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBwZXJmb3JtcyBjbGVhbiB1cCBhZnRlciBjb21wYWN0aW9uXG4gIGZ1bmN0aW9uIGNsZWFudXAoZXJyLCBjb21wYWN0ZWQsIGFjdGl2ZUN0eCwgb3B0aW9ucykge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgaWYob3B0aW9ucy5jb21wYWN0QXJyYXlzICYmICFvcHRpb25zLmdyYXBoICYmIF9pc0FycmF5KGNvbXBhY3RlZCkpIHtcbiAgICAgIGlmKGNvbXBhY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gc2ltcGxpZnkgdG8gYSBzaW5nbGUgaXRlbVxuICAgICAgICBjb21wYWN0ZWQgPSBjb21wYWN0ZWRbMF07XG4gICAgICB9IGVsc2UgaWYoY29tcGFjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBzaW1wbGlmeSB0byBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgY29tcGFjdGVkID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG9wdGlvbnMuZ3JhcGggJiYgX2lzT2JqZWN0KGNvbXBhY3RlZCkpIHtcbiAgICAgIC8vIGFsd2F5cyB1c2UgYXJyYXkgaWYgZ3JhcGggb3B0aW9uIGlzIG9uXG4gICAgICBjb21wYWN0ZWQgPSBbY29tcGFjdGVkXTtcbiAgICB9XG5cbiAgICAvLyBmb2xsb3cgQGNvbnRleHQga2V5XG4gICAgaWYoX2lzT2JqZWN0KGN0eCkgJiYgJ0Bjb250ZXh0JyBpbiBjdHgpIHtcbiAgICAgIGN0eCA9IGN0eFsnQGNvbnRleHQnXTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCBvdXRwdXQgY29udGV4dFxuICAgIGN0eCA9IF9jbG9uZShjdHgpO1xuICAgIGlmKCFfaXNBcnJheShjdHgpKSB7XG4gICAgICBjdHggPSBbY3R4XTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIGVtcHR5IGNvbnRleHRzXG4gICAgdmFyIHRtcCA9IGN0eDtcbiAgICBjdHggPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZighX2lzT2JqZWN0KHRtcFtpXSkgfHwgT2JqZWN0LmtleXModG1wW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGN0eC5wdXNoKHRtcFtpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGFycmF5IGlmIG9ubHkgb25lIGNvbnRleHRcbiAgICB2YXIgaGFzQ29udGV4dCA9IChjdHgubGVuZ3RoID4gMCk7XG4gICAgaWYoY3R4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY3R4ID0gY3R4WzBdO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb250ZXh0IGFuZC9vciBAZ3JhcGhcbiAgICBpZihfaXNBcnJheShjb21wYWN0ZWQpKSB7XG4gICAgICAvLyB1c2UgJ0BncmFwaCcga2V5d29yZFxuICAgICAgdmFyIGt3Z3JhcGggPSBfY29tcGFjdElyaShhY3RpdmVDdHgsICdAZ3JhcGgnKTtcbiAgICAgIHZhciBncmFwaCA9IGNvbXBhY3RlZDtcbiAgICAgIGNvbXBhY3RlZCA9IHt9O1xuICAgICAgaWYoaGFzQ29udGV4dCkge1xuICAgICAgICBjb21wYWN0ZWRbJ0Bjb250ZXh0J10gPSBjdHg7XG4gICAgICB9XG4gICAgICBjb21wYWN0ZWRba3dncmFwaF0gPSBncmFwaDtcbiAgICB9IGVsc2UgaWYoX2lzT2JqZWN0KGNvbXBhY3RlZCkgJiYgaGFzQ29udGV4dCkge1xuICAgICAgLy8gcmVvcmRlciBrZXlzIHNvIEBjb250ZXh0IGlzIGZpcnN0XG4gICAgICB2YXIgZ3JhcGggPSBjb21wYWN0ZWQ7XG4gICAgICBjb21wYWN0ZWQgPSB7J0Bjb250ZXh0JzogY3R4fTtcbiAgICAgIGZvcih2YXIga2V5IGluIGdyYXBoKSB7XG4gICAgICAgIGNvbXBhY3RlZFtrZXldID0gZ3JhcGhba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQsIGFjdGl2ZUN0eCk7XG4gIH1cbn07XG5cbi8qKlxuICogUGVyZm9ybXMgSlNPTi1MRCBleHBhbnNpb24uXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0IHRvIGV4cGFuZC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2Jhc2VdIHRoZSBiYXNlIElSSSB0byB1c2UuXG4gKiAgICAgICAgICBbZXhwYW5kQ29udGV4dF0gYSBjb250ZXh0IHRvIGV4cGFuZCB3aXRoLlxuICogICAgICAgICAgW2tlZXBGcmVlRmxvYXRpbmdOb2Rlc10gdHJ1ZSB0byBrZWVwIGZyZWUtZmxvYXRpbmcgbm9kZXMsXG4gKiAgICAgICAgICAgIGZhbHNlIG5vdCB0bywgZGVmYXVsdHMgdG8gZmFsc2UuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZXhwYW5kZWQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQuZXhwYW5kID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBleHBhbmQsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cbiAgaWYoISgna2VlcEZyZWVGbG9hdGluZ05vZGVzJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMua2VlcEZyZWVGbG9hdGluZ05vZGVzID0gZmFsc2U7XG4gIH1cblxuICBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgLy8gaWYgaW5wdXQgaXMgYSBzdHJpbmcsIGF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgcmVtb3RlIGRvY3VtZW50XG4gICAgaWYodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGRvbmUgPSBmdW5jdGlvbihlcnIsIHJlbW90ZURvYykge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmKCFyZW1vdGVEb2MuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICAgJ05vIHJlbW90ZSBkb2N1bWVudCBmb3VuZCBhdCB0aGUgZ2l2ZW4gVVJMLicsXG4gICAgICAgICAgICAgICdqc29ubGQuTnVsbFJlbW90ZURvY3VtZW50Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHR5cGVvZiByZW1vdGVEb2MuZG9jdW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZW1vdGVEb2MuZG9jdW1lbnQgPSBKU09OLnBhcnNlKHJlbW90ZURvYy5kb2N1bWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdDb3VsZCBub3QgcmV0cmlldmUgYSBKU09OLUxEIGRvY3VtZW50IGZyb20gdGhlIFVSTC4gVVJMICcgK1xuICAgICAgICAgICAgJ2RlcmVmZXJlbmNpbmcgbm90IGltcGxlbWVudGVkLicsICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLCB7XG4gICAgICAgICAgICAgIGNvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsXG4gICAgICAgICAgICAgIGNhdXNlOiBleCxcbiAgICAgICAgICAgICAgcmVtb3RlRG9jOiByZW1vdGVEb2NcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwYW5kKHJlbW90ZURvYyk7XG4gICAgICB9O1xuICAgICAgdmFyIHByb21pc2UgPSBvcHRpb25zLmRvY3VtZW50TG9hZGVyKGlucHV0LCBkb25lKTtcbiAgICAgIGlmKHByb21pc2UgJiYgJ3RoZW4nIGluIHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKGRvbmUuYmluZChudWxsLCBudWxsKSwgZG9uZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIG5vdGhpbmcgdG8gbG9hZFxuICAgIGV4cGFuZCh7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IG51bGwsIGRvY3VtZW50OiBpbnB1dH0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBleHBhbmQocmVtb3RlRG9jKSB7XG4gICAgLy8gc2V0IGRlZmF1bHQgYmFzZVxuICAgIGlmKCEoJ2Jhc2UnIGluIG9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zLmJhc2UgPSByZW1vdGVEb2MuZG9jdW1lbnRVcmwgfHwgJyc7XG4gICAgfVxuICAgIC8vIGJ1aWxkIG1ldGEtb2JqZWN0IGFuZCByZXRyaWV2ZSBhbGwgQGNvbnRleHQgVVJMc1xuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGRvY3VtZW50OiBfY2xvbmUocmVtb3RlRG9jLmRvY3VtZW50KSxcbiAgICAgIHJlbW90ZUNvbnRleHQ6IHsnQGNvbnRleHQnOiByZW1vdGVEb2MuY29udGV4dFVybH1cbiAgICB9O1xuICAgIGlmKCdleHBhbmRDb250ZXh0JyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgZXhwYW5kQ29udGV4dCA9IF9jbG9uZShvcHRpb25zLmV4cGFuZENvbnRleHQpO1xuICAgICAgaWYodHlwZW9mIGV4cGFuZENvbnRleHQgPT09ICdvYmplY3QnICYmICdAY29udGV4dCcgaW4gZXhwYW5kQ29udGV4dCkge1xuICAgICAgICBpbnB1dC5leHBhbmRDb250ZXh0ID0gZXhwYW5kQ29udGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LmV4cGFuZENvbnRleHQgPSB7J0Bjb250ZXh0JzogZXhwYW5kQ29udGV4dH07XG4gICAgICB9XG4gICAgfVxuICAgIF9yZXRyaWV2ZUNvbnRleHRVcmxzKGlucHV0LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGlucHV0KSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHZhciBleHBhbmRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc29yKCk7XG4gICAgICAgIHZhciBhY3RpdmVDdHggPSBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucyk7XG4gICAgICAgIHZhciBkb2N1bWVudCA9IGlucHV0LmRvY3VtZW50O1xuICAgICAgICB2YXIgcmVtb3RlQ29udGV4dCA9IGlucHV0LnJlbW90ZUNvbnRleHRbJ0Bjb250ZXh0J107XG5cbiAgICAgICAgLy8gcHJvY2VzcyBvcHRpb25hbCBleHBhbmRDb250ZXh0XG4gICAgICAgIGlmKGlucHV0LmV4cGFuZENvbnRleHQpIHtcbiAgICAgICAgICBhY3RpdmVDdHggPSBwcm9jZXNzb3IucHJvY2Vzc0NvbnRleHQoXG4gICAgICAgICAgICBhY3RpdmVDdHgsIGlucHV0LmV4cGFuZENvbnRleHRbJ0Bjb250ZXh0J10sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJvY2VzcyByZW1vdGUgY29udGV4dCBmcm9tIEhUVFAgTGluayBIZWFkZXJcbiAgICAgICAgaWYocmVtb3RlQ29udGV4dCkge1xuICAgICAgICAgIGFjdGl2ZUN0eCA9IHByb2Nlc3Nvci5wcm9jZXNzQ29udGV4dChcbiAgICAgICAgICAgIGFjdGl2ZUN0eCwgcmVtb3RlQ29udGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBleHBhbmQgZG9jdW1lbnRcbiAgICAgICAgZXhwYW5kZWQgPSBwcm9jZXNzb3IuZXhwYW5kKFxuICAgICAgICAgIGFjdGl2ZUN0eCwgbnVsbCwgZG9jdW1lbnQsIG9wdGlvbnMsIGZhbHNlKTtcblxuICAgICAgICAvLyBvcHRpbWl6ZSBhd2F5IEBncmFwaCB3aXRoIG5vIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgaWYoX2lzT2JqZWN0KGV4cGFuZGVkKSAmJiAoJ0BncmFwaCcgaW4gZXhwYW5kZWQpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoZXhwYW5kZWQpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGV4cGFuZGVkID0gZXhwYW5kZWRbJ0BncmFwaCddO1xuICAgICAgICB9IGVsc2UgaWYoZXhwYW5kZWQgPT09IG51bGwpIHtcbiAgICAgICAgICBleHBhbmRlZCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm9ybWFsaXplIHRvIGFuIGFycmF5XG4gICAgICAgIGlmKCFfaXNBcnJheShleHBhbmRlZCkpIHtcbiAgICAgICAgICBleHBhbmRlZCA9IFtleHBhbmRlZF07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGV4cGFuZGVkKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBKU09OLUxEIGZsYXR0ZW5pbmcuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY3R4IHRoZSBjb250ZXh0IHRvIHVzZSB0byBjb21wYWN0IHRoZSBmbGF0dGVuZWQgb3V0cHV0LCBvciBudWxsLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbYmFzZV0gdGhlIGJhc2UgSVJJIHRvIHVzZS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZmxhdHRlbmVkKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCwgY3R4LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZmxhdHRlbiwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH0gZWxzZSBpZih0eXBlb2YgY3R4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBjdHg7XG4gICAgY3R4ID0gbnVsbDtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBmbGF0dGVuaW5nLicsXG4gICAgICAgICdqc29ubGQuRmxhdHRlbkVycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgfVxuXG4gICAgdmFyIGZsYXR0ZW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gZG8gZmxhdHRlbmluZ1xuICAgICAgZmxhdHRlbmVkID0gbmV3IFByb2Nlc3NvcigpLmZsYXR0ZW4oX2lucHV0KTtcbiAgICB9IGNhdGNoKGV4KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXgpO1xuICAgIH1cblxuICAgIGlmKGN0eCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGZsYXR0ZW5lZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcGFjdCByZXN1bHQgKGZvcmNlIEBncmFwaCBvcHRpb24gdG8gdHJ1ZSwgc2tpcCBleHBhbnNpb24pXG4gICAgb3B0aW9ucy5ncmFwaCA9IHRydWU7XG4gICAgb3B0aW9ucy5za2lwRXhwYW5zaW9uID0gdHJ1ZTtcbiAgICBqc29ubGQuY29tcGFjdChmbGF0dGVuZWQsIGN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBjb21wYWN0ZWQpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgY29tcGFjdCBmbGF0dGVuZWQgb3V0cHV0LicsXG4gICAgICAgICAgJ2pzb25sZC5GbGF0dGVuRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGNvbXBhY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBKU09OLUxEIGZyYW1pbmcuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0IHRvIGZyYW1lLlxuICogQHBhcmFtIGZyYW1lIHRoZSBKU09OLUxEIGZyYW1lIHRvIHVzZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIGZyYW1pbmcgb3B0aW9ucy5cbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtlbWJlZF0gZGVmYXVsdCBAZW1iZWQgZmxhZzogJ0BsYXN0JywgJ0BhbHdheXMnLCAnQG5ldmVyJywgJ0BsaW5rJ1xuICogICAgICAgICAgICAoZGVmYXVsdDogJ0BsYXN0JykuXG4gKiAgICAgICAgICBbZXhwbGljaXRdIGRlZmF1bHQgQGV4cGxpY2l0IGZsYWcgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtyZXF1aXJlQWxsXSBkZWZhdWx0IEByZXF1aXJlQWxsIGZsYWcgKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW29taXREZWZhdWx0XSBkZWZhdWx0IEBvbWl0RGVmYXVsdCBmbGFnIChkZWZhdWx0OiBmYWxzZSkuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgZnJhbWVkKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmZyYW1lID0gZnVuY3Rpb24oaW5wdXQsIGZyYW1lLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZnJhbWUsIHRvbyBmZXcgYXJndW1lbnRzLicpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGdldCBhcmd1bWVudHNcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnYmFzZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmJhc2UgPSAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgPyBpbnB1dCA6ICcnO1xuICB9XG4gIGlmKCEoJ2RvY3VtZW50TG9hZGVyJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZG9jdW1lbnRMb2FkZXIgPSBqc29ubGQubG9hZERvY3VtZW50O1xuICB9XG4gIGlmKCEoJ2VtYmVkJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZW1iZWQgPSAnQGxhc3QnO1xuICB9XG4gIG9wdGlvbnMuZXhwbGljaXQgPSBvcHRpb25zLmV4cGxpY2l0IHx8IGZhbHNlO1xuICBpZighKCdyZXF1aXJlQWxsJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMucmVxdWlyZUFsbCA9IHRydWU7XG4gIH1cbiAgb3B0aW9ucy5vbWl0RGVmYXVsdCA9IG9wdGlvbnMub21pdERlZmF1bHQgfHwgZmFsc2U7XG5cbiAganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIC8vIGlmIGZyYW1lIGlzIGEgc3RyaW5nLCBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIHJlbW90ZSBkb2N1bWVudFxuICAgIGlmKHR5cGVvZiBmcmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBkb25lID0gZnVuY3Rpb24oZXJyLCByZW1vdGVEb2MpIHtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZighcmVtb3RlRG9jLmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdObyByZW1vdGUgZG9jdW1lbnQgZm91bmQgYXQgdGhlIGdpdmVuIFVSTC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLk51bGxSZW1vdGVEb2N1bWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0eXBlb2YgcmVtb3RlRG9jLmRvY3VtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVtb3RlRG9jLmRvY3VtZW50ID0gSlNPTi5wYXJzZShyZW1vdGVEb2MuZG9jdW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnQ291bGQgbm90IHJldHJpZXZlIGEgSlNPTi1MRCBkb2N1bWVudCBmcm9tIHRoZSBVUkwuIFVSTCAnICtcbiAgICAgICAgICAgICdkZXJlZmVyZW5jaW5nIG5vdCBpbXBsZW1lbnRlZC4nLCAnanNvbmxkLkxvYWREb2N1bWVudEVycm9yJywge1xuICAgICAgICAgICAgICBjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLFxuICAgICAgICAgICAgICBjYXVzZTogZXgsXG4gICAgICAgICAgICAgIHJlbW90ZURvYzogcmVtb3RlRG9jXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGRvRnJhbWUocmVtb3RlRG9jKTtcbiAgICAgIH07XG4gICAgICB2YXIgcHJvbWlzZSA9IG9wdGlvbnMuZG9jdW1lbnRMb2FkZXIoZnJhbWUsIGRvbmUpO1xuICAgICAgaWYocHJvbWlzZSAmJiAndGhlbicgaW4gcHJvbWlzZSkge1xuICAgICAgICBwcm9taXNlLnRoZW4oZG9uZS5iaW5kKG51bGwsIG51bGwpLCBkb25lKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gbm90aGluZyB0byBsb2FkXG4gICAgZG9GcmFtZSh7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IG51bGwsIGRvY3VtZW50OiBmcmFtZX0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBkb0ZyYW1lKHJlbW90ZUZyYW1lKSB7XG4gICAgLy8gcHJlc2VydmUgZnJhbWUgY29udGV4dCBhbmQgYWRkIGFueSBMaW5rIGhlYWRlciBjb250ZXh0XG4gICAgdmFyIGZyYW1lID0gcmVtb3RlRnJhbWUuZG9jdW1lbnQ7XG4gICAgdmFyIGN0eDtcbiAgICBpZihmcmFtZSkge1xuICAgICAgY3R4ID0gZnJhbWVbJ0Bjb250ZXh0J107XG4gICAgICBpZihyZW1vdGVGcmFtZS5jb250ZXh0VXJsKSB7XG4gICAgICAgIGlmKCFjdHgpIHtcbiAgICAgICAgICBjdHggPSByZW1vdGVGcmFtZS5jb250ZXh0VXJsO1xuICAgICAgICB9IGVsc2UgaWYoX2lzQXJyYXkoY3R4KSkge1xuICAgICAgICAgIGN0eC5wdXNoKHJlbW90ZUZyYW1lLmNvbnRleHRVcmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eCA9IFtjdHgsIHJlbW90ZUZyYW1lLmNvbnRleHRVcmxdO1xuICAgICAgICB9XG4gICAgICAgIGZyYW1lWydAY29udGV4dCddID0gY3R4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4ID0gY3R4IHx8IHt9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjdHggPSB7fTtcbiAgICB9XG5cbiAgICAvLyBleHBhbmQgaW5wdXRcbiAgICBqc29ubGQuZXhwYW5kKGlucHV0LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGV4cGFuZGVkKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGV4cGFuZCBpbnB1dCBiZWZvcmUgZnJhbWluZy4nLFxuICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBleHBhbmQgZnJhbWVcbiAgICAgIHZhciBvcHRzID0gX2Nsb25lKG9wdGlvbnMpO1xuICAgICAgb3B0cy5pc0ZyYW1lID0gdHJ1ZTtcbiAgICAgIG9wdHMua2VlcEZyZWVGbG9hdGluZ05vZGVzID0gdHJ1ZTtcbiAgICAgIGpzb25sZC5leHBhbmQoZnJhbWUsIG9wdHMsIGZ1bmN0aW9uKGVyciwgZXhwYW5kZWRGcmFtZSkge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgZnJhbWUgYmVmb3JlIGZyYW1pbmcuJyxcbiAgICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYW1lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBkbyBmcmFtaW5nXG4gICAgICAgICAgZnJhbWVkID0gbmV3IFByb2Nlc3NvcigpLmZyYW1lKGV4cGFuZGVkLCBleHBhbmRlZEZyYW1lLCBvcHRzKTtcbiAgICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb21wYWN0IHJlc3VsdCAoZm9yY2UgQGdyYXBoIG9wdGlvbiB0byB0cnVlLCBza2lwIGV4cGFuc2lvbixcbiAgICAgICAgLy8gY2hlY2sgZm9yIGxpbmtlZCBlbWJlZHMpXG4gICAgICAgIG9wdHMuZ3JhcGggPSB0cnVlO1xuICAgICAgICBvcHRzLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICAgICAgICBvcHRzLmxpbmsgPSB7fTtcbiAgICAgICAganNvbmxkLmNvbXBhY3QoZnJhbWVkLCBjdHgsIG9wdHMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkLCBjdHgpIHtcbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdDb3VsZCBub3QgY29tcGFjdCBmcmFtZWQgb3V0cHV0LicsXG4gICAgICAgICAgICAgICdqc29ubGQuRnJhbWVFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBnZXQgZ3JhcGggYWxpYXNcbiAgICAgICAgICB2YXIgZ3JhcGggPSBfY29tcGFjdElyaShjdHgsICdAZ3JhcGgnKTtcbiAgICAgICAgICAvLyByZW1vdmUgQHByZXNlcnZlIGZyb20gcmVzdWx0c1xuICAgICAgICAgIG9wdHMubGluayA9IHt9O1xuICAgICAgICAgIGNvbXBhY3RlZFtncmFwaF0gPSBfcmVtb3ZlUHJlc2VydmUoY3R4LCBjb21wYWN0ZWRbZ3JhcGhdLCBvcHRzKTtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqICoqRXhwZXJpbWVudGFsKipcbiAqXG4gKiBMaW5rcyBhIEpTT04tTEQgZG9jdW1lbnQncyBub2RlcyBpbiBtZW1vcnkuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGRvY3VtZW50IHRvIGxpbmsuXG4gKiBAcGFyYW0gY3R4IHRoZSBKU09OLUxEIGNvbnRleHQgdG8gYXBwbHkuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBsaW5rZWQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQubGluayA9IGZ1bmN0aW9uKGlucHV0LCBjdHgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIC8vIEFQSSBtYXRjaGVzIHJ1bm5pbmcgZnJhbWUgd2l0aCBhIHdpbGRjYXJkIGZyYW1lIGFuZCBlbWJlZDogJ0BsaW5rJ1xuICAvLyBnZXQgYXJndW1lbnRzXG4gIHZhciBmcmFtZSA9IHt9O1xuICBpZihjdHgpIHtcbiAgICBmcmFtZVsnQGNvbnRleHQnXSA9IGN0eDtcbiAgfVxuICBmcmFtZVsnQGVtYmVkJ10gPSAnQGxpbmsnO1xuICBqc29ubGQuZnJhbWUoaW5wdXQsIGZyYW1lLCBvcHRpb25zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqICoqRGVwcmVjYXRlZCoqXG4gKlxuICogUGVyZm9ybXMgSlNPTi1MRCBvYmplY3RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGRvY3VtZW50IHRvIG9iamVjdGlmeS5cbiAqIEBwYXJhbSBjdHggdGhlIEpTT04tTEQgY29udGV4dCB0byBhcHBseS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2Jhc2VdIHRoZSBiYXNlIElSSSB0byB1c2UuXG4gKiAgICAgICAgICBbZXhwYW5kQ29udGV4dF0gYSBjb250ZXh0IHRvIGV4cGFuZCB3aXRoLlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIGxpbmtlZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5vYmplY3RpZnkgPSBmdW5jdGlvbihpbnB1dCwgY3R4LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBsaW5raW5nLicsXG4gICAgICAgICdqc29ubGQuTGlua0Vycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgfVxuXG4gICAgdmFyIGZsYXR0ZW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gZmxhdHRlbiB0aGUgZ3JhcGhcbiAgICAgIGZsYXR0ZW5lZCA9IG5ldyBQcm9jZXNzb3IoKS5mbGF0dGVuKF9pbnB1dCk7XG4gICAgfSBjYXRjaChleCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICB9XG5cbiAgICAvLyBjb21wYWN0IHJlc3VsdCAoZm9yY2UgQGdyYXBoIG9wdGlvbiB0byB0cnVlLCBza2lwIGV4cGFuc2lvbilcbiAgICBvcHRpb25zLmdyYXBoID0gdHJ1ZTtcbiAgICBvcHRpb25zLnNraXBFeHBhbnNpb24gPSB0cnVlO1xuICAgIGpzb25sZC5jb21wYWN0KGZsYXR0ZW5lZCwgY3R4LCBvcHRpb25zLCBmdW5jdGlvbihlcnIsIGNvbXBhY3RlZCwgY3R4KSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGNvbXBhY3QgZmxhdHRlbmVkIG91dHB1dCBiZWZvcmUgbGlua2luZy4nLFxuICAgICAgICAgICdqc29ubGQuTGlua0Vycm9yJywge2NhdXNlOiBlcnJ9KSk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZ3JhcGggYWxpYXNcbiAgICAgIHZhciBncmFwaCA9IF9jb21wYWN0SXJpKGN0eCwgJ0BncmFwaCcpO1xuICAgICAgdmFyIHRvcCA9IGNvbXBhY3RlZFtncmFwaF1bMF07XG5cbiAgICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24oc3ViamVjdCkge1xuICAgICAgICAvLyBjYW4ndCByZXBsYWNlIGp1c3QgYSBzdHJpbmdcbiAgICAgICAgaWYoIV9pc09iamVjdChzdWJqZWN0KSAmJiAhX2lzQXJyYXkoc3ViamVjdCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBib3R0b20gb3V0IHJlY3Vyc2lvbiBvbiByZS12aXNpdFxuICAgICAgICBpZihfaXNPYmplY3Qoc3ViamVjdCkpIHtcbiAgICAgICAgICBpZihyZWN1cnNlLnZpc2l0ZWRbc3ViamVjdFsnQGlkJ11dKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2UudmlzaXRlZFtzdWJqZWN0WydAaWQnXV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWFjaCBhcnJheSBlbGVtZW50ICpvciogb2JqZWN0IGtleVxuICAgICAgICBmb3IodmFyIGsgaW4gc3ViamVjdCkge1xuICAgICAgICAgIHZhciBvYmogPSBzdWJqZWN0W2tdO1xuICAgICAgICAgIHZhciBpc2lkID0gKGpzb25sZC5nZXRDb250ZXh0VmFsdWUoY3R4LCBrLCAnQHR5cGUnKSA9PT0gJ0BpZCcpO1xuXG4gICAgICAgICAgLy8gY2FuJ3QgcmVwbGFjZSBhIG5vbi1vYmplY3Qgb3Igbm9uLWFycmF5IHVubGVzcyBpdCdzIGFuIEBpZFxuICAgICAgICAgIGlmKCFfaXNBcnJheShvYmopICYmICFfaXNPYmplY3Qob2JqKSAmJiAhaXNpZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoX2lzU3RyaW5nKG9iaikgJiYgaXNpZCkge1xuICAgICAgICAgICAgc3ViamVjdFtrXSA9IG9iaiA9IHRvcFtvYmpdO1xuICAgICAgICAgICAgcmVjdXJzZShvYmopO1xuICAgICAgICAgIH0gZWxzZSBpZihfaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGlmKF9pc1N0cmluZyhvYmpbaV0pICYmIGlzaWQpIHtcbiAgICAgICAgICAgICAgICBvYmpbaV0gPSB0b3Bbb2JqW2ldXTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmKF9pc09iamVjdChvYmpbaV0pICYmICdAaWQnIGluIG9ialtpXSkge1xuICAgICAgICAgICAgICAgIG9ialtpXSA9IHRvcFtvYmpbaV1bJ0BpZCddXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWN1cnNlKG9ialtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKF9pc09iamVjdChvYmopKSB7XG4gICAgICAgICAgICB2YXIgc2lkID0gb2JqWydAaWQnXTtcbiAgICAgICAgICAgIHN1YmplY3Rba10gPSBvYmogPSB0b3Bbc2lkXTtcbiAgICAgICAgICAgIHJlY3Vyc2Uob2JqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWN1cnNlLnZpc2l0ZWQgPSB7fTtcbiAgICAgIHJlY3Vyc2UodG9wKTtcblxuICAgICAgY29tcGFjdGVkLm9mX3R5cGUgPSB7fTtcbiAgICAgIGZvcih2YXIgcyBpbiB0b3ApIHtcbiAgICAgICAgaWYoISgnQHR5cGUnIGluIHRvcFtzXSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZXMgPSB0b3Bbc11bJ0B0eXBlJ107XG4gICAgICAgIGlmKCFfaXNBcnJheSh0eXBlcykpIHtcbiAgICAgICAgICB0eXBlcyA9IFt0eXBlc107XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciB0ID0gMDsgdCA8IHR5cGVzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgaWYoISh0eXBlc1t0XSBpbiBjb21wYWN0ZWQub2ZfdHlwZSkpIHtcbiAgICAgICAgICAgIGNvbXBhY3RlZC5vZl90eXBlW3R5cGVzW3RdXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wYWN0ZWQub2ZfdHlwZVt0eXBlc1t0XV0ucHVzaCh0b3Bbc10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCBjb21wYWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgUkRGIGRhdGFzZXQgbm9ybWFsaXphdGlvbiBvbiB0aGUgZ2l2ZW4gaW5wdXQuIFRoZSBpbnB1dCBpcyBKU09OLUxEXG4gKiB1bmxlc3MgdGhlICdpbnB1dEZvcm1hdCcgb3B0aW9uIGlzIHVzZWQuIFRoZSBvdXRwdXQgaXMgYW4gUkRGIGRhdGFzZXRcbiAqIHVubGVzcyB0aGUgJ2Zvcm1hdCcgb3B0aW9uIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCB0byBub3JtYWxpemUgYXMgSlNPTi1MRCBvciBhcyBhIGZvcm1hdCBzcGVjaWZpZWQgYnlcbiAqICAgICAgICAgIHRoZSAnaW5wdXRGb3JtYXQnIG9wdGlvbi5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2FsZ29yaXRobV0gdGhlIG5vcm1hbGl6YXRpb24gYWxnb3JpdGhtIHRvIHVzZSwgYFVSRE5BMjAxNWAgb3JcbiAqICAgICAgICAgICAgYFVSR05BMjAxMmAgKGRlZmF1bHQ6IGBVUkdOQTIwMTJgKS5cbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtpbnB1dEZvcm1hdF0gdGhlIGZvcm1hdCBpZiBpbnB1dCBpcyBub3QgSlNPTi1MRDpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbZm9ybWF0XSB0aGUgZm9ybWF0IGlmIG91dHB1dCBpcyBhIHN0cmluZzpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpXSB0aGUgZG9jdW1lbnQgbG9hZGVyLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgbm9ybWFsaXplZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5ub3JtYWxpemUgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IG5vcm1hbGl6ZSwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdhbGdvcml0aG0nIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5hbGdvcml0aG0gPSAnVVJHTkEyMDEyJztcbiAgfVxuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICBpZignaW5wdXRGb3JtYXQnIGluIG9wdGlvbnMpIHtcbiAgICBpZihvcHRpb25zLmlucHV0Rm9ybWF0ICE9PSAnYXBwbGljYXRpb24vbnF1YWRzJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ1Vua25vd24gbm9ybWFsaXphdGlvbiBpbnB1dCBmb3JtYXQuJyxcbiAgICAgICAgJ2pzb25sZC5Ob3JtYWxpemVFcnJvcicpKTtcbiAgICB9XG4gICAgdmFyIHBhcnNlZElucHV0ID0gX3BhcnNlTlF1YWRzKGlucHV0KTtcbiAgICAvLyBkbyBub3JtYWxpemF0aW9uXG4gICAgbmV3IFByb2Nlc3NvcigpLm5vcm1hbGl6ZShwYXJzZWRJbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnZlcnQgdG8gUkRGIGRhdGFzZXQgdGhlbiBkbyBub3JtYWxpemF0aW9uXG4gICAgdmFyIG9wdHMgPSBfY2xvbmUob3B0aW9ucyk7XG4gICAgZGVsZXRlIG9wdHMuZm9ybWF0O1xuICAgIG9wdHMucHJvZHVjZUdlbmVyYWxpemVkUmRmID0gZmFsc2U7XG4gICAganNvbmxkLnRvUkRGKGlucHV0LCBvcHRzLCBmdW5jdGlvbihlcnIsIGRhdGFzZXQpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgY29udmVydCBpbnB1dCB0byBSREYgZGF0YXNldCBiZWZvcmUgbm9ybWFsaXphdGlvbi4nLFxuICAgICAgICAgICdqc29ubGQuTm9ybWFsaXplRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICAgIH1cbiAgICAgIC8vIGRvIG5vcm1hbGl6YXRpb25cbiAgICAgIG5ldyBQcm9jZXNzb3IoKS5ub3JtYWxpemUoZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIFJERiBkYXRhc2V0IHRvIEpTT04tTEQuXG4gKlxuICogQHBhcmFtIGRhdGFzZXQgYSBzZXJpYWxpemVkIHN0cmluZyBvZiBSREYgaW4gYSBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZVxuICogICAgICAgICAgZm9ybWF0IG9wdGlvbiBvciBhbiBSREYgZGF0YXNldCB0byBjb252ZXJ0LlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbZm9ybWF0XSB0aGUgZm9ybWF0IGlmIGRhdGFzZXQgcGFyYW0gbXVzdCBmaXJzdCBiZSBwYXJzZWQ6XG4gKiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9ucXVhZHMnIGZvciBOLVF1YWRzIChkZWZhdWx0KS5cbiAqICAgICAgICAgIFtyZGZQYXJzZXJdIGEgY3VzdG9tIFJERi1wYXJzZXIgdG8gdXNlIHRvIHBhcnNlIHRoZSBkYXRhc2V0LlxuICogICAgICAgICAgW3VzZVJkZlR5cGVdIHRydWUgdG8gdXNlIHJkZjp0eXBlLCBmYWxzZSB0byB1c2UgQHR5cGVcbiAqICAgICAgICAgICAgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFt1c2VOYXRpdmVUeXBlc10gdHJ1ZSB0byBjb252ZXJ0IFhTRCB0eXBlcyBpbnRvIG5hdGl2ZSB0eXBlc1xuICogICAgICAgICAgICAoYm9vbGVhbiwgaW50ZWdlciwgZG91YmxlKSwgZmFsc2Ugbm90IHRvIChkZWZhdWx0OiBmYWxzZSkuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBvdXRwdXQpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5qc29ubGQuZnJvbVJERiA9IGZ1bmN0aW9uKGRhdGFzZXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGZyb20gUkRGLCB0b28gZmV3IGFyZ3VtZW50cy4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBnZXQgYXJndW1lbnRzXG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmKCEoJ3VzZVJkZlR5cGUnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy51c2VSZGZUeXBlID0gZmFsc2U7XG4gIH1cbiAgaWYoISgndXNlTmF0aXZlVHlwZXMnIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy51c2VOYXRpdmVUeXBlcyA9IGZhbHNlO1xuICB9XG5cbiAgaWYoISgnZm9ybWF0JyBpbiBvcHRpb25zKSAmJiBfaXNTdHJpbmcoZGF0YXNldCkpIHtcbiAgICAvLyBzZXQgZGVmYXVsdCBmb3JtYXQgdG8gbnF1YWRzXG4gICAgaWYoISgnZm9ybWF0JyBpbiBvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5mb3JtYXQgPSAnYXBwbGljYXRpb24vbnF1YWRzJztcbiAgICB9XG4gIH1cblxuICBqc29ubGQubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgLy8gaGFuZGxlIHNwZWNpYWwgZm9ybWF0XG4gICAgdmFyIHJkZlBhcnNlcjtcbiAgICBpZihvcHRpb25zLmZvcm1hdCkge1xuICAgICAgLy8gY2hlY2sgc3VwcG9ydGVkIGZvcm1hdHNcbiAgICAgIHJkZlBhcnNlciA9IG9wdGlvbnMucmRmUGFyc2VyIHx8IF9yZGZQYXJzZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICAgIGlmKCFyZGZQYXJzZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnVW5rbm93biBpbnB1dCBmb3JtYXQuJyxcbiAgICAgICAgICAnanNvbmxkLlVua25vd25Gb3JtYXQnLCB7Zm9ybWF0OiBvcHRpb25zLmZvcm1hdH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm8tb3AgcGFyc2VyLCBhc3N1bWUgZGF0YXNldCBhbHJlYWR5IHBhcnNlZFxuICAgICAgcmRmUGFyc2VyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBkYXRhc2V0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2tDYWxsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLy8gcmRmIHBhcnNlciBtYXkgYmUgYXN5bmMgb3Igc3luYywgYWx3YXlzIHBhc3MgY2FsbGJhY2tcbiAgICAgIGRhdGFzZXQgPSByZGZQYXJzZXIoZGF0YXNldCwgZnVuY3Rpb24oZXJyLCBkYXRhc2V0KSB7XG4gICAgICAgIGNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIGlmKCFjYWxsYmFja0NhbGxlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgc3luY2hyb25vdXMgb3IgcHJvbWlzZS1iYXNlZCBwYXJzZXJcbiAgICBpZihkYXRhc2V0KSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGFjdHVhbGx5IGEgcHJvbWlzZVxuICAgICAgaWYoJ3RoZW4nIGluIGRhdGFzZXQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFzZXQudGhlbihmdW5jdGlvbihkYXRhc2V0KSB7XG4gICAgICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIHBhcnNlciBpcyBzeW5jaHJvbm91c1xuICAgICAgZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbVJERihkYXRhc2V0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgLy8gY29udmVydCBmcm9tIFJERlxuICAgICAgbmV3IFByb2Nlc3NvcigpLmZyb21SREYoZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIE91dHB1dHMgdGhlIFJERiBkYXRhc2V0IGZvdW5kIGluIHRoZSBnaXZlbiBKU09OLUxEIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtmb3JtYXRdIHRoZSBmb3JtYXQgdG8gdXNlIHRvIG91dHB1dCBhIHN0cmluZzpcbiAqICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL25xdWFkcycgZm9yIE4tUXVhZHMuXG4gKiAgICAgICAgICBbcHJvZHVjZUdlbmVyYWxpemVkUmRmXSB0cnVlIHRvIG91dHB1dCBnZW5lcmFsaXplZCBSREYsIGZhbHNlXG4gKiAgICAgICAgICAgIHRvIHByb2R1Y2Ugb25seSBzdGFuZGFyZCBSREYgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBkYXRhc2V0KSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLnRvUkRGID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHRvIFJERiwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBleHBhbmRlZCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIHNlcmlhbGl6YXRpb24gdG8gUkRGLicsXG4gICAgICAgICdqc29ubGQuUmRmRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG5cbiAgICB2YXIgZGF0YXNldDtcbiAgICB0cnkge1xuICAgICAgLy8gb3V0cHV0IFJERiBkYXRhc2V0XG4gICAgICBkYXRhc2V0ID0gUHJvY2Vzc29yLnByb3RvdHlwZS50b1JERihleHBhbmRlZCwgb3B0aW9ucyk7XG4gICAgICBpZihvcHRpb25zLmZvcm1hdCkge1xuICAgICAgICBpZihvcHRpb25zLmZvcm1hdCA9PT0gJ2FwcGxpY2F0aW9uL25xdWFkcycpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgX3RvTlF1YWRzKGRhdGFzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ1Vua25vd24gb3V0cHV0IGZvcm1hdC4nLFxuICAgICAgICAgICdqc29ubGQuVW5rbm93bkZvcm1hdCcsIHtmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0fSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChleCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGV4KTtcbiAgICB9XG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YXNldCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiAqKkV4cGVyaW1lbnRhbCoqXG4gKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlIG5vZGVzIGluIHRoZSBnaXZlbiBKU09OLUxEIGlucHV0IGludG8gYSBtYXAgb2ZcbiAqIG5vZGUgSUQgPT4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgYmFzZSBJUkkgdG8gdXNlLlxuICogICAgICAgICAgW2V4cGFuZENvbnRleHRdIGEgY29udGV4dCB0byBleHBhbmQgd2l0aC5cbiAqICAgICAgICAgIFtpc3N1ZXJdIGEganNvbmxkLklkZW50aWZpZXJJc3N1ZXIgdG8gdXNlIHRvIGxhYmVsIGJsYW5rIG5vZGVzLlxuICogICAgICAgICAgW25hbWVyXSAoZGVwcmVjYXRlZClcbiAqICAgICAgICAgIFtkb2N1bWVudExvYWRlcih1cmwsIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSldIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBub2RlTWFwKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqL1xuanNvbmxkLmNyZWF0ZU5vZGVNYXAgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNyZWF0ZSBub2RlIG1hcCwgdG9vIGZldyBhcmd1bWVudHMuJykpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZighKCdiYXNlJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuYmFzZSA9ICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSA/IGlucHV0IDogJyc7XG4gIH1cbiAgaWYoISgnZG9jdW1lbnRMb2FkZXInIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5kb2N1bWVudExvYWRlciA9IGpzb25sZC5sb2FkRG9jdW1lbnQ7XG4gIH1cblxuICAvLyBleHBhbmQgaW5wdXRcbiAganNvbmxkLmV4cGFuZChpbnB1dCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZXhwYW5kIGlucHV0IGJlZm9yZSBjcmVhdGluZyBub2RlIG1hcC4nLFxuICAgICAgICAnanNvbmxkLkNyZWF0ZU5vZGVNYXBFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgIH1cblxuICAgIHZhciBub2RlTWFwO1xuICAgIHRyeSB7XG4gICAgICBub2RlTWFwID0gbmV3IFByb2Nlc3NvcigpLmNyZWF0ZU5vZGVNYXAoX2lucHV0LCBvcHRpb25zKTtcbiAgICB9IGNhdGNoKGV4KSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIG5vZGVNYXApO1xuICB9KTtcbn07XG5cbi8qKlxuICogKipFeHBlcmltZW50YWwqKlxuICpcbiAqIE1lcmdlcyB0d28gb3IgbW9yZSBKU09OLUxEIGRvY3VtZW50cyBpbnRvIGEgc2luZ2xlIGZsYXR0ZW5lZCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0gZG9jcyB0aGUgSlNPTi1MRCBkb2N1bWVudHMgdG8gbWVyZ2UgdG9nZXRoZXIuXG4gKiBAcGFyYW0gY3R4IHRoZSBjb250ZXh0IHRvIHVzZSB0byBjb21wYWN0IHRoZSBtZXJnZWQgcmVzdWx0LCBvciBudWxsLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbYmFzZV0gdGhlIGJhc2UgSVJJIHRvIHVzZS5cbiAqICAgICAgICAgIFtleHBhbmRDb250ZXh0XSBhIGNvbnRleHQgdG8gZXhwYW5kIHdpdGguXG4gKiAgICAgICAgICBbaXNzdWVyXSBhIGpzb25sZC5JZGVudGlmaWVySXNzdWVyIHRvIHVzZSB0byBsYWJlbCBibGFuayBub2Rlcy5cbiAqICAgICAgICAgIFtuYW1lcl0gKGRlcHJlY2F0ZWQpLlxuICogICAgICAgICAgW21lcmdlTm9kZXNdIHRydWUgdG8gbWVyZ2UgcHJvcGVydGllcyBmb3Igbm9kZXMgd2l0aCB0aGUgc2FtZSBJRCxcbiAqICAgICAgICAgICAgZmFsc2UgdG8gaWdub3JlIG5ldyBwcm9wZXJ0aWVzIGZvciBub2RlcyB3aXRoIHRoZSBzYW1lIElEIG9uY2VcbiAqICAgICAgICAgICAgdGhlIElEIGhhcyBiZWVuIGRlZmluZWQ7IG5vdGUgdGhhdCB0aGlzIG1heSBub3QgcHJldmVudCBtZXJnaW5nXG4gKiAgICAgICAgICAgIG5ldyBwcm9wZXJ0aWVzIHdoZXJlIGEgbm9kZSBpcyBpbiB0aGUgYG9iamVjdGAgcG9zaXRpb25cbiAqICAgICAgICAgICAgKGRlZmF1bHQ6IHRydWUpLlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIG1lcmdlZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5tZXJnZSA9IGZ1bmN0aW9uKGRvY3MsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IFR5cGVFcnJvcignQ291bGQgbm90IG1lcmdlLCB0b28gZmV3IGFyZ3VtZW50cy4nKSk7XG4gICAgfSk7XG4gIH1cbiAgaWYoIV9pc0FycmF5KGRvY3MpKSB7XG4gICAgcmV0dXJuIGpzb25sZC5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBtZXJnZSwgXCJkb2NzXCIgbXVzdCBiZSBhbiBhcnJheS4nKSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBnZXQgYXJndW1lbnRzXG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIGlmKHR5cGVvZiBjdHggPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGN0eDtcbiAgICBjdHggPSBudWxsO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBleHBhbmQgYWxsIGRvY3VtZW50c1xuICB2YXIgZXhwYW5kZWQgPSBbXTtcbiAgdmFyIGVycm9yID0gbnVsbDtcbiAgdmFyIGNvdW50ID0gZG9jcy5sZW5ndGg7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG9wdHMgPSB7fTtcbiAgICBmb3IodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBvcHRzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICAgIGpzb25sZC5leHBhbmQoZG9jc1tpXSwgb3B0cywgZXhwYW5kQ29tcGxldGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kQ29tcGxldGUoZXJyLCBfaW5wdXQpIHtcbiAgICBpZihlcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZihlcnIpIHtcbiAgICAgIGVycm9yID0gZXJyO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBleHBhbmQgaW5wdXQgYmVmb3JlIGZsYXR0ZW5pbmcuJyxcbiAgICAgICAgJ2pzb25sZC5GbGF0dGVuRXJyb3InLCB7Y2F1c2U6IGVycn0pKTtcbiAgICB9XG4gICAgZXhwYW5kZWQucHVzaChfaW5wdXQpO1xuICAgIGlmKC0tY291bnQgPT09IDApIHtcbiAgICAgIG1lcmdlKGV4cGFuZGVkKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZShleHBhbmRlZCkge1xuICAgIHZhciBtZXJnZU5vZGVzID0gdHJ1ZTtcbiAgICBpZignbWVyZ2VOb2RlcycgaW4gb3B0aW9ucykge1xuICAgICAgbWVyZ2VOb2RlcyA9IG9wdGlvbnMubWVyZ2VOb2RlcztcbiAgICB9XG5cbiAgICB2YXIgaXNzdWVyID0gb3B0aW9ucy5uYW1lciB8fCBvcHRpb25zLmlzc3VlciB8fCBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gICAgdmFyIGdyYXBocyA9IHsnQGRlZmF1bHQnOiB7fX07XG5cbiAgICB2YXIgZGVmYXVsdEdyYXBoO1xuICAgIHRyeSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZXhwYW5kZWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gdW5pcXVlbHkgcmVsYWJlbCBibGFuayBub2Rlc1xuICAgICAgICB2YXIgZG9jID0gZXhwYW5kZWRbaV07XG4gICAgICAgIGRvYyA9IGpzb25sZC5yZWxhYmVsQmxhbmtOb2Rlcyhkb2MsIHtcbiAgICAgICAgICBpc3N1ZXI6IG5ldyBJZGVudGlmaWVySXNzdWVyKCdfOmInICsgaSArICctJylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gYWRkIG5vZGVzIHRvIHRoZSBzaGFyZWQgbm9kZSBtYXAgZ3JhcGhzIGlmIG1lcmdpbmcgbm9kZXMsIHRvIGFcbiAgICAgICAgLy8gc2VwYXJhdGUgZ3JhcGggc2V0IGlmIG5vdFxuICAgICAgICB2YXIgX2dyYXBocyA9IChtZXJnZU5vZGVzIHx8IGkgPT09IDApID8gZ3JhcGhzIDogeydAZGVmYXVsdCc6IHt9fTtcbiAgICAgICAgX2NyZWF0ZU5vZGVNYXAoZG9jLCBfZ3JhcGhzLCAnQGRlZmF1bHQnLCBpc3N1ZXIpO1xuXG4gICAgICAgIGlmKF9ncmFwaHMgIT09IGdyYXBocykge1xuICAgICAgICAgIC8vIG1lcmdlIGRvY3VtZW50IGdyYXBocyBidXQgZG9uJ3QgbWVyZ2UgZXhpc3Rpbmcgbm9kZXNcbiAgICAgICAgICBmb3IodmFyIGdyYXBoTmFtZSBpbiBfZ3JhcGhzKSB7XG4gICAgICAgICAgICB2YXIgX25vZGVNYXAgPSBfZ3JhcGhzW2dyYXBoTmFtZV07XG4gICAgICAgICAgICBpZighKGdyYXBoTmFtZSBpbiBncmFwaHMpKSB7XG4gICAgICAgICAgICAgIGdyYXBoc1tncmFwaE5hbWVdID0gX25vZGVNYXA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5vZGVNYXAgPSBncmFwaHNbZ3JhcGhOYW1lXTtcbiAgICAgICAgICAgIGZvcih2YXIga2V5IGluIF9ub2RlTWFwKSB7XG4gICAgICAgICAgICAgIGlmKCEoa2V5IGluIG5vZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgbm9kZU1hcFtrZXldID0gX25vZGVNYXBba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYWxsIG5vbi1kZWZhdWx0IGdyYXBocyB0byBkZWZhdWx0IGdyYXBoXG4gICAgICBkZWZhdWx0R3JhcGggPSBfbWVyZ2VOb2RlTWFwcyhncmFwaHMpO1xuICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgfVxuXG4gICAgLy8gcHJvZHVjZSBmbGF0dGVuZWQgb3V0cHV0XG4gICAgdmFyIGZsYXR0ZW5lZCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdEdyYXBoKS5zb3J0KCk7XG4gICAgZm9yKHZhciBraSA9IDA7IGtpIDwga2V5cy5sZW5ndGg7ICsra2kpIHtcbiAgICAgIHZhciBub2RlID0gZGVmYXVsdEdyYXBoW2tleXNba2ldXTtcbiAgICAgIC8vIG9ubHkgYWRkIGZ1bGwgc3ViamVjdHMgdG8gdG9wLWxldmVsXG4gICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlKSkge1xuICAgICAgICBmbGF0dGVuZWQucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjdHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBmbGF0dGVuZWQpO1xuICAgIH1cblxuICAgIC8vIGNvbXBhY3QgcmVzdWx0IChmb3JjZSBAZ3JhcGggb3B0aW9uIHRvIHRydWUsIHNraXAgZXhwYW5zaW9uKVxuICAgIG9wdGlvbnMuZ3JhcGggPSB0cnVlO1xuICAgIG9wdGlvbnMuc2tpcEV4cGFuc2lvbiA9IHRydWU7XG4gICAganNvbmxkLmNvbXBhY3QoZmxhdHRlbmVkLCBjdHgsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnQ291bGQgbm90IGNvbXBhY3QgbWVyZ2VkIG91dHB1dC4nLFxuICAgICAgICAgICdqc29ubGQuTWVyZ2VFcnJvcicsIHtjYXVzZTogZXJyfSkpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgY29tcGFjdGVkKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZWxhYmVscyBhbGwgYmxhbmsgbm9kZXMgaW4gdGhlIGdpdmVuIEpTT04tTEQgaW5wdXQuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBKU09OLUxEIGlucHV0LlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbaXNzdWVyXSBhIGpzb25sZC5JZGVudGlmaWVySXNzdWVyIHRvIHVzZSB0byBsYWJlbCBibGFuayBub2Rlcy5cbiAqICAgICAgICAgIFtuYW1lcl0gKGRlcHJlY2F0ZWQpLlxuICovXG5qc29ubGQucmVsYWJlbEJsYW5rTm9kZXMgPSBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGlzc3VlciA9IG9wdGlvbnMubmFtZXIgfHwgb3B0aW9ucy5pc3N1ZXIgfHwgbmV3IElkZW50aWZpZXJJc3N1ZXIoJ186YicpO1xuICByZXR1cm4gX2xhYmVsQmxhbmtOb2Rlcyhpc3N1ZXIsIGlucHV0KTtcbn07XG5cbi8qKlxuICogUHJlcGVuZHMgYSBiYXNlIElSSSB0byB0aGUgZ2l2ZW4gcmVsYXRpdmUgSVJJLlxuICpcbiAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIElSSS5cbiAqIEBwYXJhbSBpcmkgdGhlIHJlbGF0aXZlIElSSS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBJUkkuXG4gKi9cbmpzb25sZC5wcmVwZW5kQmFzZSA9IGZ1bmN0aW9uKGJhc2UsIGlyaSkge1xuICByZXR1cm4gX3ByZXBlbmRCYXNlKGJhc2UsIGlyaSk7XG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGRvY3VtZW50IGxvYWRlciBmb3IgZXh0ZXJuYWwgZG9jdW1lbnRzLiBJZiB0aGUgZW52aXJvbm1lbnRcbiAqIGlzIG5vZGUuanMsIGEgY2FsbGJhY2stY29udGludWF0aW9uLXN0eWxlIGRvY3VtZW50IGxvYWRlciBpcyB1c2VkOyBvdGhlcndpc2UsXG4gKiBhIHByb21pc2VzLXN0eWxlIGRvY3VtZW50IGxvYWRlciBpcyB1c2VkLlxuICpcbiAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byBsb2FkLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgcmVtb3RlRG9jKSBjYWxsZWQgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcyxcbiAqICAgICAgICAgIGlmIHVzaW5nIGEgbm9uLXByb21pc2VzIEFQSS5cbiAqXG4gKiBAcmV0dXJuIGEgcHJvbWlzZSwgaWYgdXNpbmcgYSBwcm9taXNlcyBBUEkuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlciA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgdmFyIGVyciA9IG5ldyBKc29uTGRFcnJvcihcbiAgICAnQ291bGQgbm90IHJldHJpZXZlIGEgSlNPTi1MRCBkb2N1bWVudCBmcm9tIHRoZSBVUkwuIFVSTCAnICtcbiAgICAnZGVyZWZlcmVuY2luZyBub3QgaW1wbGVtZW50ZWQuJywgJ2pzb25sZC5Mb2FkRG9jdW1lbnRFcnJvcicsXG4gICAge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCd9KTtcbiAgaWYoX25vZGVqcykge1xuICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICB9XG4gIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQgZGVmYXVsdCBkb2N1bWVudCBsb2FkZXIuIFVzZSBvciBvdmVycmlkZSBqc29ubGQuZG9jdW1lbnRMb2FkZXJcbiAqIGluc3RlYWQuXG4gKi9cbmpzb25sZC5sb2FkRG9jdW1lbnQgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gIHZhciBwcm9taXNlID0ganNvbmxkLmRvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2spO1xuICBpZihwcm9taXNlICYmICd0aGVuJyBpbiBwcm9taXNlKSB7XG4gICAgcHJvbWlzZS50aGVuKGNhbGxiYWNrLmJpbmQobnVsbCwgbnVsbCksIGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLyogUHJvbWlzZXMgQVBJICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlcyBBUEkgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2FwaV0gYW4gb2JqZWN0IHRvIGF0dGFjaCB0aGUgQVBJIHRvLlxuICogICAgICAgICAgW3ZlcnNpb25dICdqc29uLWxkLTEuMCcgdG8gb3V0cHV0IGEgc3RhbmRhcmQgSlNPTi1MRCAxLjAgcHJvbWlzZXNcbiAqICAgICAgICAgICAgQVBJLCAnanNvbmxkLmpzJyB0byBvdXRwdXQgdGhlIHNhbWUgd2l0aCBhdWdtZW50ZWQgcHJvcHJpZXRhcnlcbiAqICAgICAgICAgICAgbWV0aG9kcyAoZGVmYXVsdDogJ2pzb25sZC5qcycpXG4gKlxuICogQHJldHVybiB0aGUgcHJvbWlzZXMgQVBJIG9iamVjdC5cbiAqL1xuanNvbmxkLnByb21pc2VzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuICB2YXIgcHJvbWlzaWZ5ID0ganNvbmxkLnByb21pc2lmeTtcblxuICAvLyBoYW5kbGUgJ2FwaScgb3B0aW9uIGFzIHZlcnNpb24sIHNldCBkZWZhdWx0c1xuICB2YXIgYXBpID0gb3B0aW9ucy5hcGkgfHwge307XG4gIHZhciB2ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8ICdqc29ubGQuanMnO1xuICBpZih0eXBlb2Ygb3B0aW9ucy5hcGkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYoIW9wdGlvbnMudmVyc2lvbikge1xuICAgICAgdmVyc2lvbiA9IG9wdGlvbnMuYXBpO1xuICAgIH1cbiAgICBhcGkgPSB7fTtcbiAgfVxuXG4gIC8vIFRoZSBXZWIgSURMIHRlc3QgaGFybmVzcyB3aWxsIGNoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkZWZpbmVkIGluXG4gIC8vIHRoZSBmdW5jdGlvbnMgYmVsb3cuIFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlXG4gIC8vIHJlcXVpcmVkIChub24tb3B0aW9uYWwpIHBhcmFtZXRlcnMgb2YgdGhlIEpzb25MZFByb2Nlc3NvciBpbnRlcmZhY2UgYXNcbiAgLy8gZGVmaW5lZCBoZXJlOlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvanNvbi1sZC1hcGkvI3RoZS1qc29ubGRwcm9jZXNzb3ItaW50ZXJmYWNlXG5cbiAgYXBpLmV4cGFuZCA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBleHBhbmQsIHRvbyBmZXcgYXJndW1lbnRzLicpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzaWZ5LmFwcGx5KG51bGwsIFtqc29ubGQuZXhwYW5kXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5jb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29tcGFjdCwgdG9vIGZldyBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIHZhciBjb21wYWN0ID0gZnVuY3Rpb24oaW5wdXQsIGN0eCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAvLyBlbnN1cmUgb25seSBvbmUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2tcbiAgICAgIGpzb25sZC5jb21wYWN0KGlucHV0LCBjdHgsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgY29tcGFjdGVkKSB7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgY29tcGFjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbY29tcGFjdF0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICB9O1xuICBhcGkuZmxhdHRlbiA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBmbGF0dGVuLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgIG51bGwsIFtqc29ubGQuZmxhdHRlbl0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICB9O1xuICBhcGkuZnJhbWUgPSBmdW5jdGlvbihpbnB1dCwgZnJhbWUpIHtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ291bGQgbm90IGZyYW1lLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbanNvbmxkLmZyYW1lXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5mcm9tUkRGID0gZnVuY3Rpb24oZGF0YXNldCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBmcm9tIFJERiwgdG9vIGZldyBhcmd1bWVudHMuJyk7XG4gICAgfVxuICAgIHJldHVybiBwcm9taXNpZnkuYXBwbHkoXG4gICAgICBudWxsLCBbanNvbmxkLmZyb21SREZdLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgfTtcbiAgYXBpLnRvUkRGID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdG8gUkRGLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShudWxsLCBbanNvbmxkLnRvUkRGXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG4gIGFwaS5ub3JtYWxpemUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3Qgbm9ybWFsaXplLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgIG51bGwsIFtqc29ubGQubm9ybWFsaXplXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gIH07XG5cbiAgaWYodmVyc2lvbiA9PT0gJ2pzb25sZC5qcycpIHtcbiAgICBhcGkubGluayA9IGZ1bmN0aW9uKGlucHV0LCBjdHgpIHtcbiAgICAgIGlmKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBsaW5rLCB0b28gZmV3IGFyZ3VtZW50cy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNpZnkuYXBwbHkoXG4gICAgICAgIG51bGwsIFtqc29ubGQubGlua10uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gICAgYXBpLm9iamVjdGlmeSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICByZXR1cm4gcHJvbWlzaWZ5LmFwcGx5KFxuICAgICAgICBudWxsLCBbanNvbmxkLm9iamVjdGlmeV0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gICAgYXBpLmNyZWF0ZU5vZGVNYXAgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgICAgbnVsbCwgW2pzb25sZC5jcmVhdGVOb2RlTWFwXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbiAgICBhcGkubWVyZ2UgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuIHByb21pc2lmeS5hcHBseShcbiAgICAgICAgbnVsbCwgW2pzb25sZC5tZXJnZV0uY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGpzb25sZC5Qcm9taXNlID0gZ2xvYmFsLlByb21pc2UgfHwgcmVxdWlyZSgnZXM2LXByb21pc2UnKS5Qcm9taXNlO1xuICB9IGNhdGNoKGUpIHtcbiAgICB2YXIgZiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBhIFByb21pc2UgaW1wbGVtZW50YXRpb24uJyk7XG4gICAgfTtcbiAgICBmb3IodmFyIG1ldGhvZCBpbiBhcGkpIHtcbiAgICAgIGFwaVttZXRob2RdID0gZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXBpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5vZGUuanMgYXN5bmMgb3AgaW50byBhIHByb21pc2Ugdy9ib3hlZCByZXNvbHZlZCB2YWx1ZShzKS5cbiAqXG4gKiBAcGFyYW0gb3AgdGhlIG9wZXJhdGlvbiB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIHByb21pc2UuXG4gKi9cbmpzb25sZC5wcm9taXNpZnkgPSBmdW5jdGlvbihvcCkge1xuICBpZighanNvbmxkLlByb21pc2UpIHtcbiAgICB0cnkge1xuICAgICAganNvbmxkLlByb21pc2UgPSBnbG9iYWwuUHJvbWlzZSB8fCByZXF1aXJlKCdlczYtcHJvbWlzZScpLlByb21pc2U7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGEgUHJvbWlzZSBpbXBsZW1lbnRhdGlvbi4nKTtcbiAgICB9XG4gIH1cbiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICByZXR1cm4gbmV3IGpzb25sZC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIG9wLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KGZ1bmN0aW9uKGVyciwgdmFsdWUpIHtcbiAgICAgIGlmKCFlcnIpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufTtcblxuLy8gZXh0ZW5kIGpzb25sZC5wcm9taXNlcyB3L2pzb25sZC5qcyBtZXRob2RzXG5qc29ubGQucHJvbWlzZXMoe2FwaToganNvbmxkLnByb21pc2VzfSk7XG5cbi8qIFdlYklETCBBUEkgKi9cblxuZnVuY3Rpb24gSnNvbkxkUHJvY2Vzc29yKCkge31cbkpzb25MZFByb2Nlc3Nvci5wcm90b3R5cGUgPSBqc29ubGQucHJvbWlzZXMoe3ZlcnNpb246ICdqc29uLWxkLTEuMCd9KTtcbkpzb25MZFByb2Nlc3Nvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcyBpbnN0YW5jZW9mIEpzb25MZFByb2Nlc3Nvcikge1xuICAgIHJldHVybiAnW29iamVjdCBKc29uTGRQcm9jZXNzb3JdJztcbiAgfVxuICByZXR1cm4gJ1tvYmplY3QgSnNvbkxkUHJvY2Vzc29yUHJvdG90eXBlXSc7XG59O1xuanNvbmxkLkpzb25MZFByb2Nlc3NvciA9IEpzb25MZFByb2Nlc3NvcjtcblxuLy8gSUU4IGhhcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgYnV0IGl0IG9ubHlcbi8vIHdvcmtzIG9uIERPTSBub2RlcyAtLSBzbyBmZWF0dXJlIGRldGVjdGlvblxuLy8gcmVxdWlyZXMgdHJ5L2NhdGNoIDotKFxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gISFPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5pZihjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7fSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gZmFsc2U7XG4gIH1cbn1cblxuaWYoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEpzb25MZFByb2Nlc3NvciwgJ3Byb3RvdHlwZScsIHtcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2VcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShKc29uTGRQcm9jZXNzb3IucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCB7XG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiBKc29uTGRQcm9jZXNzb3JcbiAgfSk7XG59XG5cbi8vIHNldHVwIGJyb3dzZXIgZ2xvYmFsIEpzb25MZFByb2Nlc3NvclxuaWYoX2Jyb3dzZXIgJiYgdHlwZW9mIGdsb2JhbC5Kc29uTGRQcm9jZXNzb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gIGlmKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ0pzb25MZFByb2Nlc3NvcicsIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogSnNvbkxkUHJvY2Vzc29yXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZ2xvYmFsLkpzb25MZFByb2Nlc3NvciA9IEpzb25MZFByb2Nlc3NvcjtcbiAgfVxufVxuXG4vKiBVdGlsaXR5IEFQSSAqL1xuXG4vLyBkZWZpbmUgc2V0SW1tZWRpYXRlIGFuZCBuZXh0VGlja1xuLy8vLyBuZXh0VGljayBpbXBsZW1lbnRhdGlvbiB3aXRoIGJyb3dzZXItY29tcGF0aWJsZSBmYWxsYmFjayAvLy8vXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jYW9sYW4vYXN5bmMvYmxvYi9tYXN0ZXIvbGliL2FzeW5jLmpzXG5cbi8vIGNhcHR1cmUgdGhlIGdsb2JhbCByZWZlcmVuY2UgdG8gZ3VhcmQgYWdhaW5zdCBmYWtlVGltZXIgbW9ja3NcbnZhciBfc2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBzZXRJbW1lZGlhdGU7XG5cbnZhciBfZGVsYXkgPSBfc2V0SW1tZWRpYXRlID8gZnVuY3Rpb24oZm4pIHtcbiAgLy8gbm90IGEgZGlyZWN0IGFsaWFzIChmb3IgSUUxMCBjb21wYXRpYmlsaXR5KVxuICBfc2V0SW1tZWRpYXRlKGZuKTtcbn0gOiBmdW5jdGlvbihmbikge1xuICBzZXRUaW1lb3V0KGZuLCAwKTtcbn07XG5cbmlmKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICBqc29ubGQubmV4dFRpY2sgPSBwcm9jZXNzLm5leHRUaWNrO1xufSBlbHNlIHtcbiAganNvbmxkLm5leHRUaWNrID0gX2RlbGF5O1xufVxuanNvbmxkLnNldEltbWVkaWF0ZSA9IF9zZXRJbW1lZGlhdGUgPyBfZGVsYXkgOiBqc29ubGQubmV4dFRpY2s7XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBoZWFkZXIuIFRoZSByZXN1bHRzIHdpbGwgYmUga2V5J2QgYnkgdGhlIHZhbHVlIG9mIFwicmVsXCIuXG4gKlxuICogTGluazogPGh0dHA6Ly9qc29uLWxkLm9yZy9jb250ZXh0cy9wZXJzb24uanNvbmxkPjsgcmVsPVwiaHR0cDovL3d3dy53My5vcmcvbnMvanNvbi1sZCNjb250ZXh0XCI7IHR5cGU9XCJhcHBsaWNhdGlvbi9sZCtqc29uXCJcbiAqXG4gKiBQYXJzZXMgYXM6IHtcbiAqICAgJ2h0dHA6Ly93d3cudzMub3JnL25zL2pzb24tbGQjY29udGV4dCc6IHtcbiAqICAgICB0YXJnZXQ6IGh0dHA6Ly9qc29uLWxkLm9yZy9jb250ZXh0cy9wZXJzb24uanNvbmxkLFxuICogICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9sZCtqc29uJ1xuICogICB9XG4gKiB9XG4gKlxuICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBcInJlbFwiIHdpdGggdGhlIHNhbWUgSVJJLCB0aGVuIGVudHJpZXMgaW4gdGhlXG4gKiByZXN1bHRpbmcgbWFwIGZvciB0aGF0IFwicmVsXCIgd2lsbCBiZSBhcnJheXMuXG4gKlxuICogQHBhcmFtIGhlYWRlciB0aGUgbGluayBoZWFkZXIgdG8gcGFyc2UuXG4gKi9cbmpzb25sZC5wYXJzZUxpbmtIZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIpIHtcbiAgdmFyIHJ2YWwgPSB7fTtcbiAgLy8gc3BsaXQgb24gdW5icmFja2V0ZWQvdW5xdW90ZWQgY29tbWFzXG4gIHZhciBlbnRyaWVzID0gaGVhZGVyLm1hdGNoKC8oPzo8W14+XSo/PnxcIlteXCJdKj9cInxbXixdKSsvZyk7XG4gIHZhciByTGlua0hlYWRlciA9IC9cXHMqPChbXj5dKj8pPlxccyooPzo7XFxzKiguKikpPy87XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG1hdGNoID0gZW50cmllc1tpXS5tYXRjaChyTGlua0hlYWRlcik7XG4gICAgaWYoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHt0YXJnZXQ6IG1hdGNoWzFdfTtcbiAgICB2YXIgcGFyYW1zID0gbWF0Y2hbMl07XG4gICAgdmFyIHJQYXJhbXMgPSAvKC4qPyk9KD86KD86XCIoW15cIl0qPylcIil8KFteXCJdKj8pKVxccyooPzooPzo7XFxzKil8JCkvZztcbiAgICB3aGlsZShtYXRjaCA9IHJQYXJhbXMuZXhlYyhwYXJhbXMpKSB7XG4gICAgICByZXN1bHRbbWF0Y2hbMV1dID0gKG1hdGNoWzJdID09PSB1bmRlZmluZWQpID8gbWF0Y2hbM10gOiBtYXRjaFsyXTtcbiAgICB9XG4gICAgdmFyIHJlbCA9IHJlc3VsdFsncmVsJ10gfHwgJyc7XG4gICAgaWYoX2lzQXJyYXkocnZhbFtyZWxdKSkge1xuICAgICAgcnZhbFtyZWxdLnB1c2gocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYocmVsIGluIHJ2YWwpIHtcbiAgICAgIHJ2YWxbcmVsXSA9IFtydmFsW3JlbF0sIHJlc3VsdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ2YWxbcmVsXSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW1wbGUgcXVldWUgZm9yIHJlcXVlc3RpbmcgZG9jdW1lbnRzLlxuICovXG5qc29ubGQuUmVxdWVzdFF1ZXVlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3JlcXVlc3RzID0ge307XG59O1xuanNvbmxkLlJlcXVlc3RRdWV1ZS5wcm90b3R5cGUud3JhcExvYWRlciA9IGZ1bmN0aW9uKGxvYWRlcikge1xuICB0aGlzLl9sb2FkZXIgPSBsb2FkZXI7XG4gIHRoaXMuX3VzZVByb21pc2UgPSAobG9hZGVyLmxlbmd0aCA9PT0gMSk7XG4gIHJldHVybiB0aGlzLmFkZC5iaW5kKHRoaXMpO1xufTtcbmpzb25sZC5SZXF1ZXN0UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIGNhbGxiYWNrIG11c3QgYmUgZ2l2ZW4gaWYgbm90IHVzaW5nIHByb21pc2VzXG4gIGlmKCFjYWxsYmFjayAmJiAhc2VsZi5fdXNlUHJvbWlzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XG4gIH1cblxuICAvLyBQcm9taXNlLWJhc2VkIEFQSVxuICBpZihzZWxmLl91c2VQcm9taXNlKSB7XG4gICAgcmV0dXJuIG5ldyBqc29ubGQuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsb2FkID0gc2VsZi5fcmVxdWVzdHNbdXJsXTtcbiAgICAgIGlmKCFsb2FkKSB7XG4gICAgICAgIC8vIGxvYWQgVVJMIHRoZW4gcmVtb3ZlIGZyb20gcXVldWVcbiAgICAgICAgbG9hZCA9IHNlbGYuX3JlcXVlc3RzW3VybF0gPSBzZWxmLl9sb2FkZXIodXJsKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlbW90ZURvYykge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3JlcXVlc3RzW3VybF07XG4gICAgICAgICAgICByZXR1cm4gcmVtb3RlRG9jO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3JlcXVlc3RzW3VybF07XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyByZXNvbHZlL3JlamVjdCBwcm9taXNlIG9uY2UgVVJMIGhhcyBiZWVuIGxvYWRlZFxuICAgICAgbG9hZC50aGVuKGZ1bmN0aW9uKHJlbW90ZURvYykge1xuICAgICAgICByZXNvbHZlKHJlbW90ZURvYyk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNhbGxiYWNrLWJhc2VkIEFQSVxuICBpZih1cmwgaW4gc2VsZi5fcmVxdWVzdHMpIHtcbiAgICBzZWxmLl9yZXF1ZXN0c1t1cmxdLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHNlbGYuX3JlcXVlc3RzW3VybF0gPSBbY2FsbGJhY2tdO1xuICAgIHNlbGYuX2xvYWRlcih1cmwsIGZ1bmN0aW9uKGVyciwgcmVtb3RlRG9jKSB7XG4gICAgICB2YXIgY2FsbGJhY2tzID0gc2VsZi5fcmVxdWVzdHNbdXJsXTtcbiAgICAgIGRlbGV0ZSBzZWxmLl9yZXF1ZXN0c1t1cmxdO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYWxsYmFja3NbaV0oZXJyLCByZW1vdGVEb2MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW1wbGUgZG9jdW1lbnQgY2FjaGUgdGhhdCByZXRhaW5zIGRvY3VtZW50cyBmb3IgYSBzaG9ydFxuICogcGVyaW9kIG9mIHRpbWUuXG4gKlxuICogRklYTUU6IEltcGxlbWVudCBzaW1wbGUgSFRUUCBjYWNoaW5nIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuXG4gKi9cbmpzb25sZC5Eb2N1bWVudENhY2hlID0gZnVuY3Rpb24oc2l6ZSkge1xuICB0aGlzLm9yZGVyID0gW107XG4gIHRoaXMuY2FjaGUgPSB7fTtcbiAgdGhpcy5zaXplID0gc2l6ZSB8fCA1MDtcbiAgdGhpcy5leHBpcmVzID0gMzAgKiAxMDAwO1xufTtcbmpzb25sZC5Eb2N1bWVudENhY2hlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih1cmwpIHtcbiAgaWYodXJsIGluIHRoaXMuY2FjaGUpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmNhY2hlW3VybF07XG4gICAgaWYoZW50cnkuZXhwaXJlcyA+PSArbmV3IERhdGUoKSkge1xuICAgICAgcmV0dXJuIGVudHJ5LmN0eDtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbdXJsXTtcbiAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YodXJsKSwgMSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuanNvbmxkLkRvY3VtZW50Q2FjaGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKHVybCwgY3R4KSB7XG4gIGlmKHRoaXMub3JkZXIubGVuZ3RoID09PSB0aGlzLnNpemUpIHtcbiAgICBkZWxldGUgdGhpcy5jYWNoZVt0aGlzLm9yZGVyLnNoaWZ0KCldO1xuICB9XG4gIHRoaXMub3JkZXIucHVzaCh1cmwpO1xuICB0aGlzLmNhY2hlW3VybF0gPSB7Y3R4OiBjdHgsIGV4cGlyZXM6ICgrbmV3IERhdGUoKSArIHRoaXMuZXhwaXJlcyl9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBjb250ZXh0IGNhY2hlLlxuICpcbiAqIEBwYXJhbSBzaXplIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLlxuICovXG5qc29ubGQuQWN0aXZlQ29udGV4dENhY2hlID0gZnVuY3Rpb24oc2l6ZSkge1xuICB0aGlzLm9yZGVyID0gW107XG4gIHRoaXMuY2FjaGUgPSB7fTtcbiAgdGhpcy5zaXplID0gc2l6ZSB8fCAxMDA7XG59O1xuanNvbmxkLkFjdGl2ZUNvbnRleHRDYWNoZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oYWN0aXZlQ3R4LCBsb2NhbEN0eCkge1xuICB2YXIga2V5MSA9IEpTT04uc3RyaW5naWZ5KGFjdGl2ZUN0eCk7XG4gIHZhciBrZXkyID0gSlNPTi5zdHJpbmdpZnkobG9jYWxDdHgpO1xuICB2YXIgbGV2ZWwxID0gdGhpcy5jYWNoZVtrZXkxXTtcbiAgaWYobGV2ZWwxICYmIGtleTIgaW4gbGV2ZWwxKSB7XG4gICAgcmV0dXJuIGxldmVsMVtrZXkyXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5qc29ubGQuQWN0aXZlQ29udGV4dENhY2hlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBsb2NhbEN0eCwgcmVzdWx0KSB7XG4gIGlmKHRoaXMub3JkZXIubGVuZ3RoID09PSB0aGlzLnNpemUpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLm9yZGVyLnNoaWZ0KCk7XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbZW50cnkuYWN0aXZlQ3R4XVtlbnRyeS5sb2NhbEN0eF07XG4gIH1cbiAgdmFyIGtleTEgPSBKU09OLnN0cmluZ2lmeShhY3RpdmVDdHgpO1xuICB2YXIga2V5MiA9IEpTT04uc3RyaW5naWZ5KGxvY2FsQ3R4KTtcbiAgdGhpcy5vcmRlci5wdXNoKHthY3RpdmVDdHg6IGtleTEsIGxvY2FsQ3R4OiBrZXkyfSk7XG4gIGlmKCEoa2V5MSBpbiB0aGlzLmNhY2hlKSkge1xuICAgIHRoaXMuY2FjaGVba2V5MV0gPSB7fTtcbiAgfVxuICB0aGlzLmNhY2hlW2tleTFdW2tleTJdID0gX2Nsb25lKHJlc3VsdCk7XG59O1xuXG4vKipcbiAqIERlZmF1bHQgSlNPTi1MRCBjYWNoZS5cbiAqL1xuanNvbmxkLmNhY2hlID0ge1xuICBhY3RpdmVDdHg6IG5ldyBqc29ubGQuQWN0aXZlQ29udGV4dENhY2hlKClcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgbG9hZGVycy5cbiAqL1xuanNvbmxkLmRvY3VtZW50TG9hZGVycyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBidWlsdC1pbiBqcXVlcnkgZG9jdW1lbnQgbG9hZGVyLlxuICpcbiAqIEBwYXJhbSAkIHRoZSBqcXVlcnkgaW5zdGFuY2UgdG8gdXNlLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHVzZVByb21pc2U6IHRydWUgdG8gdXNlIGEgcHJvbWlzZXMgQVBJLCBmYWxzZSBmb3IgYVxuICogICAgICAgICAgICBjYWxsYmFjay1jb250aW51YXRpb24tc3R5bGUgQVBJOyBkZWZhdWx0cyB0byB0cnVlIGlmIFByb21pc2VcbiAqICAgICAgICAgICAgaXMgZ2xvYmFsbHkgZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICpcbiAqIEByZXR1cm4gdGhlIGpxdWVyeSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlcnMuanF1ZXJ5ID0gZnVuY3Rpb24oJCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHF1ZXVlID0gbmV3IGpzb25sZC5SZXF1ZXN0UXVldWUoKTtcblxuICAvLyB1c2Ugb3B0aW9uIG9yLCBieSBkZWZhdWx0LCB1c2UgUHJvbWlzZSB3aGVuIGl0cyBkZWZpbmVkXG4gIHZhciB1c2VQcm9taXNlID0gKCd1c2VQcm9taXNlJyBpbiBvcHRpb25zID9cbiAgICBvcHRpb25zLnVzZVByb21pc2UgOiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSk7XG4gIGlmKHVzZVByb21pc2UpIHtcbiAgICByZXR1cm4gcXVldWUud3JhcExvYWRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGxvYWRlciwgdXJsKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVldWUud3JhcExvYWRlcihsb2FkZXIpO1xuXG4gIGZ1bmN0aW9uIGxvYWRlcih1cmwsIGNhbGxiYWNrKSB7XG4gICAgaWYodXJsLmluZGV4T2YoJ2h0dHA6JykgIT09IDAgJiYgdXJsLmluZGV4T2YoJ2h0dHBzOicpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IG9ubHkgXCJodHRwXCIgYW5kIFwiaHR0cHNcIiBVUkxzIGFyZSAnICtcbiAgICAgICAgJ3N1cHBvcnRlZC4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuc2VjdXJlICYmIHVybC5pbmRleE9mKCdodHRwcycpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IHNlY3VyZSBtb2RlIGlzIGVuYWJsZWQgYW5kICcgK1xuICAgICAgICAndGhlIFVSTFxcJ3Mgc2NoZW1lIGlzIG5vdCBcImh0dHBzXCIuJyxcbiAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsfSksXG4gICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICAgIH1cbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBhY2NlcHRzOiB7XG4gICAgICAgIGpzb246ICdhcHBsaWNhdGlvbi9sZCtqc29uLCBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgfSxcbiAgICAgIC8vIGVuc3VyZSBBY2NlcHQgaGVhZGVyIGlzIHZlcnkgc3BlY2lmaWMgZm9yIEpTT04tTEQvSlNPTlxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2xkK2pzb24sIGFwcGxpY2F0aW9uL2pzb24nXG4gICAgICB9LFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgIGNyb3NzRG9tYWluOiB0cnVlLFxuICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgdmFyIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogZGF0YX07XG5cbiAgICAgICAgLy8gaGFuZGxlIExpbmsgSGVhZGVyXG4gICAgICAgIHZhciBjb250ZW50VHlwZSA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgdmFyIGxpbmtIZWFkZXIgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcignTGluaycpO1xuICAgICAgICBpZihsaW5rSGVhZGVyICYmIGNvbnRlbnRUeXBlICE9PSAnYXBwbGljYXRpb24vbGQranNvbicpIHtcbiAgICAgICAgICAvLyBvbmx5IDEgcmVsYXRlZCBsaW5rIGhlYWRlciBwZXJtaXR0ZWRcbiAgICAgICAgICBsaW5rSGVhZGVyID0ganNvbmxkLnBhcnNlTGlua0hlYWRlcihsaW5rSGVhZGVyKVtMSU5LX0hFQURFUl9SRUxdO1xuICAgICAgICAgIGlmKF9pc0FycmF5KGxpbmtIZWFkZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGl0IGhhcyBtb3JlIHRoYW4gb25lICcgK1xuICAgICAgICAgICAgICAnYXNzb2NpYXRlZCBIVFRQIExpbmsgSGVhZGVyLicsXG4gICAgICAgICAgICAgICdqc29ubGQuSW52YWxpZFVybCcsXG4gICAgICAgICAgICAgIHtjb2RlOiAnbXVsdGlwbGUgY29udGV4dCBsaW5rIGhlYWRlcnMnLCB1cmw6IHVybH0pLCBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihsaW5rSGVhZGVyKSB7XG4gICAgICAgICAgICBkb2MuY29udGV4dFVybCA9IGxpbmtIZWFkZXIudGFyZ2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnIpIHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCwgYW4gZXJyb3Igb2NjdXJyZWQuJyxcbiAgICAgICAgICAnanNvbmxkLkxvYWREb2N1bWVudEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmwsIGNhdXNlOiBlcnJ9KSxcbiAgICAgICAgICB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYnVpbHQtaW4gbm9kZSBkb2N1bWVudCBsb2FkZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHN0cmljdFNTTDogdHJ1ZSB0byByZXF1aXJlIFNTTCBjZXJ0aWZpY2F0ZXMgdG8gYmUgdmFsaWQsXG4gKiAgICAgICAgICAgIGZhbHNlIG5vdCB0byAoZGVmYXVsdDogdHJ1ZSkuXG4gKiAgICAgICAgICBtYXhSZWRpcmVjdHM6IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHMgdG8gcGVybWl0LCBub25lIGJ5XG4gKiAgICAgICAgICAgIGRlZmF1bHQuXG4gKiAgICAgICAgICByZXF1ZXN0OiB0aGUgb2JqZWN0IHdoaWNoIHdpbGwgbWFrZSB0aGUgcmVxdWVzdCwgZGVmYXVsdCBpc1xuICogICAgICAgICAgICBwcm92aWRlZCBieSBgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcmVxdWVzdGAuXG4gKiAgICAgICAgICBoZWFkZXJzOiBhbiBhcnJheSBvZiBoZWFkZXJzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFzIHJlcXVlc3RcbiAqICAgICAgICAgICAgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3RlZCBkb2N1bWVudC4gQWNjZXB0IGlzIG5vdCBhbGxvd2VkLlxuICogICAgICAgICAgdXNlUHJvbWlzZTogdHJ1ZSB0byB1c2UgYSBwcm9taXNlcyBBUEksIGZhbHNlIGZvciBhXG4gKiAgICAgICAgICAgIGNhbGxiYWNrLWNvbnRpbnVhdGlvbi1zdHlsZSBBUEk7IGZhbHNlIGJ5IGRlZmF1bHQuXG4gKlxuICogQHJldHVybiB0aGUgbm9kZSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC5kb2N1bWVudExvYWRlcnMubm9kZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBzdHJpY3RTU0wgPSAoJ3N0cmljdFNTTCcgaW4gb3B0aW9ucykgPyBvcHRpb25zLnN0cmljdFNTTCA6IHRydWU7XG4gIHZhciBtYXhSZWRpcmVjdHMgPSAoJ21heFJlZGlyZWN0cycgaW4gb3B0aW9ucykgPyBvcHRpb25zLm1heFJlZGlyZWN0cyA6IC0xO1xuICB2YXIgcmVxdWVzdCA9ICgncmVxdWVzdCcgaW4gb3B0aW9ucykgPyBvcHRpb25zLnJlcXVlc3QgOiByZXF1aXJlKCdyZXF1ZXN0Jyk7XG4gIHZhciBhY2NlcHRIZWFkZXIgPSAnYXBwbGljYXRpb24vbGQranNvbiwgYXBwbGljYXRpb24vanNvbic7XG4gIHZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuICAvLyBUT0RPOiBkaXNhYmxlIGNhY2hlIHVudGlsIEhUVFAgY2FjaGluZyBpbXBsZW1lbnRlZFxuICAvL3ZhciBjYWNoZSA9IG5ldyBqc29ubGQuRG9jdW1lbnRDYWNoZSgpO1xuXG4gIHZhciBxdWV1ZSA9IG5ldyBqc29ubGQuUmVxdWVzdFF1ZXVlKCk7XG4gIGlmKG9wdGlvbnMudXNlUHJvbWlzZSkge1xuICAgIHJldHVybiBxdWV1ZS53cmFwTG9hZGVyKGZ1bmN0aW9uKHVybCkge1xuICAgICAgcmV0dXJuIGpzb25sZC5wcm9taXNpZnkobG9hZERvY3VtZW50LCB1cmwsIFtdKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgaWYoJ0FjY2VwdCcgaW4gaGVhZGVycyB8fCAnYWNjZXB0JyBpbiBoZWFkZXJzKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAnQWNjZXB0IGhlYWRlciBtYXkgbm90IGJlIHNwZWNpZmllZCBhcyBhbiBvcHRpb247IG9ubHkgXCInICtcbiAgICAgIGFjY2VwdEhlYWRlciArICdcIiBpcyBzdXBwb3J0ZWQuJyk7XG4gIH1cbiAgcmV0dXJuIHF1ZXVlLndyYXBMb2FkZXIoZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIGxvYWREb2N1bWVudCh1cmwsIFtdLCBjYWxsYmFjayk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGxvYWREb2N1bWVudCh1cmwsIHJlZGlyZWN0cywgY2FsbGJhY2spIHtcbiAgICBpZih1cmwuaW5kZXhPZignaHR0cDonKSAhPT0gMCAmJiB1cmwuaW5kZXhPZignaHR0cHM6JykgIT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgb25seSBcImh0dHBcIiBhbmQgXCJodHRwc1wiIFVSTHMgYXJlICcgK1xuICAgICAgICAnc3VwcG9ydGVkLicsXG4gICAgICAgICdqc29ubGQuSW52YWxpZFVybCcsIHtjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLCB1cmw6IHVybH0pLFxuICAgICAgICB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICB9XG4gICAgaWYob3B0aW9ucy5zZWN1cmUgJiYgdXJsLmluZGV4T2YoJ2h0dHBzJykgIT09IDApIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgc2VjdXJlIG1vZGUgaXMgZW5hYmxlZCBhbmQgJyArXG4gICAgICAgICd0aGUgVVJMXFwncyBzY2hlbWUgaXMgbm90IFwiaHR0cHNcIi4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IGRpc2FibGUgY2FjaGUgdW50aWwgSFRUUCBjYWNoaW5nIGltcGxlbWVudGVkXG4gICAgdmFyIGRvYyA9IG51bGw7Ly9jYWNoZS5nZXQodXJsKTtcbiAgICBpZihkb2MgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBkb2MpO1xuICAgIH1cbiAgICB2YXIgaGVhZGVycyA9IHsnQWNjZXB0JzogYWNjZXB0SGVhZGVyfTtcbiAgICBmb3IodmFyIGsgaW4gb3B0aW9ucy5oZWFkZXJzKSB7IGhlYWRlcnNba10gPSBvcHRpb25zLmhlYWRlcnNba107IH1cbiAgICByZXF1ZXN0KHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIHN0cmljdFNTTDogc3RyaWN0U1NMLFxuICAgICAgZm9sbG93UmVkaXJlY3Q6IGZhbHNlXG4gICAgfSwgaGFuZGxlUmVzcG9uc2UpO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UoZXJyLCByZXMsIGJvZHkpIHtcbiAgICAgIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogYm9keSB8fCBudWxsfTtcblxuICAgICAgLy8gaGFuZGxlIGVycm9yXG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGFuIGVycm9yIG9jY3VycmVkLicsXG4gICAgICAgICAgJ2pzb25sZC5Mb2FkRG9jdW1lbnRFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsLCBjYXVzZTogZXJyfSksIGRvYyk7XG4gICAgICB9XG4gICAgICB2YXIgc3RhdHVzVGV4dCA9IGh0dHAuU1RBVFVTX0NPREVTW3Jlcy5zdGF0dXNDb2RlXTtcbiAgICAgIGlmKHJlcy5zdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDogJyArIHN0YXR1c1RleHQsXG4gICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge1xuICAgICAgICAgICAgY29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgaHR0cFN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlXG4gICAgICAgICAgfSksIGRvYyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBMaW5rIEhlYWRlclxuICAgICAgaWYocmVzLmhlYWRlcnMubGluayAmJlxuICAgICAgICByZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10gIT09ICdhcHBsaWNhdGlvbi9sZCtqc29uJykge1xuICAgICAgICAvLyBvbmx5IDEgcmVsYXRlZCBsaW5rIGhlYWRlciBwZXJtaXR0ZWRcbiAgICAgICAgdmFyIGxpbmtIZWFkZXIgPSBqc29ubGQucGFyc2VMaW5rSGVhZGVyKFxuICAgICAgICAgIHJlcy5oZWFkZXJzLmxpbmspW0xJTktfSEVBREVSX1JFTF07XG4gICAgICAgIGlmKF9pc0FycmF5KGxpbmtIZWFkZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZCwgaXQgaGFzIG1vcmUgdGhhbiBvbmUgYXNzb2NpYXRlZCAnICtcbiAgICAgICAgICAgICdIVFRQIExpbmsgSGVhZGVyLicsXG4gICAgICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLFxuICAgICAgICAgICAge2NvZGU6ICdtdWx0aXBsZSBjb250ZXh0IGxpbmsgaGVhZGVycycsIHVybDogdXJsfSksIGRvYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYobGlua0hlYWRlcikge1xuICAgICAgICAgIGRvYy5jb250ZXh0VXJsID0gbGlua0hlYWRlci50YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIHJlZGlyZWN0XG4gICAgICBpZihyZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCA0MDAgJiZcbiAgICAgICAgcmVzLmhlYWRlcnMubG9jYXRpb24pIHtcbiAgICAgICAgaWYocmVkaXJlY3RzLmxlbmd0aCA9PT0gbWF4UmVkaXJlY3RzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgdGhlcmUgd2VyZSB0b28gbWFueSByZWRpcmVjdHMuJyxcbiAgICAgICAgICAgICdqc29ubGQuVG9vTWFueVJlZGlyZWN0cycsIHtcbiAgICAgICAgICAgICAgY29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJyxcbiAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgIGh0dHBTdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgcmVkaXJlY3RzOiByZWRpcmVjdHNcbiAgICAgICAgICAgIH0pLCBkb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHJlZGlyZWN0cy5pbmRleE9mKHVybCkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDsgaW5maW5pdGUgcmVkaXJlY3Rpb24gd2FzIGRldGVjdGVkLicsXG4gICAgICAgICAgICAnanNvbmxkLkluZmluaXRlUmVkaXJlY3REZXRlY3RlZCcsIHtcbiAgICAgICAgICAgICAgY29kZTogJ3JlY3Vyc2l2ZSBjb250ZXh0IGluY2x1c2lvbicsXG4gICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICBodHRwU3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgIHJlZGlyZWN0czogcmVkaXJlY3RzXG4gICAgICAgICAgICB9KSwgZG9jKTtcbiAgICAgICAgfVxuICAgICAgICByZWRpcmVjdHMucHVzaCh1cmwpO1xuICAgICAgICByZXR1cm4gbG9hZERvY3VtZW50KHJlcy5oZWFkZXJzLmxvY2F0aW9uLCByZWRpcmVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIGNhY2hlIGZvciBlYWNoIHJlZGlyZWN0ZWQgVVJMXG4gICAgICByZWRpcmVjdHMucHVzaCh1cmwpO1xuICAgICAgLy8gVE9ETzogZGlzYWJsZSBjYWNoZSB1bnRpbCBIVFRQIGNhY2hpbmcgaW1wbGVtZW50ZWRcbiAgICAgIC8qZm9yKHZhciBpID0gMDsgaSA8IHJlZGlyZWN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYWNoZS5zZXQoXG4gICAgICAgICAgcmVkaXJlY3RzW2ldLFxuICAgICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogcmVkaXJlY3RzW2ldLCBkb2N1bWVudDogYm9keX0pO1xuICAgICAgfSovXG4gICAgICBjYWxsYmFjayhlcnIsIGRvYyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBidWlsdC1pbiBYTUxIdHRwUmVxdWVzdCBkb2N1bWVudCBsb2FkZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgc2VjdXJlOiByZXF1aXJlIGFsbCBVUkxzIHRvIHVzZSBIVFRQUy5cbiAqICAgICAgICAgIHVzZVByb21pc2U6IHRydWUgdG8gdXNlIGEgcHJvbWlzZXMgQVBJLCBmYWxzZSBmb3IgYVxuICogICAgICAgICAgICBjYWxsYmFjay1jb250aW51YXRpb24tc3R5bGUgQVBJOyBkZWZhdWx0cyB0byB0cnVlIGlmIFByb21pc2VcbiAqICAgICAgICAgICAgaXMgZ2xvYmFsbHkgZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICogICAgICAgICAgW3hocl06IHRoZSBYTUxIdHRwUmVxdWVzdCBBUEkgdG8gdXNlLlxuICpcbiAqIEByZXR1cm4gdGhlIFhNTEh0dHBSZXF1ZXN0IGRvY3VtZW50IGxvYWRlci5cbiAqL1xuanNvbmxkLmRvY3VtZW50TG9hZGVycy54aHIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcmxpbmsgPSAvKF58KFxcclxcbikpbGluazovaTtcbiAgdmFyIHF1ZXVlID0gbmV3IGpzb25sZC5SZXF1ZXN0UXVldWUoKTtcblxuICAvLyB1c2Ugb3B0aW9uIG9yLCBieSBkZWZhdWx0LCB1c2UgUHJvbWlzZSB3aGVuIGl0cyBkZWZpbmVkXG4gIHZhciB1c2VQcm9taXNlID0gKCd1c2VQcm9taXNlJyBpbiBvcHRpb25zID9cbiAgICBvcHRpb25zLnVzZVByb21pc2UgOiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSk7XG4gIGlmKHVzZVByb21pc2UpIHtcbiAgICByZXR1cm4gcXVldWUud3JhcExvYWRlcihmdW5jdGlvbih1cmwpIHtcbiAgICAgIHJldHVybiBqc29ubGQucHJvbWlzaWZ5KGxvYWRlciwgdXJsKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVldWUud3JhcExvYWRlcihsb2FkZXIpO1xuXG4gIGZ1bmN0aW9uIGxvYWRlcih1cmwsIGNhbGxiYWNrKSB7XG4gICAgaWYodXJsLmluZGV4T2YoJ2h0dHA6JykgIT09IDAgJiYgdXJsLmluZGV4T2YoJ2h0dHBzOicpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IG9ubHkgXCJodHRwXCIgYW5kIFwiaHR0cHNcIiBVUkxzIGFyZSAnICtcbiAgICAgICAgJ3N1cHBvcnRlZC4nLFxuICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLCB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuc2VjdXJlICYmIHVybC5pbmRleE9mKCdodHRwcycpICE9PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQ7IHNlY3VyZSBtb2RlIGlzIGVuYWJsZWQgYW5kICcgK1xuICAgICAgICAndGhlIFVSTFxcJ3Mgc2NoZW1lIGlzIG5vdCBcImh0dHBzXCIuJyxcbiAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJywge2NvZGU6ICdsb2FkaW5nIGRvY3VtZW50IGZhaWxlZCcsIHVybDogdXJsfSksXG4gICAgICAgIHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogbnVsbH0pO1xuICAgIH1cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgWE1MSHR0cFJlcXVlc3Q7XG4gICAgdmFyIHJlcSA9IG5ldyB4aHIoKTtcbiAgICByZXEub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZihyZXEuc3RhdHVzID49IDQwMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVUkwgY291bGQgbm90IGJlIGRlcmVmZXJlbmNlZDogJyArIHJlcS5zdGF0dXNUZXh0LFxuICAgICAgICAgICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLCB7XG4gICAgICAgICAgICBjb2RlOiAnbG9hZGluZyBkb2N1bWVudCBmYWlsZWQnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBodHRwU3RhdHVzQ29kZTogcmVxLnN0YXR1c1xuICAgICAgICAgIH0pLCB7Y29udGV4dFVybDogbnVsbCwgZG9jdW1lbnRVcmw6IHVybCwgZG9jdW1lbnQ6IG51bGx9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRvYyA9IHtjb250ZXh0VXJsOiBudWxsLCBkb2N1bWVudFVybDogdXJsLCBkb2N1bWVudDogcmVxLnJlc3BvbnNlfTtcblxuICAgICAgLy8gaGFuZGxlIExpbmsgSGVhZGVyIChhdm9pZCB1bnNhZmUgaGVhZGVyIHdhcm5pbmcgYnkgZXhpc3RlbmNlIHRlc3RpbmcpXG4gICAgICB2YXIgY29udGVudFR5cGUgPSByZXEuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgdmFyIGxpbmtIZWFkZXI7XG4gICAgICBpZihybGluay50ZXN0KHJlcS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICAgICAgbGlua0hlYWRlciA9IHJlcS5nZXRSZXNwb25zZUhlYWRlcignTGluaycpO1xuICAgICAgfVxuICAgICAgaWYobGlua0hlYWRlciAmJiBjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nKSB7XG4gICAgICAgIC8vIG9ubHkgMSByZWxhdGVkIGxpbmsgaGVhZGVyIHBlcm1pdHRlZFxuICAgICAgICBsaW5rSGVhZGVyID0ganNvbmxkLnBhcnNlTGlua0hlYWRlcihsaW5rSGVhZGVyKVtMSU5LX0hFQURFUl9SRUxdO1xuICAgICAgICBpZihfaXNBcnJheShsaW5rSGVhZGVyKSkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGl0IGhhcyBtb3JlIHRoYW4gb25lICcgK1xuICAgICAgICAgICAgJ2Fzc29jaWF0ZWQgSFRUUCBMaW5rIEhlYWRlci4nLFxuICAgICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJyxcbiAgICAgICAgICAgIHtjb2RlOiAnbXVsdGlwbGUgY29udGV4dCBsaW5rIGhlYWRlcnMnLCB1cmw6IHVybH0pLCBkb2MpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGxpbmtIZWFkZXIpIHtcbiAgICAgICAgICBkb2MuY29udGV4dFVybCA9IGxpbmtIZWFkZXIudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKG51bGwsIGRvYyk7XG4gICAgfTtcbiAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2sobmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnVVJMIGNvdWxkIG5vdCBiZSBkZXJlZmVyZW5jZWQsIGFuIGVycm9yIG9jY3VycmVkLicsXG4gICAgICAgICdqc29ubGQuTG9hZERvY3VtZW50RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2xvYWRpbmcgZG9jdW1lbnQgZmFpbGVkJywgdXJsOiB1cmx9KSxcbiAgICAgICAge2NvbnRleHRVcmw6IG51bGwsIGRvY3VtZW50VXJsOiB1cmwsIGRvY3VtZW50OiBudWxsfSk7XG4gICAgfTtcbiAgICByZXEub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2xkK2pzb24sIGFwcGxpY2F0aW9uL2pzb24nKTtcbiAgICByZXEuc2VuZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEFzc2lnbnMgdGhlIGRlZmF1bHQgZG9jdW1lbnQgbG9hZGVyIGZvciBleHRlcm5hbCBkb2N1bWVudCBVUkxzIHRvIGEgYnVpbHQtaW5cbiAqIGRlZmF1bHQuIFN1cHBvcnRlZCB0eXBlcyBjdXJyZW50bHkgaW5jbHVkZTogJ2pxdWVyeScgYW5kICdub2RlJy5cbiAqXG4gKiBUbyB1c2UgdGhlIGpxdWVyeSBkb2N1bWVudCBsb2FkZXIsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHJlZmVyZW5jZVxuICogdG8gdGhlIG1haW4ganF1ZXJ5IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSB0byBzZXQuXG4gKiBAcGFyYW0gW3BhcmFtc10gdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8gdXNlIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKi9cbmpzb25sZC51c2VEb2N1bWVudExvYWRlciA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYoISh0eXBlIGluIGpzb25sZC5kb2N1bWVudExvYWRlcnMpKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ1Vua25vd24gZG9jdW1lbnQgbG9hZGVyIHR5cGU6IFwiJyArIHR5cGUgKyAnXCInLFxuICAgICAgJ2pzb25sZC5Vbmtub3duRG9jdW1lbnRMb2FkZXInLFxuICAgICAge3R5cGU6IHR5cGV9KTtcbiAgfVxuXG4gIC8vIHNldCBkb2N1bWVudCBsb2FkZXJcbiAganNvbmxkLmRvY3VtZW50TG9hZGVyID0ganNvbmxkLmRvY3VtZW50TG9hZGVyc1t0eXBlXS5hcHBseShcbiAgICBqc29ubGQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBsb2NhbCBjb250ZXh0LCByZXNvbHZpbmcgYW55IFVSTHMgYXMgbmVjZXNzYXJ5LCBhbmQgcmV0dXJucyBhXG4gKiBuZXcgYWN0aXZlIGNvbnRleHQgaW4gaXRzIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBhY3RpdmVDdHggdGhlIGN1cnJlbnQgYWN0aXZlIGNvbnRleHQuXG4gKiBAcGFyYW0gbG9jYWxDdHggdGhlIGxvY2FsIGNvbnRleHQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2RvY3VtZW50TG9hZGVyKHVybCwgY2FsbGJhY2soZXJyLCByZW1vdGVEb2MpKV0gdGhlIGRvY3VtZW50IGxvYWRlci5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIGN0eCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmpzb25sZC5wcm9jZXNzQ29udGV4dCA9IGZ1bmN0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgpIHtcbiAgLy8gZ2V0IGFyZ3VtZW50c1xuICB2YXIgb3B0aW9ucyA9IHt9O1xuICB2YXIgY2FsbGJhY2tBcmcgPSAyO1xuICBpZihhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMl0gfHwge307XG4gICAgY2FsbGJhY2tBcmcgKz0gMTtcbiAgfVxuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbY2FsbGJhY2tBcmddO1xuXG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYoISgnYmFzZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmJhc2UgPSAnJztcbiAgfVxuICBpZighKCdkb2N1bWVudExvYWRlcicgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmRvY3VtZW50TG9hZGVyID0ganNvbmxkLmxvYWREb2N1bWVudDtcbiAgfVxuXG4gIC8vIHJldHVybiBpbml0aWFsIGNvbnRleHQgZWFybHkgZm9yIG51bGwgY29udGV4dFxuICBpZihsb2NhbEN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucykpO1xuICB9XG5cbiAgLy8gcmV0cmlldmUgVVJMcyBpbiBsb2NhbEN0eFxuICBsb2NhbEN0eCA9IF9jbG9uZShsb2NhbEN0eCk7XG4gIGlmKCEoX2lzT2JqZWN0KGxvY2FsQ3R4KSAmJiAnQGNvbnRleHQnIGluIGxvY2FsQ3R4KSkge1xuICAgIGxvY2FsQ3R4ID0geydAY29udGV4dCc6IGxvY2FsQ3R4fTtcbiAgfVxuICBfcmV0cmlldmVDb250ZXh0VXJscyhsb2NhbEN0eCwgb3B0aW9ucywgZnVuY3Rpb24oZXJyLCBjdHgpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gcHJvY2VzcyBjb250ZXh0XG4gICAgICBjdHggPSBuZXcgUHJvY2Vzc29yKCkucHJvY2Vzc0NvbnRleHQoYWN0aXZlQ3R4LCBjdHgsIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhleCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIGN0eCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN1YmplY3QgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gbG9vayBmb3IuXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSBzdWJqZWN0IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHksIGZhbHNlIGlmIG5vdC5cbiAqL1xuanNvbmxkLmhhc1Byb3BlcnR5ID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgdmFyIHJ2YWwgPSBmYWxzZTtcbiAgaWYocHJvcGVydHkgaW4gc3ViamVjdCkge1xuICAgIHZhciB2YWx1ZSA9IHN1YmplY3RbcHJvcGVydHldO1xuICAgIHJ2YWwgPSAoIV9pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPiAwKTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gc3ViamVjdC5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2suXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgZXhpc3RzLCBmYWxzZSBpZiBub3QuXG4gKi9cbmpzb25sZC5oYXNWYWx1ZSA9IGZ1bmN0aW9uKHN1YmplY3QsIHByb3BlcnR5LCB2YWx1ZSkge1xuICB2YXIgcnZhbCA9IGZhbHNlO1xuICBpZihqc29ubGQuaGFzUHJvcGVydHkoc3ViamVjdCwgcHJvcGVydHkpKSB7XG4gICAgdmFyIHZhbCA9IHN1YmplY3RbcHJvcGVydHldO1xuICAgIHZhciBpc0xpc3QgPSBfaXNMaXN0KHZhbCk7XG4gICAgaWYoX2lzQXJyYXkodmFsKSB8fCBpc0xpc3QpIHtcbiAgICAgIGlmKGlzTGlzdCkge1xuICAgICAgICB2YWwgPSB2YWxbJ0BsaXN0J107XG4gICAgICB9XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmKGpzb25sZC5jb21wYXJlVmFsdWVzKHZhbHVlLCB2YWxbaV0pKSB7XG4gICAgICAgICAgcnZhbCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoIV9pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gYXZvaWQgbWF0Y2hpbmcgdGhlIHNldCBvZiB2YWx1ZXMgd2l0aCBhbiBhcnJheSB2YWx1ZSBwYXJhbWV0ZXJcbiAgICAgIHJ2YWwgPSBqc29ubGQuY29tcGFyZVZhbHVlcyh2YWx1ZSwgdmFsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEFkZHMgYSB2YWx1ZSB0byBhIHN1YmplY3QuIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSwgYWxsIHZhbHVlcyBpbiB0aGVcbiAqIGFycmF5IHdpbGwgYmUgYWRkZWQuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QgdG8gYWRkIHRoZSB2YWx1ZSB0by5cbiAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdGhhdCByZWxhdGVzIHRoZSB2YWx1ZSB0byB0aGUgc3ViamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYWRkLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgW3Byb3BlcnR5SXNBcnJheV0gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYWx3YXlzIGFuIGFycmF5LCBmYWxzZVxuICogICAgICAgICAgaWYgbm90IChkZWZhdWx0OiBmYWxzZSkuXG4gKiAgICAgICAgW2FsbG93RHVwbGljYXRlXSB0cnVlIHRvIGFsbG93IGR1cGxpY2F0ZXMsIGZhbHNlIG5vdCB0byAodXNlcyBhXG4gKiAgICAgICAgICBzaW1wbGUgc2hhbGxvdyBjb21wYXJpc29uIG9mIHN1YmplY3QgSUQgb3IgdmFsdWUpIChkZWZhdWx0OiB0cnVlKS5cbiAqL1xuanNvbmxkLmFkZFZhbHVlID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHksIHZhbHVlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZighKCdwcm9wZXJ0eUlzQXJyYXknIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuICBpZighKCdhbGxvd0R1cGxpY2F0ZScgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmFsbG93RHVwbGljYXRlID0gdHJ1ZTtcbiAgfVxuXG4gIGlmKF9pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmKHZhbHVlLmxlbmd0aCA9PT0gMCAmJiBvcHRpb25zLnByb3BlcnR5SXNBcnJheSAmJlxuICAgICAgIShwcm9wZXJ0eSBpbiBzdWJqZWN0KSkge1xuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0gPSBbXTtcbiAgICB9XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICBqc29ubGQuYWRkVmFsdWUoc3ViamVjdCwgcHJvcGVydHksIHZhbHVlW2ldLCBvcHRpb25zKTtcbiAgICB9XG4gIH0gZWxzZSBpZihwcm9wZXJ0eSBpbiBzdWJqZWN0KSB7XG4gICAgLy8gY2hlY2sgaWYgc3ViamVjdCBhbHJlYWR5IGhhcyB2YWx1ZSBpZiBkdXBsaWNhdGVzIG5vdCBhbGxvd2VkXG4gICAgdmFyIGhhc1ZhbHVlID0gKCFvcHRpb25zLmFsbG93RHVwbGljYXRlICYmXG4gICAgICBqc29ubGQuaGFzVmFsdWUoc3ViamVjdCwgcHJvcGVydHksIHZhbHVlKSk7XG5cbiAgICAvLyBtYWtlIHByb3BlcnR5IGFuIGFycmF5IGlmIHZhbHVlIG5vdCBwcmVzZW50IG9yIGFsd2F5cyBhbiBhcnJheVxuICAgIGlmKCFfaXNBcnJheShzdWJqZWN0W3Byb3BlcnR5XSkgJiZcbiAgICAgICghaGFzVmFsdWUgfHwgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkpKSB7XG4gICAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IFtzdWJqZWN0W3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gYWRkIG5ldyB2YWx1ZVxuICAgIGlmKCFoYXNWYWx1ZSkge1xuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0ucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGFkZCBuZXcgdmFsdWUgYXMgc2V0IG9yIHNpbmdsZSB2YWx1ZVxuICAgIHN1YmplY3RbcHJvcGVydHldID0gb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPyBbdmFsdWVdIDogdmFsdWU7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhbGwgb2YgdGhlIHZhbHVlcyBmb3IgYSBzdWJqZWN0J3MgcHJvcGVydHkgYXMgYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5LlxuICpcbiAqIEByZXR1cm4gYWxsIG9mIHRoZSB2YWx1ZXMgZm9yIGEgc3ViamVjdCdzIHByb3BlcnR5IGFzIGFuIGFycmF5LlxuICovXG5qc29ubGQuZ2V0VmFsdWVzID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgdmFyIHJ2YWwgPSBzdWJqZWN0W3Byb3BlcnR5XSB8fCBbXTtcbiAgaWYoIV9pc0FycmF5KHJ2YWwpKSB7XG4gICAgcnZhbCA9IFtydmFsXTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhIHByb3BlcnR5IGZyb20gYSBzdWJqZWN0LlxuICpcbiAqIEBwYXJhbSBzdWJqZWN0IHRoZSBzdWJqZWN0LlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eS5cbiAqL1xuanNvbmxkLnJlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHkpIHtcbiAgZGVsZXRlIHN1YmplY3RbcHJvcGVydHldO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSBhIHN1YmplY3QuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRoYXQgcmVsYXRlcyB0aGUgdmFsdWUgdG8gdGhlIHN1YmplY3QuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW3Byb3BlcnR5SXNBcnJheV0gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgYWx3YXlzIGFuIGFycmF5LCBmYWxzZVxuICogICAgICAgICAgICBpZiBub3QgKGRlZmF1bHQ6IGZhbHNlKS5cbiAqL1xuanNvbmxkLnJlbW92ZVZhbHVlID0gZnVuY3Rpb24oc3ViamVjdCwgcHJvcGVydHksIHZhbHVlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZighKCdwcm9wZXJ0eUlzQXJyYXknIGluIG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIGZpbHRlciBvdXQgdmFsdWVcbiAgdmFyIHZhbHVlcyA9IGpzb25sZC5nZXRWYWx1ZXMoc3ViamVjdCwgcHJvcGVydHkpLmZpbHRlcihmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuICFqc29ubGQuY29tcGFyZVZhbHVlcyhlLCB2YWx1ZSk7XG4gIH0pO1xuXG4gIGlmKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICBqc29ubGQucmVtb3ZlUHJvcGVydHkoc3ViamVjdCwgcHJvcGVydHkpO1xuICB9IGVsc2UgaWYodmFsdWVzLmxlbmd0aCA9PT0gMSAmJiAhb3B0aW9ucy5wcm9wZXJ0eUlzQXJyYXkpIHtcbiAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IHZhbHVlc1swXTtcbiAgfSBlbHNlIHtcbiAgICBzdWJqZWN0W3Byb3BlcnR5XSA9IHZhbHVlcztcbiAgfVxufTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gSlNPTi1MRCB2YWx1ZXMgZm9yIGVxdWFsaXR5LiBUd28gSlNPTi1MRCB2YWx1ZXMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBlcXVhbCBpZjpcbiAqXG4gKiAxLiBUaGV5IGFyZSBib3RoIHByaW1pdGl2ZXMgb2YgdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUuXG4gKiAyLiBUaGV5IGFyZSBib3RoIEB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBAdmFsdWUsIEB0eXBlLCBAbGFuZ3VhZ2UsXG4gKiAgIGFuZCBAaW5kZXgsIE9SXG4gKiAzLiBUaGV5IGJvdGggaGF2ZSBAaWRzIHRoZXkgYXJlIHRoZSBzYW1lLlxuICpcbiAqIEBwYXJhbSB2MSB0aGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0gdjIgdGhlIHNlY29uZCB2YWx1ZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdjEgYW5kIHYyIGFyZSBjb25zaWRlcmVkIGVxdWFsLCBmYWxzZSBpZiBub3QuXG4gKi9cbmpzb25sZC5jb21wYXJlVmFsdWVzID0gZnVuY3Rpb24odjEsIHYyKSB7XG4gIC8vIDEuIGVxdWFsIHByaW1pdGl2ZXNcbiAgaWYodjEgPT09IHYyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAyLiBlcXVhbCBAdmFsdWVzXG4gIGlmKF9pc1ZhbHVlKHYxKSAmJiBfaXNWYWx1ZSh2MikgJiZcbiAgICB2MVsnQHZhbHVlJ10gPT09IHYyWydAdmFsdWUnXSAmJlxuICAgIHYxWydAdHlwZSddID09PSB2MlsnQHR5cGUnXSAmJlxuICAgIHYxWydAbGFuZ3VhZ2UnXSA9PT0gdjJbJ0BsYW5ndWFnZSddICYmXG4gICAgdjFbJ0BpbmRleCddID09PSB2MlsnQGluZGV4J10pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIDMuIGVxdWFsIEBpZHNcbiAgaWYoX2lzT2JqZWN0KHYxKSAmJiAoJ0BpZCcgaW4gdjEpICYmIF9pc09iamVjdCh2MikgJiYgKCdAaWQnIGluIHYyKSkge1xuICAgIHJldHVybiB2MVsnQGlkJ10gPT09IHYyWydAaWQnXTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dCBrZXkgYW5kIHR5cGUsIG51bGwgaWYgbm9uZSBpc1xuICogc2V0LlxuICpcbiAqIEBwYXJhbSBjdHggdGhlIGFjdGl2ZSBjb250ZXh0LlxuICogQHBhcmFtIGtleSB0aGUgY29udGV4dCBrZXkuXG4gKiBAcGFyYW0gW3R5cGVdIHRoZSB0eXBlIG9mIHZhbHVlIHRvIGdldCAoZWc6ICdAaWQnLCAnQHR5cGUnKSwgaWYgbm90XG4gKiAgICAgICAgICBzcGVjaWZpZWQgZ2V0cyB0aGUgZW50aXJlIGVudHJ5IGZvciBhIGtleSwgbnVsbCBpZiBub3QgZm91bmQuXG4gKlxuICogQHJldHVybiB0aGUgdmFsdWUuXG4gKi9cbmpzb25sZC5nZXRDb250ZXh0VmFsdWUgPSBmdW5jdGlvbihjdHgsIGtleSwgdHlwZSkge1xuICB2YXIgcnZhbCA9IG51bGw7XG5cbiAgLy8gcmV0dXJuIG51bGwgZm9yIGludmFsaWQga2V5XG4gIGlmKGtleSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gZ2V0IGRlZmF1bHQgbGFuZ3VhZ2VcbiAgaWYodHlwZSA9PT0gJ0BsYW5ndWFnZScgJiYgKHR5cGUgaW4gY3R4KSkge1xuICAgIHJ2YWwgPSBjdHhbdHlwZV07XG4gIH1cblxuICAvLyBnZXQgc3BlY2lmaWMgZW50cnkgaW5mb3JtYXRpb25cbiAgaWYoY3R4Lm1hcHBpbmdzW2tleV0pIHtcbiAgICB2YXIgZW50cnkgPSBjdHgubWFwcGluZ3Nba2V5XTtcblxuICAgIGlmKF9pc1VuZGVmaW5lZCh0eXBlKSkge1xuICAgICAgLy8gcmV0dXJuIHdob2xlIGVudHJ5XG4gICAgICBydmFsID0gZW50cnk7XG4gICAgfSBlbHNlIGlmKHR5cGUgaW4gZW50cnkpIHtcbiAgICAgIC8vIHJldHVybiBlbnRyeSB2YWx1ZSBmb3IgdHlwZVxuICAgICAgcnZhbCA9IGVudHJ5W3R5cGVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqIFJlZ2lzdGVyZWQgUkRGIGRhdGFzZXQgcGFyc2VycyBoYXNoZWQgYnkgY29udGVudC10eXBlLiAqL1xudmFyIF9yZGZQYXJzZXJzID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIFJERiBkYXRhc2V0IHBhcnNlciBieSBjb250ZW50LXR5cGUsIGZvciB1c2Ugd2l0aFxuICoganNvbmxkLmZyb21SREYuIEFuIFJERiBkYXRhc2V0IHBhcnNlciB3aWxsIGFsd2F5cyBiZSBnaXZlbiB0d28gcGFyYW1ldGVycyxcbiAqIGEgc3RyaW5nIG9mIGlucHV0IGFuZCBhIGNhbGxiYWNrLiBBbiBSREYgZGF0YXNldCBwYXJzZXIgY2FuIGJlIHN5bmNocm9ub3VzXG4gKiBvciBhc3luY2hyb25vdXMuXG4gKlxuICogSWYgdGhlIHBhcnNlciBmdW5jdGlvbiByZXR1cm5zIHVuZGVmaW5lZCBvciBudWxsIHRoZW4gaXQgd2lsbCBiZSBhc3N1bWVkIHRvXG4gKiBiZSBhc3luY2hyb25vdXMgdy9hIGNvbnRpbnVhdGlvbi1wYXNzaW5nIHN0eWxlIGFuZCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyXG4gKiBnaXZlbiB0byB0aGUgcGFyc2VyIE1VU1QgYmUgaW52b2tlZC5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGEgUHJvbWlzZSwgdGhlbiBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgYXN5bmNocm9ub3VzLCBidXQgdGhlXG4gKiBjYWxsYmFjayBwYXJhbWV0ZXIgTVVTVCBOT1QgYmUgaW52b2tlZC4gSXQgc2hvdWxkIGluc3RlYWQgYmUgaWdub3JlZC5cbiAqXG4gKiBJZiBpdCByZXR1cm5zIGFuIFJERiBkYXRhc2V0LCBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgc3luY2hyb25vdXMgYW5kIHRoZVxuICogY2FsbGJhY2sgcGFyYW1ldGVyIE1VU1QgTk9UIGJlIGludm9rZWQuIEl0IHNob3VsZCBpbnN0ZWFkIGJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50LXR5cGUgZm9yIHRoZSBwYXJzZXIuXG4gKiBAcGFyYW0gcGFyc2VyKGlucHV0LCBjYWxsYmFjayhlcnIsIGRhdGFzZXQpKSB0aGUgcGFyc2VyIGZ1bmN0aW9uICh0YWtlcyBhXG4gKiAgICAgICAgICBzdHJpbmcgYXMgYSBwYXJhbWV0ZXIgYW5kIGVpdGhlciByZXR1cm5zIG51bGwvdW5kZWZpbmVkIGFuZCB1c2VzXG4gKiAgICAgICAgICB0aGUgZ2l2ZW4gY2FsbGJhY2ssIHJldHVybnMgYSBQcm9taXNlLCBvciByZXR1cm5zIGFuIFJERiBkYXRhc2V0KS5cbiAqL1xuanNvbmxkLnJlZ2lzdGVyUkRGUGFyc2VyID0gZnVuY3Rpb24oY29udGVudFR5cGUsIHBhcnNlcikge1xuICBfcmRmUGFyc2Vyc1tjb250ZW50VHlwZV0gPSBwYXJzZXI7XG59O1xuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGFuIFJERiBkYXRhc2V0IHBhcnNlciBieSBjb250ZW50LXR5cGUuXG4gKlxuICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50LXR5cGUgZm9yIHRoZSBwYXJzZXIuXG4gKi9cbmpzb25sZC51bnJlZ2lzdGVyUkRGUGFyc2VyID0gZnVuY3Rpb24oY29udGVudFR5cGUpIHtcbiAgZGVsZXRlIF9yZGZQYXJzZXJzW2NvbnRlbnRUeXBlXTtcbn07XG5cbmlmKF9ub2RlanMpIHtcbiAgLy8gbmVlZGVkIGZvciBzZXJpYWxpemF0aW9uIG9mIFhNTCBsaXRlcmFsc1xuICBpZih0eXBlb2YgWE1MU2VyaWFsaXplciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgWE1MU2VyaWFsaXplciA9IG51bGw7XG4gIH1cbiAgaWYodHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIE5vZGUgPSB7XG4gICAgICBFTEVNRU5UX05PREU6IDEsXG4gICAgICBBVFRSSUJVVEVfTk9ERTogMixcbiAgICAgIFRFWFRfTk9ERTogMyxcbiAgICAgIENEQVRBX1NFQ1RJT05fTk9ERTogNCxcbiAgICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSxcbiAgICAgIEVOVElUWV9OT0RFOiA2LFxuICAgICAgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiA3LFxuICAgICAgQ09NTUVOVF9OT0RFOiA4LFxuICAgICAgRE9DVU1FTlRfTk9ERTogOSxcbiAgICAgIERPQ1VNRU5UX1RZUEVfTk9ERTogMTAsXG4gICAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSxcbiAgICAgIE5PVEFUSU9OX05PREU6MTJcbiAgICB9O1xuICB9XG59XG5cbi8vIGNvbnN0YW50c1xudmFyIFhTRF9CT09MRUFOID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW4nO1xudmFyIFhTRF9ET1VCTEUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZG91YmxlJztcbnZhciBYU0RfSU5URUdFUiA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRlZ2VyJztcbnZhciBYU0RfU1RSSU5HID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZyc7XG5cbnZhciBSREYgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc7XG52YXIgUkRGX0xJU1QgPSBSREYgKyAnTGlzdCc7XG52YXIgUkRGX0ZJUlNUID0gUkRGICsgJ2ZpcnN0JztcbnZhciBSREZfUkVTVCA9IFJERiArICdyZXN0JztcbnZhciBSREZfTklMID0gUkRGICsgJ25pbCc7XG52YXIgUkRGX1RZUEUgPSBSREYgKyAndHlwZSc7XG52YXIgUkRGX1BMQUlOX0xJVEVSQUwgPSBSREYgKyAnUGxhaW5MaXRlcmFsJztcbnZhciBSREZfWE1MX0xJVEVSQUwgPSBSREYgKyAnWE1MTGl0ZXJhbCc7XG52YXIgUkRGX09CSkVDVCA9IFJERiArICdvYmplY3QnO1xudmFyIFJERl9MQU5HU1RSSU5HID0gUkRGICsgJ2xhbmdTdHJpbmcnO1xuXG52YXIgTElOS19IRUFERVJfUkVMID0gJ2h0dHA6Ly93d3cudzMub3JnL25zL2pzb24tbGQjY29udGV4dCc7XG52YXIgTUFYX0NPTlRFWFRfVVJMUyA9IDEwO1xuXG4vKipcbiAqIEEgSlNPTi1MRCBFcnJvci5cbiAqXG4gKiBAcGFyYW0gbXNnIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHR5cGUgdGhlIGVycm9yIHR5cGUuXG4gKiBAcGFyYW0gZGV0YWlscyB0aGUgZXJyb3IgZGV0YWlscy5cbiAqL1xudmFyIEpzb25MZEVycm9yID0gZnVuY3Rpb24obXNnLCB0eXBlLCBkZXRhaWxzKSB7XG4gIGlmKF9ub2RlanMpIHtcbiAgICBFcnJvci5jYWxsKHRoaXMpO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2UgaWYodHlwZW9mIEVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG4gIHRoaXMubmFtZSA9IHR5cGUgfHwgJ2pzb25sZC5FcnJvcic7XG4gIHRoaXMubWVzc2FnZSA9IG1zZyB8fCAnQW4gdW5zcGVjaWZpZWQgSlNPTi1MRCBlcnJvciBvY2N1cnJlZC4nO1xuICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzIHx8IHt9O1xufTtcbmlmKF9ub2RlanMpIHtcbiAgcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzKEpzb25MZEVycm9yLCBFcnJvcik7XG59IGVsc2UgaWYodHlwZW9mIEVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICBKc29uTGRFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IEpTT04tTEQgUHJvY2Vzc29yLlxuICovXG52YXIgUHJvY2Vzc29yID0gZnVuY3Rpb24oKSB7fTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb21wYWN0cyBhbiBlbGVtZW50IHVzaW5nIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dC4gQWxsIHZhbHVlc1xuICogbXVzdCBiZSBpbiBleHBhbmRlZCBmb3JtIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGFjdGl2ZVByb3BlcnR5IHRoZSBjb21wYWN0ZWQgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiAgICAgICAgICB0byBjb21wYWN0LCBudWxsIGZvciBub25lLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY29tcGFjdC5cbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBjb21wYWN0aW9uIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB0aGUgY29tcGFjdGVkIHZhbHVlLlxuICovXG5Qcm9jZXNzb3IucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCwgb3B0aW9ucykge1xuICAvLyByZWN1cnNpdmVseSBjb21wYWN0IGFycmF5XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7ICsraSkge1xuICAgICAgLy8gY29tcGFjdCwgZHJvcHBpbmcgYW55IG51bGwgdmFsdWVzXG4gICAgICB2YXIgY29tcGFjdGVkID0gdGhpcy5jb21wYWN0KFxuICAgICAgICBhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCBlbGVtZW50W2ldLCBvcHRpb25zKTtcbiAgICAgIGlmKGNvbXBhY3RlZCAhPT0gbnVsbCkge1xuICAgICAgICBydmFsLnB1c2goY29tcGFjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob3B0aW9ucy5jb21wYWN0QXJyYXlzICYmIHJ2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyB1c2Ugc2luZ2xlIGVsZW1lbnQgaWYgbm8gY29udGFpbmVyIGlzIHNwZWNpZmllZFxuICAgICAgdmFyIGNvbnRhaW5lciA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoXG4gICAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG4gICAgICBpZihjb250YWluZXIgPT09IG51bGwpIHtcbiAgICAgICAgcnZhbCA9IHJ2YWxbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlbHkgY29tcGFjdCBvYmplY3RcbiAgaWYoX2lzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgaWYob3B0aW9ucy5saW5rICYmICdAaWQnIGluIGVsZW1lbnQgJiYgZWxlbWVudFsnQGlkJ10gaW4gb3B0aW9ucy5saW5rKSB7XG4gICAgICAvLyBjaGVjayBmb3IgYSBsaW5rZWQgZWxlbWVudCB0byByZXVzZVxuICAgICAgdmFyIGxpbmtlZCA9IG9wdGlvbnMubGlua1tlbGVtZW50WydAaWQnXV07XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlua2VkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmKGxpbmtlZFtpXS5leHBhbmRlZCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBsaW5rZWRbaV0uY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZG8gdmFsdWUgY29tcGFjdGlvbiBvbiBAdmFsdWVzIGFuZCBzdWJqZWN0IHJlZmVyZW5jZXNcbiAgICBpZihfaXNWYWx1ZShlbGVtZW50KSB8fCBfaXNTdWJqZWN0UmVmZXJlbmNlKGVsZW1lbnQpKSB7XG4gICAgICB2YXIgcnZhbCA9IF9jb21wYWN0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCk7XG4gICAgICBpZihvcHRpb25zLmxpbmsgJiYgX2lzU3ViamVjdFJlZmVyZW5jZShlbGVtZW50KSkge1xuICAgICAgICAvLyBzdG9yZSBsaW5rZWQgZWxlbWVudFxuICAgICAgICBpZighKGVsZW1lbnRbJ0BpZCddIGluIG9wdGlvbnMubGluaykpIHtcbiAgICAgICAgICBvcHRpb25zLmxpbmtbZWxlbWVudFsnQGlkJ11dID0gW107XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXS5wdXNoKHtleHBhbmRlZDogZWxlbWVudCwgY29tcGFjdGVkOiBydmFsfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnZhbDtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogYXZvaWQgbWlzdXNlIG9mIGFjdGl2ZSBwcm9wZXJ0eSBhcyBhbiBleHBhbmRlZCBwcm9wZXJ0eT9cbiAgICB2YXIgaW5zaWRlUmV2ZXJzZSA9IChhY3RpdmVQcm9wZXJ0eSA9PT0gJ0ByZXZlcnNlJyk7XG5cbiAgICB2YXIgcnZhbCA9IHt9O1xuXG4gICAgaWYob3B0aW9ucy5saW5rICYmICdAaWQnIGluIGVsZW1lbnQpIHtcbiAgICAgIC8vIHN0b3JlIGxpbmtlZCBlbGVtZW50XG4gICAgICBpZighKGVsZW1lbnRbJ0BpZCddIGluIG9wdGlvbnMubGluaykpIHtcbiAgICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXSA9IFtdO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5saW5rW2VsZW1lbnRbJ0BpZCddXS5wdXNoKHtleHBhbmRlZDogZWxlbWVudCwgY29tcGFjdGVkOiBydmFsfSk7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBlbGVtZW50IGtleXMgaW4gb3JkZXJcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQpLnNvcnQoKTtcbiAgICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgICAgdmFyIGV4cGFuZGVkUHJvcGVydHkgPSBrZXlzW2tpXTtcbiAgICAgIHZhciBleHBhbmRlZFZhbHVlID0gZWxlbWVudFtleHBhbmRlZFByb3BlcnR5XTtcblxuICAgICAgLy8gY29tcGFjdCBAaWQgYW5kIEB0eXBlKHMpXG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQGlkJyB8fCBleHBhbmRlZFByb3BlcnR5ID09PSAnQHR5cGUnKSB7XG4gICAgICAgIHZhciBjb21wYWN0ZWRWYWx1ZTtcblxuICAgICAgICAvLyBjb21wYWN0IHNpbmdsZSBAaWRcbiAgICAgICAgaWYoX2lzU3RyaW5nKGV4cGFuZGVkVmFsdWUpKSB7XG4gICAgICAgICAgY29tcGFjdGVkVmFsdWUgPSBfY29tcGFjdElyaShcbiAgICAgICAgICAgIGFjdGl2ZUN0eCwgZXhwYW5kZWRWYWx1ZSwgbnVsbCxcbiAgICAgICAgICAgIHt2b2NhYjogKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdHlwZScpfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXhwYW5kZWQgdmFsdWUgbXVzdCBiZSBhIEB0eXBlIGFycmF5XG4gICAgICAgICAgY29tcGFjdGVkVmFsdWUgPSBbXTtcbiAgICAgICAgICBmb3IodmFyIHZpID0gMDsgdmkgPCBleHBhbmRlZFZhbHVlLmxlbmd0aDsgKyt2aSkge1xuICAgICAgICAgICAgY29tcGFjdGVkVmFsdWUucHVzaChfY29tcGFjdElyaShcbiAgICAgICAgICAgICAgYWN0aXZlQ3R4LCBleHBhbmRlZFZhbHVlW3ZpXSwgbnVsbCwge3ZvY2FiOiB0cnVlfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBrZXl3b3JkIGFsaWFzIGFuZCBhZGQgdmFsdWVcbiAgICAgICAgdmFyIGFsaWFzID0gX2NvbXBhY3RJcmkoYWN0aXZlQ3R4LCBleHBhbmRlZFByb3BlcnR5KTtcbiAgICAgICAgdmFyIGlzQXJyYXkgPSAoX2lzQXJyYXkoY29tcGFjdGVkVmFsdWUpICYmIGV4cGFuZGVkVmFsdWUubGVuZ3RoID09PSAwKTtcbiAgICAgICAganNvbmxkLmFkZFZhbHVlKFxuICAgICAgICAgIHJ2YWwsIGFsaWFzLCBjb21wYWN0ZWRWYWx1ZSwge3Byb3BlcnR5SXNBcnJheTogaXNBcnJheX0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIEByZXZlcnNlXG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQHJldmVyc2UnKSB7XG4gICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGNvbXBhY3QgZXhwYW5kZWQgdmFsdWVcbiAgICAgICAgdmFyIGNvbXBhY3RlZFZhbHVlID0gdGhpcy5jb21wYWN0KFxuICAgICAgICAgIGFjdGl2ZUN0eCwgJ0ByZXZlcnNlJywgZXhwYW5kZWRWYWx1ZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGRvdWJsZS1yZXZlcnNlZCBwcm9wZXJ0aWVzXG4gICAgICAgIGZvcih2YXIgY29tcGFjdGVkUHJvcGVydHkgaW4gY29tcGFjdGVkVmFsdWUpIHtcbiAgICAgICAgICBpZihhY3RpdmVDdHgubWFwcGluZ3NbY29tcGFjdGVkUHJvcGVydHldICYmXG4gICAgICAgICAgICBhY3RpdmVDdHgubWFwcGluZ3NbY29tcGFjdGVkUHJvcGVydHldLnJldmVyc2UpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNvbXBhY3RlZFZhbHVlW2NvbXBhY3RlZFByb3BlcnR5XTtcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKFxuICAgICAgICAgICAgICBhY3RpdmVDdHgsIGNvbXBhY3RlZFByb3BlcnR5LCAnQGNvbnRhaW5lcicpO1xuICAgICAgICAgICAgdmFyIHVzZUFycmF5ID0gKGNvbnRhaW5lciA9PT0gJ0BzZXQnIHx8ICFvcHRpb25zLmNvbXBhY3RBcnJheXMpO1xuICAgICAgICAgICAganNvbmxkLmFkZFZhbHVlKFxuICAgICAgICAgICAgICBydmFsLCBjb21wYWN0ZWRQcm9wZXJ0eSwgdmFsdWUsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gICAgICAgICAgICBkZWxldGUgY29tcGFjdGVkVmFsdWVbY29tcGFjdGVkUHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGNvbXBhY3RlZFZhbHVlKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gdXNlIGtleXdvcmQgYWxpYXMgYW5kIGFkZCB2YWx1ZVxuICAgICAgICAgIHZhciBhbGlhcyA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgZXhwYW5kZWRQcm9wZXJ0eSk7XG4gICAgICAgICAganNvbmxkLmFkZFZhbHVlKHJ2YWwsIGFsaWFzLCBjb21wYWN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFuZGxlIEBpbmRleCBwcm9wZXJ0eVxuICAgICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpbmRleCcpIHtcbiAgICAgICAgLy8gZHJvcCBAaW5kZXggaWYgaW5zaWRlIGFuIEBpbmRleCBjb250YWluZXJcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0Bjb250YWluZXInKTtcbiAgICAgICAgaWYoY29udGFpbmVyID09PSAnQGluZGV4Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXNlIGtleXdvcmQgYWxpYXMgYW5kIGFkZCB2YWx1ZVxuICAgICAgICB2YXIgYWxpYXMgPSBfY29tcGFjdElyaShhY3RpdmVDdHgsIGV4cGFuZGVkUHJvcGVydHkpO1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUocnZhbCwgYWxpYXMsIGV4cGFuZGVkVmFsdWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2tpcCBhcnJheSBwcm9jZXNzaW5nIGZvciBrZXl3b3JkcyB0aGF0IGFyZW4ndCBAZ3JhcGggb3IgQGxpc3RcbiAgICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgIT09ICdAZ3JhcGgnICYmIGV4cGFuZGVkUHJvcGVydHkgIT09ICdAbGlzdCcgJiZcbiAgICAgICAgX2lzS2V5d29yZChleHBhbmRlZFByb3BlcnR5KSkge1xuICAgICAgICAvLyB1c2Uga2V5d29yZCBhbGlhcyBhbmQgYWRkIHZhbHVlIGFzIGlzXG4gICAgICAgIHZhciBhbGlhcyA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgZXhwYW5kZWRQcm9wZXJ0eSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShydmFsLCBhbGlhcywgZXhwYW5kZWRWYWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3RlOiBleHBhbmRlZCB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5IGR1ZSB0byBleHBhbnNpb24gYWxnb3JpdGhtLlxuXG4gICAgICAvLyBwcmVzZXJ2ZSBlbXB0eSBhcnJheXNcbiAgICAgIGlmKGV4cGFuZGVkVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBpdGVtQWN0aXZlUHJvcGVydHkgPSBfY29tcGFjdElyaShcbiAgICAgICAgICBhY3RpdmVDdHgsIGV4cGFuZGVkUHJvcGVydHksIGV4cGFuZGVkVmFsdWUsIHt2b2NhYjogdHJ1ZX0sXG4gICAgICAgICAgaW5zaWRlUmV2ZXJzZSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICBydmFsLCBpdGVtQWN0aXZlUHJvcGVydHksIGV4cGFuZGVkVmFsdWUsIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWV9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVjdXNpdmVseSBwcm9jZXNzIGFycmF5IHZhbHVlc1xuICAgICAgZm9yKHZhciB2aSA9IDA7IHZpIDwgZXhwYW5kZWRWYWx1ZS5sZW5ndGg7ICsrdmkpIHtcbiAgICAgICAgdmFyIGV4cGFuZGVkSXRlbSA9IGV4cGFuZGVkVmFsdWVbdmldO1xuXG4gICAgICAgIC8vIGNvbXBhY3QgcHJvcGVydHkgYW5kIGdldCBjb250YWluZXIgdHlwZVxuICAgICAgICB2YXIgaXRlbUFjdGl2ZVByb3BlcnR5ID0gX2NvbXBhY3RJcmkoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBleHBhbmRlZFByb3BlcnR5LCBleHBhbmRlZEl0ZW0sIHt2b2NhYjogdHJ1ZX0sXG4gICAgICAgICAgaW5zaWRlUmV2ZXJzZSk7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKFxuICAgICAgICAgIGFjdGl2ZUN0eCwgaXRlbUFjdGl2ZVByb3BlcnR5LCAnQGNvbnRhaW5lcicpO1xuXG4gICAgICAgIC8vIGdldCBAbGlzdCB2YWx1ZSBpZiBhcHByb3ByaWF0ZVxuICAgICAgICB2YXIgaXNMaXN0ID0gX2lzTGlzdChleHBhbmRlZEl0ZW0pO1xuICAgICAgICB2YXIgbGlzdCA9IG51bGw7XG4gICAgICAgIGlmKGlzTGlzdCkge1xuICAgICAgICAgIGxpc3QgPSBleHBhbmRlZEl0ZW1bJ0BsaXN0J107XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWN1cnNpdmVseSBjb21wYWN0IGV4cGFuZGVkIGl0ZW1cbiAgICAgICAgdmFyIGNvbXBhY3RlZEl0ZW0gPSB0aGlzLmNvbXBhY3QoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBpdGVtQWN0aXZlUHJvcGVydHksIGlzTGlzdCA/IGxpc3QgOiBleHBhbmRlZEl0ZW0sIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBAbGlzdFxuICAgICAgICBpZihpc0xpc3QpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgQGxpc3QgdmFsdWUgaXMgYW4gYXJyYXlcbiAgICAgICAgICBpZighX2lzQXJyYXkoY29tcGFjdGVkSXRlbSkpIHtcbiAgICAgICAgICAgIGNvbXBhY3RlZEl0ZW0gPSBbY29tcGFjdGVkSXRlbV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoY29udGFpbmVyICE9PSAnQGxpc3QnKSB7XG4gICAgICAgICAgICAvLyB3cmFwIHVzaW5nIEBsaXN0IGFsaWFzXG4gICAgICAgICAgICB2YXIgd3JhcHBlciA9IHt9O1xuICAgICAgICAgICAgd3JhcHBlcltfY29tcGFjdElyaShhY3RpdmVDdHgsICdAbGlzdCcpXSA9IGNvbXBhY3RlZEl0ZW07XG4gICAgICAgICAgICBjb21wYWN0ZWRJdGVtID0gd3JhcHBlcjtcblxuICAgICAgICAgICAgLy8gaW5jbHVkZSBAaW5kZXggZnJvbSBleHBhbmRlZCBAbGlzdCwgaWYgYW55XG4gICAgICAgICAgICBpZignQGluZGV4JyBpbiBleHBhbmRlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgY29tcGFjdGVkSXRlbVtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAaW5kZXgnKV0gPVxuICAgICAgICAgICAgICAgIGV4cGFuZGVkSXRlbVsnQGluZGV4J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKGl0ZW1BY3RpdmVQcm9wZXJ0eSBpbiBydmFsKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCB1c2UgQGxpc3QgY29udGFpbmVyIGZvciBtb3JlIHRoYW4gMSBsaXN0XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdKU09OLUxEIGNvbXBhY3QgZXJyb3I7IHByb3BlcnR5IGhhcyBhIFwiQGxpc3RcIiBAY29udGFpbmVyICcgK1xuICAgICAgICAgICAgICAncnVsZSBidXQgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIEBsaXN0IHRoYXQgbWF0Y2hlcyAnICtcbiAgICAgICAgICAgICAgJ3RoZSBjb21wYWN0ZWQgdGVybSBpbiB0aGUgZG9jdW1lbnQuIENvbXBhY3Rpb24gbWlnaHQgbWl4ICcgK1xuICAgICAgICAgICAgICAndW53YW50ZWQgaXRlbXMgaW50byB0aGUgbGlzdC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdjb21wYWN0aW9uIHRvIGxpc3Qgb2YgbGlzdHMnfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGxhbmd1YWdlIGFuZCBpbmRleCBtYXBzXG4gICAgICAgIGlmKGNvbnRhaW5lciA9PT0gJ0BsYW5ndWFnZScgfHwgY29udGFpbmVyID09PSAnQGluZGV4Jykge1xuICAgICAgICAgIC8vIGdldCBvciBjcmVhdGUgdGhlIG1hcCBvYmplY3RcbiAgICAgICAgICB2YXIgbWFwT2JqZWN0O1xuICAgICAgICAgIGlmKGl0ZW1BY3RpdmVQcm9wZXJ0eSBpbiBydmFsKSB7XG4gICAgICAgICAgICBtYXBPYmplY3QgPSBydmFsW2l0ZW1BY3RpdmVQcm9wZXJ0eV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ2YWxbaXRlbUFjdGl2ZVByb3BlcnR5XSA9IG1hcE9iamVjdCA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIGNvbnRhaW5lciBpcyBhIGxhbmd1YWdlIG1hcCwgc2ltcGxpZnkgY29tcGFjdGVkIHZhbHVlIHRvXG4gICAgICAgICAgLy8gYSBzaW1wbGUgc3RyaW5nXG4gICAgICAgICAgaWYoY29udGFpbmVyID09PSAnQGxhbmd1YWdlJyAmJiBfaXNWYWx1ZShjb21wYWN0ZWRJdGVtKSkge1xuICAgICAgICAgICAgY29tcGFjdGVkSXRlbSA9IGNvbXBhY3RlZEl0ZW1bJ0B2YWx1ZSddO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGFkZCBjb21wYWN0IHZhbHVlIHRvIG1hcCBvYmplY3QgdXNpbmcga2V5IGZyb20gZXhwYW5kZWQgdmFsdWVcbiAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUgY29udGFpbmVyIHR5cGVcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUobWFwT2JqZWN0LCBleHBhbmRlZEl0ZW1bY29udGFpbmVyXSwgY29tcGFjdGVkSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXNlIGFuIGFycmF5IGlmOiBjb21wYWN0QXJyYXlzIGZsYWcgaXMgZmFsc2UsXG4gICAgICAgICAgLy8gQGNvbnRhaW5lciBpcyBAc2V0IG9yIEBsaXN0ICwgdmFsdWUgaXMgYW4gZW1wdHlcbiAgICAgICAgICAvLyBhcnJheSwgb3Iga2V5IGlzIEBncmFwaFxuICAgICAgICAgIHZhciBpc0FycmF5ID0gKCFvcHRpb25zLmNvbXBhY3RBcnJheXMgfHwgY29udGFpbmVyID09PSAnQHNldCcgfHxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9PT0gJ0BsaXN0JyB8fFxuICAgICAgICAgICAgKF9pc0FycmF5KGNvbXBhY3RlZEl0ZW0pICYmIGNvbXBhY3RlZEl0ZW0ubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BsaXN0JyB8fCBleHBhbmRlZFByb3BlcnR5ID09PSAnQGdyYXBoJyk7XG5cbiAgICAgICAgICAvLyBhZGQgY29tcGFjdCB2YWx1ZVxuICAgICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICAgIHJ2YWwsIGl0ZW1BY3RpdmVQcm9wZXJ0eSwgY29tcGFjdGVkSXRlbSxcbiAgICAgICAgICAgIHtwcm9wZXJ0eUlzQXJyYXk6IGlzQXJyYXl9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBydmFsO1xuICB9XG5cbiAgLy8gb25seSBwcmltaXRpdmVzIHJlbWFpbiB3aGljaCBhcmUgYWxyZWFkeSBjb21wYWN0XG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBleHBhbmRzIGFuIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIGNvbnRleHQuIEFueSBjb250ZXh0IGluXG4gKiB0aGUgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQuIEFsbCBjb250ZXh0IFVSTHMgbXVzdCBoYXZlIGJlZW4gcmV0cmlldmVkXG4gKiBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlQ3R4IHRoZSBjb250ZXh0IHRvIHVzZS5cbiAqIEBwYXJhbSBhY3RpdmVQcm9wZXJ0eSB0aGUgcHJvcGVydHkgZm9yIHRoZSBlbGVtZW50LCBudWxsIGZvciBub25lLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZXhwYW5kLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGV4cGFuc2lvbiBvcHRpb25zLlxuICogQHBhcmFtIGluc2lkZUxpc3QgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhIGxpc3QsIGZhbHNlIGlmIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBleHBhbmRlZCB2YWx1ZS5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbihcbiAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgZWxlbWVudCwgb3B0aW9ucywgaW5zaWRlTGlzdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gbm90aGluZyB0byBleHBhbmRcbiAgaWYoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKCFfaXNBcnJheShlbGVtZW50KSAmJiAhX2lzT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgLy8gZHJvcCBmcmVlLWZsb2F0aW5nIHNjYWxhcnMgdGhhdCBhcmUgbm90IGluIGxpc3RzXG4gICAgaWYoIWluc2lkZUxpc3QgJiYgKGFjdGl2ZVByb3BlcnR5ID09PSBudWxsIHx8XG4gICAgICBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHt2b2NhYjogdHJ1ZX0pID09PSAnQGdyYXBoJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBlbGVtZW50IGFjY29yZGluZyB0byB2YWx1ZSBleHBhbnNpb24gcnVsZXNcbiAgICByZXR1cm4gX2V4cGFuZFZhbHVlKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIGVsZW1lbnQpO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIGFycmF5XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICB2YXIgY29udGFpbmVyID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG4gICAgaW5zaWRlTGlzdCA9IGluc2lkZUxpc3QgfHwgY29udGFpbmVyID09PSAnQGxpc3QnO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBleHBhbmQgZWxlbWVudFxuICAgICAgdmFyIGUgPSBzZWxmLmV4cGFuZChhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCBlbGVtZW50W2ldLCBvcHRpb25zKTtcbiAgICAgIGlmKGluc2lkZUxpc3QgJiYgKF9pc0FycmF5KGUpIHx8IF9pc0xpc3QoZSkpKSB7XG4gICAgICAgIC8vIGxpc3RzIG9mIGxpc3RzIGFyZSBpbGxlZ2FsXG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgbGlzdHMgb2YgbGlzdHMgYXJlIG5vdCBwZXJtaXR0ZWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdsaXN0IG9mIGxpc3RzJ30pO1xuICAgICAgfVxuICAgICAgLy8gZHJvcCBudWxsIHZhbHVlc1xuICAgICAgaWYoZSAhPT0gbnVsbCkge1xuICAgICAgICBpZihfaXNBcnJheShlKSkge1xuICAgICAgICAgIHJ2YWwgPSBydmFsLmNvbmNhdChlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBydmFsLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH1cblxuICAvLyByZWN1cnNpdmVseSBleHBhbmQgb2JqZWN0OlxuXG4gIC8vIGlmIGVsZW1lbnQgaGFzIGEgY29udGV4dCwgcHJvY2VzcyBpdFxuICBpZignQGNvbnRleHQnIGluIGVsZW1lbnQpIHtcbiAgICBhY3RpdmVDdHggPSBzZWxmLnByb2Nlc3NDb250ZXh0KGFjdGl2ZUN0eCwgZWxlbWVudFsnQGNvbnRleHQnXSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBleHBhbmQgdGhlIGFjdGl2ZSBwcm9wZXJ0eVxuICB2YXIgZXhwYW5kZWRBY3RpdmVQcm9wZXJ0eSA9IF9leHBhbmRJcmkoXG4gICAgYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwge3ZvY2FiOiB0cnVlfSk7XG5cbiAgdmFyIHJ2YWwgPSB7fTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KS5zb3J0KCk7XG4gIGZvcih2YXIga2kgPSAwOyBraSA8IGtleXMubGVuZ3RoOyArK2tpKSB7XG4gICAgdmFyIGtleSA9IGtleXNba2ldO1xuICAgIHZhciB2YWx1ZSA9IGVsZW1lbnRba2V5XTtcbiAgICB2YXIgZXhwYW5kZWRWYWx1ZTtcblxuICAgIC8vIHNraXAgQGNvbnRleHRcbiAgICBpZihrZXkgPT09ICdAY29udGV4dCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBwcm9wZXJ0eVxuICAgIHZhciBleHBhbmRlZFByb3BlcnR5ID0gX2V4cGFuZElyaShhY3RpdmVDdHgsIGtleSwge3ZvY2FiOiB0cnVlfSk7XG5cbiAgICAvLyBkcm9wIG5vbi1hYnNvbHV0ZSBJUkkga2V5cyB0aGF0IGFyZW4ndCBrZXl3b3Jkc1xuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09IG51bGwgfHxcbiAgICAgICEoX2lzQWJzb2x1dGVJcmkoZXhwYW5kZWRQcm9wZXJ0eSkgfHwgX2lzS2V5d29yZChleHBhbmRlZFByb3BlcnR5KSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmKF9pc0tleXdvcmQoZXhwYW5kZWRQcm9wZXJ0eSkpIHtcbiAgICAgIGlmKGV4cGFuZGVkQWN0aXZlUHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIGtleXdvcmQgY2Fubm90IGJlIHVzZWQgYXMgYSBAcmV2ZXJzZSAnICtcbiAgICAgICAgICAncHJvcGVydHkuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgbWFwJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICB9XG4gICAgICBpZihleHBhbmRlZFByb3BlcnR5IGluIHJ2YWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBjb2xsaWRpbmcga2V5d29yZHMgZGV0ZWN0ZWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2NvbGxpZGluZyBrZXl3b3JkcycsIGtleXdvcmQ6IGV4cGFuZGVkUHJvcGVydHl9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzeW50YXggZXJyb3IgaWYgQGlkIGlzIG5vdCBhIHN0cmluZ1xuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAaWQnICYmICFfaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICBpZighb3B0aW9ucy5pc0ZyYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaWRcIiB2YWx1ZSBtdXN0IGEgc3RyaW5nLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnaW52YWxpZCBAaWQgdmFsdWUnLCB2YWx1ZTogdmFsdWV9KTtcbiAgICAgIH1cbiAgICAgIGlmKCFfaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaWRcIiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuICcgK1xuICAgICAgICAgICdvYmplY3QuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIEBpZCB2YWx1ZScsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdHlwZScpIHtcbiAgICAgIF92YWxpZGF0ZVR5cGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQGdyYXBoIG11c3QgYmUgYW4gYXJyYXkgb3IgYW4gb2JqZWN0XG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BncmFwaCcgJiZcbiAgICAgICEoX2lzT2JqZWN0KHZhbHVlKSB8fCBfaXNBcnJheSh2YWx1ZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkBncmFwaFwiIHZhbHVlIG11c3Qgbm90IGJlIGFuICcgK1xuICAgICAgICAnb2JqZWN0IG9yIGFuIGFycmF5LicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgQGdyYXBoIHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgLy8gQHZhbHVlIG11c3Qgbm90IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheVxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgPT09ICdAdmFsdWUnICYmXG4gICAgICAoX2lzT2JqZWN0KHZhbHVlKSB8fCBfaXNBcnJheSh2YWx1ZSkpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkB2YWx1ZVwiIHZhbHVlIG11c3Qgbm90IGJlIGFuICcgK1xuICAgICAgICAnb2JqZWN0IG9yIGFuIGFycmF5LicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgdmFsdWUgb2JqZWN0IHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgLy8gQGxhbmd1YWdlIG11c3QgYmUgYSBzdHJpbmdcbiAgICBpZihleHBhbmRlZFByb3BlcnR5ID09PSAnQGxhbmd1YWdlJykge1xuICAgICAgaWYodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZHJvcCBudWxsIEBsYW5ndWFnZSB2YWx1ZXMsIHRoZXkgZXhwYW5kIGFzIGlmIHRoZXkgZGlkbid0IGV4aXN0XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYoIV9pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkBsYW5ndWFnZVwiIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgbGFuZ3VhZ2UtdGFnZ2VkIHN0cmluZycsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgICAgLy8gZW5zdXJlIGxhbmd1YWdlIHZhbHVlIGlzIGxvd2VyY2FzZVxuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIEBpbmRleCBtdXN0IGJlIGEgc3RyaW5nXG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpbmRleCcpIHtcbiAgICAgIGlmKCFfaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAaW5kZXhcIiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIEBpbmRleCB2YWx1ZScsIHZhbHVlOiB2YWx1ZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEByZXZlcnNlIG11c3QgYmUgYW4gb2JqZWN0XG4gICAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0ByZXZlcnNlJykge1xuICAgICAgaWYoIV9pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkByZXZlcnNlXCIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3QuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIEByZXZlcnNlIHZhbHVlJywgdmFsdWU6IHZhbHVlfSk7XG4gICAgICB9XG5cbiAgICAgIGV4cGFuZGVkVmFsdWUgPSBzZWxmLmV4cGFuZChhY3RpdmVDdHgsICdAcmV2ZXJzZScsIHZhbHVlLCBvcHRpb25zKTtcblxuICAgICAgLy8gcHJvcGVydGllcyBkb3VibGUtcmV2ZXJzZWRcbiAgICAgIGlmKCdAcmV2ZXJzZScgaW4gZXhwYW5kZWRWYWx1ZSkge1xuICAgICAgICBmb3IodmFyIHByb3BlcnR5IGluIGV4cGFuZGVkVmFsdWVbJ0ByZXZlcnNlJ10pIHtcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICBydmFsLCBwcm9wZXJ0eSwgZXhwYW5kZWRWYWx1ZVsnQHJldmVyc2UnXVtwcm9wZXJ0eV0sXG4gICAgICAgICAgICB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYTUU6IGNhbiB0aGlzIGJlIG1lcmdlZCB3aXRoIGNvZGUgYmVsb3cgdG8gc2ltcGxpZnk/XG4gICAgICAvLyBtZXJnZSBpbiBhbGwgcmV2ZXJzZWQgcHJvcGVydGllc1xuICAgICAgdmFyIHJldmVyc2VNYXAgPSBydmFsWydAcmV2ZXJzZSddIHx8IG51bGw7XG4gICAgICBmb3IodmFyIHByb3BlcnR5IGluIGV4cGFuZGVkVmFsdWUpIHtcbiAgICAgICAgaWYocHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZihyZXZlcnNlTWFwID09PSBudWxsKSB7XG4gICAgICAgICAgcmV2ZXJzZU1hcCA9IHJ2YWxbJ0ByZXZlcnNlJ10gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBqc29ubGQuYWRkVmFsdWUocmV2ZXJzZU1hcCwgcHJvcGVydHksIFtdLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICAgIHZhciBpdGVtcyA9IGV4cGFuZGVkVmFsdWVbcHJvcGVydHldO1xuICAgICAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpdGVtcy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2lpXTtcbiAgICAgICAgICBpZihfaXNWYWx1ZShpdGVtKSB8fCBfaXNMaXN0KGl0ZW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBcIkByZXZlcnNlXCIgdmFsdWUgbXVzdCBub3QgYmUgYSAnICtcbiAgICAgICAgICAgICAgJ0B2YWx1ZSBvciBhbiBAbGlzdC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgdmFsdWUnLCB2YWx1ZTogZXhwYW5kZWRWYWx1ZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICByZXZlcnNlTWFwLCBwcm9wZXJ0eSwgaXRlbSwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGFjdGl2ZUN0eCwga2V5LCAnQGNvbnRhaW5lcicpO1xuXG4gICAgaWYoY29udGFpbmVyID09PSAnQGxhbmd1YWdlJyAmJiBfaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAvLyBoYW5kbGUgbGFuZ3VhZ2UgbWFwIGNvbnRhaW5lciAoc2tpcCBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0KVxuICAgICAgZXhwYW5kZWRWYWx1ZSA9IF9leHBhbmRMYW5ndWFnZU1hcCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmKGNvbnRhaW5lciA9PT0gJ0BpbmRleCcgJiYgX2lzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgLy8gaGFuZGxlIGluZGV4IGNvbnRhaW5lciAoc2tpcCBpZiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0KVxuICAgICAgZXhwYW5kZWRWYWx1ZSA9IChmdW5jdGlvbiBfZXhwYW5kSW5kZXhNYXAoYWN0aXZlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHJ2YWwgPSBbXTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpO1xuICAgICAgICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2tpXTtcbiAgICAgICAgICB2YXIgdmFsID0gdmFsdWVba2V5XTtcbiAgICAgICAgICBpZighX2lzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgdmFsID0gW3ZhbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbCA9IHNlbGYuZXhwYW5kKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHZhbCwgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICAgIGZvcih2YXIgdmkgPSAwOyB2aSA8IHZhbC5sZW5ndGg7ICsrdmkpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gdmFsW3ZpXTtcbiAgICAgICAgICAgIGlmKCEoJ0BpbmRleCcgaW4gaXRlbSkpIHtcbiAgICAgICAgICAgICAgaXRlbVsnQGluZGV4J10gPSBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydmFsLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydmFsO1xuICAgICAgfSkoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVjdXJzZSBpbnRvIEBsaXN0IG9yIEBzZXRcbiAgICAgIHZhciBpc0xpc3QgPSAoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BsaXN0Jyk7XG4gICAgICBpZihpc0xpc3QgfHwgZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BzZXQnKSB7XG4gICAgICAgIHZhciBuZXh0QWN0aXZlUHJvcGVydHkgPSBhY3RpdmVQcm9wZXJ0eTtcbiAgICAgICAgaWYoaXNMaXN0ICYmIGV4cGFuZGVkQWN0aXZlUHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgICAgICAgbmV4dEFjdGl2ZVByb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBleHBhbmRlZFZhbHVlID0gc2VsZi5leHBhbmQoXG4gICAgICAgICAgYWN0aXZlQ3R4LCBuZXh0QWN0aXZlUHJvcGVydHksIHZhbHVlLCBvcHRpb25zLCBpc0xpc3QpO1xuICAgICAgICBpZihpc0xpc3QgJiYgX2lzTGlzdChleHBhbmRlZFZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBsaXN0cyBvZiBsaXN0cyBhcmUgbm90IHBlcm1pdHRlZC4nLFxuICAgICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnbGlzdCBvZiBsaXN0cyd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgZXhwYW5kIHZhbHVlIHdpdGgga2V5IGFzIG5ldyBhY3RpdmUgcHJvcGVydHlcbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA9IHNlbGYuZXhwYW5kKGFjdGl2ZUN0eCwga2V5LCB2YWx1ZSwgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRyb3AgbnVsbCB2YWx1ZXMgaWYgcHJvcGVydHkgaXMgbm90IEB2YWx1ZVxuICAgIGlmKGV4cGFuZGVkVmFsdWUgPT09IG51bGwgJiYgZXhwYW5kZWRQcm9wZXJ0eSAhPT0gJ0B2YWx1ZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgZXhwYW5kZWQgdmFsdWUgdG8gQGxpc3QgaWYgY29udGFpbmVyIHNwZWNpZmllcyBpdFxuICAgIGlmKGV4cGFuZGVkUHJvcGVydHkgIT09ICdAbGlzdCcgJiYgIV9pc0xpc3QoZXhwYW5kZWRWYWx1ZSkgJiZcbiAgICAgIGNvbnRhaW5lciA9PT0gJ0BsaXN0Jykge1xuICAgICAgLy8gZW5zdXJlIGV4cGFuZGVkIHZhbHVlIGlzIGFuIGFycmF5XG4gICAgICBleHBhbmRlZFZhbHVlID0gKF9pc0FycmF5KGV4cGFuZGVkVmFsdWUpID9cbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA6IFtleHBhbmRlZFZhbHVlXSk7XG4gICAgICBleHBhbmRlZFZhbHVlID0geydAbGlzdCc6IGV4cGFuZGVkVmFsdWV9O1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBjYW4gdGhpcyBiZSBtZXJnZWQgd2l0aCBjb2RlIGFib3ZlIHRvIHNpbXBsaWZ5P1xuICAgIC8vIG1lcmdlIGluIHJldmVyc2UgcHJvcGVydGllc1xuICAgIGlmKGFjdGl2ZUN0eC5tYXBwaW5nc1trZXldICYmIGFjdGl2ZUN0eC5tYXBwaW5nc1trZXldLnJldmVyc2UpIHtcbiAgICAgIHZhciByZXZlcnNlTWFwID0gcnZhbFsnQHJldmVyc2UnXSA9IHJ2YWxbJ0ByZXZlcnNlJ10gfHwge307XG4gICAgICBpZighX2lzQXJyYXkoZXhwYW5kZWRWYWx1ZSkpIHtcbiAgICAgICAgZXhwYW5kZWRWYWx1ZSA9IFtleHBhbmRlZFZhbHVlXTtcbiAgICAgIH1cbiAgICAgIGZvcih2YXIgaWkgPSAwOyBpaSA8IGV4cGFuZGVkVmFsdWUubGVuZ3RoOyArK2lpKSB7XG4gICAgICAgIHZhciBpdGVtID0gZXhwYW5kZWRWYWx1ZVtpaV07XG4gICAgICAgIGlmKF9pc1ZhbHVlKGl0ZW0pIHx8IF9pc0xpc3QoaXRlbSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAcmV2ZXJzZVwiIHZhbHVlIG11c3Qgbm90IGJlIGEgJyArXG4gICAgICAgICAgICAnQHZhbHVlIG9yIGFuIEBsaXN0LicsICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHkgdmFsdWUnLCB2YWx1ZTogZXhwYW5kZWRWYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICByZXZlcnNlTWFwLCBleHBhbmRlZFByb3BlcnR5LCBpdGVtLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdmFsdWUgZm9yIHByb3BlcnR5XG4gICAgLy8gdXNlIGFuIGFycmF5IGV4Y2VwdCBmb3IgY2VydGFpbiBrZXl3b3Jkc1xuICAgIHZhciB1c2VBcnJheSA9XG4gICAgICBbJ0BpbmRleCcsICdAaWQnLCAnQHR5cGUnLCAnQHZhbHVlJywgJ0BsYW5ndWFnZSddLmluZGV4T2YoXG4gICAgICAgIGV4cGFuZGVkUHJvcGVydHkpID09PSAtMTtcbiAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICBydmFsLCBleHBhbmRlZFByb3BlcnR5LCBleHBhbmRlZFZhbHVlLCB7cHJvcGVydHlJc0FycmF5OiB1c2VBcnJheX0pO1xuICB9XG5cbiAgLy8gZ2V0IHByb3BlcnR5IGNvdW50IG9uIGV4cGFuZGVkIG91dHB1dFxuICBrZXlzID0gT2JqZWN0LmtleXMocnZhbCk7XG4gIHZhciBjb3VudCA9IGtleXMubGVuZ3RoO1xuXG4gIGlmKCdAdmFsdWUnIGluIHJ2YWwpIHtcbiAgICAvLyBAdmFsdWUgbXVzdCBvbmx5IGhhdmUgQGxhbmd1YWdlIG9yIEB0eXBlXG4gICAgaWYoJ0B0eXBlJyBpbiBydmFsICYmICdAbGFuZ3VhZ2UnIGluIHJ2YWwpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIGVsZW1lbnQgY29udGFpbmluZyBcIkB2YWx1ZVwiIG1heSBub3QgJyArXG4gICAgICAgICdjb250YWluIGJvdGggXCJAdHlwZVwiIGFuZCBcIkBsYW5ndWFnZVwiLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgdmFsdWUgb2JqZWN0JywgZWxlbWVudDogcnZhbH0pO1xuICAgIH1cbiAgICB2YXIgdmFsaWRDb3VudCA9IGNvdW50IC0gMTtcbiAgICBpZignQHR5cGUnIGluIHJ2YWwpIHtcbiAgICAgIHZhbGlkQ291bnQgLT0gMTtcbiAgICB9XG4gICAgaWYoJ0BpbmRleCcgaW4gcnZhbCkge1xuICAgICAgdmFsaWRDb3VudCAtPSAxO1xuICAgIH1cbiAgICBpZignQGxhbmd1YWdlJyBpbiBydmFsKSB7XG4gICAgICB2YWxpZENvdW50IC09IDE7XG4gICAgfVxuICAgIGlmKHZhbGlkQ291bnQgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIGVsZW1lbnQgY29udGFpbmluZyBcIkB2YWx1ZVwiIG1heSBvbmx5ICcgK1xuICAgICAgICAnaGF2ZSBhbiBcIkBpbmRleFwiIHByb3BlcnR5IGFuZCBhdCBtb3N0IG9uZSBvdGhlciBwcm9wZXJ0eSAnICtcbiAgICAgICAgJ3doaWNoIGNhbiBiZSBcIkB0eXBlXCIgb3IgXCJAbGFuZ3VhZ2VcIi4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZhbHVlIG9iamVjdCcsIGVsZW1lbnQ6IHJ2YWx9KTtcbiAgICB9XG4gICAgLy8gZHJvcCBudWxsIEB2YWx1ZXNcbiAgICBpZihydmFsWydAdmFsdWUnXSA9PT0gbnVsbCkge1xuICAgICAgcnZhbCA9IG51bGw7XG4gICAgfSBlbHNlIGlmKCdAbGFuZ3VhZ2UnIGluIHJ2YWwgJiYgIV9pc1N0cmluZyhydmFsWydAdmFsdWUnXSkpIHtcbiAgICAgIC8vIGlmIEBsYW5ndWFnZSBpcyBwcmVzZW50LCBAdmFsdWUgbXVzdCBiZSBhIHN0cmluZ1xuICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgb25seSBzdHJpbmdzIG1heSBiZSBsYW5ndWFnZS10YWdnZWQuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZS10YWdnZWQgdmFsdWUnLCBlbGVtZW50OiBydmFsfSk7XG4gICAgfSBlbHNlIGlmKCdAdHlwZScgaW4gcnZhbCAmJiAoIV9pc0Fic29sdXRlSXJpKHJ2YWxbJ0B0eXBlJ10pIHx8XG4gICAgICBydmFsWydAdHlwZSddLmluZGV4T2YoJ186JykgPT09IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhbiBlbGVtZW50IGNvbnRhaW5pbmcgXCJAdmFsdWVcIiBhbmQgXCJAdHlwZVwiICcgK1xuICAgICAgICAnbXVzdCBoYXZlIGFuIGFic29sdXRlIElSSSBmb3IgdGhlIHZhbHVlIG9mIFwiQHR5cGVcIi4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHR5cGVkIHZhbHVlJywgZWxlbWVudDogcnZhbH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmKCdAdHlwZScgaW4gcnZhbCAmJiAhX2lzQXJyYXkocnZhbFsnQHR5cGUnXSkpIHtcbiAgICAvLyBjb252ZXJ0IEB0eXBlIHRvIGFuIGFycmF5XG4gICAgcnZhbFsnQHR5cGUnXSA9IFtydmFsWydAdHlwZSddXTtcbiAgfSBlbHNlIGlmKCdAc2V0JyBpbiBydmFsIHx8ICdAbGlzdCcgaW4gcnZhbCkge1xuICAgIC8vIGhhbmRsZSBAc2V0IGFuZCBAbGlzdFxuICAgIGlmKGNvdW50ID4gMSAmJiAhKGNvdW50ID09PSAyICYmICdAaW5kZXgnIGluIHJ2YWwpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBpZiBhbiBlbGVtZW50IGhhcyB0aGUgcHJvcGVydHkgXCJAc2V0XCIgJyArXG4gICAgICAgICdvciBcIkBsaXN0XCIsIHRoZW4gaXQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgb3RoZXIgcHJvcGVydHkgdGhhdCBpcyAnICtcbiAgICAgICAgJ1wiQGluZGV4XCIuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBzZXQgb3IgbGlzdCBvYmplY3QnLCBlbGVtZW50OiBydmFsfSk7XG4gICAgfVxuICAgIC8vIG9wdGltaXplIGF3YXkgQHNldFxuICAgIGlmKCdAc2V0JyBpbiBydmFsKSB7XG4gICAgICBydmFsID0gcnZhbFsnQHNldCddO1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHJ2YWwpO1xuICAgICAgY291bnQgPSBrZXlzLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZihjb3VudCA9PT0gMSAmJiAnQGxhbmd1YWdlJyBpbiBydmFsKSB7XG4gICAgLy8gZHJvcCBvYmplY3RzIHdpdGggb25seSBAbGFuZ3VhZ2VcbiAgICBydmFsID0gbnVsbDtcbiAgfVxuXG4gIC8vIGRyb3AgY2VydGFpbiB0b3AtbGV2ZWwgb2JqZWN0cyB0aGF0IGRvIG5vdCBvY2N1ciBpbiBsaXN0c1xuICBpZihfaXNPYmplY3QocnZhbCkgJiZcbiAgICAhb3B0aW9ucy5rZWVwRnJlZUZsb2F0aW5nTm9kZXMgJiYgIWluc2lkZUxpc3QgJiZcbiAgICAoYWN0aXZlUHJvcGVydHkgPT09IG51bGwgfHwgZXhwYW5kZWRBY3RpdmVQcm9wZXJ0eSA9PT0gJ0BncmFwaCcpKSB7XG4gICAgLy8gZHJvcCBlbXB0eSBvYmplY3QsIHRvcC1sZXZlbCBAdmFsdWUvQGxpc3QsIG9yIG9iamVjdCB3aXRoIG9ubHkgQGlkXG4gICAgaWYoY291bnQgPT09IDAgfHwgJ0B2YWx1ZScgaW4gcnZhbCB8fCAnQGxpc3QnIGluIHJ2YWwgfHxcbiAgICAgIChjb3VudCA9PT0gMSAmJiAnQGlkJyBpbiBydmFsKSkge1xuICAgICAgcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBKU09OLUxEIG5vZGUgbWFwIChub2RlIElEID0+IG5vZGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgZXhwYW5kZWQgSlNPTi1MRCB0byBjcmVhdGUgYSBub2RlIG1hcCBvZi5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW2lzc3Vlcl0gYSBqc29ubGQuSWRlbnRpZmllcklzc3VlciB0byB1c2UgdG8gbGFiZWwgYmxhbmsgbm9kZXMuXG4gKiAgICAgICAgICBbbmFtZXJdIChkZXByZWNhdGVkKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBub2RlIG1hcC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5jcmVhdGVOb2RlTWFwID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gcHJvZHVjZSBhIG1hcCBvZiBhbGwgc3ViamVjdHMgYW5kIG5hbWUgZWFjaCBibm9kZVxuICB2YXIgaXNzdWVyID0gb3B0aW9ucy5uYW1lciB8fCBvcHRpb25zLmlzc3VlciB8fCBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gIHZhciBncmFwaHMgPSB7J0BkZWZhdWx0Jzoge319O1xuICBfY3JlYXRlTm9kZU1hcChpbnB1dCwgZ3JhcGhzLCAnQGRlZmF1bHQnLCBpc3N1ZXIpO1xuXG4gIC8vIGFkZCBhbGwgbm9uLWRlZmF1bHQgZ3JhcGhzIHRvIGRlZmF1bHQgZ3JhcGhcbiAgcmV0dXJuIF9tZXJnZU5vZGVNYXBzKGdyYXBocyk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIEpTT04tTEQgZmxhdHRlbmluZy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGV4cGFuZGVkIEpTT04tTEQgdG8gZmxhdHRlbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBmbGF0dGVuZWQgb3V0cHV0LlxuICovXG5Qcm9jZXNzb3IucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCkge1xuICB2YXIgZGVmYXVsdEdyYXBoID0gdGhpcy5jcmVhdGVOb2RlTWFwKGlucHV0KTtcblxuICAvLyBwcm9kdWNlIGZsYXR0ZW5lZCBvdXRwdXRcbiAgdmFyIGZsYXR0ZW5lZCA9IFtdO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRHcmFwaCkuc29ydCgpO1xuICBmb3IodmFyIGtpID0gMDsga2kgPCBrZXlzLmxlbmd0aDsgKytraSkge1xuICAgIHZhciBub2RlID0gZGVmYXVsdEdyYXBoW2tleXNba2ldXTtcbiAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgIGlmKCFfaXNTdWJqZWN0UmVmZXJlbmNlKG5vZGUpKSB7XG4gICAgICBmbGF0dGVuZWQucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgSlNPTi1MRCBmcmFtaW5nLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgZXhwYW5kZWQgSlNPTi1MRCB0byBmcmFtZS5cbiAqIEBwYXJhbSBmcmFtZSB0aGUgZXhwYW5kZWQgSlNPTi1MRCBmcmFtZSB0byB1c2UuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgZnJhbWluZyBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gdGhlIGZyYW1lZCBvdXRwdXQuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUuZnJhbWUgPSBmdW5jdGlvbihpbnB1dCwgZnJhbWUsIG9wdGlvbnMpIHtcbiAgLy8gY3JlYXRlIGZyYW1pbmcgc3RhdGVcbiAgdmFyIHN0YXRlID0ge1xuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgZ3JhcGhzOiB7J0BkZWZhdWx0Jzoge30sICdAbWVyZ2VkJzoge319LFxuICAgIHN1YmplY3RTdGFjazogW10sXG4gICAgbGluazoge31cbiAgfTtcblxuICAvLyBwcm9kdWNlIGEgbWFwIG9mIGFsbCBncmFwaHMgYW5kIG5hbWUgZWFjaCBibm9kZVxuICAvLyBGSVhNRTogY3VycmVudGx5IHVzZXMgc3ViamVjdHMgZnJvbSBAbWVyZ2VkIGdyYXBoIG9ubHlcbiAgdmFyIGlzc3VlciA9IG5ldyBJZGVudGlmaWVySXNzdWVyKCdfOmInKTtcbiAgX2NyZWF0ZU5vZGVNYXAoaW5wdXQsIHN0YXRlLmdyYXBocywgJ0BtZXJnZWQnLCBpc3N1ZXIpO1xuICBzdGF0ZS5zdWJqZWN0cyA9IHN0YXRlLmdyYXBoc1snQG1lcmdlZCddO1xuXG4gIC8vIGZyYW1lIHRoZSBzdWJqZWN0c1xuICB2YXIgZnJhbWVkID0gW107XG4gIF9mcmFtZShzdGF0ZSwgT2JqZWN0LmtleXMoc3RhdGUuc3ViamVjdHMpLnNvcnQoKSwgZnJhbWUsIGZyYW1lZCwgbnVsbCk7XG4gIHJldHVybiBmcmFtZWQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIG5vcm1hbGl6YXRpb24gb24gdGhlIGdpdmVuIFJERiBkYXRhc2V0LlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0IHRoZSBSREYgZGF0YXNldCB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgbm9ybWFsaXphdGlvbiBvcHRpb25zLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwgbm9ybWFsaXplZCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24oZGF0YXNldCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYob3B0aW9ucy5hbGdvcml0aG0gPT09ICdVUkROQTIwMTUnKSB7XG4gICAgcmV0dXJuIG5ldyBVUkROQTIwMTUob3B0aW9ucykubWFpbihkYXRhc2V0LCBjYWxsYmFjayk7XG4gIH1cbiAgaWYob3B0aW9ucy5hbGdvcml0aG0gPT09ICdVUkdOQTIwMTInKSB7XG4gICAgcmV0dXJuIG5ldyBVUkdOQTIwMTIob3B0aW9ucykubWFpbihkYXRhc2V0LCBjYWxsYmFjayk7XG4gIH1cbiAgY2FsbGJhY2sobmV3IEVycm9yKFxuICAgICdJbnZhbGlkIFJERiBEYXRhc2V0IE5vcm1hbGl6YXRpb24gYWxnb3JpdGhtOiAnICsgb3B0aW9ucy5hbGdvcml0aG0pKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gUkRGIGRhdGFzZXQgdG8gSlNPTi1MRC5cbiAqXG4gKiBAcGFyYW0gZGF0YXNldCB0aGUgUkRGIGRhdGFzZXQuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIG91dHB1dCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cblByb2Nlc3Nvci5wcm90b3R5cGUuZnJvbVJERiA9IGZ1bmN0aW9uKGRhdGFzZXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBkZWZhdWx0R3JhcGggPSB7fTtcbiAgdmFyIGdyYXBoTWFwID0geydAZGVmYXVsdCc6IGRlZmF1bHRHcmFwaH07XG4gIHZhciByZWZlcmVuY2VkT25jZSA9IHt9O1xuXG4gIGZvcih2YXIgbmFtZSBpbiBkYXRhc2V0KSB7XG4gICAgdmFyIGdyYXBoID0gZGF0YXNldFtuYW1lXTtcbiAgICBpZighKG5hbWUgaW4gZ3JhcGhNYXApKSB7XG4gICAgICBncmFwaE1hcFtuYW1lXSA9IHt9O1xuICAgIH1cbiAgICBpZihuYW1lICE9PSAnQGRlZmF1bHQnICYmICEobmFtZSBpbiBkZWZhdWx0R3JhcGgpKSB7XG4gICAgICBkZWZhdWx0R3JhcGhbbmFtZV0gPSB7J0BpZCc6IG5hbWV9O1xuICAgIH1cbiAgICB2YXIgbm9kZU1hcCA9IGdyYXBoTWFwW25hbWVdO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IGdyYXBoLmxlbmd0aDsgKyt0aSkge1xuICAgICAgdmFyIHRyaXBsZSA9IGdyYXBoW3RpXTtcblxuICAgICAgLy8gZ2V0IHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0XG4gICAgICB2YXIgcyA9IHRyaXBsZS5zdWJqZWN0LnZhbHVlO1xuICAgICAgdmFyIHAgPSB0cmlwbGUucHJlZGljYXRlLnZhbHVlO1xuICAgICAgdmFyIG8gPSB0cmlwbGUub2JqZWN0O1xuXG4gICAgICBpZighKHMgaW4gbm9kZU1hcCkpIHtcbiAgICAgICAgbm9kZU1hcFtzXSA9IHsnQGlkJzogc307XG4gICAgICB9XG4gICAgICB2YXIgbm9kZSA9IG5vZGVNYXBbc107XG5cbiAgICAgIHZhciBvYmplY3RJc0lkID0gKG8udHlwZSA9PT0gJ0lSSScgfHwgby50eXBlID09PSAnYmxhbmsgbm9kZScpO1xuICAgICAgaWYob2JqZWN0SXNJZCAmJiAhKG8udmFsdWUgaW4gbm9kZU1hcCkpIHtcbiAgICAgICAgbm9kZU1hcFtvLnZhbHVlXSA9IHsnQGlkJzogby52YWx1ZX07XG4gICAgICB9XG5cbiAgICAgIGlmKHAgPT09IFJERl9UWVBFICYmICFvcHRpb25zLnVzZVJkZlR5cGUgJiYgb2JqZWN0SXNJZCkge1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUobm9kZSwgJ0B0eXBlJywgby52YWx1ZSwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gX1JERlRvT2JqZWN0KG8sIG9wdGlvbnMudXNlTmF0aXZlVHlwZXMpO1xuICAgICAganNvbmxkLmFkZFZhbHVlKG5vZGUsIHAsIHZhbHVlLCB7cHJvcGVydHlJc0FycmF5OiB0cnVlfSk7XG5cbiAgICAgIC8vIG9iamVjdCBtYXkgYmUgYW4gUkRGIGxpc3QvcGFydGlhbCBsaXN0IG5vZGUgYnV0IHdlIGNhbid0IGtub3cgZWFzaWx5XG4gICAgICAvLyB1bnRpbCBhbGwgdHJpcGxlcyBhcmUgcmVhZFxuICAgICAgaWYob2JqZWN0SXNJZCkge1xuICAgICAgICBpZihvLnZhbHVlID09PSBSREZfTklMKSB7XG4gICAgICAgICAgLy8gdHJhY2sgcmRmOm5pbCB1bmlxdWVseSBwZXIgZ3JhcGhcbiAgICAgICAgICB2YXIgb2JqZWN0ID0gbm9kZU1hcFtvLnZhbHVlXTtcbiAgICAgICAgICBpZighKCd1c2FnZXMnIGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIG9iamVjdC51c2FnZXMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0LnVzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBwcm9wZXJ0eTogcCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYoby52YWx1ZSBpbiByZWZlcmVuY2VkT25jZSkge1xuICAgICAgICAgIC8vIG9iamVjdCByZWZlcmVuY2VkIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgcmVmZXJlbmNlZE9uY2Vbby52YWx1ZV0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHNpbmdsZSByZWZlcmVuY2VcbiAgICAgICAgICByZWZlcmVuY2VkT25jZVtvLnZhbHVlXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBwcm9wZXJ0eTogcCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBjb252ZXJ0IGxpbmtlZCBsaXN0cyB0byBAbGlzdCBhcnJheXNcbiAgZm9yKHZhciBuYW1lIGluIGdyYXBoTWFwKSB7XG4gICAgdmFyIGdyYXBoT2JqZWN0ID0gZ3JhcGhNYXBbbmFtZV07XG5cbiAgICAvLyBubyBAbGlzdHMgdG8gYmUgY29udmVydGVkLCBjb250aW51ZVxuICAgIGlmKCEoUkRGX05JTCBpbiBncmFwaE9iamVjdCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2ggZWFjaCBSREYgbGlzdFxuICAgIHZhciBuaWwgPSBncmFwaE9iamVjdFtSREZfTklMXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbmlsLnVzYWdlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHVzYWdlID0gbmlsLnVzYWdlc1tpXTtcbiAgICAgIHZhciBub2RlID0gdXNhZ2Uubm9kZTtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHVzYWdlLnByb3BlcnR5O1xuICAgICAgdmFyIGhlYWQgPSB1c2FnZS52YWx1ZTtcbiAgICAgIHZhciBsaXN0ID0gW107XG4gICAgICB2YXIgbGlzdE5vZGVzID0gW107XG5cbiAgICAgIC8vIGVuc3VyZSBub2RlIGlzIGEgd2VsbC1mb3JtZWQgbGlzdCBub2RlOyBpdCBtdXN0OlxuICAgICAgLy8gMS4gQmUgcmVmZXJlbmNlZCBvbmx5IG9uY2UuXG4gICAgICAvLyAyLiBIYXZlIGFuIGFycmF5IGZvciByZGY6Zmlyc3QgdGhhdCBoYXMgMSBpdGVtLlxuICAgICAgLy8gMy4gSGF2ZSBhbiBhcnJheSBmb3IgcmRmOnJlc3QgdGhhdCBoYXMgMSBpdGVtLlxuICAgICAgLy8gNC4gSGF2ZSBubyBrZXlzIG90aGVyIHRoYW46IEBpZCwgcmRmOmZpcnN0LCByZGY6cmVzdCwgYW5kLFxuICAgICAgLy8gICBvcHRpb25hbGx5LCBAdHlwZSB3aGVyZSB0aGUgdmFsdWUgaXMgcmRmOkxpc3QuXG4gICAgICB2YXIgbm9kZUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoO1xuICAgICAgd2hpbGUocHJvcGVydHkgPT09IFJERl9SRVNUICYmXG4gICAgICAgIF9pc09iamVjdChyZWZlcmVuY2VkT25jZVtub2RlWydAaWQnXV0pICYmXG4gICAgICAgIF9pc0FycmF5KG5vZGVbUkRGX0ZJUlNUXSkgJiYgbm9kZVtSREZfRklSU1RdLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBfaXNBcnJheShub2RlW1JERl9SRVNUXSkgJiYgbm9kZVtSREZfUkVTVF0ubGVuZ3RoID09PSAxICYmXG4gICAgICAgIChub2RlS2V5Q291bnQgPT09IDMgfHwgKG5vZGVLZXlDb3VudCA9PT0gNCAmJiBfaXNBcnJheShub2RlWydAdHlwZSddKSAmJlxuICAgICAgICAgIG5vZGVbJ0B0eXBlJ10ubGVuZ3RoID09PSAxICYmIG5vZGVbJ0B0eXBlJ11bMF0gPT09IFJERl9MSVNUKSkpIHtcbiAgICAgICAgbGlzdC5wdXNoKG5vZGVbUkRGX0ZJUlNUXVswXSk7XG4gICAgICAgIGxpc3ROb2Rlcy5wdXNoKG5vZGVbJ0BpZCddKTtcblxuICAgICAgICAvLyBnZXQgbmV4dCBub2RlLCBtb3ZpbmcgYmFja3dhcmRzIHRocm91Z2ggbGlzdFxuICAgICAgICB1c2FnZSA9IHJlZmVyZW5jZWRPbmNlW25vZGVbJ0BpZCddXTtcbiAgICAgICAgbm9kZSA9IHVzYWdlLm5vZGU7XG4gICAgICAgIHByb3BlcnR5ID0gdXNhZ2UucHJvcGVydHk7XG4gICAgICAgIGhlYWQgPSB1c2FnZS52YWx1ZTtcbiAgICAgICAgbm9kZUtleUNvdW50ID0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoO1xuXG4gICAgICAgIC8vIGlmIG5vZGUgaXMgbm90IGEgYmxhbmsgbm9kZSwgdGhlbiBsaXN0IGhlYWQgZm91bmRcbiAgICAgICAgaWYobm9kZVsnQGlkJ10uaW5kZXhPZignXzonKSAhPT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHRoZSBsaXN0IGlzIG5lc3RlZCBpbiBhbm90aGVyIGxpc3RcbiAgICAgIGlmKHByb3BlcnR5ID09PSBSREZfRklSU1QpIHtcbiAgICAgICAgLy8gZW1wdHkgbGlzdFxuICAgICAgICBpZihub2RlWydAaWQnXSA9PT0gUkRGX05JTCkge1xuICAgICAgICAgIC8vIGNhbid0IGNvbnZlcnQgcmRmOm5pbCB0byBhIEBsaXN0IG9iamVjdCBiZWNhdXNlIGl0IHdvdWxkXG4gICAgICAgICAgLy8gcmVzdWx0IGluIGEgbGlzdCBvZiBsaXN0cyB3aGljaCBpc24ndCBzdXBwb3J0ZWRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXNlcnZlIGxpc3QgaGVhZFxuICAgICAgICBoZWFkID0gZ3JhcGhPYmplY3RbaGVhZFsnQGlkJ11dW1JERl9SRVNUXVswXTtcbiAgICAgICAgbGlzdC5wb3AoKTtcbiAgICAgICAgbGlzdE5vZGVzLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLyB0cmFuc2Zvcm0gbGlzdCBpbnRvIEBsaXN0IG9iamVjdFxuICAgICAgZGVsZXRlIGhlYWRbJ0BpZCddO1xuICAgICAgaGVhZFsnQGxpc3QnXSA9IGxpc3QucmV2ZXJzZSgpO1xuICAgICAgZm9yKHZhciBqID0gMDsgaiA8IGxpc3ROb2Rlcy5sZW5ndGg7ICsraikge1xuICAgICAgICBkZWxldGUgZ3JhcGhPYmplY3RbbGlzdE5vZGVzW2pdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGUgbmlsLnVzYWdlcztcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1YmplY3RzID0gT2JqZWN0LmtleXMoZGVmYXVsdEdyYXBoKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzdWJqZWN0cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBzdWJqZWN0ID0gc3ViamVjdHNbaV07XG4gICAgdmFyIG5vZGUgPSBkZWZhdWx0R3JhcGhbc3ViamVjdF07XG4gICAgaWYoc3ViamVjdCBpbiBncmFwaE1hcCkge1xuICAgICAgdmFyIGdyYXBoID0gbm9kZVsnQGdyYXBoJ10gPSBbXTtcbiAgICAgIHZhciBncmFwaE9iamVjdCA9IGdyYXBoTWFwW3N1YmplY3RdO1xuICAgICAgdmFyIHN1YmplY3RzXyA9IE9iamVjdC5rZXlzKGdyYXBoT2JqZWN0KS5zb3J0KCk7XG4gICAgICBmb3IodmFyIHNpID0gMDsgc2kgPCBzdWJqZWN0c18ubGVuZ3RoOyArK3NpKSB7XG4gICAgICAgIHZhciBub2RlXyA9IGdyYXBoT2JqZWN0W3N1YmplY3RzX1tzaV1dO1xuICAgICAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlXykpIHtcbiAgICAgICAgICBncmFwaC5wdXNoKG5vZGVfKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzIHRvIHRvcC1sZXZlbFxuICAgIGlmKCFfaXNTdWJqZWN0UmVmZXJlbmNlKG5vZGUpKSB7XG4gICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xufTtcblxuLyoqXG4gKiBPdXRwdXRzIGFuIFJERiBkYXRhc2V0IGZvciB0aGUgZXhwYW5kZWQgSlNPTi1MRCBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGV4cGFuZGVkIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBSREYgZGF0YXNldC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS50b1JERiA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7XG4gIC8vIGNyZWF0ZSBub2RlIG1hcCBmb3IgZGVmYXVsdCBncmFwaCAoYW5kIGFueSBuYW1lZCBncmFwaHMpXG4gIHZhciBpc3N1ZXIgPSBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG4gIHZhciBub2RlTWFwID0geydAZGVmYXVsdCc6IHt9fTtcbiAgX2NyZWF0ZU5vZGVNYXAoaW5wdXQsIG5vZGVNYXAsICdAZGVmYXVsdCcsIGlzc3Vlcik7XG5cbiAgdmFyIGRhdGFzZXQgPSB7fTtcbiAgdmFyIGdyYXBoTmFtZXMgPSBPYmplY3Qua2V5cyhub2RlTWFwKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBncmFwaE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGdyYXBoTmFtZSA9IGdyYXBoTmFtZXNbaV07XG4gICAgLy8gc2tpcCByZWxhdGl2ZSBJUklzXG4gICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnIHx8IF9pc0Fic29sdXRlSXJpKGdyYXBoTmFtZSkpIHtcbiAgICAgIGRhdGFzZXRbZ3JhcGhOYW1lXSA9IF9ncmFwaFRvUkRGKG5vZGVNYXBbZ3JhcGhOYW1lXSwgaXNzdWVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFzZXQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGxvY2FsIGNvbnRleHQgYW5kIHJldHVybnMgYSBuZXcgYWN0aXZlIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBsb2NhbEN0eCB0aGUgbG9jYWwgY29udGV4dCB0byBwcm9jZXNzLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGNvbnRleHQgcHJvY2Vzc2luZyBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gdGhlIG5ldyBhY3RpdmUgY29udGV4dC5cbiAqL1xuUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzQ29udGV4dCA9IGZ1bmN0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIG9wdGlvbnMpIHtcbiAgLy8gbm9ybWFsaXplIGxvY2FsIGNvbnRleHQgdG8gYW4gYXJyYXkgb2YgQGNvbnRleHQgb2JqZWN0c1xuICBpZihfaXNPYmplY3QobG9jYWxDdHgpICYmICdAY29udGV4dCcgaW4gbG9jYWxDdHggJiZcbiAgICBfaXNBcnJheShsb2NhbEN0eFsnQGNvbnRleHQnXSkpIHtcbiAgICBsb2NhbEN0eCA9IGxvY2FsQ3R4WydAY29udGV4dCddO1xuICB9XG4gIHZhciBjdHhzID0gX2lzQXJyYXkobG9jYWxDdHgpID8gbG9jYWxDdHggOiBbbG9jYWxDdHhdO1xuXG4gIC8vIG5vIGNvbnRleHRzIGluIGFycmF5LCBjbG9uZSBleGlzdGluZyBjb250ZXh0XG4gIGlmKGN0eHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUN0eC5jbG9uZSgpO1xuICB9XG5cbiAgLy8gcHJvY2VzcyBlYWNoIGNvbnRleHQgaW4gb3JkZXIsIHVwZGF0ZSBhY3RpdmUgY29udGV4dFxuICAvLyBvbiBlYWNoIGl0ZXJhdGlvbiB0byBlbnN1cmUgcHJvcGVyIGNhY2hpbmdcbiAgdmFyIHJ2YWwgPSBhY3RpdmVDdHg7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBjdHhzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGN0eCA9IGN0eHNbaV07XG5cbiAgICAvLyByZXNldCB0byBpbml0aWFsIGNvbnRleHRcbiAgICBpZihjdHggPT09IG51bGwpIHtcbiAgICAgIHJ2YWwgPSBhY3RpdmVDdHggPSBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBkZXJlZmVyZW5jZSBAY29udGV4dCBrZXkgaWYgcHJlc2VudFxuICAgIGlmKF9pc09iamVjdChjdHgpICYmICdAY29udGV4dCcgaW4gY3R4KSB7XG4gICAgICBjdHggPSBjdHhbJ0Bjb250ZXh0J107XG4gICAgfVxuXG4gICAgLy8gY29udGV4dCBtdXN0IGJlIGFuIG9iamVjdCBieSBub3csIGFsbCBVUkxzIHJldHJpZXZlZCBiZWZvcmUgdGhpcyBjYWxsXG4gICAgaWYoIV9pc09iamVjdChjdHgpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIGxvY2FsIGNvbnRleHQnLCBjb250ZXh0OiBjdHh9KTtcbiAgICB9XG5cbiAgICAvLyBnZXQgY29udGV4dCBmcm9tIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgIGlmKGpzb25sZC5jYWNoZS5hY3RpdmVDdHgpIHtcbiAgICAgIHZhciBjYWNoZWQgPSBqc29ubGQuY2FjaGUuYWN0aXZlQ3R4LmdldChhY3RpdmVDdHgsIGN0eCk7XG4gICAgICBpZihjYWNoZWQpIHtcbiAgICAgICAgcnZhbCA9IGFjdGl2ZUN0eCA9IGNhY2hlZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGFjdGl2ZSBjb250ZXh0IGFuZCBjbG9uZSBuZXcgb25lIGJlZm9yZSB1cGRhdGluZ1xuICAgIGFjdGl2ZUN0eCA9IHJ2YWw7XG4gICAgcnZhbCA9IHJ2YWwuY2xvbmUoKTtcblxuICAgIC8vIGRlZmluZSBjb250ZXh0IG1hcHBpbmdzIGZvciBrZXlzIGluIGxvY2FsIGNvbnRleHRcbiAgICB2YXIgZGVmaW5lZCA9IHt9O1xuXG4gICAgLy8gaGFuZGxlIEBiYXNlXG4gICAgaWYoJ0BiYXNlJyBpbiBjdHgpIHtcbiAgICAgIHZhciBiYXNlID0gY3R4WydAYmFzZSddO1xuXG4gICAgICAvLyBjbGVhciBiYXNlXG4gICAgICBpZihiYXNlID09PSBudWxsKSB7XG4gICAgICAgIGJhc2UgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmKCFfaXNTdHJpbmcoYmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAYmFzZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgYmFzZSBJUkknLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSBpZihiYXNlICE9PSAnJyAmJiAhX2lzQWJzb2x1dGVJcmkoYmFzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAYmFzZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYW4gYWJzb2x1dGUgSVJJIG9yIHRoZSBlbXB0eSBzdHJpbmcuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIGJhc2UgSVJJJywgY29udGV4dDogY3R4fSk7XG4gICAgICB9XG5cbiAgICAgIGlmKGJhc2UgIT09IG51bGwpIHtcbiAgICAgICAgYmFzZSA9IGpzb25sZC51cmwucGFyc2UoYmFzZSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBydmFsWydAYmFzZSddID0gYmFzZTtcbiAgICAgIGRlZmluZWRbJ0BiYXNlJ10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBAdm9jYWJcbiAgICBpZignQHZvY2FiJyBpbiBjdHgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGN0eFsnQHZvY2FiJ107XG4gICAgICBpZih2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgcnZhbFsnQHZvY2FiJ107XG4gICAgICB9IGVsc2UgaWYoIV9pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyB0aGUgdmFsdWUgb2YgXCJAdm9jYWJcIiBpbiBhICcgK1xuICAgICAgICAgICdAY29udGV4dCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZvY2FiIG1hcHBpbmcnLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSBpZighX2lzQWJzb2x1dGVJcmkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgdGhlIHZhbHVlIG9mIFwiQHZvY2FiXCIgaW4gYSAnICtcbiAgICAgICAgICAnQGNvbnRleHQgbXVzdCBiZSBhbiBhYnNvbHV0ZSBJUkkuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIHZvY2FiIG1hcHBpbmcnLCBjb250ZXh0OiBjdHh9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJ2YWxbJ0B2b2NhYiddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBkZWZpbmVkWydAdm9jYWInXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIEBsYW5ndWFnZVxuICAgIGlmKCdAbGFuZ3VhZ2UnIGluIGN0eCkge1xuICAgICAgdmFyIHZhbHVlID0gY3R4WydAbGFuZ3VhZ2UnXTtcbiAgICAgIGlmKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBydmFsWydAbGFuZ3VhZ2UnXTtcbiAgICAgIH0gZWxzZSBpZighX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IHRoZSB2YWx1ZSBvZiBcIkBsYW5ndWFnZVwiIGluIGEgJyArXG4gICAgICAgICAgJ0Bjb250ZXh0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBkZWZhdWx0IGxhbmd1YWdlJywgY29udGV4dDogY3R4fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydmFsWydAbGFuZ3VhZ2UnXSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBkZWZpbmVkWydAbGFuZ3VhZ2UnXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBhbGwgb3RoZXIga2V5c1xuICAgIGZvcih2YXIga2V5IGluIGN0eCkge1xuICAgICAgX2NyZWF0ZVRlcm1EZWZpbml0aW9uKHJ2YWwsIGN0eCwga2V5LCBkZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBjYWNoZSByZXN1bHRcbiAgICBpZihqc29ubGQuY2FjaGUuYWN0aXZlQ3R4KSB7XG4gICAgICBqc29ubGQuY2FjaGUuYWN0aXZlQ3R4LnNldChhY3RpdmVDdHgsIGN0eCwgcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEV4cGFuZHMgYSBsYW5ndWFnZSBtYXAuXG4gKlxuICogQHBhcmFtIGxhbmd1YWdlTWFwIHRoZSBsYW5ndWFnZSBtYXAgdG8gZXhwYW5kLlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIGxhbmd1YWdlIG1hcC5cbiAqL1xuZnVuY3Rpb24gX2V4cGFuZExhbmd1YWdlTWFwKGxhbmd1YWdlTWFwKSB7XG4gIHZhciBydmFsID0gW107XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMobGFuZ3VhZ2VNYXApLnNvcnQoKTtcbiAgZm9yKHZhciBraSA9IDA7IGtpIDwga2V5cy5sZW5ndGg7ICsra2kpIHtcbiAgICB2YXIga2V5ID0ga2V5c1traV07XG4gICAgdmFyIHZhbCA9IGxhbmd1YWdlTWFwW2tleV07XG4gICAgaWYoIV9pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhbCA9IFt2YWxdO1xuICAgIH1cbiAgICBmb3IodmFyIHZpID0gMDsgdmkgPCB2YWwubGVuZ3RoOyArK3ZpKSB7XG4gICAgICB2YXIgaXRlbSA9IHZhbFt2aV07XG4gICAgICBpZihpdGVtID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gbnVsbCB2YWx1ZXMgYXJlIGFsbG93ZWQgKDguNSkgYnV0IGlnbm9yZWQgKDMuMSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmKCFfaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBsYW5ndWFnZSBtYXAgdmFsdWVzIG11c3QgYmUgc3RyaW5ncy4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZSBtYXAgdmFsdWUnLCBsYW5ndWFnZU1hcDogbGFuZ3VhZ2VNYXB9KTtcbiAgICAgIH1cbiAgICAgIHJ2YWwucHVzaCh7XG4gICAgICAgICdAdmFsdWUnOiBpdGVtLFxuICAgICAgICAnQGxhbmd1YWdlJzoga2V5LnRvTG93ZXJDYXNlKClcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBMYWJlbHMgdGhlIGJsYW5rIG5vZGVzIGluIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB0aGUgZ2l2ZW4gSWRlbnRpZmllcklzc3Vlci5cbiAqXG4gKiBAcGFyYW0gaXNzdWVyIHRoZSBJZGVudGlmaWVySXNzdWVyIHRvIHVzZS5cbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHdpdGggYmxhbmsgbm9kZXMgdG8gcmVuYW1lLlxuICpcbiAqIEByZXR1cm4gdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIF9sYWJlbEJsYW5rTm9kZXMoaXNzdWVyLCBlbGVtZW50KSB7XG4gIGlmKF9pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGVsZW1lbnQubGVuZ3RoOyArK2kpIHtcbiAgICAgIGVsZW1lbnRbaV0gPSBfbGFiZWxCbGFua05vZGVzKGlzc3VlciwgZWxlbWVudFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYoX2lzTGlzdChlbGVtZW50KSkge1xuICAgIGVsZW1lbnRbJ0BsaXN0J10gPSBfbGFiZWxCbGFua05vZGVzKGlzc3VlciwgZWxlbWVudFsnQGxpc3QnXSk7XG4gIH0gZWxzZSBpZihfaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAvLyByZWxhYmVsIGJsYW5rIG5vZGVcbiAgICBpZihfaXNCbGFua05vZGUoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRbJ0BpZCddID0gaXNzdWVyLmdldElkKGVsZW1lbnRbJ0BpZCddKTtcbiAgICB9XG5cbiAgICAvLyByZWN1cnNpdmVseSBhcHBseSB0byBhbGwga2V5c1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudCkuc29ydCgpO1xuICAgIGZvcih2YXIga2kgPSAwOyBraSA8IGtleXMubGVuZ3RoOyArK2tpKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1traV07XG4gICAgICBpZihrZXkgIT09ICdAaWQnKSB7XG4gICAgICAgIGVsZW1lbnRba2V5XSA9IF9sYWJlbEJsYW5rTm9kZXMoaXNzdWVyLCBlbGVtZW50W2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEV4cGFuZHMgdGhlIGdpdmVuIHZhbHVlIGJ5IHVzaW5nIHRoZSBjb2VyY2lvbiBhbmQga2V5d29yZCBydWxlcyBpbiB0aGVcbiAqIGdpdmVuIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGFjdGl2ZVByb3BlcnR5IHRoZSBhY3RpdmUgcHJvcGVydHkgdGhlIHZhbHVlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZXhwYW5kLlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBfZXhwYW5kVmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgdmFsdWUpIHtcbiAgLy8gbm90aGluZyB0byBleHBhbmRcbiAgaWYodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gc3BlY2lhbC1jYXNlIGV4cGFuZCBAaWQgYW5kIEB0eXBlIChza2lwcyAnQGlkJyBleHBhbnNpb24pXG4gIHZhciBleHBhbmRlZFByb3BlcnR5ID0gX2V4cGFuZElyaShhY3RpdmVDdHgsIGFjdGl2ZVByb3BlcnR5LCB7dm9jYWI6IHRydWV9KTtcbiAgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BpZCcpIHtcbiAgICByZXR1cm4gX2V4cGFuZElyaShhY3RpdmVDdHgsIHZhbHVlLCB7YmFzZTogdHJ1ZX0pO1xuICB9IGVsc2UgaWYoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0B0eXBlJykge1xuICAgIHJldHVybiBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgdmFsdWUsIHt2b2NhYjogdHJ1ZSwgYmFzZTogdHJ1ZX0pO1xuICB9XG5cbiAgLy8gZ2V0IHR5cGUgZGVmaW5pdGlvbiBmcm9tIGNvbnRleHRcbiAgdmFyIHR5cGUgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAdHlwZScpO1xuXG4gIC8vIGRvIEBpZCBleHBhbnNpb24gKGF1dG9tYXRpYyBmb3IgQGdyYXBoKVxuICBpZih0eXBlID09PSAnQGlkJyB8fCAoZXhwYW5kZWRQcm9wZXJ0eSA9PT0gJ0BncmFwaCcgJiYgX2lzU3RyaW5nKHZhbHVlKSkpIHtcbiAgICByZXR1cm4geydAaWQnOiBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgdmFsdWUsIHtiYXNlOiB0cnVlfSl9O1xuICB9XG4gIC8vIGRvIEBpZCBleHBhbnNpb24gdy92b2NhYlxuICBpZih0eXBlID09PSAnQHZvY2FiJykge1xuICAgIHJldHVybiB7J0BpZCc6IF9leHBhbmRJcmkoYWN0aXZlQ3R4LCB2YWx1ZSwge3ZvY2FiOiB0cnVlLCBiYXNlOiB0cnVlfSl9O1xuICB9XG5cbiAgLy8gZG8gbm90IGV4cGFuZCBrZXl3b3JkIHZhbHVlc1xuICBpZihfaXNLZXl3b3JkKGV4cGFuZGVkUHJvcGVydHkpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgdmFyIHJ2YWwgPSB7fTtcblxuICBpZih0eXBlICE9PSBudWxsKSB7XG4gICAgLy8gb3RoZXIgdHlwZVxuICAgIHJ2YWxbJ0B0eXBlJ10gPSB0eXBlO1xuICB9IGVsc2UgaWYoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIC8vIGNoZWNrIGZvciBsYW5ndWFnZSB0YWdnaW5nIGZvciBzdHJpbmdzXG4gICAgdmFyIGxhbmd1YWdlID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAbGFuZ3VhZ2UnKTtcbiAgICBpZihsYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgcnZhbFsnQGxhbmd1YWdlJ10gPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cbiAgLy8gZG8gY29udmVyc2lvbiBvZiB2YWx1ZXMgdGhhdCBhcmVuJ3QgYmFzaWMgSlNPTiB0eXBlcyB0byBzdHJpbmdzXG4gIGlmKFsnYm9vbGVhbicsICdudW1iZXInLCAnc3RyaW5nJ10uaW5kZXhPZih0eXBlb2YgdmFsdWUpID09PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuICBydmFsWydAdmFsdWUnXSA9IHZhbHVlO1xuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgUkRGIHRyaXBsZXMgZm9yIHRoZSBnaXZlbiBncmFwaC5cbiAqXG4gKiBAcGFyYW0gZ3JhcGggdGhlIGdyYXBoIHRvIGNyZWF0ZSBSREYgdHJpcGxlcyBmb3IuXG4gKiBAcGFyYW0gaXNzdWVyIGEgSWRlbnRpZmllcklzc3VlciBmb3IgYXNzaWduaW5nIGJsYW5rIG5vZGUgbmFtZXMuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgUkRGIHNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBSREYgdHJpcGxlcyBmb3IgdGhlIGdpdmVuIGdyYXBoLlxuICovXG5mdW5jdGlvbiBfZ3JhcGhUb1JERihncmFwaCwgaXNzdWVyLCBvcHRpb25zKSB7XG4gIHZhciBydmFsID0gW107XG5cbiAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKGdyYXBoKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaWQgPSBpZHNbaV07XG4gICAgdmFyIG5vZGUgPSBncmFwaFtpZF07XG4gICAgdmFyIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhub2RlKS5zb3J0KCk7XG4gICAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsrcGkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbcGldO1xuICAgICAgdmFyIGl0ZW1zID0gbm9kZVtwcm9wZXJ0eV07XG4gICAgICBpZihwcm9wZXJ0eSA9PT0gJ0B0eXBlJykge1xuICAgICAgICBwcm9wZXJ0eSA9IFJERl9UWVBFO1xuICAgICAgfSBlbHNlIGlmKF9pc0tleXdvcmQocHJvcGVydHkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpdGVtcy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpaV07XG5cbiAgICAgICAgLy8gUkRGIHN1YmplY3RcbiAgICAgICAgdmFyIHN1YmplY3QgPSB7fTtcbiAgICAgICAgc3ViamVjdC50eXBlID0gKGlkLmluZGV4T2YoJ186JykgPT09IDApID8gJ2JsYW5rIG5vZGUnIDogJ0lSSSc7XG4gICAgICAgIHN1YmplY3QudmFsdWUgPSBpZDtcblxuICAgICAgICAvLyBza2lwIHJlbGF0aXZlIElSSSBzdWJqZWN0c1xuICAgICAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSREYgcHJlZGljYXRlXG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB7fTtcbiAgICAgICAgcHJlZGljYXRlLnR5cGUgPSAocHJvcGVydHkuaW5kZXhPZignXzonKSA9PT0gMCkgPyAnYmxhbmsgbm9kZScgOiAnSVJJJztcbiAgICAgICAgcHJlZGljYXRlLnZhbHVlID0gcHJvcGVydHk7XG5cbiAgICAgICAgLy8gc2tpcCByZWxhdGl2ZSBJUkkgcHJlZGljYXRlc1xuICAgICAgICBpZighX2lzQWJzb2x1dGVJcmkocHJvcGVydHkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBza2lwIGJsYW5rIG5vZGUgcHJlZGljYXRlcyB1bmxlc3MgcHJvZHVjaW5nIGdlbmVyYWxpemVkIFJERlxuICAgICAgICBpZihwcmVkaWNhdGUudHlwZSA9PT0gJ2JsYW5rIG5vZGUnICYmICFvcHRpb25zLnByb2R1Y2VHZW5lcmFsaXplZFJkZikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29udmVydCBAbGlzdCB0byB0cmlwbGVzXG4gICAgICAgIGlmKF9pc0xpc3QoaXRlbSkpIHtcbiAgICAgICAgICBfbGlzdFRvUkRGKGl0ZW1bJ0BsaXN0J10sIGlzc3Vlciwgc3ViamVjdCwgcHJlZGljYXRlLCBydmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb252ZXJ0IHZhbHVlIG9yIG5vZGUgb2JqZWN0IHRvIHRyaXBsZVxuICAgICAgICAgIHZhciBvYmplY3QgPSBfb2JqZWN0VG9SREYoaXRlbSk7XG4gICAgICAgICAgLy8gc2tpcCBudWxsIG9iamVjdHMgKHRoZXkgYXJlIHJlbGF0aXZlIElSSXMpXG4gICAgICAgICAgaWYob2JqZWN0KSB7XG4gICAgICAgICAgICBydmFsLnB1c2goe3N1YmplY3Q6IHN1YmplY3QsIHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgQGxpc3QgdmFsdWUgaW50byBsaW5rZWQgbGlzdCBvZiBibGFuayBub2RlIFJERiB0cmlwbGVzXG4gKiAoYW4gUkRGIGNvbGxlY3Rpb24pLlxuICpcbiAqIEBwYXJhbSBsaXN0IHRoZSBAbGlzdCB2YWx1ZS5cbiAqIEBwYXJhbSBpc3N1ZXIgYSBJZGVudGlmaWVySXNzdWVyIGZvciBhc3NpZ25pbmcgYmxhbmsgbm9kZSBuYW1lcy5cbiAqIEBwYXJhbSBzdWJqZWN0IHRoZSBzdWJqZWN0IGZvciB0aGUgaGVhZCBvZiB0aGUgbGlzdC5cbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHByZWRpY2F0ZSBmb3IgdGhlIGhlYWQgb2YgdGhlIGxpc3QuXG4gKiBAcGFyYW0gdHJpcGxlcyB0aGUgYXJyYXkgb2YgdHJpcGxlcyB0byBhcHBlbmQgdG8uXG4gKi9cbmZ1bmN0aW9uIF9saXN0VG9SREYobGlzdCwgaXNzdWVyLCBzdWJqZWN0LCBwcmVkaWNhdGUsIHRyaXBsZXMpIHtcbiAgdmFyIGZpcnN0ID0ge3R5cGU6ICdJUkknLCB2YWx1ZTogUkRGX0ZJUlNUfTtcbiAgdmFyIHJlc3QgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBSREZfUkVTVH07XG4gIHZhciBuaWwgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBSREZfTklMfTtcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcblxuICAgIHZhciBibGFua05vZGUgPSB7dHlwZTogJ2JsYW5rIG5vZGUnLCB2YWx1ZTogaXNzdWVyLmdldElkKCl9O1xuICAgIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogYmxhbmtOb2RlfSk7XG5cbiAgICBzdWJqZWN0ID0gYmxhbmtOb2RlO1xuICAgIHByZWRpY2F0ZSA9IGZpcnN0O1xuICAgIHZhciBvYmplY3QgPSBfb2JqZWN0VG9SREYoaXRlbSk7XG5cbiAgICAvLyBza2lwIG51bGwgb2JqZWN0cyAodGhleSBhcmUgcmVsYXRpdmUgSVJJcylcbiAgICBpZihvYmplY3QpIHtcbiAgICAgIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogb2JqZWN0fSk7XG4gICAgfVxuXG4gICAgcHJlZGljYXRlID0gcmVzdDtcbiAgfVxuXG4gIHRyaXBsZXMucHVzaCh7c3ViamVjdDogc3ViamVjdCwgcHJlZGljYXRlOiBwcmVkaWNhdGUsIG9iamVjdDogbmlsfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBKU09OLUxEIHZhbHVlIG9iamVjdCB0byBhbiBSREYgbGl0ZXJhbCBvciBhIEpTT04tTEQgc3RyaW5nIG9yXG4gKiBub2RlIG9iamVjdCB0byBhbiBSREYgcmVzb3VyY2UuXG4gKlxuICogQHBhcmFtIGl0ZW0gdGhlIEpTT04tTEQgdmFsdWUgb3Igbm9kZSBvYmplY3QuXG4gKlxuICogQHJldHVybiB0aGUgUkRGIGxpdGVyYWwgb3IgUkRGIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBfb2JqZWN0VG9SREYoaXRlbSkge1xuICB2YXIgb2JqZWN0ID0ge307XG5cbiAgLy8gY29udmVydCB2YWx1ZSBvYmplY3QgdG8gUkRGXG4gIGlmKF9pc1ZhbHVlKGl0ZW0pKSB7XG4gICAgb2JqZWN0LnR5cGUgPSAnbGl0ZXJhbCc7XG4gICAgdmFyIHZhbHVlID0gaXRlbVsnQHZhbHVlJ107XG4gICAgdmFyIGRhdGF0eXBlID0gaXRlbVsnQHR5cGUnXSB8fCBudWxsO1xuXG4gICAgLy8gY29udmVydCB0byBYU0QgZGF0YXR5cGVzIGFzIGFwcHJvcHJpYXRlXG4gICAgaWYoX2lzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBYU0RfQk9PTEVBTjtcbiAgICB9IGVsc2UgaWYoX2lzRG91YmxlKHZhbHVlKSB8fCBkYXRhdHlwZSA9PT0gWFNEX0RPVUJMRSkge1xuICAgICAgaWYoIV9pc0RvdWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIGNhbm9uaWNhbCBkb3VibGUgcmVwcmVzZW50YXRpb25cbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvRXhwb25lbnRpYWwoMTUpLnJlcGxhY2UoLyhcXGQpMCplXFwrPy8sICckMUUnKTtcbiAgICAgIG9iamVjdC5kYXRhdHlwZSA9IGRhdGF0eXBlIHx8IFhTRF9ET1VCTEU7XG4gICAgfSBlbHNlIGlmKF9pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIG9iamVjdC52YWx1ZSA9IHZhbHVlLnRvRml4ZWQoMCk7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBYU0RfSU5URUdFUjtcbiAgICB9IGVsc2UgaWYoJ0BsYW5ndWFnZScgaW4gaXRlbSkge1xuICAgICAgb2JqZWN0LnZhbHVlID0gdmFsdWU7XG4gICAgICBvYmplY3QuZGF0YXR5cGUgPSBkYXRhdHlwZSB8fCBSREZfTEFOR1NUUklORztcbiAgICAgIG9iamVjdC5sYW5ndWFnZSA9IGl0ZW1bJ0BsYW5ndWFnZSddO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG9iamVjdC5kYXRhdHlwZSA9IGRhdGF0eXBlIHx8IFhTRF9TVFJJTkc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGNvbnZlcnQgc3RyaW5nL25vZGUgb2JqZWN0IHRvIFJERlxuICAgIHZhciBpZCA9IF9pc09iamVjdChpdGVtKSA/IGl0ZW1bJ0BpZCddIDogaXRlbTtcbiAgICBvYmplY3QudHlwZSA9IChpZC5pbmRleE9mKCdfOicpID09PSAwKSA/ICdibGFuayBub2RlJyA6ICdJUkknO1xuICAgIG9iamVjdC52YWx1ZSA9IGlkO1xuICB9XG5cbiAgLy8gc2tpcCByZWxhdGl2ZSBJUklzXG4gIGlmKG9iamVjdC50eXBlID09PSAnSVJJJyAmJiAhX2lzQWJzb2x1dGVJcmkob2JqZWN0LnZhbHVlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgdHJpcGxlIG9iamVjdCB0byBhIEpTT04tTEQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBvIHRoZSBSREYgdHJpcGxlIG9iamVjdCB0byBjb252ZXJ0LlxuICogQHBhcmFtIHVzZU5hdGl2ZVR5cGVzIHRydWUgdG8gb3V0cHV0IG5hdGl2ZSB0eXBlcywgZmFsc2Ugbm90IHRvLlxuICpcbiAqIEByZXR1cm4gdGhlIEpTT04tTEQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBfUkRGVG9PYmplY3QobywgdXNlTmF0aXZlVHlwZXMpIHtcbiAgLy8gY29udmVydCBJUkkvYmxhbmsgbm9kZSBvYmplY3QgdG8gSlNPTi1MRFxuICBpZihvLnR5cGUgPT09ICdJUkknIHx8IG8udHlwZSA9PT0gJ2JsYW5rIG5vZGUnKSB7XG4gICAgcmV0dXJuIHsnQGlkJzogby52YWx1ZX07XG4gIH1cblxuICAvLyBjb252ZXJ0IGxpdGVyYWwgdG8gSlNPTi1MRFxuICB2YXIgcnZhbCA9IHsnQHZhbHVlJzogby52YWx1ZX07XG5cbiAgLy8gYWRkIGxhbmd1YWdlXG4gIGlmKG8ubGFuZ3VhZ2UpIHtcbiAgICBydmFsWydAbGFuZ3VhZ2UnXSA9IG8ubGFuZ3VhZ2U7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHR5cGUgPSBvLmRhdGF0eXBlO1xuICAgIGlmKCF0eXBlKSB7XG4gICAgICB0eXBlID0gWFNEX1NUUklORztcbiAgICB9XG4gICAgLy8gdXNlIG5hdGl2ZSB0eXBlcyBmb3IgY2VydGFpbiB4c2QgdHlwZXNcbiAgICBpZih1c2VOYXRpdmVUeXBlcykge1xuICAgICAgaWYodHlwZSA9PT0gWFNEX0JPT0xFQU4pIHtcbiAgICAgICAgaWYocnZhbFsnQHZhbHVlJ10gPT09ICd0cnVlJykge1xuICAgICAgICAgIHJ2YWxbJ0B2YWx1ZSddID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmKHJ2YWxbJ0B2YWx1ZSddID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgcnZhbFsnQHZhbHVlJ10gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKF9pc051bWVyaWMocnZhbFsnQHZhbHVlJ10pKSB7XG4gICAgICAgIGlmKHR5cGUgPT09IFhTRF9JTlRFR0VSKSB7XG4gICAgICAgICAgdmFyIGkgPSBwYXJzZUludChydmFsWydAdmFsdWUnXSwgMTApO1xuICAgICAgICAgIGlmKGkudG9GaXhlZCgwKSA9PT0gcnZhbFsnQHZhbHVlJ10pIHtcbiAgICAgICAgICAgIHJ2YWxbJ0B2YWx1ZSddID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZih0eXBlID09PSBYU0RfRE9VQkxFKSB7XG4gICAgICAgICAgcnZhbFsnQHZhbHVlJ10gPSBwYXJzZUZsb2F0KHJ2YWxbJ0B2YWx1ZSddKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gZG8gbm90IGFkZCBuYXRpdmUgdHlwZVxuICAgICAgaWYoW1hTRF9CT09MRUFOLCBYU0RfSU5URUdFUiwgWFNEX0RPVUJMRSwgWFNEX1NUUklOR11cbiAgICAgICAgLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgIHJ2YWxbJ0B0eXBlJ10gPSB0eXBlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlICE9PSBYU0RfU1RSSU5HKSB7XG4gICAgICBydmFsWydAdHlwZSddID0gdHlwZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gUkRGIHRyaXBsZXMgZm9yIGVxdWFsaXR5LlxuICpcbiAqIEBwYXJhbSB0MSB0aGUgZmlyc3QgdHJpcGxlLlxuICogQHBhcmFtIHQyIHRoZSBzZWNvbmQgdHJpcGxlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJpcGxlcyBhcmUgdGhlIHNhbWUsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2NvbXBhcmVSREZUcmlwbGVzKHQxLCB0Mikge1xuICB2YXIgYXR0cnMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCddO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldO1xuICAgIGlmKHQxW2F0dHJdLnR5cGUgIT09IHQyW2F0dHJdLnR5cGUgfHwgdDFbYXR0cl0udmFsdWUgIT09IHQyW2F0dHJdLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmKHQxLm9iamVjdC5sYW5ndWFnZSAhPT0gdDIub2JqZWN0Lmxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmKHQxLm9iamVjdC5kYXRhdHlwZSAhPT0gdDIub2JqZWN0LmRhdGF0eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBVUkROQTIwMTUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBVUkROQTIwMTUgPSAoZnVuY3Rpb24oKSB7XG5cbnZhciBQT1NJVElPTlMgPSB7J3N1YmplY3QnOiAncycsICdvYmplY3QnOiAnbycsICduYW1lJzogJ2cnfTtcblxudmFyIE5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMubmFtZSA9ICdVUkROQTIwMTUnO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLmJsYW5rTm9kZUluZm8gPSB7fTtcbiAgdGhpcy5oYXNoVG9CbGFua05vZGVzID0ge307XG4gIHRoaXMuY2Fub25pY2FsSXNzdWVyID0gbmV3IElkZW50aWZpZXJJc3N1ZXIoJ186YzE0bicpO1xuICB0aGlzLnF1YWRzID0gW107XG4gIHRoaXMuc2NoZWR1bGUgPSB7fTtcbiAgaWYoJ21heENhbGxTdGFja0RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy5zY2hlZHVsZS5NQVhfREVQVEggPSBvcHRpb25zLm1heENhbGxTdGFja0RlcHRoO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2NoZWR1bGUuTUFYX0RFUFRIID0gNTAwO1xuICB9XG4gIGlmKCdtYXhUb3RhbENhbGxTdGFja0RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy5zY2hlZHVsZS5NQVhfVE9UQUxfREVQVEggPSBvcHRpb25zLm1heENhbGxTdGFja0RlcHRoO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc2NoZWR1bGUuTUFYX1RPVEFMX0RFUFRIID0gMHhGRkZGRkZGRjtcbiAgfVxuICB0aGlzLnNjaGVkdWxlLmRlcHRoID0gMDtcbiAgdGhpcy5zY2hlZHVsZS50b3RhbERlcHRoID0gMDtcbiAgaWYoJ3RpbWVTbGljZScgaW4gb3B0aW9ucykge1xuICAgIHRoaXMuc2NoZWR1bGUudGltZVNsaWNlID0gb3B0aW9ucy50aW1lU2xpY2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWlsbGlzZWNvbmRzXG4gICAgdGhpcy5zY2hlZHVsZS50aW1lU2xpY2UgPSAxMDtcbiAgfVxufTtcblxuLy8gZG8gc29tZSB3b3JrIGluIGEgdGltZSBzbGljZSwgYnV0IGluIHNlcmlhbFxuTm9ybWFsaXplLnByb3RvdHlwZS5kb1dvcmsgPSBmdW5jdGlvbihmbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNjaGVkdWxlID0gdGhpcy5zY2hlZHVsZTtcblxuICBpZihzY2hlZHVsZS50b3RhbERlcHRoID49IHNjaGVkdWxlLk1BWF9UT1RBTF9ERVBUSCkge1xuICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXG4gICAgICAnTWF4aW11bSB0b3RhbCBjYWxsIHN0YWNrIGRlcHRoIGV4Y2VlZGVkOyBub3JtYWxpemF0aW9uIGFib3J0aW5nLicpKTtcbiAgfVxuXG4gIChmdW5jdGlvbiB3b3JrKCkge1xuICAgIGlmKHNjaGVkdWxlLmRlcHRoID09PSBzY2hlZHVsZS5NQVhfREVQVEgpIHtcbiAgICAgIC8vIHN0YWNrIHRvbyBkZWVwLCBydW4gb24gbmV4dCB0aWNrXG4gICAgICBzY2hlZHVsZS5kZXB0aCA9IDA7XG4gICAgICBzY2hlZHVsZS5ydW5uaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4ganNvbmxkLm5leHRUaWNrKHdvcmspO1xuICAgIH1cblxuICAgIC8vIGlmIG5vdCB5ZXQgcnVubmluZywgZm9yY2UgcnVuXG4gICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGlmKCFzY2hlZHVsZS5ydW5uaW5nKSB7XG4gICAgICBzY2hlZHVsZS5zdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgc2NoZWR1bGUuZGVhZGxpbmUgPSBzY2hlZHVsZS5zdGFydCArIHNjaGVkdWxlLnRpbWVTbGljZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBzaG91bGQgYWxzbyBpbmNsdWRlIGFuIGVzdGltYXRlIG9mIGV4cGVjdGVkV29ya1RpbWVcbiAgICBpZihub3cgPCBzY2hlZHVsZS5kZWFkbGluZSkge1xuICAgICAgc2NoZWR1bGUucnVubmluZyA9IHRydWU7XG4gICAgICBzY2hlZHVsZS5kZXB0aCsrO1xuICAgICAgc2NoZWR1bGUudG90YWxEZXB0aCsrO1xuICAgICAgcmV0dXJuIGZuKGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHNjaGVkdWxlLmRlcHRoLS07XG4gICAgICAgIHNjaGVkdWxlLnRvdGFsRGVwdGgtLTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gbm90IGVub3VnaCB0aW1lIGxlZnQgaW4gdGhpcyBzbGljZSwgcnVuIGFmdGVyIGxldHRpbmcgYnJvd3NlclxuICAgIC8vIGRvIHNvbWUgb3RoZXIgdGhpbmdzXG4gICAgc2NoZWR1bGUuZGVwdGggPSAwO1xuICAgIHNjaGVkdWxlLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICBqc29ubGQuc2V0SW1tZWRpYXRlKHdvcmspO1xuICB9KSgpO1xufTtcblxuLy8gYXN5bmNocm9ub3VzbHkgbG9vcFxuTm9ybWFsaXplLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oaXRlcmFibGUsIGZuLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpdGVyYXRvcjtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW5ndGg7XG4gIGlmKF9pc0FycmF5KGl0ZXJhYmxlKSkge1xuICAgIGxlbmd0aCA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgICBpdGVyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYoaWR4ID09PSBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaXRlcmF0b3IudmFsdWUgPSBpdGVyYWJsZVtpZHgrK107XG4gICAgICBpdGVyYXRvci5rZXkgPSBpZHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaXRlcmFibGUpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGl0ZXJhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZihpZHggPT09IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpdGVyYXRvci5rZXkgPSBrZXlzW2lkeCsrXTtcbiAgICAgIGl0ZXJhdG9yLnZhbHVlID0gaXRlcmFibGVbaXRlcmF0b3Iua2V5XTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICAoZnVuY3Rpb24gaXRlcmF0ZShlcnIsIHJlc3VsdCkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIGlmKGl0ZXJhdG9yKCkpIHtcbiAgICAgIHJldHVybiBzZWxmLmRvV29yayhmdW5jdGlvbigpIHtcbiAgICAgICAgZm4oaXRlcmF0b3IudmFsdWUsIGl0ZXJhdG9yLmtleSwgaXRlcmF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FsbGJhY2soKTtcbiAgfSkoKTtcbn07XG5cbi8vIGFzeW5jaHJvbm91cyB3YXRlcmZhbGxcbk5vcm1hbGl6ZS5wcm90b3R5cGUud2F0ZXJmYWxsID0gZnVuY3Rpb24oZm5zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZm9yRWFjaChmbnMsIGZ1bmN0aW9uKGZuLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgc2VsZi5kb1dvcmsoZm4sIGNhbGxiYWNrKTtcbiAgfSwgY2FsbGJhY2spO1xufTtcblxuLy8gYXN5bmNocm9ub3VzIHdoaWxlXG5Ob3JtYWxpemUucHJvdG90eXBlLndoaWxzdCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm4sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgKGZ1bmN0aW9uIGxvb3AoZXJyKSB7XG4gICAgaWYoZXJyKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgaWYoIWNvbmRpdGlvbigpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG4gICAgc2VsZi5kb1dvcmsoZm4sIGxvb3ApO1xuICB9KSgpO1xufTtcblxuLy8gNC40KSBOb3JtYWxpemF0aW9uIEFsZ29yaXRobVxuTm9ybWFsaXplLnByb3RvdHlwZS5tYWluID0gZnVuY3Rpb24oZGF0YXNldCwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnNjaGVkdWxlLnN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHZhciByZXN1bHQ7XG5cbiAgLy8gaGFuZGxlIGludmFsaWQgb3V0cHV0IGZvcm1hdFxuICBpZihzZWxmLm9wdGlvbnMuZm9ybWF0KSB7XG4gICAgaWYoc2VsZi5vcHRpb25zLmZvcm1hdCAhPT0gJ2FwcGxpY2F0aW9uL25xdWFkcycpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdVbmtub3duIG91dHB1dCBmb3JtYXQuJyxcbiAgICAgICAgJ2pzb25sZC5Vbmtub3duRm9ybWF0Jywge2Zvcm1hdDogc2VsZi5vcHRpb25zLmZvcm1hdH0pKTtcbiAgICB9XG4gIH1cblxuICAvLyAxKSBDcmVhdGUgdGhlIG5vcm1hbGl6YXRpb24gc3RhdGUuXG5cbiAgLy8gTm90ZTogT3B0aW1pemUgYnkgZ2VuZXJhdGluZyBub24tbm9ybWFsaXplZCBibGFuayBub2RlIG1hcCBjb25jdXJyZW50bHkuXG4gIHZhciBub25Ob3JtYWxpemVkID0ge307XG5cbiAgc2VsZi53YXRlcmZhbGwoW1xuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvLyAyKSBGb3IgZXZlcnkgcXVhZCBpbiBpbnB1dCBkYXRhc2V0OlxuICAgICAgc2VsZi5mb3JFYWNoKGRhdGFzZXQsIGZ1bmN0aW9uKHRyaXBsZXMsIGdyYXBoTmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnKSB7XG4gICAgICAgICAgZ3JhcGhOYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmZvckVhY2godHJpcGxlcywgZnVuY3Rpb24ocXVhZCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAgIGlmKGdyYXBoTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYoZ3JhcGhOYW1lLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgICAgICAgcXVhZC5uYW1lID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IGdyYXBoTmFtZX07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWFkLm5hbWUgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBncmFwaE5hbWV9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLnF1YWRzLnB1c2gocXVhZCk7XG5cbiAgICAgICAgICAvLyAyLjEpIEZvciBlYWNoIGJsYW5rIG5vZGUgdGhhdCBvY2N1cnMgaW4gdGhlIHF1YWQsIGFkZCBhIHJlZmVyZW5jZVxuICAgICAgICAgIC8vIHRvIHRoZSBxdWFkIHVzaW5nIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgaW4gdGhlIGJsYW5rIG5vZGUgdG9cbiAgICAgICAgICAvLyBxdWFkcyBtYXAsIGNyZWF0aW5nIGEgbmV3IGVudHJ5IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICBzZWxmLmZvckVhY2hDb21wb25lbnQocXVhZCwgZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgICAgICBpZihjb21wb25lbnQudHlwZSAhPT0gJ2JsYW5rIG5vZGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9IGNvbXBvbmVudC52YWx1ZTtcbiAgICAgICAgICAgIGlmKGlkIGluIHNlbGYuYmxhbmtOb2RlSW5mbykge1xuICAgICAgICAgICAgICBzZWxmLmJsYW5rTm9kZUluZm9baWRdLnF1YWRzLnB1c2gocXVhZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub25Ob3JtYWxpemVkW2lkXSA9IHRydWU7XG4gICAgICAgICAgICAgIHNlbGYuYmxhbmtOb2RlSW5mb1tpZF0gPSB7cXVhZHM6IFtxdWFkXX07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIC8vIDMpIENyZWF0ZSBhIGxpc3Qgb2Ygbm9uLW5vcm1hbGl6ZWQgYmxhbmsgbm9kZSBpZGVudGlmaWVyc1xuICAgICAgLy8gbm9uLW5vcm1hbGl6ZWQgaWRlbnRpZmllcnMgYW5kIHBvcHVsYXRlIGl0IHVzaW5nIHRoZSBrZXlzIGZyb20gdGhlXG4gICAgICAvLyBibGFuayBub2RlIHRvIHF1YWRzIG1hcC5cbiAgICAgIC8vIE5vdGU6IFdlIHVzZSBhIG1hcCBoZXJlIGFuZCBpdCB3YXMgZ2VuZXJhdGVkIGR1cmluZyBzdGVwIDIuXG5cbiAgICAgIC8vIDQpIEluaXRpYWxpemUgc2ltcGxlLCBhIGJvb2xlYW4gZmxhZywgdG8gdHJ1ZS5cbiAgICAgIHZhciBzaW1wbGUgPSB0cnVlO1xuXG4gICAgICAvLyA1KSBXaGlsZSBzaW1wbGUgaXMgdHJ1ZSwgaXNzdWUgY2Fub25pY2FsIGlkZW50aWZpZXJzIGZvciBibGFuayBub2RlczpcbiAgICAgIHNlbGYud2hpbHN0KGZ1bmN0aW9uKCkgeyByZXR1cm4gc2ltcGxlOyB9LCBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAvLyA1LjEpIFNldCBzaW1wbGUgdG8gZmFsc2UuXG4gICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIDUuMikgQ2xlYXIgaGFzaCB0byBibGFuayBub2RlcyBtYXAuXG4gICAgICAgIHNlbGYuaGFzaFRvQmxhbmtOb2RlcyA9IHt9O1xuXG4gICAgICAgIHNlbGYud2F0ZXJmYWxsKFtcbiAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gNS4zKSBGb3IgZWFjaCBibGFuayBub2RlIGlkZW50aWZpZXIgaWRlbnRpZmllciBpbiBub24tbm9ybWFsaXplZFxuICAgICAgICAgICAgLy8gaWRlbnRpZmllcnM6XG4gICAgICAgICAgICBzZWxmLmZvckVhY2gobm9uTm9ybWFsaXplZCwgZnVuY3Rpb24odmFsdWUsIGlkLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjMuMSkgQ3JlYXRlIGEgaGFzaCwgaGFzaCwgYWNjb3JkaW5nIHRvIHRoZSBIYXNoIEZpcnN0IERlZ3JlZVxuICAgICAgICAgICAgICAvLyBRdWFkcyBhbGdvcml0aG0uXG4gICAgICAgICAgICAgIHNlbGYuaGFzaEZpcnN0RGVncmVlUXVhZHMoaWQsIGZ1bmN0aW9uKGVyciwgaGFzaCkge1xuICAgICAgICAgICAgICAgIGlmKGVycikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDUuMy4yKSBBZGQgaGFzaCBhbmQgaWRlbnRpZmllciB0byBoYXNoIHRvIGJsYW5rIG5vZGVzIG1hcCxcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhIG5ldyBlbnRyeSBpZiBuZWNlc3NhcnkuXG4gICAgICAgICAgICAgICAgaWYoaGFzaCBpbiBzZWxmLmhhc2hUb0JsYW5rTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXS5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2VsZi5oYXNoVG9CbGFua05vZGVzW2hhc2hdID0gW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gNS40KSBGb3IgZWFjaCBoYXNoIHRvIGlkZW50aWZpZXIgbGlzdCBtYXBwaW5nIGluIGhhc2ggdG8gYmxhbmtcbiAgICAgICAgICAgIC8vIG5vZGVzIG1hcCwgbGV4aWNvZ3JhcGhpY2FsbHktc29ydGVkIGJ5IGhhc2g6XG4gICAgICAgICAgICB2YXIgaGFzaGVzID0gT2JqZWN0LmtleXMoc2VsZi5oYXNoVG9CbGFua05vZGVzKS5zb3J0KCk7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaGFzaGVzLCBmdW5jdGlvbihoYXNoLCBpLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuMSkgSWYgdGhlIGxlbmd0aCBvZiBpZGVudGlmaWVyIGxpc3QgaXMgZ3JlYXRlciB0aGFuIDEsXG4gICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG1hcHBpbmcuXG4gICAgICAgICAgICAgIHZhciBpZExpc3QgPSBzZWxmLmhhc2hUb0JsYW5rTm9kZXNbaGFzaF07XG4gICAgICAgICAgICAgIGlmKGlkTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyA1LjQuMikgVXNlIHRoZSBJc3N1ZSBJZGVudGlmaWVyIGFsZ29yaXRobSwgcGFzc2luZyBjYW5vbmljYWxcbiAgICAgICAgICAgICAgLy8gaXNzdWVyIGFuZCB0aGUgc2luZ2xlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpbiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIC8vIGxpc3QsIGlkZW50aWZpZXIsIHRvIGlzc3VlIGEgY2Fub25pY2FsIHJlcGxhY2VtZW50IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgLy8gZm9yIGlkZW50aWZpZXIuXG4gICAgICAgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoYW5naW5nIGBnZXRJZGAgdG8gYGlzc3VlYFxuICAgICAgICAgICAgICB2YXIgaWQgPSBpZExpc3RbMF07XG4gICAgICAgICAgICAgIHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKGlkKTtcblxuICAgICAgICAgICAgICAvLyA1LjQuMykgUmVtb3ZlIGlkZW50aWZpZXIgZnJvbSBub24tbm9ybWFsaXplZCBpZGVudGlmaWVycy5cbiAgICAgICAgICAgICAgZGVsZXRlIG5vbk5vcm1hbGl6ZWRbaWRdO1xuXG4gICAgICAgICAgICAgIC8vIDUuNC40KSBSZW1vdmUgaGFzaCBmcm9tIHRoZSBoYXNoIHRvIGJsYW5rIG5vZGVzIG1hcC5cbiAgICAgICAgICAgICAgZGVsZXRlIHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXTtcblxuICAgICAgICAgICAgICAvLyA1LjQuNSkgU2V0IHNpbXBsZSB0byB0cnVlLlxuICAgICAgICAgICAgICBzaW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgXSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIC8vIDYpIEZvciBlYWNoIGhhc2ggdG8gaWRlbnRpZmllciBsaXN0IG1hcHBpbmcgaW4gaGFzaCB0byBibGFuayBub2RlcyBtYXAsXG4gICAgICAvLyBsZXhpY29ncmFwaGljYWxseS1zb3J0ZWQgYnkgaGFzaDpcbiAgICAgIHZhciBoYXNoZXMgPSBPYmplY3Qua2V5cyhzZWxmLmhhc2hUb0JsYW5rTm9kZXMpLnNvcnQoKTtcbiAgICAgIHNlbGYuZm9yRWFjaChoYXNoZXMsIGZ1bmN0aW9uKGhhc2gsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gNi4xKSBDcmVhdGUgaGFzaCBwYXRoIGxpc3Qgd2hlcmUgZWFjaCBpdGVtIHdpbGwgYmUgYSByZXN1bHQgb2ZcbiAgICAgICAgLy8gcnVubmluZyB0aGUgSGFzaCBOLURlZ3JlZSBRdWFkcyBhbGdvcml0aG0uXG4gICAgICAgIHZhciBoYXNoUGF0aExpc3QgPSBbXTtcblxuICAgICAgICAvLyA2LjIpIEZvciBlYWNoIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpZGVudGlmaWVyIGluIGlkZW50aWZpZXIgbGlzdDpcbiAgICAgICAgdmFyIGlkTGlzdCA9IHNlbGYuaGFzaFRvQmxhbmtOb2Rlc1toYXNoXTtcbiAgICAgICAgc2VsZi53YXRlcmZhbGwoW1xuICAgICAgICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaWRMaXN0LCBmdW5jdGlvbihpZCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA2LjIuMSkgSWYgYSBjYW5vbmljYWwgaWRlbnRpZmllciBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZCBmb3JcbiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciwgY29udGludWUgdG8gdGhlIG5leHQgaWRlbnRpZmllci5cbiAgICAgICAgICAgICAgaWYoc2VsZi5jYW5vbmljYWxJc3N1ZXIuaGFzSWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyA2LjIuMikgQ3JlYXRlIHRlbXBvcmFyeSBpc3N1ZXIsIGFuIGlkZW50aWZpZXIgaXNzdWVyXG4gICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIHdpdGggdGhlIHByZWZpeCBfOmIuXG4gICAgICAgICAgICAgIHZhciBpc3N1ZXIgPSBuZXcgSWRlbnRpZmllcklzc3VlcignXzpiJyk7XG5cbiAgICAgICAgICAgICAgLy8gNi4yLjMpIFVzZSB0aGUgSXNzdWUgSWRlbnRpZmllciBhbGdvcml0aG0sIHBhc3NpbmcgdGVtcG9yYXJ5XG4gICAgICAgICAgICAgIC8vIGlzc3VlciBhbmQgaWRlbnRpZmllciwgdG8gaXNzdWUgYSBuZXcgdGVtcG9yYXJ5IGJsYW5rIG5vZGVcbiAgICAgICAgICAgICAgLy8gaWRlbnRpZmllciBmb3IgaWRlbnRpZmllci5cbiAgICAgICAgICAgICAgaXNzdWVyLmdldElkKGlkKTtcblxuICAgICAgICAgICAgICAvLyA2LjIuNCkgUnVuIHRoZSBIYXNoIE4tRGVncmVlIFF1YWRzIGFsZ29yaXRobSwgcGFzc2luZ1xuICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgaXNzdWVyLCBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGhhc2ggcGF0aCBsaXN0LlxuICAgICAgICAgICAgICBzZWxmLmhhc2hORGVncmVlUXVhZHMoaWQsIGlzc3VlciwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNoUGF0aExpc3QucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIDYuMykgRm9yIGVhY2ggcmVzdWx0IGluIHRoZSBoYXNoIHBhdGggbGlzdCxcbiAgICAgICAgICAgIC8vIGxleGljb2dyYXBoaWNhbGx5LXNvcnRlZCBieSB0aGUgaGFzaCBpbiByZXN1bHQ6XG4gICAgICAgICAgICBoYXNoUGF0aExpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoYS5oYXNoIDwgYi5oYXNoKSA/IC0xIDogKChhLmhhc2ggPiBiLmhhc2gpID8gMSA6IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLmZvckVhY2goaGFzaFBhdGhMaXN0LCBmdW5jdGlvbihyZXN1bHQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgLy8gNi4zLjEpIEZvciBlYWNoIGJsYW5rIG5vZGUgaWRlbnRpZmllciwgZXhpc3RpbmcgaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgLy8gdGhhdCB3YXMgaXNzdWVkIGEgdGVtcG9yYXJ5IGlkZW50aWZpZXIgYnkgaWRlbnRpZmllciBpc3N1ZXJcbiAgICAgICAgICAgICAgLy8gaW4gcmVzdWx0LCBpc3N1ZSBhIGNhbm9uaWNhbCBpZGVudGlmaWVyLCBpbiB0aGUgc2FtZSBvcmRlcixcbiAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIElzc3VlIElkZW50aWZpZXIgYWxnb3JpdGhtLCBwYXNzaW5nIGNhbm9uaWNhbFxuICAgICAgICAgICAgICAvLyBpc3N1ZXIgYW5kIGV4aXN0aW5nIGlkZW50aWZpZXIuXG4gICAgICAgICAgICAgIGZvcih2YXIgZXhpc3RpbmcgaW4gcmVzdWx0Lmlzc3Vlci5leGlzdGluZykge1xuICAgICAgICAgICAgICAgIHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKGV4aXN0aW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgXSwgY2FsbGJhY2spO1xuICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH0sIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvKiBOb3RlOiBBdCB0aGlzIHBvaW50IGFsbCBibGFuayBub2RlcyBpbiB0aGUgc2V0IG9mIFJERiBxdWFkcyBoYXZlIGJlZW5cbiAgICAgIGFzc2lnbmVkIGNhbm9uaWNhbCBpZGVudGlmaWVycywgd2hpY2ggaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgY2Fub25pY2FsXG4gICAgICBpc3N1ZXIuIEhlcmUgZWFjaCBxdWFkIGlzIHVwZGF0ZWQgYnkgYXNzaWduaW5nIGVhY2ggb2YgaXRzIGJsYW5rIG5vZGVzXG4gICAgICBpdHMgbmV3IGlkZW50aWZpZXIuICovXG5cbiAgICAgIC8vIDcpIEZvciBlYWNoIHF1YWQsIHF1YWQsIGluIGlucHV0IGRhdGFzZXQ6XG4gICAgICB2YXIgbm9ybWFsaXplZCA9IFtdO1xuICAgICAgc2VsZi53YXRlcmZhbGwoW1xuICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIHNlbGYuZm9yRWFjaChzZWxmLnF1YWRzLCBmdW5jdGlvbihxdWFkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyA3LjEpIENyZWF0ZSBhIGNvcHksIHF1YWQgY29weSwgb2YgcXVhZCBhbmQgcmVwbGFjZSBhbnkgZXhpc3RpbmdcbiAgICAgICAgICAgIC8vIGJsYW5rIG5vZGUgaWRlbnRpZmllcnMgdXNpbmcgdGhlIGNhbm9uaWNhbCBpZGVudGlmaWVyc1xuICAgICAgICAgICAgLy8gcHJldmlvdXNseSBpc3N1ZWQgYnkgY2Fub25pY2FsIGlzc3Vlci5cbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9wdGltaXplIGF3YXkgdGhlIGNvcHkgaGVyZS5cbiAgICAgICAgICAgIHNlbGYuZm9yRWFjaENvbXBvbmVudChxdWFkLCBmdW5jdGlvbihjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgaWYoY29tcG9uZW50LnR5cGUgPT09ICdibGFuayBub2RlJyAmJlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC52YWx1ZS5pbmRleE9mKHNlbGYuY2Fub25pY2FsSXNzdWVyLnByZWZpeCkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSBzZWxmLmNhbm9uaWNhbElzc3Vlci5nZXRJZChjb21wb25lbnQudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIDcuMikgQWRkIHF1YWQgY29weSB0byB0aGUgbm9ybWFsaXplZCBkYXRhc2V0LlxuICAgICAgICAgICAgbm9ybWFsaXplZC5wdXNoKF90b05RdWFkKHF1YWQpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICB9LFxuICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgIC8vIHNvcnQgbm9ybWFsaXplZCBvdXRwdXRcbiAgICAgICAgICBub3JtYWxpemVkLnNvcnQoKTtcblxuICAgICAgICAgIC8vIDgpIFJldHVybiB0aGUgbm9ybWFsaXplZCBkYXRhc2V0LlxuICAgICAgICAgIGlmKHNlbGYub3B0aW9ucy5mb3JtYXQgPT09ICdhcHBsaWNhdGlvbi9ucXVhZHMnKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBub3JtYWxpemVkLmpvaW4oJycpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0ID0gX3BhcnNlTlF1YWRzKG5vcm1hbGl6ZWQuam9pbignJykpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIF0sIGNhbGxiYWNrKTtcbiAgICB9XG4gIF0sIGZ1bmN0aW9uKGVycikge1xuICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgfSk7XG59O1xuXG4vLyA0LjYpIEhhc2ggRmlyc3QgRGVncmVlIFF1YWRzXG5Ob3JtYWxpemUucHJvdG90eXBlLmhhc2hGaXJzdERlZ3JlZVF1YWRzID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyByZXR1cm4gY2FjaGVkIGhhc2hcbiAgdmFyIGluZm8gPSBzZWxmLmJsYW5rTm9kZUluZm9baWRdO1xuICBpZignaGFzaCcgaW4gaW5mbykge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBpbmZvLmhhc2gpO1xuICB9XG5cbiAgLy8gMSkgSW5pdGlhbGl6ZSBucXVhZHMgdG8gYW4gZW1wdHkgbGlzdC4gSXQgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHF1YWRzIGluXG4gIC8vIE4tUXVhZHMgZm9ybWF0LlxuICB2YXIgbnF1YWRzID0gW107XG5cbiAgLy8gMikgR2V0IHRoZSBsaXN0IG9mIHF1YWRzIHF1YWRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGJsYW5rIG5vZGVcbiAgLy8gaWRlbnRpZmllciBpbiB0aGUgYmxhbmsgbm9kZSB0byBxdWFkcyBtYXAuXG4gIHZhciBxdWFkcyA9IGluZm8ucXVhZHM7XG5cbiAgLy8gMykgRm9yIGVhY2ggcXVhZCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIFNlcmlhbGl6ZSB0aGUgcXVhZCBpbiBOLVF1YWRzIGZvcm1hdCB3aXRoIHRoZSBmb2xsb3dpbmcgc3BlY2lhbFxuICAgIC8vIHJ1bGU6XG5cbiAgICAvLyAzLjEuMSkgSWYgYW55IGNvbXBvbmVudCBpbiBxdWFkIGlzIGFuIGJsYW5rIG5vZGUsIHRoZW4gc2VyaWFsaXplIGl0XG4gICAgLy8gdXNpbmcgYSBzcGVjaWFsIGlkZW50aWZpZXIgYXMgZm9sbG93czpcbiAgICB2YXIgY29weSA9IHtwcmVkaWNhdGU6IHF1YWQucHJlZGljYXRlfTtcbiAgICBzZWxmLmZvckVhY2hDb21wb25lbnQocXVhZCwgZnVuY3Rpb24oY29tcG9uZW50LCBrZXkpIHtcbiAgICAgIC8vIDMuMS4yKSBJZiB0aGUgYmxhbmsgbm9kZSdzIGV4aXN0aW5nIGJsYW5rIG5vZGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZVxuICAgICAgLy8gcmVmZXJlbmNlIGJsYW5rIG5vZGUgaWRlbnRpZmllciB0aGVuIHVzZSB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIF86YSxcbiAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgXzp6LlxuICAgICAgY29weVtrZXldID0gc2VsZi5tb2RpZnlGaXJzdERlZ3JlZUNvbXBvbmVudChpZCwgY29tcG9uZW50LCBrZXkpO1xuICAgIH0pO1xuICAgIG5xdWFkcy5wdXNoKF90b05RdWFkKGNvcHkpKTtcbiAgICBjYWxsYmFjaygpO1xuICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICAvLyA0KSBTb3J0IG5xdWFkcyBpbiBsZXhpY29ncmFwaGljYWwgb3JkZXIuXG4gICAgbnF1YWRzLnNvcnQoKTtcblxuICAgIC8vIDUpIFJldHVybiB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIHRoZSBzb3J0ZWQsIGpvaW5lZCBucXVhZHNcbiAgICAvLyB0aHJvdWdoIHRoZSBoYXNoIGFsZ29yaXRobS5cbiAgICBpbmZvLmhhc2ggPSBOb3JtYWxpemVIYXNoLmhhc2hOUXVhZHMoc2VsZi5uYW1lLCBucXVhZHMpO1xuICAgIGNhbGxiYWNrKG51bGwsIGluZm8uaGFzaCk7XG4gIH0pO1xufTtcblxuLy8gaGVscGVyIGZvciBtb2RpZnlpbmcgY29tcG9uZW50IGR1cmluZyBIYXNoIEZpcnN0IERlZ3JlZSBRdWFkc1xuTm9ybWFsaXplLnByb3RvdHlwZS5tb2RpZnlGaXJzdERlZ3JlZUNvbXBvbmVudCA9IGZ1bmN0aW9uKGlkLCBjb21wb25lbnQpIHtcbiAgaWYoY29tcG9uZW50LnR5cGUgIT09ICdibGFuayBub2RlJykge1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbiAgY29tcG9uZW50ID0gX2Nsb25lKGNvbXBvbmVudCk7XG4gIGNvbXBvbmVudC52YWx1ZSA9IChjb21wb25lbnQudmFsdWUgPT09IGlkID8gJ186YScgOiAnXzp6Jyk7XG4gIHJldHVybiBjb21wb25lbnQ7XG59O1xuXG4vLyA0LjcpIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG5Ob3JtYWxpemUucHJvdG90eXBlLmhhc2hSZWxhdGVkQmxhbmtOb2RlID0gZnVuY3Rpb24oXG4gIHJlbGF0ZWQsIHF1YWQsIGlzc3VlciwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyAxKSBTZXQgdGhlIGlkZW50aWZpZXIgdG8gdXNlIGZvciByZWxhdGVkLCBwcmVmZXJyaW5nIGZpcnN0IHRoZSBjYW5vbmljYWxcbiAgLy8gaWRlbnRpZmllciBmb3IgcmVsYXRlZCBpZiBpc3N1ZWQsIHNlY29uZCB0aGUgaWRlbnRpZmllciBpc3N1ZWQgYnkgaXNzdWVyXG4gIC8vIGlmIGlzc3VlZCwgYW5kIGxhc3QsIGlmIG5lY2Vzc2FyeSwgdGhlIHJlc3VsdCBvZiB0aGUgSGFzaCBGaXJzdCBEZWdyZWVcbiAgLy8gUXVhZHMgYWxnb3JpdGhtLCBwYXNzaW5nIHJlbGF0ZWQuXG4gIHZhciBpZDtcbiAgc2VsZi53YXRlcmZhbGwoW1xuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBpZihzZWxmLmNhbm9uaWNhbElzc3Vlci5oYXNJZChyZWxhdGVkKSkge1xuICAgICAgICBpZCA9IHNlbGYuY2Fub25pY2FsSXNzdWVyLmdldElkKHJlbGF0ZWQpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICAgIGlmKGlzc3Vlci5oYXNJZChyZWxhdGVkKSkge1xuICAgICAgICBpZCA9IGlzc3Vlci5nZXRJZChyZWxhdGVkKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgICBzZWxmLmhhc2hGaXJzdERlZ3JlZVF1YWRzKHJlbGF0ZWQsIGZ1bmN0aW9uKGVyciwgaGFzaCkge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBpZCA9IGhhc2g7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIF0sIGZ1bmN0aW9uKGVycikge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgLy8gMikgSW5pdGlhbGl6ZSBhIHN0cmluZyBpbnB1dCB0byB0aGUgdmFsdWUgb2YgcG9zaXRpb24uXG4gICAgLy8gTm90ZTogV2UgdXNlIGEgaGFzaCBvYmplY3QgaW5zdGVhZC5cbiAgICB2YXIgbWQgPSBuZXcgTm9ybWFsaXplSGFzaChzZWxmLm5hbWUpO1xuICAgIG1kLnVwZGF0ZShwb3NpdGlvbik7XG5cbiAgICAvLyAzKSBJZiBwb3NpdGlvbiBpcyBub3QgZywgYXBwZW5kIDwsIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZGljYXRlIGluIHF1YWQsXG4gICAgLy8gYW5kID4gdG8gaW5wdXQuXG4gICAgaWYocG9zaXRpb24gIT09ICdnJykge1xuICAgICAgbWQudXBkYXRlKHNlbGYuZ2V0UmVsYXRlZFByZWRpY2F0ZShxdWFkKSk7XG4gICAgfVxuXG4gICAgLy8gNCkgQXBwZW5kIGlkZW50aWZpZXIgdG8gaW5wdXQuXG4gICAgbWQudXBkYXRlKGlkKTtcblxuICAgIC8vIDUpIFJldHVybiB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIGlucHV0IHRocm91Z2ggdGhlIGhhc2hcbiAgICAvLyBhbGdvcml0aG0uXG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG1kLmRpZ2VzdCgpKTtcbiAgfSk7XG59O1xuXG4vLyBoZWxwZXIgZm9yIGdldHRpbmcgYSByZWxhdGVkIHByZWRpY2F0ZVxuTm9ybWFsaXplLnByb3RvdHlwZS5nZXRSZWxhdGVkUHJlZGljYXRlID0gZnVuY3Rpb24ocXVhZCkge1xuICByZXR1cm4gJzwnICsgcXVhZC5wcmVkaWNhdGUudmFsdWUgKyAnPic7XG59O1xuXG4vLyA0LjgpIEhhc2ggTi1EZWdyZWUgUXVhZHNcbk5vcm1hbGl6ZS5wcm90b3R5cGUuaGFzaE5EZWdyZWVRdWFkcyA9IGZ1bmN0aW9uKGlkLCBpc3N1ZXIsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyAxKSBDcmVhdGUgYSBoYXNoIHRvIHJlbGF0ZWQgYmxhbmsgbm9kZXMgbWFwIGZvciBzdG9yaW5nIGhhc2hlcyB0aGF0XG4gIC8vIGlkZW50aWZ5IHJlbGF0ZWQgYmxhbmsgbm9kZXMuXG4gIC8vIE5vdGU6IDIpIGFuZCAzKSBoYW5kbGVkIHdpdGhpbiBgY3JlYXRlSGFzaFRvUmVsYXRlZGBcbiAgdmFyIGhhc2hUb1JlbGF0ZWQ7XG4gIHZhciBtZCA9IG5ldyBOb3JtYWxpemVIYXNoKHNlbGYubmFtZSk7XG4gIHNlbGYud2F0ZXJmYWxsKFtcbiAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgc2VsZi5jcmVhdGVIYXNoVG9SZWxhdGVkKGlkLCBpc3N1ZXIsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGlmKGVycikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGhhc2hUb1JlbGF0ZWQgPSByZXN1bHQ7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAvLyA0KSBDcmVhdGUgYW4gZW1wdHkgc3RyaW5nLCBkYXRhIHRvIGhhc2guXG4gICAgICAvLyBOb3RlOiBXZSBjcmVhdGVkIGEgaGFzaCBvYmplY3QgYG1kYCBhYm92ZSBpbnN0ZWFkLlxuXG4gICAgICAvLyA1KSBGb3IgZWFjaCByZWxhdGVkIGhhc2ggdG8gYmxhbmsgbm9kZSBsaXN0IG1hcHBpbmcgaW4gaGFzaCB0byByZWxhdGVkXG4gICAgICAvLyBibGFuayBub2RlcyBtYXAsIHNvcnRlZCBsZXhpY29ncmFwaGljYWxseSBieSByZWxhdGVkIGhhc2g6XG4gICAgICB2YXIgaGFzaGVzID0gT2JqZWN0LmtleXMoaGFzaFRvUmVsYXRlZCkuc29ydCgpO1xuICAgICAgc2VsZi5mb3JFYWNoKGhhc2hlcywgZnVuY3Rpb24oaGFzaCwgaWR4LCBjYWxsYmFjaykge1xuICAgICAgICAvLyA1LjEpIEFwcGVuZCB0aGUgcmVsYXRlZCBoYXNoIHRvIHRoZSBkYXRhIHRvIGhhc2guXG4gICAgICAgIG1kLnVwZGF0ZShoYXNoKTtcblxuICAgICAgICAvLyA1LjIpIENyZWF0ZSBhIHN0cmluZyBjaG9zZW4gcGF0aC5cbiAgICAgICAgdmFyIGNob3NlblBhdGggPSAnJztcblxuICAgICAgICAvLyA1LjMpIENyZWF0ZSBhbiB1bnNldCBjaG9zZW4gaXNzdWVyIHZhcmlhYmxlLlxuICAgICAgICB2YXIgY2hvc2VuSXNzdWVyO1xuXG4gICAgICAgIC8vIDUuNCkgRm9yIGVhY2ggcGVybXV0YXRpb24gb2YgYmxhbmsgbm9kZSBsaXN0OlxuICAgICAgICB2YXIgcGVybXV0YXRvciA9IG5ldyBQZXJtdXRhdG9yKGhhc2hUb1JlbGF0ZWRbaGFzaF0pO1xuICAgICAgICBzZWxmLndoaWxzdChcbiAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHBlcm11dGF0b3IuaGFzTmV4dCgpOyB9LFxuICAgICAgICAgIGZ1bmN0aW9uKG5leHRQZXJtdXRhdGlvbikge1xuICAgICAgICAgIHZhciBwZXJtdXRhdGlvbiA9IHBlcm11dGF0b3IubmV4dCgpO1xuXG4gICAgICAgICAgLy8gNS40LjEpIENyZWF0ZSBhIGNvcHkgb2YgaXNzdWVyLCBpc3N1ZXIgY29weS5cbiAgICAgICAgICB2YXIgaXNzdWVyQ29weSA9IGlzc3Vlci5jbG9uZSgpO1xuXG4gICAgICAgICAgLy8gNS40LjIpIENyZWF0ZSBhIHN0cmluZyBwYXRoLlxuICAgICAgICAgIHZhciBwYXRoID0gJyc7XG5cbiAgICAgICAgICAvLyA1LjQuMykgQ3JlYXRlIGEgcmVjdXJzaW9uIGxpc3QsIHRvIHN0b3JlIGJsYW5rIG5vZGUgaWRlbnRpZmllcnNcbiAgICAgICAgICAvLyB0aGF0IG11c3QgYmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkIGJ5IHRoaXMgYWxnb3JpdGhtLlxuICAgICAgICAgIHZhciByZWN1cnNpb25MaXN0ID0gW107XG5cbiAgICAgICAgICBzZWxmLndhdGVyZmFsbChbXG4gICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuNCkgRm9yIGVhY2ggcmVsYXRlZCBpbiBwZXJtdXRhdGlvbjpcbiAgICAgICAgICAgICAgc2VsZi5mb3JFYWNoKHBlcm11dGF0aW9uLCBmdW5jdGlvbihyZWxhdGVkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gNS40LjQuMSkgSWYgYSBjYW5vbmljYWwgaWRlbnRpZmllciBoYXMgYmVlbiBpc3N1ZWQgZm9yXG4gICAgICAgICAgICAgICAgLy8gcmVsYXRlZCwgYXBwZW5kIGl0IHRvIHBhdGguXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5jYW5vbmljYWxJc3N1ZXIuaGFzSWQocmVsYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgIHBhdGggKz0gc2VsZi5jYW5vbmljYWxJc3N1ZXIuZ2V0SWQocmVsYXRlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIDUuNC40LjIpIE90aGVyd2lzZTpcbiAgICAgICAgICAgICAgICAgIC8vIDUuNC40LjIuMSkgSWYgaXNzdWVyIGNvcHkgaGFzIG5vdCBpc3N1ZWQgYW4gaWRlbnRpZmllciBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGF0ZWQsIGFwcGVuZCByZWxhdGVkIHRvIHJlY3Vyc2lvbiBsaXN0LlxuICAgICAgICAgICAgICAgICAgaWYoIWlzc3VlckNvcHkuaGFzSWQocmVsYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGlzdC5wdXNoKHJlbGF0ZWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gNS40LjQuMi4yKSBVc2UgdGhlIElzc3VlIElkZW50aWZpZXIgYWxnb3JpdGhtLCBwYXNzaW5nXG4gICAgICAgICAgICAgICAgICAvLyBpc3N1ZXIgY29weSBhbmQgcmVsYXRlZCBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gcGF0aC5cbiAgICAgICAgICAgICAgICAgIHBhdGggKz0gaXNzdWVyQ29weS5nZXRJZChyZWxhdGVkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyA1LjQuNC4zKSBJZiBjaG9zZW4gcGF0aCBpcyBub3QgZW1wdHkgYW5kIHRoZSBsZW5ndGggb2YgcGF0aFxuICAgICAgICAgICAgICAgIC8vIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIGNob3NlbiBwYXRoIGFuZFxuICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIGNob3NlbiBwYXRoLCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gc2tpcCB0byB0aGUgbmV4dCBwZXJtdXRhdGlvbi5cbiAgICAgICAgICAgICAgICBpZihjaG9zZW5QYXRoLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgcGF0aC5sZW5ndGggPj0gY2hvc2VuUGF0aC5sZW5ndGggJiYgcGF0aCA+IGNob3NlblBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBtYXkgY2F1c2UgaW5hY2N1cmF0ZSB0b3RhbCBkZXB0aCBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRQZXJtdXRhdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgLy8gNS40LjUpIEZvciBlYWNoIHJlbGF0ZWQgaW4gcmVjdXJzaW9uIGxpc3Q6XG4gICAgICAgICAgICAgIHNlbGYuZm9yRWFjaChyZWN1cnNpb25MaXN0LCBmdW5jdGlvbihyZWxhdGVkLCBpZHgsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gNS40LjUuMSkgU2V0IHJlc3VsdCB0byB0aGUgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGV4ZWN1dGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBIYXNoIE4tRGVncmVlIFF1YWRzIGFsZ29yaXRobSwgcGFzc2luZyByZWxhdGVkIGZvclxuICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgYW5kIGlzc3VlciBjb3B5IGZvciBwYXRoIGlkZW50aWZpZXIgaXNzdWVyLlxuICAgICAgICAgICAgICAgIHNlbGYuaGFzaE5EZWdyZWVRdWFkcyhcbiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQsIGlzc3VlckNvcHksIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIDUuNC41LjIpIFVzZSB0aGUgSXNzdWUgSWRlbnRpZmllciBhbGdvcml0aG0sIHBhc3NpbmcgaXNzdWVyXG4gICAgICAgICAgICAgICAgICAvLyBjb3B5IGFuZCByZWxhdGVkIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byBwYXRoLlxuICAgICAgICAgICAgICAgICAgcGF0aCArPSBpc3N1ZXJDb3B5LmdldElkKHJlbGF0ZWQpO1xuXG4gICAgICAgICAgICAgICAgICAvLyA1LjQuNS4zKSBBcHBlbmQgPCwgdGhlIGhhc2ggaW4gcmVzdWx0LCBhbmQgPiB0byBwYXRoLlxuICAgICAgICAgICAgICAgICAgcGF0aCArPSAnPCcgKyByZXN1bHQuaGFzaCArICc+JztcblxuICAgICAgICAgICAgICAgICAgLy8gNS40LjUuNCkgU2V0IGlzc3VlciBjb3B5IHRvIHRoZSBpZGVudGlmaWVyIGlzc3VlciBpblxuICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0LlxuICAgICAgICAgICAgICAgICAgaXNzdWVyQ29weSA9IHJlc3VsdC5pc3N1ZXI7XG5cbiAgICAgICAgICAgICAgICAgIC8vIDUuNC41LjUpIElmIGNob3NlbiBwYXRoIGlzIG5vdCBlbXB0eSBhbmQgdGhlIGxlbmd0aCBvZiBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBjaG9zZW4gcGF0aCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIGNob3NlbiBwYXRoLCB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyBza2lwIHRvIHRoZSBuZXh0IHBlcm11dGF0aW9uLlxuICAgICAgICAgICAgICAgICAgaWYoY2hvc2VuUGF0aC5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5sZW5ndGggPj0gY2hvc2VuUGF0aC5sZW5ndGggJiYgcGF0aCA+IGNob3NlblBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1heSBjYXVzZSBpbmFjY3VyYXRlIHRvdGFsIGRlcHRoIGNhbGN1bGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0UGVybXV0YXRpb24oKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAvLyA1LjQuNikgSWYgY2hvc2VuIHBhdGggaXMgZW1wdHkgb3IgcGF0aCBpcyBsZXhpY29ncmFwaGljYWxseVxuICAgICAgICAgICAgICAvLyBsZXNzIHRoYW4gY2hvc2VuIHBhdGgsIHNldCBjaG9zZW4gcGF0aCB0byBwYXRoIGFuZCBjaG9zZW5cbiAgICAgICAgICAgICAgLy8gaXNzdWVyIHRvIGlzc3VlciBjb3B5LlxuICAgICAgICAgICAgICBpZihjaG9zZW5QYXRoLmxlbmd0aCA9PT0gMCB8fCBwYXRoIDwgY2hvc2VuUGF0aCkge1xuICAgICAgICAgICAgICAgIGNob3NlblBhdGggPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNob3Nlbklzc3VlciA9IGlzc3VlckNvcHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLCBuZXh0UGVybXV0YXRpb24pO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDUuNSkgQXBwZW5kIGNob3NlbiBwYXRoIHRvIGRhdGEgdG8gaGFzaC5cbiAgICAgICAgICBtZC51cGRhdGUoY2hvc2VuUGF0aCk7XG5cbiAgICAgICAgICAvLyA1LjYpIFJlcGxhY2UgaXNzdWVyLCBieSByZWZlcmVuY2UsIHdpdGggY2hvc2VuIGlzc3Vlci5cbiAgICAgICAgICBpc3N1ZXIgPSBjaG9zZW5Jc3N1ZXI7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuICBdLCBmdW5jdGlvbihlcnIpIHtcbiAgICAvLyA2KSBSZXR1cm4gaXNzdWVyIGFuZCB0aGUgaGFzaCB0aGF0IHJlc3VsdHMgZnJvbSBwYXNzaW5nIGRhdGEgdG8gaGFzaFxuICAgIC8vIHRocm91Z2ggdGhlIGhhc2ggYWxnb3JpdGhtLlxuICAgIGNhbGxiYWNrKGVyciwge2hhc2g6IG1kLmRpZ2VzdCgpLCBpc3N1ZXI6IGlzc3Vlcn0pO1xuICB9KTtcbn07XG5cbi8vIGhlbHBlciBmb3IgY3JlYXRpbmcgaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcFxuTm9ybWFsaXplLnByb3RvdHlwZS5jcmVhdGVIYXNoVG9SZWxhdGVkID0gZnVuY3Rpb24oaWQsIGlzc3VlciwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIDEpIENyZWF0ZSBhIGhhc2ggdG8gcmVsYXRlZCBibGFuayBub2RlcyBtYXAgZm9yIHN0b3JpbmcgaGFzaGVzIHRoYXRcbiAgLy8gaWRlbnRpZnkgcmVsYXRlZCBibGFuayBub2Rlcy5cbiAgdmFyIGhhc2hUb1JlbGF0ZWQgPSB7fTtcblxuICAvLyAyKSBHZXQgYSByZWZlcmVuY2UsIHF1YWRzLCB0byB0aGUgbGlzdCBvZiBxdWFkcyBpbiB0aGUgYmxhbmsgbm9kZSB0b1xuICAvLyBxdWFkcyBtYXAgZm9yIHRoZSBrZXkgaWRlbnRpZmllci5cbiAgdmFyIHF1YWRzID0gc2VsZi5ibGFua05vZGVJbmZvW2lkXS5xdWFkcztcblxuICAvLyAzKSBGb3IgZWFjaCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIEZvciBlYWNoIGNvbXBvbmVudCBpbiBxdWFkLCBpZiBjb21wb25lbnQgaXMgdGhlIHN1YmplY3QsIG9iamVjdCxcbiAgICAvLyBhbmQgZ3JhcGggbmFtZSBhbmQgaXQgaXMgYSBibGFuayBub2RlIHRoYXQgaXMgbm90IGlkZW50aWZpZWQgYnlcbiAgICAvLyBpZGVudGlmaWVyOlxuICAgIHNlbGYuZm9yRWFjaChxdWFkLCBmdW5jdGlvbihjb21wb25lbnQsIGtleSwgY2FsbGJhY2spIHtcbiAgICAgIGlmKGtleSA9PT0gJ3ByZWRpY2F0ZScgfHxcbiAgICAgICAgIShjb21wb25lbnQudHlwZSA9PT0gJ2JsYW5rIG5vZGUnICYmIGNvbXBvbmVudC52YWx1ZSAhPT0gaWQpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgICAgLy8gMy4xLjEpIFNldCBoYXNoIHRvIHRoZSByZXN1bHQgb2YgdGhlIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG4gICAgICAvLyBhbGdvcml0aG0sIHBhc3NpbmcgdGhlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBmb3IgY29tcG9uZW50IGFzXG4gICAgICAvLyByZWxhdGVkLCBxdWFkLCBwYXRoIGlkZW50aWZpZXIgaXNzdWVyIGFzIGlzc3VlciwgYW5kIHBvc2l0aW9uIGFzXG4gICAgICAvLyBlaXRoZXIgcywgbywgb3IgZyBiYXNlZCBvbiB3aGV0aGVyIGNvbXBvbmVudCBpcyBhIHN1YmplY3QsIG9iamVjdCxcbiAgICAgIC8vIGdyYXBoIG5hbWUsIHJlc3BlY3RpdmVseS5cbiAgICAgIHZhciByZWxhdGVkID0gY29tcG9uZW50LnZhbHVlO1xuICAgICAgdmFyIHBvc2l0aW9uID0gUE9TSVRJT05TW2tleV07XG4gICAgICBzZWxmLmhhc2hSZWxhdGVkQmxhbmtOb2RlKFxuICAgICAgICByZWxhdGVkLCBxdWFkLCBpc3N1ZXIsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGhhc2gpIHtcbiAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIpIEFkZCBhIG1hcHBpbmcgb2YgaGFzaCB0byB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvclxuICAgICAgICAvLyBjb21wb25lbnQgdG8gaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcCwgYWRkaW5nIGFuIGVudHJ5IGFzXG4gICAgICAgIC8vIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYoaGFzaCBpbiBoYXNoVG9SZWxhdGVkKSB7XG4gICAgICAgICAgaGFzaFRvUmVsYXRlZFtoYXNoXS5wdXNoKHJlbGF0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc2hUb1JlbGF0ZWRbaGFzaF0gPSBbcmVsYXRlZF07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0sIGNhbGxiYWNrKTtcbiAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgY2FsbGJhY2soZXJyLCBoYXNoVG9SZWxhdGVkKTtcbiAgfSk7XG59O1xuXG4vLyBoZWxwZXIgdGhhdCBpdGVyYXRlcyBvdmVyIHF1YWQgY29tcG9uZW50cyAoc2tpcHMgcHJlZGljYXRlKVxuTm9ybWFsaXplLnByb3RvdHlwZS5mb3JFYWNoQ29tcG9uZW50ID0gZnVuY3Rpb24ocXVhZCwgb3ApIHtcbiAgZm9yKHZhciBrZXkgaW4gcXVhZCkge1xuICAgIC8vIHNraXAgYHByZWRpY2F0ZWBcbiAgICBpZihrZXkgPT09ICdwcmVkaWNhdGUnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb3AocXVhZFtrZXldLCBrZXksIHF1YWQpO1xuICB9XG59O1xuXG5yZXR1cm4gTm9ybWFsaXplO1xuXG59KSgpOyAvLyBlbmQgb2YgZGVmaW5lIFVSRE5BMjAxNVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBVUkdOQTIwMTIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBVUkdOQTIwMTIgPSAoZnVuY3Rpb24oKSB7XG5cbnZhciBOb3JtYWxpemUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIFVSRE5BMjAxNS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLm5hbWUgPSAnVVJHTkEyMDEyJztcbn07XG5Ob3JtYWxpemUucHJvdG90eXBlID0gbmV3IFVSRE5BMjAxNSgpO1xuXG4vLyBoZWxwZXIgZm9yIG1vZGlmeWluZyBjb21wb25lbnQgZHVyaW5nIEhhc2ggRmlyc3QgRGVncmVlIFF1YWRzXG5Ob3JtYWxpemUucHJvdG90eXBlLm1vZGlmeUZpcnN0RGVncmVlQ29tcG9uZW50ID0gZnVuY3Rpb24oaWQsIGNvbXBvbmVudCwga2V5KSB7XG4gIGlmKGNvbXBvbmVudC50eXBlICE9PSAnYmxhbmsgbm9kZScpIHtcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG4gIGNvbXBvbmVudCA9IF9jbG9uZShjb21wb25lbnQpO1xuICBpZihrZXkgPT09ICduYW1lJykge1xuICAgIGNvbXBvbmVudC52YWx1ZSA9ICdfOmcnO1xuICB9IGVsc2Uge1xuICAgIGNvbXBvbmVudC52YWx1ZSA9IChjb21wb25lbnQudmFsdWUgPT09IGlkID8gJ186YScgOiAnXzp6Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn07XG5cbi8vIGhlbHBlciBmb3IgZ2V0dGluZyBhIHJlbGF0ZWQgcHJlZGljYXRlXG5Ob3JtYWxpemUucHJvdG90eXBlLmdldFJlbGF0ZWRQcmVkaWNhdGUgPSBmdW5jdGlvbihxdWFkKSB7XG4gIHJldHVybiBxdWFkLnByZWRpY2F0ZS52YWx1ZTtcbn07XG5cbi8vIGhlbHBlciBmb3IgY3JlYXRpbmcgaGFzaCB0byByZWxhdGVkIGJsYW5rIG5vZGVzIG1hcFxuTm9ybWFsaXplLnByb3RvdHlwZS5jcmVhdGVIYXNoVG9SZWxhdGVkID0gZnVuY3Rpb24oaWQsIGlzc3VlciwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIC8vIDEpIENyZWF0ZSBhIGhhc2ggdG8gcmVsYXRlZCBibGFuayBub2RlcyBtYXAgZm9yIHN0b3JpbmcgaGFzaGVzIHRoYXRcbiAgLy8gaWRlbnRpZnkgcmVsYXRlZCBibGFuayBub2Rlcy5cbiAgdmFyIGhhc2hUb1JlbGF0ZWQgPSB7fTtcblxuICAvLyAyKSBHZXQgYSByZWZlcmVuY2UsIHF1YWRzLCB0byB0aGUgbGlzdCBvZiBxdWFkcyBpbiB0aGUgYmxhbmsgbm9kZSB0b1xuICAvLyBxdWFkcyBtYXAgZm9yIHRoZSBrZXkgaWRlbnRpZmllci5cbiAgdmFyIHF1YWRzID0gc2VsZi5ibGFua05vZGVJbmZvW2lkXS5xdWFkcztcblxuICAvLyAzKSBGb3IgZWFjaCBxdWFkIGluIHF1YWRzOlxuICBzZWxmLmZvckVhY2gocXVhZHMsIGZ1bmN0aW9uKHF1YWQsIGlkeCwgY2FsbGJhY2spIHtcbiAgICAvLyAzLjEpIElmIHRoZSBxdWFkJ3Mgc3ViamVjdCBpcyBhIGJsYW5rIG5vZGUgdGhhdCBkb2VzIG5vdCBtYXRjaFxuICAgIC8vIGlkZW50aWZpZXIsIHNldCBoYXNoIHRvIHRoZSByZXN1bHQgb2YgdGhlIEhhc2ggUmVsYXRlZCBCbGFuayBOb2RlXG4gICAgLy8gYWxnb3JpdGhtLCBwYXNzaW5nIHRoZSBibGFuayBub2RlIGlkZW50aWZpZXIgZm9yIHN1YmplY3QgYXMgcmVsYXRlZCxcbiAgICAvLyBxdWFkLCBwYXRoIGlkZW50aWZpZXIgaXNzdWVyIGFzIGlzc3VlciwgYW5kIHAgYXMgcG9zaXRpb24uXG4gICAgdmFyIHBvc2l0aW9uO1xuICAgIHZhciByZWxhdGVkO1xuICAgIGlmKHF1YWQuc3ViamVjdC50eXBlID09PSAnYmxhbmsgbm9kZScgJiYgcXVhZC5zdWJqZWN0LnZhbHVlICE9PSBpZCkge1xuICAgICAgcmVsYXRlZCA9IHF1YWQuc3ViamVjdC52YWx1ZTtcbiAgICAgIHBvc2l0aW9uID0gJ3AnO1xuICAgIH0gZWxzZSBpZihxdWFkLm9iamVjdC50eXBlID09PSAnYmxhbmsgbm9kZScgJiYgcXVhZC5vYmplY3QudmFsdWUgIT09IGlkKSB7XG4gICAgICAvLyAzLjIpIE90aGVyd2lzZSwgaWYgcXVhZCdzIG9iamVjdCBpcyBhIGJsYW5rIG5vZGUgdGhhdCBkb2VzIG5vdCBtYXRjaFxuICAgICAgLy8gaWRlbnRpZmllciwgdG8gdGhlIHJlc3VsdCBvZiB0aGUgSGFzaCBSZWxhdGVkIEJsYW5rIE5vZGUgYWxnb3JpdGhtLFxuICAgICAgLy8gcGFzc2luZyB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvciBvYmplY3QgYXMgcmVsYXRlZCwgcXVhZCwgcGF0aFxuICAgICAgLy8gaWRlbnRpZmllciBpc3N1ZXIgYXMgaXNzdWVyLCBhbmQgciBhcyBwb3NpdGlvbi5cbiAgICAgIHJlbGF0ZWQgPSBxdWFkLm9iamVjdC52YWx1ZTtcbiAgICAgIHBvc2l0aW9uID0gJ3InO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyAzLjMpIE90aGVyd2lzZSwgY29udGludWUgdG8gdGhlIG5leHQgcXVhZC5cbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICAvLyAzLjQpIEFkZCBhIG1hcHBpbmcgb2YgaGFzaCB0byB0aGUgYmxhbmsgbm9kZSBpZGVudGlmaWVyIGZvciB0aGVcbiAgICAvLyBjb21wb25lbnQgdGhhdCBtYXRjaGVkIChzdWJqZWN0IG9yIG9iamVjdCkgdG8gaGFzaCB0byByZWxhdGVkIGJsYW5rXG4gICAgLy8gbm9kZXMgbWFwLCBhZGRpbmcgYW4gZW50cnkgYXMgbmVjZXNzYXJ5LlxuICAgIHNlbGYuaGFzaFJlbGF0ZWRCbGFua05vZGUoXG4gICAgICByZWxhdGVkLCBxdWFkLCBpc3N1ZXIsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGhhc2gpIHtcbiAgICAgIGlmKGhhc2ggaW4gaGFzaFRvUmVsYXRlZCkge1xuICAgICAgICBoYXNoVG9SZWxhdGVkW2hhc2hdLnB1c2gocmVsYXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNoVG9SZWxhdGVkW2hhc2hdID0gW3JlbGF0ZWRdO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgY2FsbGJhY2soZXJyLCBoYXNoVG9SZWxhdGVkKTtcbiAgfSk7XG59O1xuXG5yZXR1cm4gTm9ybWFsaXplO1xuXG59KSgpOyAvLyBlbmQgb2YgZGVmaW5lIFVSR05BMjAxMlxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZSBzdWJqZWN0cyBpbiB0aGUgZ2l2ZW4gSlNPTi1MRCBleHBhbmRlZCBpbnB1dFxuICogaW50byBhIG5vZGUgbWFwLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgSlNPTi1MRCBleHBhbmRlZCBpbnB1dC5cbiAqIEBwYXJhbSBncmFwaHMgYSBtYXAgb2YgZ3JhcGggbmFtZSB0byBzdWJqZWN0IG1hcC5cbiAqIEBwYXJhbSBncmFwaCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBncmFwaC5cbiAqIEBwYXJhbSBpc3N1ZXIgdGhlIGJsYW5rIG5vZGUgaWRlbnRpZmllciBpc3N1ZXIuXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBpbnB1dCBpZiBpdCBpcyBhIGJub2RlLlxuICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgdG8gYXBwZW5kIHRvLCBudWxsIGZvciBub25lLlxuICovXG5mdW5jdGlvbiBfY3JlYXRlTm9kZU1hcChpbnB1dCwgZ3JhcGhzLCBncmFwaCwgaXNzdWVyLCBuYW1lLCBsaXN0KSB7XG4gIC8vIHJlY3Vyc2UgdGhyb3VnaCBhcnJheVxuICBpZihfaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9jcmVhdGVOb2RlTWFwKGlucHV0W2ldLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIHVuZGVmaW5lZCwgbGlzdCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGFkZCBub24tb2JqZWN0IHRvIGxpc3RcbiAgaWYoIV9pc09iamVjdChpbnB1dCkpIHtcbiAgICBpZihsaXN0KSB7XG4gICAgICBsaXN0LnB1c2goaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhZGQgdmFsdWVzIHRvIGxpc3RcbiAgaWYoX2lzVmFsdWUoaW5wdXQpKSB7XG4gICAgaWYoJ0B0eXBlJyBpbiBpbnB1dCkge1xuICAgICAgdmFyIHR5cGUgPSBpbnB1dFsnQHR5cGUnXTtcbiAgICAgIC8vIHJlbmFtZSBAdHlwZSBibGFuayBub2RlXG4gICAgICBpZih0eXBlLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgaW5wdXRbJ0B0eXBlJ10gPSB0eXBlID0gaXNzdWVyLmdldElkKHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZihsaXN0KSB7XG4gICAgICBsaXN0LnB1c2goaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCBpbnB1dCBtdXN0IGJlIGEgc3ViamVjdC5cblxuICAvLyBzcGVjIHJlcXVpcmVzIEB0eXBlIHRvIGJlIG5hbWVkIGZpcnN0LCBzbyBhc3NpZ24gbmFtZXMgZWFybHlcbiAgaWYoJ0B0eXBlJyBpbiBpbnB1dCkge1xuICAgIHZhciB0eXBlcyA9IGlucHV0WydAdHlwZSddO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgIGlmKHR5cGUuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgICBpc3N1ZXIuZ2V0SWQodHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IG5hbWUgZm9yIHN1YmplY3RcbiAgaWYoX2lzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IF9pc0JsYW5rTm9kZShpbnB1dCkgPyBpc3N1ZXIuZ2V0SWQoaW5wdXRbJ0BpZCddKSA6IGlucHV0WydAaWQnXTtcbiAgfVxuXG4gIC8vIGFkZCBzdWJqZWN0IHJlZmVyZW5jZSB0byBsaXN0XG4gIGlmKGxpc3QpIHtcbiAgICBsaXN0LnB1c2goeydAaWQnOiBuYW1lfSk7XG4gIH1cblxuICAvLyBjcmVhdGUgbmV3IHN1YmplY3Qgb3IgbWVyZ2UgaW50byBleGlzdGluZyBvbmVcbiAgdmFyIHN1YmplY3RzID0gZ3JhcGhzW2dyYXBoXTtcbiAgdmFyIHN1YmplY3QgPSBzdWJqZWN0c1tuYW1lXSA9IHN1YmplY3RzW25hbWVdIHx8IHt9O1xuICBzdWJqZWN0WydAaWQnXSA9IG5hbWU7XG4gIHZhciBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoaW5wdXQpLnNvcnQoKTtcbiAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJvcGVydGllcy5sZW5ndGg7ICsrcGkpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW3BpXTtcblxuICAgIC8vIHNraXAgQGlkXG4gICAgaWYocHJvcGVydHkgPT09ICdAaWQnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgcmV2ZXJzZSBwcm9wZXJ0aWVzXG4gICAgaWYocHJvcGVydHkgPT09ICdAcmV2ZXJzZScpIHtcbiAgICAgIHZhciByZWZlcmVuY2VkTm9kZSA9IHsnQGlkJzogbmFtZX07XG4gICAgICB2YXIgcmV2ZXJzZU1hcCA9IGlucHV0WydAcmV2ZXJzZSddO1xuICAgICAgZm9yKHZhciByZXZlcnNlUHJvcGVydHkgaW4gcmV2ZXJzZU1hcCkge1xuICAgICAgICB2YXIgaXRlbXMgPSByZXZlcnNlTWFwW3JldmVyc2VQcm9wZXJ0eV07XG4gICAgICAgIGZvcih2YXIgaWkgPSAwOyBpaSA8IGl0ZW1zLmxlbmd0aDsgKytpaSkge1xuICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNbaWldO1xuICAgICAgICAgIHZhciBpdGVtTmFtZSA9IGl0ZW1bJ0BpZCddO1xuICAgICAgICAgIGlmKF9pc0JsYW5rTm9kZShpdGVtKSkge1xuICAgICAgICAgICAgaXRlbU5hbWUgPSBpc3N1ZXIuZ2V0SWQoaXRlbU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY3JlYXRlTm9kZU1hcChpdGVtLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIGl0ZW1OYW1lKTtcbiAgICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgICBzdWJqZWN0c1tpdGVtTmFtZV0sIHJldmVyc2VQcm9wZXJ0eSwgcmVmZXJlbmNlZE5vZGUsXG4gICAgICAgICAgICB7cHJvcGVydHlJc0FycmF5OiB0cnVlLCBhbGxvd0R1cGxpY2F0ZTogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzZSBpbnRvIGdyYXBoXG4gICAgaWYocHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgICAvLyBhZGQgZ3JhcGggc3ViamVjdHMgbWFwIGVudHJ5XG4gICAgICBpZighKG5hbWUgaW4gZ3JhcGhzKSkge1xuICAgICAgICBncmFwaHNbbmFtZV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBnID0gKGdyYXBoID09PSAnQG1lcmdlZCcpID8gZ3JhcGggOiBuYW1lO1xuICAgICAgX2NyZWF0ZU5vZGVNYXAoaW5wdXRbcHJvcGVydHldLCBncmFwaHMsIGcsIGlzc3Vlcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBjb3B5IG5vbi1AdHlwZSBrZXl3b3Jkc1xuICAgIGlmKHByb3BlcnR5ICE9PSAnQHR5cGUnICYmIF9pc0tleXdvcmQocHJvcGVydHkpKSB7XG4gICAgICBpZihwcm9wZXJ0eSA9PT0gJ0BpbmRleCcgJiYgcHJvcGVydHkgaW4gc3ViamVjdCAmJlxuICAgICAgICAoaW5wdXRbcHJvcGVydHldICE9PSBzdWJqZWN0W3Byb3BlcnR5XSB8fFxuICAgICAgICBpbnB1dFtwcm9wZXJ0eV1bJ0BpZCddICE9PSBzdWJqZWN0W3Byb3BlcnR5XVsnQGlkJ10pKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgY29uZmxpY3RpbmcgQGluZGV4IHByb3BlcnR5IGRldGVjdGVkLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdjb25mbGljdGluZyBpbmRleGVzJywgc3ViamVjdDogc3ViamVjdH0pO1xuICAgICAgfVxuICAgICAgc3ViamVjdFtwcm9wZXJ0eV0gPSBpbnB1dFtwcm9wZXJ0eV07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIG92ZXIgb2JqZWN0c1xuICAgIHZhciBvYmplY3RzID0gaW5wdXRbcHJvcGVydHldO1xuXG4gICAgLy8gaWYgcHJvcGVydHkgaXMgYSBibm9kZSwgYXNzaWduIGl0IGEgbmV3IGlkXG4gICAgaWYocHJvcGVydHkuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgcHJvcGVydHkgPSBpc3N1ZXIuZ2V0SWQocHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8vIGVuc3VyZSBwcm9wZXJ0eSBpcyBhZGRlZCBmb3IgZW1wdHkgYXJyYXlzXG4gICAgaWYob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGpzb25sZC5hZGRWYWx1ZShzdWJqZWN0LCBwcm9wZXJ0eSwgW10sIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWV9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IodmFyIG9pID0gMDsgb2kgPCBvYmplY3RzLmxlbmd0aDsgKytvaSkge1xuICAgICAgdmFyIG8gPSBvYmplY3RzW29pXTtcblxuICAgICAgaWYocHJvcGVydHkgPT09ICdAdHlwZScpIHtcbiAgICAgICAgLy8gcmVuYW1lIEB0eXBlIGJsYW5rIG5vZGVzXG4gICAgICAgIG8gPSAoby5pbmRleE9mKCdfOicpID09PSAwKSA/IGlzc3Vlci5nZXRJZChvKSA6IG87XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBlbWJlZGRlZCBzdWJqZWN0IG9yIHN1YmplY3QgcmVmZXJlbmNlXG4gICAgICBpZihfaXNTdWJqZWN0KG8pIHx8IF9pc1N1YmplY3RSZWZlcmVuY2UobykpIHtcbiAgICAgICAgLy8gcmVsYWJlbCBibGFuayBub2RlIEBpZFxuICAgICAgICB2YXIgaWQgPSBfaXNCbGFua05vZGUobykgPyBpc3N1ZXIuZ2V0SWQob1snQGlkJ10pIDogb1snQGlkJ107XG5cbiAgICAgICAgLy8gYWRkIHJlZmVyZW5jZSBhbmQgcmVjdXJzZVxuICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgc3ViamVjdCwgcHJvcGVydHksIHsnQGlkJzogaWR9LFxuICAgICAgICAgIHtwcm9wZXJ0eUlzQXJyYXk6IHRydWUsIGFsbG93RHVwbGljYXRlOiBmYWxzZX0pO1xuICAgICAgICBfY3JlYXRlTm9kZU1hcChvLCBncmFwaHMsIGdyYXBoLCBpc3N1ZXIsIGlkKTtcbiAgICAgIH0gZWxzZSBpZihfaXNMaXN0KG8pKSB7XG4gICAgICAgIC8vIGhhbmRsZSBAbGlzdFxuICAgICAgICB2YXIgX2xpc3QgPSBbXTtcbiAgICAgICAgX2NyZWF0ZU5vZGVNYXAob1snQGxpc3QnXSwgZ3JhcGhzLCBncmFwaCwgaXNzdWVyLCBuYW1lLCBfbGlzdCk7XG4gICAgICAgIG8gPSB7J0BsaXN0JzogX2xpc3R9O1xuICAgICAgICBqc29ubGQuYWRkVmFsdWUoXG4gICAgICAgICAgc3ViamVjdCwgcHJvcGVydHksIG8sXG4gICAgICAgICAge3Byb3BlcnR5SXNBcnJheTogdHJ1ZSwgYWxsb3dEdXBsaWNhdGU6IGZhbHNlfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoYW5kbGUgQHZhbHVlXG4gICAgICAgIF9jcmVhdGVOb2RlTWFwKG8sIGdyYXBocywgZ3JhcGgsIGlzc3VlciwgbmFtZSk7XG4gICAgICAgIGpzb25sZC5hZGRWYWx1ZShcbiAgICAgICAgICBzdWJqZWN0LCBwcm9wZXJ0eSwgbywge3Byb3BlcnR5SXNBcnJheTogdHJ1ZSwgYWxsb3dEdXBsaWNhdGU6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9tZXJnZU5vZGVNYXBzKGdyYXBocykge1xuICAvLyBhZGQgYWxsIG5vbi1kZWZhdWx0IGdyYXBocyB0byBkZWZhdWx0IGdyYXBoXG4gIHZhciBkZWZhdWx0R3JhcGggPSBncmFwaHNbJ0BkZWZhdWx0J107XG4gIHZhciBncmFwaE5hbWVzID0gT2JqZWN0LmtleXMoZ3JhcGhzKS5zb3J0KCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBncmFwaE5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGdyYXBoTmFtZSA9IGdyYXBoTmFtZXNbaV07XG4gICAgaWYoZ3JhcGhOYW1lID09PSAnQGRlZmF1bHQnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIG5vZGVNYXAgPSBncmFwaHNbZ3JhcGhOYW1lXTtcbiAgICB2YXIgc3ViamVjdCA9IGRlZmF1bHRHcmFwaFtncmFwaE5hbWVdO1xuICAgIGlmKCFzdWJqZWN0KSB7XG4gICAgICBkZWZhdWx0R3JhcGhbZ3JhcGhOYW1lXSA9IHN1YmplY3QgPSB7XG4gICAgICAgICdAaWQnOiBncmFwaE5hbWUsXG4gICAgICAgICdAZ3JhcGgnOiBbXVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoISgnQGdyYXBoJyBpbiBzdWJqZWN0KSkge1xuICAgICAgc3ViamVjdFsnQGdyYXBoJ10gPSBbXTtcbiAgICB9XG4gICAgdmFyIGdyYXBoID0gc3ViamVjdFsnQGdyYXBoJ107XG4gICAgdmFyIGlkcyA9IE9iamVjdC5rZXlzKG5vZGVNYXApLnNvcnQoKTtcbiAgICBmb3IodmFyIGlpID0gMDsgaWkgPCBpZHMubGVuZ3RoOyArK2lpKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVNYXBbaWRzW2lpXV07XG4gICAgICAvLyBvbmx5IGFkZCBmdWxsIHN1YmplY3RzXG4gICAgICBpZighX2lzU3ViamVjdFJlZmVyZW5jZShub2RlKSkge1xuICAgICAgICBncmFwaC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdEdyYXBoO1xufVxuXG4vKipcbiAqIEZyYW1lcyBzdWJqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBmcmFtaW5nIHN0YXRlLlxuICogQHBhcmFtIHN1YmplY3RzIHRoZSBzdWJqZWN0cyB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gZnJhbWUgdGhlIGZyYW1lLlxuICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHN1YmplY3Qgb3IgdG9wLWxldmVsIGFycmF5LlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwYXJlbnQgcHJvcGVydHksIGluaXRpYWxpemVkIHRvIG51bGwuXG4gKi9cbmZ1bmN0aW9uIF9mcmFtZShzdGF0ZSwgc3ViamVjdHMsIGZyYW1lLCBwYXJlbnQsIHByb3BlcnR5KSB7XG4gIC8vIHZhbGlkYXRlIHRoZSBmcmFtZVxuICBfdmFsaWRhdGVGcmFtZShmcmFtZSk7XG4gIGZyYW1lID0gZnJhbWVbMF07XG5cbiAgLy8gZ2V0IGZsYWdzIGZvciBjdXJyZW50IGZyYW1lXG4gIHZhciBvcHRpb25zID0gc3RhdGUub3B0aW9ucztcbiAgdmFyIGZsYWdzID0ge1xuICAgIGVtYmVkOiBfZ2V0RnJhbWVGbGFnKGZyYW1lLCBvcHRpb25zLCAnZW1iZWQnKSxcbiAgICBleHBsaWNpdDogX2dldEZyYW1lRmxhZyhmcmFtZSwgb3B0aW9ucywgJ2V4cGxpY2l0JyksXG4gICAgcmVxdWlyZUFsbDogX2dldEZyYW1lRmxhZyhmcmFtZSwgb3B0aW9ucywgJ3JlcXVpcmVBbGwnKVxuICB9O1xuXG4gIC8vIGZpbHRlciBvdXQgc3ViamVjdHMgdGhhdCBtYXRjaCB0aGUgZnJhbWVcbiAgdmFyIG1hdGNoZXMgPSBfZmlsdGVyU3ViamVjdHMoc3RhdGUsIHN1YmplY3RzLCBmcmFtZSwgZmxhZ3MpO1xuXG4gIC8vIGFkZCBtYXRjaGVzIHRvIG91dHB1dFxuICB2YXIgaWRzID0gT2JqZWN0LmtleXMobWF0Y2hlcykuc29ydCgpO1xuICBmb3IodmFyIGlkeCA9IDA7IGlkeCA8IGlkcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgdmFyIGlkID0gaWRzW2lkeF07XG4gICAgdmFyIHN1YmplY3QgPSBtYXRjaGVzW2lkXTtcblxuICAgIGlmKGZsYWdzLmVtYmVkID09PSAnQGxpbmsnICYmIGlkIGluIHN0YXRlLmxpbmspIHtcbiAgICAgIC8vIFRPRE86IG1heSB3YW50IHRvIGFsc28gbWF0Y2ggYW4gZXhpc3RpbmcgbGlua2VkIHN1YmplY3QgYWdhaW5zdFxuICAgICAgLy8gdGhlIGN1cnJlbnQgZnJhbWUgLi4uIHNvIGRpZmZlcmVudCBmcmFtZXMgY291bGQgcHJvZHVjZSBkaWZmZXJlbnRcbiAgICAgIC8vIHN1YmplY3RzIHRoYXQgYXJlIG9ubHkgc2hhcmVkIGluLW1lbW9yeSB3aGVuIHRoZSBmcmFtZXMgYXJlIHRoZSBzYW1lXG5cbiAgICAgIC8vIGFkZCBleGlzdGluZyBsaW5rZWQgc3ViamVjdFxuICAgICAgX2FkZEZyYW1lT3V0cHV0KHBhcmVudCwgcHJvcGVydHksIHN0YXRlLmxpbmtbaWRdKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIE5vdGU6IEluIG9yZGVyIHRvIHRyZWF0IGVhY2ggdG9wLWxldmVsIG1hdGNoIGFzIGEgY29tcGFydG1lbnRhbGl6ZWRcbiAgICByZXN1bHQsIGNsZWFyIHRoZSB1bmlxdWUgZW1iZWRkZWQgc3ViamVjdHMgbWFwIHdoZW4gdGhlIHByb3BlcnR5IGlzIG51bGwsXG4gICAgd2hpY2ggb25seSBvY2N1cnMgYXQgdGhlIHRvcC1sZXZlbC4gKi9cbiAgICBpZihwcm9wZXJ0eSA9PT0gbnVsbCkge1xuICAgICAgc3RhdGUudW5pcXVlRW1iZWRzID0ge307XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgb3V0cHV0IGZvciBzdWJqZWN0XG4gICAgdmFyIG91dHB1dCA9IHt9O1xuICAgIG91dHB1dFsnQGlkJ10gPSBpZDtcbiAgICBzdGF0ZS5saW5rW2lkXSA9IG91dHB1dDtcblxuICAgIC8vIGlmIGVtYmVkIGlzIEBuZXZlciBvciBpZiBhIGNpcmN1bGFyIHJlZmVyZW5jZSB3b3VsZCBiZSBjcmVhdGVkIGJ5IGFuXG4gICAgLy8gZW1iZWQsIHRoZSBzdWJqZWN0IGNhbm5vdCBiZSBlbWJlZGRlZCwganVzdCBhZGQgdGhlIHJlZmVyZW5jZTtcbiAgICAvLyBub3RlIHRoYXQgYSBjaXJjdWxhciByZWZlcmVuY2Ugd29uJ3Qgb2NjdXIgd2hlbiB0aGUgZW1iZWQgZmxhZyBpc1xuICAgIC8vIGBAbGlua2AgYXMgdGhlIGFib3ZlIGNoZWNrIHdpbGwgc2hvcnQtY2lyY3VpdCBiZWZvcmUgcmVhY2hpbmcgdGhpcyBwb2ludFxuICAgIGlmKGZsYWdzLmVtYmVkID09PSAnQG5ldmVyJyB8fFxuICAgICAgX2NyZWF0ZXNDaXJjdWxhclJlZmVyZW5jZShzdWJqZWN0LCBzdGF0ZS5zdWJqZWN0U3RhY2spKSB7XG4gICAgICBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIG9ubHkgdGhlIGxhc3QgbWF0Y2ggc2hvdWxkIGJlIGVtYmVkZGVkXG4gICAgaWYoZmxhZ3MuZW1iZWQgPT09ICdAbGFzdCcpIHtcbiAgICAgIC8vIHJlbW92ZSBhbnkgZXhpc3RpbmcgZW1iZWRcbiAgICAgIGlmKGlkIGluIHN0YXRlLnVuaXF1ZUVtYmVkcykge1xuICAgICAgICBfcmVtb3ZlRW1iZWQoc3RhdGUsIGlkKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnVuaXF1ZUVtYmVkc1tpZF0gPSB7cGFyZW50OiBwYXJlbnQsIHByb3BlcnR5OiBwcm9wZXJ0eX07XG4gICAgfVxuXG4gICAgLy8gcHVzaCBtYXRjaGluZyBzdWJqZWN0IG9udG8gc3RhY2sgdG8gZW5hYmxlIGNpcmN1bGFyIGVtYmVkIGNoZWNrc1xuICAgIHN0YXRlLnN1YmplY3RTdGFjay5wdXNoKHN1YmplY3QpO1xuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIHN1YmplY3QgcHJvcGVydGllc1xuICAgIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKHN1YmplY3QpLnNvcnQoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG5cbiAgICAgIC8vIGNvcHkga2V5d29yZHMgdG8gb3V0cHV0XG4gICAgICBpZihfaXNLZXl3b3JkKHByb3ApKSB7XG4gICAgICAgIG91dHB1dFtwcm9wXSA9IF9jbG9uZShzdWJqZWN0W3Byb3BdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cGxpY2l0IGlzIG9uIGFuZCBwcm9wZXJ0eSBpc24ndCBpbiB0aGUgZnJhbWUsIHNraXAgcHJvY2Vzc2luZ1xuICAgICAgaWYoZmxhZ3MuZXhwbGljaXQgJiYgIShwcm9wIGluIGZyYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIG9iamVjdHNcbiAgICAgIHZhciBvYmplY3RzID0gc3ViamVjdFtwcm9wXTtcbiAgICAgIGZvcih2YXIgb2kgPSAwOyBvaSA8IG9iamVjdHMubGVuZ3RoOyArK29pKSB7XG4gICAgICAgIHZhciBvID0gb2JqZWN0c1tvaV07XG5cbiAgICAgICAgLy8gcmVjdXJzZSBpbnRvIGxpc3RcbiAgICAgICAgaWYoX2lzTGlzdChvKSkge1xuICAgICAgICAgIC8vIGFkZCBlbXB0eSBsaXN0XG4gICAgICAgICAgdmFyIGxpc3QgPSB7J0BsaXN0JzogW119O1xuICAgICAgICAgIF9hZGRGcmFtZU91dHB1dChvdXRwdXQsIHByb3AsIGxpc3QpO1xuXG4gICAgICAgICAgLy8gYWRkIGxpc3Qgb2JqZWN0c1xuICAgICAgICAgIHZhciBzcmMgPSBvWydAbGlzdCddO1xuICAgICAgICAgIGZvcih2YXIgbiBpbiBzcmMpIHtcbiAgICAgICAgICAgIG8gPSBzcmNbbl07XG4gICAgICAgICAgICBpZihfaXNTdWJqZWN0UmVmZXJlbmNlKG8pKSB7XG4gICAgICAgICAgICAgIHZhciBzdWJmcmFtZSA9IChwcm9wIGluIGZyYW1lID9cbiAgICAgICAgICAgICAgICBmcmFtZVtwcm9wXVswXVsnQGxpc3QnXSA6IF9jcmVhdGVJbXBsaWNpdEZyYW1lKGZsYWdzKSk7XG4gICAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byBzdWJqZWN0IHJlZmVyZW5jZVxuICAgICAgICAgICAgICBfZnJhbWUoc3RhdGUsIFtvWydAaWQnXV0sIHN1YmZyYW1lLCBsaXN0LCAnQGxpc3QnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGluY2x1ZGUgb3RoZXIgdmFsdWVzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgICAgX2FkZEZyYW1lT3V0cHV0KGxpc3QsICdAbGlzdCcsIF9jbG9uZShvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoX2lzU3ViamVjdFJlZmVyZW5jZShvKSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byBzdWJqZWN0IHJlZmVyZW5jZVxuICAgICAgICAgIHZhciBzdWJmcmFtZSA9IChwcm9wIGluIGZyYW1lID9cbiAgICAgICAgICAgIGZyYW1lW3Byb3BdIDogX2NyZWF0ZUltcGxpY2l0RnJhbWUoZmxhZ3MpKTtcbiAgICAgICAgICBfZnJhbWUoc3RhdGUsIFtvWydAaWQnXV0sIHN1YmZyYW1lLCBvdXRwdXQsIHByb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGluY2x1ZGUgb3RoZXIgdmFsdWVzIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICBfYWRkRnJhbWVPdXRwdXQob3V0cHV0LCBwcm9wLCBfY2xvbmUobykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGRlZmF1bHRzXG4gICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXMoZnJhbWUpLnNvcnQoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG5cbiAgICAgIC8vIHNraXAga2V5d29yZHNcbiAgICAgIGlmKF9pc0tleXdvcmQocHJvcCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG9taXQgZGVmYXVsdCBpcyBvZmYsIHRoZW4gaW5jbHVkZSBkZWZhdWx0IHZhbHVlcyBmb3IgcHJvcGVydGllc1xuICAgICAgLy8gdGhhdCBhcHBlYXIgaW4gdGhlIG5leHQgZnJhbWUgYnV0IGFyZSBub3QgaW4gdGhlIG1hdGNoaW5nIHN1YmplY3RcbiAgICAgIHZhciBuZXh0ID0gZnJhbWVbcHJvcF1bMF07XG4gICAgICB2YXIgb21pdERlZmF1bHRPbiA9IF9nZXRGcmFtZUZsYWcobmV4dCwgb3B0aW9ucywgJ29taXREZWZhdWx0Jyk7XG4gICAgICBpZighb21pdERlZmF1bHRPbiAmJiAhKHByb3AgaW4gb3V0cHV0KSkge1xuICAgICAgICB2YXIgcHJlc2VydmUgPSAnQG51bGwnO1xuICAgICAgICBpZignQGRlZmF1bHQnIGluIG5leHQpIHtcbiAgICAgICAgICBwcmVzZXJ2ZSA9IF9jbG9uZShuZXh0WydAZGVmYXVsdCddKTtcbiAgICAgICAgfVxuICAgICAgICBpZighX2lzQXJyYXkocHJlc2VydmUpKSB7XG4gICAgICAgICAgcHJlc2VydmUgPSBbcHJlc2VydmVdO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFtwcm9wXSA9IFt7J0BwcmVzZXJ2ZSc6IHByZXNlcnZlfV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIG91dHB1dCB0byBwYXJlbnRcbiAgICBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KTtcblxuICAgIC8vIHBvcCBtYXRjaGluZyBzdWJqZWN0IGZyb20gY2lyY3VsYXIgcmVmLWNoZWNraW5nIHN0YWNrXG4gICAgc3RhdGUuc3ViamVjdFN0YWNrLnBvcCgpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbXBsaWNpdCBmcmFtZSB3aGVuIHJlY3Vyc2luZyB0aHJvdWdoIHN1YmplY3QgbWF0Y2hlcy4gSWZcbiAqIGEgZnJhbWUgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGZyYW1lIGZvciBhIHBhcnRpY3VsYXIgcHJvcGVydHksIHRoZW5cbiAqIGEgd2lsZGNhcmQgY2hpbGQgZnJhbWUgd2lsbCBiZSBjcmVhdGVkIHRoYXQgdXNlcyB0aGUgc2FtZSBmbGFncyB0aGF0IHRoZVxuICogcGFyZW50IGZyYW1lIHVzZWQuXG4gKlxuICogQHBhcmFtIGZsYWdzIHRoZSBjdXJyZW50IGZyYW1pbmcgZmxhZ3MuXG4gKlxuICogQHJldHVybiB0aGUgaW1wbGljaXQgZnJhbWUuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVJbXBsaWNpdEZyYW1lKGZsYWdzKSB7XG4gIHZhciBmcmFtZSA9IHt9O1xuICBmb3IodmFyIGtleSBpbiBmbGFncykge1xuICAgIGlmKGZsYWdzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWVbJ0AnICsga2V5XSA9IFtmbGFnc1trZXldXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtmcmFtZV07XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBjdXJyZW50IHN1YmplY3Qgc3RhY2sgdG8gc2VlIGlmIGVtYmVkZGluZyB0aGUgZ2l2ZW4gc3ViamVjdFxuICogd291bGQgY2F1c2UgYSBjaXJjdWxhciByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHN1YmplY3RUb0VtYmVkIHRoZSBzdWJqZWN0IHRvIGVtYmVkLlxuICogQHBhcmFtIHN1YmplY3RTdGFjayB0aGUgY3VycmVudCBzdGFjayBvZiBzdWJqZWN0cy5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgYSBjaXJjdWxhciByZWZlcmVuY2Ugd291bGQgYmUgY3JlYXRlZCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfY3JlYXRlc0NpcmN1bGFyUmVmZXJlbmNlKHN1YmplY3RUb0VtYmVkLCBzdWJqZWN0U3RhY2spIHtcbiAgZm9yKHZhciBpID0gc3ViamVjdFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgaWYoc3ViamVjdFN0YWNrW2ldWydAaWQnXSA9PT0gc3ViamVjdFRvRW1iZWRbJ0BpZCddKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGZyYW1lIGZsYWcgdmFsdWUgZm9yIHRoZSBnaXZlbiBmbGFnIG5hbWUuXG4gKlxuICogQHBhcmFtIGZyYW1lIHRoZSBmcmFtZS5cbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBmcmFtaW5nIG9wdGlvbnMuXG4gKiBAcGFyYW0gbmFtZSB0aGUgZmxhZyBuYW1lLlxuICpcbiAqIEByZXR1cm4gdGhlIGZsYWcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9nZXRGcmFtZUZsYWcoZnJhbWUsIG9wdGlvbnMsIG5hbWUpIHtcbiAgdmFyIGZsYWcgPSAnQCcgKyBuYW1lO1xuICB2YXIgcnZhbCA9IChmbGFnIGluIGZyYW1lID8gZnJhbWVbZmxhZ11bMF0gOiBvcHRpb25zW25hbWVdKTtcbiAgaWYobmFtZSA9PT0gJ2VtYmVkJykge1xuICAgIC8vIGRlZmF1bHQgaXMgXCJAbGFzdFwiXG4gICAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgXCJlbWJlZFwiIG1hcHM6XG4gICAgLy8gdHJ1ZSA9PiBcIkBsYXN0XCJcbiAgICAvLyBmYWxzZSA9PiBcIkBuZXZlclwiXG4gICAgaWYocnZhbCA9PT0gdHJ1ZSkge1xuICAgICAgcnZhbCA9ICdAbGFzdCc7XG4gICAgfSBlbHNlIGlmKHJ2YWwgPT09IGZhbHNlKSB7XG4gICAgICBydmFsID0gJ0BuZXZlcic7XG4gICAgfSBlbHNlIGlmKHJ2YWwgIT09ICdAYWx3YXlzJyAmJiBydmFsICE9PSAnQG5ldmVyJyAmJiBydmFsICE9PSAnQGxpbmsnKSB7XG4gICAgICBydmFsID0gJ0BsYXN0JztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgSlNPTi1MRCBmcmFtZSwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmcmFtZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwYXJhbSBmcmFtZSB0aGUgZnJhbWUgdG8gdmFsaWRhdGUuXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZUZyYW1lKGZyYW1lKSB7XG4gIGlmKCFfaXNBcnJheShmcmFtZSkgfHwgZnJhbWUubGVuZ3RoICE9PSAxIHx8ICFfaXNPYmplY3QoZnJhbWVbMF0pKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGEgSlNPTi1MRCBmcmFtZSBtdXN0IGJlIGEgc2luZ2xlIG9iamVjdC4nLFxuICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtmcmFtZTogZnJhbWV9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYWxsIG9mIHRoZSBzdWJqZWN0cyB0aGF0IG1hdGNoIGEgcGFyc2VkIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBmcmFtaW5nIHN0YXRlLlxuICogQHBhcmFtIHN1YmplY3RzIHRoZSBzZXQgb2Ygc3ViamVjdHMgdG8gZmlsdGVyLlxuICogQHBhcmFtIGZyYW1lIHRoZSBwYXJzZWQgZnJhbWUuXG4gKiBAcGFyYW0gZmxhZ3MgdGhlIGZyYW1lIGZsYWdzLlxuICpcbiAqIEByZXR1cm4gYWxsIG9mIHRoZSBtYXRjaGVkIHN1YmplY3RzLlxuICovXG5mdW5jdGlvbiBfZmlsdGVyU3ViamVjdHMoc3RhdGUsIHN1YmplY3RzLCBmcmFtZSwgZmxhZ3MpIHtcbiAgLy8gZmlsdGVyIHN1YmplY3RzIGluIEBpZCBvcmRlclxuICB2YXIgcnZhbCA9IHt9O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc3ViamVjdHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaWQgPSBzdWJqZWN0c1tpXTtcbiAgICB2YXIgc3ViamVjdCA9IHN0YXRlLnN1YmplY3RzW2lkXTtcbiAgICBpZihfZmlsdGVyU3ViamVjdChzdWJqZWN0LCBmcmFtZSwgZmxhZ3MpKSB7XG4gICAgICBydmFsW2lkXSA9IHN1YmplY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3ViamVjdCBtYXRjaGVzIHRoZSBnaXZlbiBmcmFtZS5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0byBjaGVjay5cbiAqIEBwYXJhbSBmcmFtZSB0aGUgZnJhbWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gZmxhZ3MgdGhlIGZyYW1lIGZsYWdzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3ViamVjdCBtYXRjaGVzLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9maWx0ZXJTdWJqZWN0KHN1YmplY3QsIGZyYW1lLCBmbGFncykge1xuICAvLyBjaGVjayBAdHlwZSAob2JqZWN0IHZhbHVlIG1lYW5zICdhbnknIHR5cGUsIGZhbGwgdGhyb3VnaCB0byBkdWNrdHlwaW5nKVxuICBpZignQHR5cGUnIGluIGZyYW1lICYmXG4gICAgIShmcmFtZVsnQHR5cGUnXS5sZW5ndGggPT09IDEgJiYgX2lzT2JqZWN0KGZyYW1lWydAdHlwZSddWzBdKSkpIHtcbiAgICB2YXIgdHlwZXMgPSBmcmFtZVsnQHR5cGUnXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vIGFueSBtYXRjaGluZyBAdHlwZSBpcyBhIG1hdGNoXG4gICAgICBpZihqc29ubGQuaGFzVmFsdWUoc3ViamVjdCwgJ0B0eXBlJywgdHlwZXNbaV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjaGVjayBkdWNrdHlwZVxuICB2YXIgd2lsZGNhcmQgPSB0cnVlO1xuICB2YXIgbWF0Y2hlc1NvbWUgPSBmYWxzZTtcbiAgZm9yKHZhciBrZXkgaW4gZnJhbWUpIHtcbiAgICBpZihfaXNLZXl3b3JkKGtleSkpIHtcbiAgICAgIC8vIHNraXAgbm9uLUBpZCBhbmQgbm9uLUB0eXBlXG4gICAgICBpZihrZXkgIT09ICdAaWQnICYmIGtleSAhPT0gJ0B0eXBlJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHdpbGRjYXJkID0gZmFsc2U7XG5cbiAgICAgIC8vIGNoZWNrIEBpZCBmb3IgYSBzcGVjaWZpYyBAaWQgdmFsdWVcbiAgICAgIGlmKGtleSA9PT0gJ0BpZCcgJiYgX2lzU3RyaW5nKGZyYW1lW2tleV0pKSB7XG4gICAgICAgIGlmKHN1YmplY3Rba2V5XSAhPT0gZnJhbWVba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaGVzU29tZSA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbGRjYXJkID0gZmFsc2U7XG5cbiAgICBpZihrZXkgaW4gc3ViamVjdCkge1xuICAgICAgLy8gZnJhbWVba2V5XSA9PT0gW10gbWVhbnMgZG8gbm90IG1hdGNoIGlmIHByb3BlcnR5IGlzIHByZXNlbnRcbiAgICAgIGlmKF9pc0FycmF5KGZyYW1lW2tleV0pICYmIGZyYW1lW2tleV0ubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHN1YmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXNTb21lID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGFsbCBwcm9wZXJ0aWVzIG11c3QgbWF0Y2ggdG8gYmUgYSBkdWNrIHVubGVzcyBhIEBkZWZhdWx0IGlzIHNwZWNpZmllZFxuICAgIHZhciBoYXNEZWZhdWx0ID0gKF9pc0FycmF5KGZyYW1lW2tleV0pICYmIF9pc09iamVjdChmcmFtZVtrZXldWzBdKSAmJlxuICAgICAgJ0BkZWZhdWx0JyBpbiBmcmFtZVtrZXldWzBdKTtcbiAgICBpZihmbGFncy5yZXF1aXJlQWxsICYmICFoYXNEZWZhdWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIHRydWUgaWYgd2lsZGNhcmQgb3Igc3ViamVjdCBtYXRjaGVzIHNvbWUgcHJvcGVydGllc1xuICByZXR1cm4gd2lsZGNhcmQgfHwgbWF0Y2hlc1NvbWU7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBleGlzdGluZyBlbWJlZC5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgdGhlIGN1cnJlbnQgZnJhbWluZyBzdGF0ZS5cbiAqIEBwYXJhbSBpZCB0aGUgQGlkIG9mIHRoZSBlbWJlZCB0byByZW1vdmUuXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVFbWJlZChzdGF0ZSwgaWQpIHtcbiAgLy8gZ2V0IGV4aXN0aW5nIGVtYmVkXG4gIHZhciBlbWJlZHMgPSBzdGF0ZS51bmlxdWVFbWJlZHM7XG4gIHZhciBlbWJlZCA9IGVtYmVkc1tpZF07XG4gIHZhciBwYXJlbnQgPSBlbWJlZC5wYXJlbnQ7XG4gIHZhciBwcm9wZXJ0eSA9IGVtYmVkLnByb3BlcnR5O1xuXG4gIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gcmVwbGFjZSBlbWJlZFxuICB2YXIgc3ViamVjdCA9IHsnQGlkJzogaWR9O1xuXG4gIC8vIHJlbW92ZSBleGlzdGluZyBlbWJlZFxuICBpZihfaXNBcnJheShwYXJlbnQpKSB7XG4gICAgLy8gcmVwbGFjZSBzdWJqZWN0IHdpdGggcmVmZXJlbmNlXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHBhcmVudC5sZW5ndGg7ICsraSkge1xuICAgICAgaWYoanNvbmxkLmNvbXBhcmVWYWx1ZXMocGFyZW50W2ldLCBzdWJqZWN0KSkge1xuICAgICAgICBwYXJlbnRbaV0gPSBzdWJqZWN0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVwbGFjZSBzdWJqZWN0IHdpdGggcmVmZXJlbmNlXG4gICAgdmFyIHVzZUFycmF5ID0gX2lzQXJyYXkocGFyZW50W3Byb3BlcnR5XSk7XG4gICAganNvbmxkLnJlbW92ZVZhbHVlKHBhcmVudCwgcHJvcGVydHksIHN1YmplY3QsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gICAganNvbmxkLmFkZFZhbHVlKHBhcmVudCwgcHJvcGVydHksIHN1YmplY3QsIHtwcm9wZXJ0eUlzQXJyYXk6IHVzZUFycmF5fSk7XG4gIH1cblxuICAvLyByZWN1cnNpdmVseSByZW1vdmUgZGVwZW5kZW50IGRhbmdsaW5nIGVtYmVkc1xuICB2YXIgcmVtb3ZlRGVwZW5kZW50cyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgLy8gZ2V0IGVtYmVkIGtleXMgYXMgYSBzZXBhcmF0ZSBhcnJheSB0byBlbmFibGUgZGVsZXRpbmcga2V5cyBpbiBtYXBcbiAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMoZW1iZWRzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgbmV4dCA9IGlkc1tpXTtcbiAgICAgIGlmKG5leHQgaW4gZW1iZWRzICYmIF9pc09iamVjdChlbWJlZHNbbmV4dF0ucGFyZW50KSAmJlxuICAgICAgICBlbWJlZHNbbmV4dF0ucGFyZW50WydAaWQnXSA9PT0gaWQpIHtcbiAgICAgICAgZGVsZXRlIGVtYmVkc1tuZXh0XTtcbiAgICAgICAgcmVtb3ZlRGVwZW5kZW50cyhuZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlbW92ZURlcGVuZGVudHMoaWQpO1xufVxuXG4vKipcbiAqIEFkZHMgZnJhbWluZyBvdXRwdXQgdG8gdGhlIGdpdmVuIHBhcmVudC5cbiAqXG4gKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgdG8gYWRkIHRvLlxuICogQHBhcmFtIHByb3BlcnR5IHRoZSBwYXJlbnQgcHJvcGVydHkuXG4gKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gYWRkLlxuICovXG5mdW5jdGlvbiBfYWRkRnJhbWVPdXRwdXQocGFyZW50LCBwcm9wZXJ0eSwgb3V0cHV0KSB7XG4gIGlmKF9pc09iamVjdChwYXJlbnQpKSB7XG4gICAganNvbmxkLmFkZFZhbHVlKHBhcmVudCwgcHJvcGVydHksIG91dHB1dCwge3Byb3BlcnR5SXNBcnJheTogdHJ1ZX0pO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudC5wdXNoKG91dHB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBAcHJlc2VydmUga2V5d29yZHMgYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGUgZnJhbWluZyBhbGdvcml0aG0uXG4gKlxuICogQHBhcmFtIGN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdXNlZCB0byBjb21wYWN0IHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBpbnB1dCB0aGUgZnJhbWVkLCBjb21wYWN0ZWQgb3V0cHV0LlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIGNvbXBhY3Rpb24gb3B0aW9ucyB1c2VkLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0LCBvcHRpb25zKSB7XG4gIC8vIHJlY3Vyc2UgdGhyb3VnaCBhcnJheXNcbiAgaWYoX2lzQXJyYXkoaW5wdXQpKSB7XG4gICAgdmFyIG91dHB1dCA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlc3VsdCA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0W2ldLCBvcHRpb25zKTtcbiAgICAgIC8vIGRyb3AgbnVsbHMgZnJvbSBhcnJheXNcbiAgICAgIGlmKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQucHVzaChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnB1dCA9IG91dHB1dDtcbiAgfSBlbHNlIGlmKF9pc09iamVjdChpbnB1dCkpIHtcbiAgICAvLyByZW1vdmUgQHByZXNlcnZlXG4gICAgaWYoJ0BwcmVzZXJ2ZScgaW4gaW5wdXQpIHtcbiAgICAgIGlmKGlucHV0WydAcHJlc2VydmUnXSA9PT0gJ0BudWxsJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnB1dFsnQHByZXNlcnZlJ107XG4gICAgfVxuXG4gICAgLy8gc2tpcCBAdmFsdWVzXG4gICAgaWYoX2lzVmFsdWUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzZSB0aHJvdWdoIEBsaXN0c1xuICAgIGlmKF9pc0xpc3QoaW5wdXQpKSB7XG4gICAgICBpbnB1dFsnQGxpc3QnXSA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0WydAbGlzdCddLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBoYW5kbGUgaW4tbWVtb3J5IGxpbmtlZCBub2Rlc1xuICAgIHZhciBpZEFsaWFzID0gX2NvbXBhY3RJcmkoY3R4LCAnQGlkJyk7XG4gICAgaWYoaWRBbGlhcyBpbiBpbnB1dCkge1xuICAgICAgdmFyIGlkID0gaW5wdXRbaWRBbGlhc107XG4gICAgICBpZihpZCBpbiBvcHRpb25zLmxpbmspIHtcbiAgICAgICAgdmFyIGlkeCA9IG9wdGlvbnMubGlua1tpZF0uaW5kZXhPZihpbnB1dCk7XG4gICAgICAgIGlmKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAvLyBwcmV2ZW50IGNpcmN1bGFyIHZpc2l0YXRpb25cbiAgICAgICAgICBvcHRpb25zLmxpbmtbaWRdLnB1c2goaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFscmVhZHkgdmlzaXRlZFxuICAgICAgICAgIHJldHVybiBvcHRpb25zLmxpbmtbaWRdW2lkeF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHByZXZlbnQgY2lyY3VsYXIgdmlzaXRhdGlvblxuICAgICAgICBvcHRpb25zLmxpbmtbaWRdID0gW2lucHV0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWN1cnNlIHRocm91Z2ggcHJvcGVydGllc1xuICAgIGZvcih2YXIgcHJvcCBpbiBpbnB1dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IF9yZW1vdmVQcmVzZXJ2ZShjdHgsIGlucHV0W3Byb3BdLCBvcHRpb25zKTtcbiAgICAgIHZhciBjb250YWluZXIgPSBqc29ubGQuZ2V0Q29udGV4dFZhbHVlKGN0eCwgcHJvcCwgJ0Bjb250YWluZXInKTtcbiAgICAgIGlmKG9wdGlvbnMuY29tcGFjdEFycmF5cyAmJiBfaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdFswXTtcbiAgICAgIH1cbiAgICAgIGlucHV0W3Byb3BdID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgZmlyc3QgYmFzZWQgb24gbGVuZ3RoIGFuZCB0aGVuIGxleGljb2dyYXBoaWNhbGx5LlxuICpcbiAqIEBwYXJhbSBhIHRoZSBmaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0gYiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIC0xIGlmIGEgPCBiLCAxIGlmIGEgPiBiLCAwIGlmIGEgPT0gYi5cbiAqL1xuZnVuY3Rpb24gX2NvbXBhcmVTaG9ydGVzdExlYXN0KGEsIGIpIHtcbiAgaWYoYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZihiLmxlbmd0aCA8IGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiAoYSA8IGIpID8gLTEgOiAxO1xufVxuXG4vKipcbiAqIFBpY2tzIHRoZSBwcmVmZXJyZWQgY29tcGFjdGlvbiB0ZXJtIGZyb20gdGhlIGdpdmVuIGludmVyc2UgY29udGV4dCBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlQ3R4IHRoZSBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBpcmkgdGhlIElSSSB0byBwaWNrIHRoZSB0ZXJtIGZvci5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcGljayB0aGUgdGVybSBmb3IuXG4gKiBAcGFyYW0gY29udGFpbmVycyB0aGUgcHJlZmVycmVkIGNvbnRhaW5lcnMuXG4gKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2UgZWl0aGVyICdAdHlwZScgb3IgJ0BsYW5ndWFnZScuXG4gKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2VWYWx1ZSB0aGUgcHJlZmVycmVkIHZhbHVlIGZvciAnQHR5cGUnIG9yICdAbGFuZ3VhZ2UnLlxuICpcbiAqIEByZXR1cm4gdGhlIHByZWZlcnJlZCB0ZXJtLlxuICovXG5mdW5jdGlvbiBfc2VsZWN0VGVybShcbiAgYWN0aXZlQ3R4LCBpcmksIHZhbHVlLCBjb250YWluZXJzLCB0eXBlT3JMYW5ndWFnZSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSkge1xuICBpZih0eXBlT3JMYW5ndWFnZVZhbHVlID09PSBudWxsKSB7XG4gICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9ICdAbnVsbCc7XG4gIH1cblxuICAvLyBwcmVmZXJlbmNlcyBmb3IgdGhlIHZhbHVlIG9mIEB0eXBlIG9yIEBsYW5ndWFnZVxuICB2YXIgcHJlZnMgPSBbXTtcblxuICAvLyBkZXRlcm1pbmUgcHJlZnMgZm9yIEBpZCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB2YWx1ZSBjb21wYWN0cyB0byBhIHRlcm1cbiAgaWYoKHR5cGVPckxhbmd1YWdlVmFsdWUgPT09ICdAaWQnIHx8IHR5cGVPckxhbmd1YWdlVmFsdWUgPT09ICdAcmV2ZXJzZScpICYmXG4gICAgX2lzU3ViamVjdFJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAvLyBwcmVmZXIgQHJldmVyc2UgZmlyc3RcbiAgICBpZih0eXBlT3JMYW5ndWFnZVZhbHVlID09PSAnQHJldmVyc2UnKSB7XG4gICAgICBwcmVmcy5wdXNoKCdAcmV2ZXJzZScpO1xuICAgIH1cbiAgICAvLyB0cnkgdG8gY29tcGFjdCB2YWx1ZSB0byBhIHRlcm1cbiAgICB2YXIgdGVybSA9IF9jb21wYWN0SXJpKGFjdGl2ZUN0eCwgdmFsdWVbJ0BpZCddLCBudWxsLCB7dm9jYWI6IHRydWV9KTtcbiAgICBpZih0ZXJtIGluIGFjdGl2ZUN0eC5tYXBwaW5ncyAmJlxuICAgICAgYWN0aXZlQ3R4Lm1hcHBpbmdzW3Rlcm1dICYmXG4gICAgICBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV1bJ0BpZCddID09PSB2YWx1ZVsnQGlkJ10pIHtcbiAgICAgIC8vIHByZWZlciBAdm9jYWJcbiAgICAgIHByZWZzLnB1c2guYXBwbHkocHJlZnMsIFsnQHZvY2FiJywgJ0BpZCddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJlZmVyIEBpZFxuICAgICAgcHJlZnMucHVzaC5hcHBseShwcmVmcywgWydAaWQnLCAnQHZvY2FiJ10pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcmVmcy5wdXNoKHR5cGVPckxhbmd1YWdlVmFsdWUpO1xuICB9XG4gIHByZWZzLnB1c2goJ0Bub25lJyk7XG5cbiAgdmFyIGNvbnRhaW5lck1hcCA9IGFjdGl2ZUN0eC5pbnZlcnNlW2lyaV07XG4gIGZvcih2YXIgY2kgPSAwOyBjaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyArK2NpKSB7XG4gICAgLy8gaWYgY29udGFpbmVyIG5vdCBhdmFpbGFibGUgaW4gdGhlIG1hcCwgY29udGludWVcbiAgICB2YXIgY29udGFpbmVyID0gY29udGFpbmVyc1tjaV07XG4gICAgaWYoIShjb250YWluZXIgaW4gY29udGFpbmVyTWFwKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVPckxhbmd1YWdlVmFsdWVNYXAgPSBjb250YWluZXJNYXBbY29udGFpbmVyXVt0eXBlT3JMYW5ndWFnZV07XG4gICAgZm9yKHZhciBwaSA9IDA7IHBpIDwgcHJlZnMubGVuZ3RoOyArK3BpKSB7XG4gICAgICAvLyBpZiB0eXBlL2xhbmd1YWdlIG9wdGlvbiBub3QgYXZhaWxhYmxlIGluIHRoZSBtYXAsIGNvbnRpbnVlXG4gICAgICB2YXIgcHJlZiA9IHByZWZzW3BpXTtcbiAgICAgIGlmKCEocHJlZiBpbiB0eXBlT3JMYW5ndWFnZVZhbHVlTWFwKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2VsZWN0IHRlcm1cbiAgICAgIHJldHVybiB0eXBlT3JMYW5ndWFnZVZhbHVlTWFwW3ByZWZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvbXBhY3RzIGFuIElSSSBvciBrZXl3b3JkIGludG8gYSB0ZXJtIG9yIHByZWZpeCBpZiBpdCBjYW4gYmUuIElmIHRoZVxuICogSVJJIGhhcyBhbiBhc3NvY2lhdGVkIHZhbHVlIGl0IG1heSBiZSBwYXNzZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQgdG8gdXNlLlxuICogQHBhcmFtIGlyaSB0aGUgSVJJIHRvIGNvbXBhY3QuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrIG9yIG51bGwuXG4gKiBAcGFyYW0gcmVsYXRpdmVUbyBvcHRpb25zIGZvciBob3cgdG8gY29tcGFjdCBJUklzOlxuICogICAgICAgICAgdm9jYWI6IHRydWUgdG8gc3BsaXQgYWZ0ZXIgQHZvY2FiLCBmYWxzZSBub3QgdG8uXG4gKiBAcGFyYW0gcmV2ZXJzZSB0cnVlIGlmIGEgcmV2ZXJzZSBwcm9wZXJ0eSBpcyBiZWluZyBjb21wYWN0ZWQsIGZhbHNlIGlmIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjb21wYWN0ZWQgdGVybSwgcHJlZml4LCBrZXl3b3JkIGFsaWFzLCBvciB0aGUgb3JpZ2luYWwgSVJJLlxuICovXG5mdW5jdGlvbiBfY29tcGFjdElyaShhY3RpdmVDdHgsIGlyaSwgdmFsdWUsIHJlbGF0aXZlVG8sIHJldmVyc2UpIHtcbiAgLy8gY2FuJ3QgY29tcGFjdCBudWxsXG4gIGlmKGlyaSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyBkZWZhdWx0IHZhbHVlIGFuZCBwYXJlbnQgdG8gbnVsbFxuICBpZihfaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG4gIC8vIGRlZmF1bHQgcmV2ZXJzZSB0byBmYWxzZVxuICBpZihfaXNVbmRlZmluZWQocmV2ZXJzZSkpIHtcbiAgICByZXZlcnNlID0gZmFsc2U7XG4gIH1cbiAgcmVsYXRpdmVUbyA9IHJlbGF0aXZlVG8gfHwge307XG5cbiAgdmFyIGludmVyc2VDdHggPSBhY3RpdmVDdHguZ2V0SW52ZXJzZSgpO1xuXG4gIC8vIGlmIHRlcm0gaXMgYSBrZXl3b3JkLCBpdCBjYW4gb25seSBiZSBjb21wYWN0ZWQgdG8gYSBzaW1wbGUgYWxpYXNcbiAgaWYoX2lzS2V5d29yZChpcmkpKSB7XG4gICAgaWYoaXJpIGluIGludmVyc2VDdHgpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlQ3R4W2lyaV1bJ0Bub25lJ11bJ0B0eXBlJ11bJ0Bub25lJ107XG4gICAgfVxuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyB1c2UgaW52ZXJzZSBjb250ZXh0IHRvIHBpY2sgYSB0ZXJtIGlmIGlyaSBpcyByZWxhdGl2ZSB0byB2b2NhYlxuICBpZihyZWxhdGl2ZVRvLnZvY2FiICYmIGlyaSBpbiBpbnZlcnNlQ3R4KSB7XG4gICAgdmFyIGRlZmF1bHRMYW5ndWFnZSA9IGFjdGl2ZUN0eFsnQGxhbmd1YWdlJ10gfHwgJ0Bub25lJztcblxuICAgIC8vIHByZWZlciBAaW5kZXggaWYgYXZhaWxhYmxlIGluIHZhbHVlXG4gICAgdmFyIGNvbnRhaW5lcnMgPSBbXTtcbiAgICBpZihfaXNPYmplY3QodmFsdWUpICYmICdAaW5kZXgnIGluIHZhbHVlKSB7XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BpbmRleCcpO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHRzIGZvciB0ZXJtIHNlbGVjdGlvbiBiYXNlZCBvbiB0eXBlL2xhbmd1YWdlXG4gICAgdmFyIHR5cGVPckxhbmd1YWdlID0gJ0BsYW5ndWFnZSc7XG4gICAgdmFyIHR5cGVPckxhbmd1YWdlVmFsdWUgPSAnQG51bGwnO1xuXG4gICAgaWYocmV2ZXJzZSkge1xuICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9ICdAcmV2ZXJzZSc7XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BzZXQnKTtcbiAgICB9IGVsc2UgaWYoX2lzTGlzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIGNob29zZSB0aGUgbW9zdCBzcGVjaWZpYyB0ZXJtIHRoYXQgd29ya3MgZm9yIGFsbCBlbGVtZW50cyBpbiBAbGlzdFxuICAgICAgLy8gb25seSBzZWxlY3QgQGxpc3QgY29udGFpbmVycyBpZiBAaW5kZXggaXMgTk9UIGluIHZhbHVlXG4gICAgICBpZighKCdAaW5kZXgnIGluIHZhbHVlKSkge1xuICAgICAgICBjb250YWluZXJzLnB1c2goJ0BsaXN0Jyk7XG4gICAgICB9XG4gICAgICB2YXIgbGlzdCA9IHZhbHVlWydAbGlzdCddO1xuICAgICAgdmFyIGNvbW1vbkxhbmd1YWdlID0gKGxpc3QubGVuZ3RoID09PSAwKSA/IGRlZmF1bHRMYW5ndWFnZSA6IG51bGw7XG4gICAgICB2YXIgY29tbW9uVHlwZSA9IG51bGw7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgICAgIHZhciBpdGVtTGFuZ3VhZ2UgPSAnQG5vbmUnO1xuICAgICAgICB2YXIgaXRlbVR5cGUgPSAnQG5vbmUnO1xuICAgICAgICBpZihfaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgIGlmKCdAbGFuZ3VhZ2UnIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1MYW5ndWFnZSA9IGl0ZW1bJ0BsYW5ndWFnZSddO1xuICAgICAgICAgIH0gZWxzZSBpZignQHR5cGUnIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW1UeXBlID0gaXRlbVsnQHR5cGUnXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGxhaW4gbGl0ZXJhbFxuICAgICAgICAgICAgaXRlbUxhbmd1YWdlID0gJ0BudWxsJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVR5cGUgPSAnQGlkJztcbiAgICAgICAgfVxuICAgICAgICBpZihjb21tb25MYW5ndWFnZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbW1vbkxhbmd1YWdlID0gaXRlbUxhbmd1YWdlO1xuICAgICAgICB9IGVsc2UgaWYoaXRlbUxhbmd1YWdlICE9PSBjb21tb25MYW5ndWFnZSAmJiBfaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgIGNvbW1vbkxhbmd1YWdlID0gJ0Bub25lJztcbiAgICAgICAgfVxuICAgICAgICBpZihjb21tb25UeXBlID09PSBudWxsKSB7XG4gICAgICAgICAgY29tbW9uVHlwZSA9IGl0ZW1UeXBlO1xuICAgICAgICB9IGVsc2UgaWYoaXRlbVR5cGUgIT09IGNvbW1vblR5cGUpIHtcbiAgICAgICAgICBjb21tb25UeXBlID0gJ0Bub25lJztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVyZSBhcmUgZGlmZmVyZW50IGxhbmd1YWdlcyBhbmQgdHlwZXMgaW4gdGhlIGxpc3QsIHNvIGNob29zZVxuICAgICAgICAvLyB0aGUgbW9zdCBnZW5lcmljIHRlcm0sIG5vIG5lZWQgdG8ga2VlcCBpdGVyYXRpbmcgdGhlIGxpc3RcbiAgICAgICAgaWYoY29tbW9uTGFuZ3VhZ2UgPT09ICdAbm9uZScgJiYgY29tbW9uVHlwZSA9PT0gJ0Bub25lJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21tb25MYW5ndWFnZSA9IGNvbW1vbkxhbmd1YWdlIHx8ICdAbm9uZSc7XG4gICAgICBjb21tb25UeXBlID0gY29tbW9uVHlwZSB8fCAnQG5vbmUnO1xuICAgICAgaWYoY29tbW9uVHlwZSAhPT0gJ0Bub25lJykge1xuICAgICAgICB0eXBlT3JMYW5ndWFnZSA9ICdAdHlwZSc7XG4gICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSBjb21tb25UeXBlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSA9IGNvbW1vbkxhbmd1YWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihfaXNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgaWYoJ0BsYW5ndWFnZScgaW4gdmFsdWUgJiYgISgnQGluZGV4JyBpbiB2YWx1ZSkpIHtcbiAgICAgICAgICBjb250YWluZXJzLnB1c2goJ0BsYW5ndWFnZScpO1xuICAgICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSB2YWx1ZVsnQGxhbmd1YWdlJ107XG4gICAgICAgIH0gZWxzZSBpZignQHR5cGUnIGluIHZhbHVlKSB7XG4gICAgICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgICAgIHR5cGVPckxhbmd1YWdlVmFsdWUgPSB2YWx1ZVsnQHR5cGUnXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU9yTGFuZ3VhZ2UgPSAnQHR5cGUnO1xuICAgICAgICB0eXBlT3JMYW5ndWFnZVZhbHVlID0gJ0BpZCc7XG4gICAgICB9XG4gICAgICBjb250YWluZXJzLnB1c2goJ0BzZXQnKTtcbiAgICB9XG5cbiAgICAvLyBkbyB0ZXJtIHNlbGVjdGlvblxuICAgIGNvbnRhaW5lcnMucHVzaCgnQG5vbmUnKTtcbiAgICB2YXIgdGVybSA9IF9zZWxlY3RUZXJtKFxuICAgICAgYWN0aXZlQ3R4LCBpcmksIHZhbHVlLCBjb250YWluZXJzLCB0eXBlT3JMYW5ndWFnZSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSk7XG4gICAgaWYodGVybSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG5cbiAgLy8gbm8gdGVybSBtYXRjaCwgdXNlIEB2b2NhYiBpZiBhdmFpbGFibGVcbiAgaWYocmVsYXRpdmVUby52b2NhYikge1xuICAgIGlmKCdAdm9jYWInIGluIGFjdGl2ZUN0eCkge1xuICAgICAgLy8gZGV0ZXJtaW5lIGlmIHZvY2FiIGlzIGEgcHJlZml4IG9mIHRoZSBpcmlcbiAgICAgIHZhciB2b2NhYiA9IGFjdGl2ZUN0eFsnQHZvY2FiJ107XG4gICAgICBpZihpcmkuaW5kZXhPZih2b2NhYikgPT09IDAgJiYgaXJpICE9PSB2b2NhYikge1xuICAgICAgICAvLyB1c2Ugc3VmZml4IGFzIHJlbGF0aXZlIGlyaSBpZiBpdCBpcyBub3QgYSB0ZXJtIGluIHRoZSBhY3RpdmUgY29udGV4dFxuICAgICAgICB2YXIgc3VmZml4ID0gaXJpLnN1YnN0cih2b2NhYi5sZW5ndGgpO1xuICAgICAgICBpZighKHN1ZmZpeCBpbiBhY3RpdmVDdHgubWFwcGluZ3MpKSB7XG4gICAgICAgICAgcmV0dXJuIHN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHRlcm0gb3IgQHZvY2FiIG1hdGNoLCBjaGVjayBmb3IgcG9zc2libGUgQ1VSSUVzXG4gIHZhciBjaG9pY2UgPSBudWxsO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIHBhcnRpYWxNYXRjaGVzID0gW107XG4gIHZhciBpcmlNYXAgPSBhY3RpdmVDdHguZmFzdEN1cmllTWFwO1xuICAvLyBjaGVjayBmb3IgcGFydGlhbCBtYXRjaGVzIG9mIGFnYWluc3QgYGlyaWAsIHdoaWNoIG1lYW5zIGxvb2sgdW50aWxcbiAgLy8gaXJpLmxlbmd0aCAtIDEsIG5vdCBmdWxsIGxlbmd0aFxuICB2YXIgbWF4UGFydGlhbExlbmd0aCA9IGlyaS5sZW5ndGggLSAxO1xuICBmb3IoOyBpZHggPCBtYXhQYXJ0aWFsTGVuZ3RoICYmIGlyaVtpZHhdIGluIGlyaU1hcDsgKytpZHgpIHtcbiAgICBpcmlNYXAgPSBpcmlNYXBbaXJpW2lkeF1dO1xuICAgIGlmKCcnIGluIGlyaU1hcCkge1xuICAgICAgcGFydGlhbE1hdGNoZXMucHVzaChpcmlNYXBbJyddWzBdKTtcbiAgICB9XG4gIH1cbiAgLy8gY2hlY2sgcGFydGlhbCBtYXRjaGVzIGluIHJldmVyc2Ugb3JkZXIgdG8gcHJlZmVyIGxvbmdlc3Qgb25lcyBmaXJzdFxuICBmb3IodmFyIGkgPSBwYXJ0aWFsTWF0Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIHZhciBlbnRyeSA9IHBhcnRpYWxNYXRjaGVzW2ldO1xuICAgIHZhciB0ZXJtcyA9IGVudHJ5LnRlcm1zO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IHRlcm1zLmxlbmd0aDsgKyt0aSkge1xuICAgICAgLy8gYSBDVVJJRSBpcyB1c2FibGUgaWY6XG4gICAgICAvLyAxLiBpdCBoYXMgbm8gbWFwcGluZywgT1JcbiAgICAgIC8vIDIuIHZhbHVlIGlzIG51bGwsIHdoaWNoIG1lYW5zIHdlJ3JlIG5vdCBjb21wYWN0aW5nIGFuIEB2YWx1ZSwgQU5EXG4gICAgICAvLyAgIHRoZSBtYXBwaW5nIG1hdGNoZXMgdGhlIElSSVxuICAgICAgdmFyIGN1cmllID0gdGVybXNbdGldICsgJzonICsgaXJpLnN1YnN0cihlbnRyeS5pcmkubGVuZ3RoKTtcbiAgICAgIHZhciBpc1VzYWJsZUN1cmllID0gKCEoY3VyaWUgaW4gYWN0aXZlQ3R4Lm1hcHBpbmdzKSB8fFxuICAgICAgICAodmFsdWUgPT09IG51bGwgJiYgYWN0aXZlQ3R4Lm1hcHBpbmdzW2N1cmllXVsnQGlkJ10gPT09IGlyaSkpO1xuXG4gICAgICAvLyBzZWxlY3QgY3VyaWUgaWYgaXQgaXMgc2hvcnRlciBvciB0aGUgc2FtZSBsZW5ndGggYnV0IGxleGljb2dyYXBoaWNhbGx5XG4gICAgICAvLyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgY2hvaWNlXG4gICAgICBpZihpc1VzYWJsZUN1cmllICYmIChjaG9pY2UgPT09IG51bGwgfHxcbiAgICAgICAgX2NvbXBhcmVTaG9ydGVzdExlYXN0KGN1cmllLCBjaG9pY2UpIDwgMCkpIHtcbiAgICAgICAgY2hvaWNlID0gY3VyaWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIGNob3NlbiBjdXJpZVxuICBpZihjaG9pY2UgIT09IG51bGwpIHtcbiAgICByZXR1cm4gY2hvaWNlO1xuICB9XG5cbiAgLy8gY29tcGFjdCBJUkkgcmVsYXRpdmUgdG8gYmFzZVxuICBpZighcmVsYXRpdmVUby52b2NhYikge1xuICAgIHJldHVybiBfcmVtb3ZlQmFzZShhY3RpdmVDdHhbJ0BiYXNlJ10sIGlyaSk7XG4gIH1cblxuICAvLyByZXR1cm4gSVJJIGFzIGlzXG4gIHJldHVybiBpcmk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdmFsdWUgY29tcGFjdGlvbiBvbiBhbiBvYmplY3Qgd2l0aCAnQHZhbHVlJyBvciAnQGlkJyBhcyB0aGUgb25seVxuICogcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgYWN0aXZlIGNvbnRleHQuXG4gKiBAcGFyYW0gYWN0aXZlUHJvcGVydHkgdGhlIGFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHBvaW50cyB0byB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNvbXBhY3QuXG4gKlxuICogQHJldHVybiB0aGUgY29tcGFjdGlvbiByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIF9jb21wYWN0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgdmFsdWUpIHtcbiAgLy8gdmFsdWUgaXMgYSBAdmFsdWVcbiAgaWYoX2lzVmFsdWUodmFsdWUpKSB7XG4gICAgLy8gZ2V0IGNvbnRleHQgcnVsZXNcbiAgICB2YXIgdHlwZSA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0B0eXBlJyk7XG4gICAgdmFyIGxhbmd1YWdlID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAbGFuZ3VhZ2UnKTtcbiAgICB2YXIgY29udGFpbmVyID0ganNvbmxkLmdldENvbnRleHRWYWx1ZShcbiAgICAgIGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksICdAY29udGFpbmVyJyk7XG5cbiAgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsdWUgaGFzIGFuIEBpbmRleCB0aGF0IG11c3QgYmUgcHJlc2VydmVkXG4gICAgdmFyIHByZXNlcnZlSW5kZXggPSAoKCdAaW5kZXgnIGluIHZhbHVlKSAmJlxuICAgICAgY29udGFpbmVyICE9PSAnQGluZGV4Jyk7XG5cbiAgICAvLyBpZiB0aGVyZSdzIG5vIEBpbmRleCB0byBwcmVzZXJ2ZSAuLi5cbiAgICBpZighcHJlc2VydmVJbmRleCkge1xuICAgICAgLy8gbWF0Y2hpbmcgQHR5cGUgb3IgQGxhbmd1YWdlIHNwZWNpZmllZCBpbiBjb250ZXh0LCBjb21wYWN0IHZhbHVlXG4gICAgICBpZih2YWx1ZVsnQHR5cGUnXSA9PT0gdHlwZSB8fCB2YWx1ZVsnQGxhbmd1YWdlJ10gPT09IGxhbmd1YWdlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVsnQHZhbHVlJ107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGp1c3QgdGhlIHZhbHVlIG9mIEB2YWx1ZSBpZiBhbGwgYXJlIHRydWU6XG4gICAgLy8gMS4gQHZhbHVlIGlzIHRoZSBvbmx5IGtleSBvciBAaW5kZXggaXNuJ3QgYmVpbmcgcHJlc2VydmVkXG4gICAgLy8gMi4gdGhlcmUgaXMgbm8gZGVmYXVsdCBsYW5ndWFnZSBvciBAdmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yXG4gICAgLy8gICB0aGUga2V5IGhhcyBhIG1hcHBpbmcgd2l0aCBhIG51bGwgQGxhbmd1YWdlXG4gICAgdmFyIGtleUNvdW50ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcbiAgICB2YXIgaXNWYWx1ZU9ubHlLZXkgPSAoa2V5Q291bnQgPT09IDEgfHxcbiAgICAgIChrZXlDb3VudCA9PT0gMiAmJiAoJ0BpbmRleCcgaW4gdmFsdWUpICYmICFwcmVzZXJ2ZUluZGV4KSk7XG4gICAgdmFyIGhhc0RlZmF1bHRMYW5ndWFnZSA9ICgnQGxhbmd1YWdlJyBpbiBhY3RpdmVDdHgpO1xuICAgIHZhciBpc1ZhbHVlU3RyaW5nID0gX2lzU3RyaW5nKHZhbHVlWydAdmFsdWUnXSk7XG4gICAgdmFyIGhhc051bGxNYXBwaW5nID0gKGFjdGl2ZUN0eC5tYXBwaW5nc1thY3RpdmVQcm9wZXJ0eV0gJiZcbiAgICAgIGFjdGl2ZUN0eC5tYXBwaW5nc1thY3RpdmVQcm9wZXJ0eV1bJ0BsYW5ndWFnZSddID09PSBudWxsKTtcbiAgICBpZihpc1ZhbHVlT25seUtleSAmJlxuICAgICAgKCFoYXNEZWZhdWx0TGFuZ3VhZ2UgfHwgIWlzVmFsdWVTdHJpbmcgfHwgaGFzTnVsbE1hcHBpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsdWVbJ0B2YWx1ZSddO1xuICAgIH1cblxuICAgIHZhciBydmFsID0ge307XG5cbiAgICAvLyBwcmVzZXJ2ZSBAaW5kZXhcbiAgICBpZihwcmVzZXJ2ZUluZGV4KSB7XG4gICAgICBydmFsW19jb21wYWN0SXJpKGFjdGl2ZUN0eCwgJ0BpbmRleCcpXSA9IHZhbHVlWydAaW5kZXgnXTtcbiAgICB9XG5cbiAgICBpZignQHR5cGUnIGluIHZhbHVlKSB7XG4gICAgICAvLyBjb21wYWN0IEB0eXBlIElSSVxuICAgICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAdHlwZScpXSA9IF9jb21wYWN0SXJpKFxuICAgICAgICBhY3RpdmVDdHgsIHZhbHVlWydAdHlwZSddLCBudWxsLCB7dm9jYWI6IHRydWV9KTtcbiAgICB9IGVsc2UgaWYoJ0BsYW5ndWFnZScgaW4gdmFsdWUpIHtcbiAgICAgIC8vIGFsaWFzIEBsYW5ndWFnZVxuICAgICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAbGFuZ3VhZ2UnKV0gPSB2YWx1ZVsnQGxhbmd1YWdlJ107XG4gICAgfVxuXG4gICAgLy8gYWxpYXMgQHZhbHVlXG4gICAgcnZhbFtfY29tcGFjdElyaShhY3RpdmVDdHgsICdAdmFsdWUnKV0gPSB2YWx1ZVsnQHZhbHVlJ107XG5cbiAgICByZXR1cm4gcnZhbDtcbiAgfVxuXG4gIC8vIHZhbHVlIGlzIGEgc3ViamVjdCByZWZlcmVuY2VcbiAgdmFyIGV4cGFuZGVkUHJvcGVydHkgPSBfZXhwYW5kSXJpKGFjdGl2ZUN0eCwgYWN0aXZlUHJvcGVydHksIHt2b2NhYjogdHJ1ZX0pO1xuICB2YXIgdHlwZSA9IGpzb25sZC5nZXRDb250ZXh0VmFsdWUoYWN0aXZlQ3R4LCBhY3RpdmVQcm9wZXJ0eSwgJ0B0eXBlJyk7XG4gIHZhciBjb21wYWN0ZWQgPSBfY29tcGFjdElyaShcbiAgICBhY3RpdmVDdHgsIHZhbHVlWydAaWQnXSwgbnVsbCwge3ZvY2FiOiB0eXBlID09PSAnQHZvY2FiJ30pO1xuXG4gIC8vIGNvbXBhY3QgdG8gc2NhbGFyXG4gIGlmKHR5cGUgPT09ICdAaWQnIHx8IHR5cGUgPT09ICdAdm9jYWInIHx8IGV4cGFuZGVkUHJvcGVydHkgPT09ICdAZ3JhcGgnKSB7XG4gICAgcmV0dXJuIGNvbXBhY3RlZDtcbiAgfVxuXG4gIHZhciBydmFsID0ge307XG4gIHJ2YWxbX2NvbXBhY3RJcmkoYWN0aXZlQ3R4LCAnQGlkJyldID0gY29tcGFjdGVkO1xuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVybSBkZWZpbml0aW9uIGR1cmluZyBjb250ZXh0IHByb2Nlc3NpbmcuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSBsb2NhbEN0eCB0aGUgbG9jYWwgY29udGV4dCBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gdGVybSB0aGUgdGVybSBpbiB0aGUgbG9jYWwgY29udGV4dCB0byBkZWZpbmUgdGhlIG1hcHBpbmcgZm9yLlxuICogQHBhcmFtIGRlZmluZWQgYSBtYXAgb2YgZGVmaW5pbmcvZGVmaW5lZCBrZXlzIHRvIGRldGVjdCBjeWNsZXMgYW5kIHByZXZlbnRcbiAqICAgICAgICAgIGRvdWJsZSBkZWZpbml0aW9ucy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVRlcm1EZWZpbml0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIHRlcm0sIGRlZmluZWQpIHtcbiAgaWYodGVybSBpbiBkZWZpbmVkKSB7XG4gICAgLy8gdGVybSBhbHJlYWR5IGRlZmluZWRcbiAgICBpZihkZWZpbmVkW3Rlcm1dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGN5Y2xlIGRldGVjdGVkXG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0N5Y2xpY2FsIGNvbnRleHQgZGVmaW5pdGlvbiBkZXRlY3RlZC4nLFxuICAgICAgJ2pzb25sZC5DeWNsaWNhbENvbnRleHQnLFxuICAgICAge2NvZGU6ICdjeWNsaWMgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eCwgdGVybTogdGVybX0pO1xuICB9XG5cbiAgLy8gbm93IGRlZmluaW5nIHRlcm1cbiAgZGVmaW5lZFt0ZXJtXSA9IGZhbHNlO1xuXG4gIGlmKF9pc0tleXdvcmQodGVybSkpIHtcbiAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsga2V5d29yZHMgY2Fubm90IGJlIG92ZXJyaWRkZW4uJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAge2NvZGU6ICdrZXl3b3JkIHJlZGVmaW5pdGlvbicsIGNvbnRleHQ6IGxvY2FsQ3R4LCB0ZXJtOiB0ZXJtfSk7XG4gIH1cblxuICBpZih0ZXJtID09PSAnJykge1xuICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIHRlcm0gY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICB7Y29kZTogJ2ludmFsaWQgdGVybSBkZWZpbml0aW9uJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBvbGQgbWFwcGluZ1xuICBpZihhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0pIHtcbiAgICBkZWxldGUgYWN0aXZlQ3R4Lm1hcHBpbmdzW3Rlcm1dO1xuICB9XG5cbiAgLy8gZ2V0IGNvbnRleHQgdGVybSB2YWx1ZVxuICB2YXIgdmFsdWUgPSBsb2NhbEN0eFt0ZXJtXTtcblxuICAvLyBjbGVhciBjb250ZXh0IGVudHJ5XG4gIGlmKHZhbHVlID09PSBudWxsIHx8IChfaXNPYmplY3QodmFsdWUpICYmIHZhbHVlWydAaWQnXSA9PT0gbnVsbCkpIHtcbiAgICBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0gPSBudWxsO1xuICAgIGRlZmluZWRbdGVybV0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgc2hvcnQtaGFuZCB2YWx1ZSB0byBvYmplY3Qgdy9AaWRcbiAgaWYoX2lzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhbHVlID0geydAaWQnOiB2YWx1ZX07XG4gIH1cblxuICBpZighX2lzT2JqZWN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSAnICtcbiAgICAgICdzdHJpbmdzIG9yIG9iamVjdHMuJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAge2NvZGU6ICdpbnZhbGlkIHRlcm0gZGVmaW5pdGlvbicsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gIH1cblxuICAvLyBjcmVhdGUgbmV3IG1hcHBpbmdcbiAgdmFyIG1hcHBpbmcgPSBhY3RpdmVDdHgubWFwcGluZ3NbdGVybV0gPSB7fTtcbiAgbWFwcGluZy5yZXZlcnNlID0gZmFsc2U7XG5cbiAgaWYoJ0ByZXZlcnNlJyBpbiB2YWx1ZSkge1xuICAgIGlmKCdAaWQnIGluIHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEByZXZlcnNlIHRlcm0gZGVmaW5pdGlvbiBtdXN0IG5vdCAnICtcbiAgICAgICAgJ2NvbnRhaW4gQGlkLicsICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgcmV2ZXJzZSBwcm9wZXJ0eScsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIHZhciByZXZlcnNlID0gdmFsdWVbJ0ByZXZlcnNlJ107XG4gICAgaWYoIV9pc1N0cmluZyhyZXZlcnNlKSkge1xuICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgYSBAY29udGV4dCBAcmV2ZXJzZSB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eH0pO1xuICAgIH1cblxuICAgIC8vIGV4cGFuZCBhbmQgYWRkIEBpZCBtYXBwaW5nXG4gICAgdmFyIGlkID0gX2V4cGFuZElyaShcbiAgICAgIGFjdGl2ZUN0eCwgcmV2ZXJzZSwge3ZvY2FiOiB0cnVlLCBiYXNlOiBmYWxzZX0sIGxvY2FsQ3R4LCBkZWZpbmVkKTtcbiAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEBjb250ZXh0IEByZXZlcnNlIHZhbHVlIG11c3QgYmUgYW4gJyArXG4gICAgICAgICdhYnNvbHV0ZSBJUkkgb3IgYSBibGFuayBub2RlIGlkZW50aWZpZXIuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsIHtjb2RlOiAnaW52YWxpZCBJUkkgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIG1hcHBpbmdbJ0BpZCddID0gaWQ7XG4gICAgbWFwcGluZy5yZXZlcnNlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmKCdAaWQnIGluIHZhbHVlKSB7XG4gICAgdmFyIGlkID0gdmFsdWVbJ0BpZCddO1xuICAgIGlmKCFfaXNTdHJpbmcoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhIEBjb250ZXh0IEBpZCB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5ICcgK1xuICAgICAgICAnb2Ygc3RyaW5ncyBvciBhIHN0cmluZy4nLFxuICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJywge2NvZGU6ICdpbnZhbGlkIElSSSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG4gICAgaWYoaWQgIT09IHRlcm0pIHtcbiAgICAgIC8vIGV4cGFuZCBhbmQgYWRkIEBpZCBtYXBwaW5nXG4gICAgICBpZCA9IF9leHBhbmRJcmkoXG4gICAgICAgIGFjdGl2ZUN0eCwgaWQsIHt2b2NhYjogdHJ1ZSwgYmFzZTogZmFsc2V9LCBsb2NhbEN0eCwgZGVmaW5lZCk7XG4gICAgICBpZighX2lzQWJzb2x1dGVJcmkoaWQpICYmICFfaXNLZXl3b3JkKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGEgQGNvbnRleHQgQGlkIHZhbHVlIG11c3QgYmUgYW4gJyArXG4gICAgICAgICAgJ2Fic29sdXRlIElSSSwgYSBibGFuayBub2RlIGlkZW50aWZpZXIsIG9yIGEga2V5d29yZC4nLFxuICAgICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICAgIHtjb2RlOiAnaW52YWxpZCBJUkkgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgICB9XG4gICAgICBtYXBwaW5nWydAaWQnXSA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFsd2F5cyBjb21wdXRlIHdoZXRoZXIgdGVybSBoYXMgYSBjb2xvbiBhcyBhbiBvcHRpbWl6YXRpb24gZm9yXG4gIC8vIF9jb21wYWN0SXJpXG4gIHZhciBjb2xvbiA9IHRlcm0uaW5kZXhPZignOicpO1xuICBtYXBwaW5nLl90ZXJtSGFzQ29sb24gPSAoY29sb24gIT09IC0xKTtcblxuICBpZighKCdAaWQnIGluIG1hcHBpbmcpKSB7XG4gICAgLy8gc2VlIGlmIHRoZSB0ZXJtIGhhcyBhIHByZWZpeFxuICAgIGlmKG1hcHBpbmcuX3Rlcm1IYXNDb2xvbikge1xuICAgICAgdmFyIHByZWZpeCA9IHRlcm0uc3Vic3RyKDAsIGNvbG9uKTtcbiAgICAgIGlmKHByZWZpeCBpbiBsb2NhbEN0eCkge1xuICAgICAgICAvLyBkZWZpbmUgcGFyZW50IHByZWZpeFxuICAgICAgICBfY3JlYXRlVGVybURlZmluaXRpb24oYWN0aXZlQ3R4LCBsb2NhbEN0eCwgcHJlZml4LCBkZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgaWYoYWN0aXZlQ3R4Lm1hcHBpbmdzW3ByZWZpeF0pIHtcbiAgICAgICAgLy8gc2V0IEBpZCBiYXNlZCBvbiBwcmVmaXggcGFyZW50XG4gICAgICAgIHZhciBzdWZmaXggPSB0ZXJtLnN1YnN0cihjb2xvbiArIDEpO1xuICAgICAgICBtYXBwaW5nWydAaWQnXSA9IGFjdGl2ZUN0eC5tYXBwaW5nc1twcmVmaXhdWydAaWQnXSArIHN1ZmZpeDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRlcm0gaXMgYW4gYWJzb2x1dGUgSVJJXG4gICAgICAgIG1hcHBpbmdbJ0BpZCddID0gdGVybTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9uLUlSSXMgKm11c3QqIGRlZmluZSBAaWRzIGlmIEB2b2NhYiBpcyBub3QgYXZhaWxhYmxlXG4gICAgICBpZighKCdAdm9jYWInIGluIGFjdGl2ZUN0eCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCB0ZXJtcyBtdXN0IGRlZmluZSBhbiBAaWQuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgSVJJIG1hcHBpbmcnLCBjb250ZXh0OiBsb2NhbEN0eCwgdGVybTogdGVybX0pO1xuICAgICAgfVxuICAgICAgLy8gcHJlcGVuZCB2b2NhYiB0byB0ZXJtXG4gICAgICBtYXBwaW5nWydAaWQnXSA9IGFjdGl2ZUN0eFsnQHZvY2FiJ10gKyB0ZXJtO1xuICAgIH1cbiAgfVxuXG4gIC8vIElSSSBtYXBwaW5nIG5vdyBkZWZpbmVkXG4gIGRlZmluZWRbdGVybV0gPSB0cnVlO1xuXG4gIGlmKCdAdHlwZScgaW4gdmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHZhbHVlWydAdHlwZSddO1xuICAgIGlmKCFfaXNTdHJpbmcodHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IGFuIEBjb250ZXh0IEB0eXBlIHZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLicsXG4gICAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLFxuICAgICAgICB7Y29kZTogJ2ludmFsaWQgdHlwZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG5cbiAgICBpZih0eXBlICE9PSAnQGlkJyAmJiB0eXBlICE9PSAnQHZvY2FiJykge1xuICAgICAgLy8gZXhwYW5kIEB0eXBlIHRvIGZ1bGwgSVJJXG4gICAgICB0eXBlID0gX2V4cGFuZElyaShcbiAgICAgICAgYWN0aXZlQ3R4LCB0eXBlLCB7dm9jYWI6IHRydWUsIGJhc2U6IGZhbHNlfSwgbG9jYWxDdHgsIGRlZmluZWQpO1xuICAgICAgaWYoIV9pc0Fic29sdXRlSXJpKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgYW4gQGNvbnRleHQgQHR5cGUgdmFsdWUgbXVzdCBiZSBhbiAnICtcbiAgICAgICAgICAnYWJzb2x1dGUgSVJJLicsXG4gICAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgICAge2NvZGU6ICdpbnZhbGlkIHR5cGUgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgICB9XG4gICAgICBpZih0eXBlLmluZGV4T2YoJ186JykgPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBhbiBAY29udGV4dCBAdHlwZSB2YWx1ZXMgbXVzdCBiZSBhbiBJUkksICcgK1xuICAgICAgICAgICdub3QgYSBibGFuayBub2RlIGlkZW50aWZpZXIuJyxcbiAgICAgICAgICAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgdHlwZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgQHR5cGUgdG8gbWFwcGluZ1xuICAgIG1hcHBpbmdbJ0B0eXBlJ10gPSB0eXBlO1xuICB9XG5cbiAgaWYoJ0Bjb250YWluZXInIGluIHZhbHVlKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHZhbHVlWydAY29udGFpbmVyJ107XG4gICAgaWYoY29udGFpbmVyICE9PSAnQGxpc3QnICYmIGNvbnRhaW5lciAhPT0gJ0BzZXQnICYmXG4gICAgICBjb250YWluZXIgIT09ICdAaW5kZXgnICYmIGNvbnRhaW5lciAhPT0gJ0BsYW5ndWFnZScpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IEBjb250YWluZXIgdmFsdWUgbXVzdCBiZSAnICtcbiAgICAgICAgJ29uZSBvZiB0aGUgZm9sbG93aW5nOiBAbGlzdCwgQHNldCwgQGluZGV4LCBvciBAbGFuZ3VhZ2UuJyxcbiAgICAgICAgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBjb250YWluZXIgbWFwcGluZycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gICAgfVxuICAgIGlmKG1hcHBpbmcucmV2ZXJzZSAmJiBjb250YWluZXIgIT09ICdAaW5kZXgnICYmIGNvbnRhaW5lciAhPT0gJ0BzZXQnICYmXG4gICAgICBjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IEBjb250YWluZXIgdmFsdWUgZm9yIGEgQHJldmVyc2UgJyArXG4gICAgICAgICd0eXBlIGRlZmluaXRpb24gbXVzdCBiZSBAaW5kZXggb3IgQHNldC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgICAge2NvZGU6ICdpbnZhbGlkIHJldmVyc2UgcHJvcGVydHknLCBjb250ZXh0OiBsb2NhbEN0eH0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBAY29udGFpbmVyIHRvIG1hcHBpbmdcbiAgICBtYXBwaW5nWydAY29udGFpbmVyJ10gPSBjb250YWluZXI7XG4gIH1cblxuICBpZignQGxhbmd1YWdlJyBpbiB2YWx1ZSAmJiAhKCdAdHlwZScgaW4gdmFsdWUpKSB7XG4gICAgdmFyIGxhbmd1YWdlID0gdmFsdWVbJ0BsYW5ndWFnZSddO1xuICAgIGlmKGxhbmd1YWdlICE9PSBudWxsICYmICFfaXNTdHJpbmcobGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIEpTT04tTEQgc3ludGF4OyBAY29udGV4dCBAbGFuZ3VhZ2UgdmFsdWUgbXVzdCBiZSAnICtcbiAgICAgICAgJ2Egc3RyaW5nIG9yIG51bGwuJywgJ2pzb25sZC5TeW50YXhFcnJvcicsXG4gICAgICAgIHtjb2RlOiAnaW52YWxpZCBsYW5ndWFnZSBtYXBwaW5nJywgY29udGV4dDogbG9jYWxDdHh9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgQGxhbmd1YWdlIHRvIG1hcHBpbmdcbiAgICBpZihsYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBtYXBwaW5nWydAbGFuZ3VhZ2UnXSA9IGxhbmd1YWdlO1xuICB9XG5cbiAgLy8gZGlzYWxsb3cgYWxpYXNpbmcgQGNvbnRleHQgYW5kIEBwcmVzZXJ2ZVxuICB2YXIgaWQgPSBtYXBwaW5nWydAaWQnXTtcbiAgaWYoaWQgPT09ICdAY29udGV4dCcgfHwgaWQgPT09ICdAcHJlc2VydmUnKSB7XG4gICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgJ0ludmFsaWQgSlNPTi1MRCBzeW50YXg7IEBjb250ZXh0IGFuZCBAcHJlc2VydmUgY2Fubm90IGJlIGFsaWFzZWQuJyxcbiAgICAgICdqc29ubGQuU3ludGF4RXJyb3InLCB7Y29kZTogJ2ludmFsaWQga2V5d29yZCBhbGlhcycsIGNvbnRleHQ6IGxvY2FsQ3R4fSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBhbmRzIGEgc3RyaW5nIHRvIGEgZnVsbCBJUkkuIFRoZSBzdHJpbmcgbWF5IGJlIGEgdGVybSwgYSBwcmVmaXgsIGFcbiAqIHJlbGF0aXZlIElSSSwgb3IgYW4gYWJzb2x1dGUgSVJJLiBUaGUgYXNzb2NpYXRlZCBhYnNvbHV0ZSBJUkkgd2lsbCBiZVxuICogcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUN0eCB0aGUgY3VycmVudCBhY3RpdmUgY29udGV4dC5cbiAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHRvIGV4cGFuZC5cbiAqIEBwYXJhbSByZWxhdGl2ZVRvIG9wdGlvbnMgZm9yIGhvdyB0byByZXNvbHZlIHJlbGF0aXZlIElSSXM6XG4gKiAgICAgICAgICBiYXNlOiB0cnVlIHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgYmFzZSBJUkksIGZhbHNlIG5vdCB0by5cbiAqICAgICAgICAgIHZvY2FiOiB0cnVlIHRvIGNvbmNhdGVuYXRlIGFmdGVyIEB2b2NhYiwgZmFsc2Ugbm90IHRvLlxuICogQHBhcmFtIGxvY2FsQ3R4IHRoZSBsb2NhbCBjb250ZXh0IGJlaW5nIHByb2Nlc3NlZCAob25seSBnaXZlbiBpZiBjYWxsZWRcbiAqICAgICAgICAgIGR1cmluZyBjb250ZXh0IHByb2Nlc3NpbmcpLlxuICogQHBhcmFtIGRlZmluZWQgYSBtYXAgZm9yIHRyYWNraW5nIGN5Y2xlcyBpbiBjb250ZXh0IGRlZmluaXRpb25zIChvbmx5IGdpdmVuXG4gKiAgICAgICAgICBpZiBjYWxsZWQgZHVyaW5nIGNvbnRleHQgcHJvY2Vzc2luZykuXG4gKlxuICogQHJldHVybiB0aGUgZXhwYW5kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9leHBhbmRJcmkoYWN0aXZlQ3R4LCB2YWx1ZSwgcmVsYXRpdmVUbywgbG9jYWxDdHgsIGRlZmluZWQpIHtcbiAgLy8gYWxyZWFkeSBleHBhbmRlZFxuICBpZih2YWx1ZSA9PT0gbnVsbCB8fCBfaXNLZXl3b3JkKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIGVuc3VyZSB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZ1xuICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG5cbiAgLy8gZGVmaW5lIHRlcm0gZGVwZW5kZW5jeSBpZiBub3QgZGVmaW5lZFxuICBpZihsb2NhbEN0eCAmJiB2YWx1ZSBpbiBsb2NhbEN0eCAmJiBkZWZpbmVkW3ZhbHVlXSAhPT0gdHJ1ZSkge1xuICAgIF9jcmVhdGVUZXJtRGVmaW5pdGlvbihhY3RpdmVDdHgsIGxvY2FsQ3R4LCB2YWx1ZSwgZGVmaW5lZCk7XG4gIH1cblxuICByZWxhdGl2ZVRvID0gcmVsYXRpdmVUbyB8fCB7fTtcbiAgaWYocmVsYXRpdmVUby52b2NhYikge1xuICAgIHZhciBtYXBwaW5nID0gYWN0aXZlQ3R4Lm1hcHBpbmdzW3ZhbHVlXTtcblxuICAgIC8vIHZhbHVlIGlzIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoIGEgbnVsbCBtYXBwaW5nXG4gICAgaWYobWFwcGluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYobWFwcGluZykge1xuICAgICAgLy8gdmFsdWUgaXMgYSB0ZXJtXG4gICAgICByZXR1cm4gbWFwcGluZ1snQGlkJ107XG4gICAgfVxuICB9XG5cbiAgLy8gc3BsaXQgdmFsdWUgaW50byBwcmVmaXg6c3VmZml4XG4gIHZhciBjb2xvbiA9IHZhbHVlLmluZGV4T2YoJzonKTtcbiAgaWYoY29sb24gIT09IC0xKSB7XG4gICAgdmFyIHByZWZpeCA9IHZhbHVlLnN1YnN0cigwLCBjb2xvbik7XG4gICAgdmFyIHN1ZmZpeCA9IHZhbHVlLnN1YnN0cihjb2xvbiArIDEpO1xuXG4gICAgLy8gZG8gbm90IGV4cGFuZCBibGFuayBub2RlcyAocHJlZml4IG9mICdfJykgb3IgYWxyZWFkeS1hYnNvbHV0ZVxuICAgIC8vIElSSXMgKHN1ZmZpeCBvZiAnLy8nKVxuICAgIGlmKHByZWZpeCA9PT0gJ18nIHx8IHN1ZmZpeC5pbmRleE9mKCcvLycpID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gcHJlZml4IGRlcGVuZGVuY3kgbm90IGRlZmluZWQsIGRlZmluZSBpdFxuICAgIGlmKGxvY2FsQ3R4ICYmIHByZWZpeCBpbiBsb2NhbEN0eCkge1xuICAgICAgX2NyZWF0ZVRlcm1EZWZpbml0aW9uKGFjdGl2ZUN0eCwgbG9jYWxDdHgsIHByZWZpeCwgZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gdXNlIG1hcHBpbmcgaWYgcHJlZml4IGlzIGRlZmluZWRcbiAgICB2YXIgbWFwcGluZyA9IGFjdGl2ZUN0eC5tYXBwaW5nc1twcmVmaXhdO1xuICAgIGlmKG1hcHBpbmcpIHtcbiAgICAgIHJldHVybiBtYXBwaW5nWydAaWQnXSArIHN1ZmZpeDtcbiAgICB9XG5cbiAgICAvLyBhbHJlYWR5IGFic29sdXRlIElSSVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIHByZXBlbmQgdm9jYWJcbiAgaWYocmVsYXRpdmVUby52b2NhYiAmJiAnQHZvY2FiJyBpbiBhY3RpdmVDdHgpIHtcbiAgICByZXR1cm4gYWN0aXZlQ3R4WydAdm9jYWInXSArIHZhbHVlO1xuICB9XG5cbiAgLy8gcHJlcGVuZCBiYXNlXG4gIHZhciBydmFsID0gdmFsdWU7XG4gIGlmKHJlbGF0aXZlVG8uYmFzZSkge1xuICAgIHJ2YWwgPSBqc29ubGQucHJlcGVuZEJhc2UoYWN0aXZlQ3R4WydAYmFzZSddLCBydmFsKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG5mdW5jdGlvbiBfcHJlcGVuZEJhc2UoYmFzZSwgaXJpKSB7XG4gIC8vIHNraXAgSVJJIHByb2Nlc3NpbmdcbiAgaWYoYmFzZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cbiAgLy8gYWxyZWFkeSBhbiBhYnNvbHV0ZSBJUklcbiAgaWYoaXJpLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gaXJpO1xuICB9XG5cbiAgLy8gcGFyc2UgYmFzZSBpZiBpdCBpcyBhIHN0cmluZ1xuICBpZihfaXNTdHJpbmcoYmFzZSkpIHtcbiAgICBiYXNlID0ganNvbmxkLnVybC5wYXJzZShiYXNlIHx8ICcnKTtcbiAgfVxuXG4gIC8vIHBhcnNlIGdpdmVuIElSSVxuICB2YXIgcmVsID0ganNvbmxkLnVybC5wYXJzZShpcmkpO1xuXG4gIC8vIHBlciBSRkMzOTg2IDUuMi4yXG4gIHZhciB0cmFuc2Zvcm0gPSB7XG4gICAgcHJvdG9jb2w6IGJhc2UucHJvdG9jb2wgfHwgJydcbiAgfTtcblxuICBpZihyZWwuYXV0aG9yaXR5ICE9PSBudWxsKSB7XG4gICAgdHJhbnNmb3JtLmF1dGhvcml0eSA9IHJlbC5hdXRob3JpdHk7XG4gICAgdHJhbnNmb3JtLnBhdGggPSByZWwucGF0aDtcbiAgICB0cmFuc2Zvcm0ucXVlcnkgPSByZWwucXVlcnk7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNmb3JtLmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5O1xuXG4gICAgaWYocmVsLnBhdGggPT09ICcnKSB7XG4gICAgICB0cmFuc2Zvcm0ucGF0aCA9IGJhc2UucGF0aDtcbiAgICAgIGlmKHJlbC5xdWVyeSAhPT0gbnVsbCkge1xuICAgICAgICB0cmFuc2Zvcm0ucXVlcnkgPSByZWwucXVlcnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2Zvcm0ucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihyZWwucGF0aC5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgICAgLy8gSVJJIHJlcHJlc2VudHMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAgICB0cmFuc2Zvcm0ucGF0aCA9IHJlbC5wYXRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbWVyZ2UgcGF0aHNcbiAgICAgICAgdmFyIHBhdGggPSBiYXNlLnBhdGg7XG5cbiAgICAgICAgLy8gYXBwZW5kIHJlbGF0aXZlIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgbGFzdCBkaXJlY3RvcnkgZnJvbSBiYXNlXG4gICAgICAgIGlmKHJlbC5wYXRoICE9PSAnJykge1xuICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICAgICAgICBpZihwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aC5zdWJzdHIoLTEpICE9PSAnLycpIHtcbiAgICAgICAgICAgIHBhdGggKz0gJy8nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoICs9IHJlbC5wYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhbnNmb3JtLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgICAgdHJhbnNmb3JtLnF1ZXJ5ID0gcmVsLnF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBzbGFzaGVzIGFuZCBkb3RzIGluIHBhdGhcbiAgdHJhbnNmb3JtLnBhdGggPSBfcmVtb3ZlRG90U2VnbWVudHModHJhbnNmb3JtLnBhdGgsICEhdHJhbnNmb3JtLmF1dGhvcml0eSk7XG5cbiAgLy8gY29uc3RydWN0IFVSTFxuICB2YXIgcnZhbCA9IHRyYW5zZm9ybS5wcm90b2NvbDtcbiAgaWYodHJhbnNmb3JtLmF1dGhvcml0eSAhPT0gbnVsbCkge1xuICAgIHJ2YWwgKz0gJy8vJyArIHRyYW5zZm9ybS5hdXRob3JpdHk7XG4gIH1cbiAgcnZhbCArPSB0cmFuc2Zvcm0ucGF0aDtcbiAgaWYodHJhbnNmb3JtLnF1ZXJ5ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnPycgKyB0cmFuc2Zvcm0ucXVlcnk7XG4gIH1cbiAgaWYocmVsLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnIycgKyByZWwuZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBoYW5kbGUgZW1wdHkgYmFzZVxuICBpZihydmFsID09PSAnJykge1xuICAgIHJ2YWwgPSAnLi8nO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIGJhc2UgSVJJIGZyb20gdGhlIGdpdmVuIGFic29sdXRlIElSSS5cbiAqXG4gKiBAcGFyYW0gYmFzZSB0aGUgYmFzZSBJUkkuXG4gKiBAcGFyYW0gaXJpIHRoZSBhYnNvbHV0ZSBJUkkuXG4gKlxuICogQHJldHVybiB0aGUgcmVsYXRpdmUgSVJJIGlmIHJlbGF0aXZlIHRvIGJhc2UsIG90aGVyd2lzZSB0aGUgYWJzb2x1dGUgSVJJLlxuICovXG5mdW5jdGlvbiBfcmVtb3ZlQmFzZShiYXNlLCBpcmkpIHtcbiAgLy8gc2tpcCBJUkkgcHJvY2Vzc2luZ1xuICBpZihiYXNlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGlyaTtcbiAgfVxuXG4gIGlmKF9pc1N0cmluZyhiYXNlKSkge1xuICAgIGJhc2UgPSBqc29ubGQudXJsLnBhcnNlKGJhc2UgfHwgJycpO1xuICB9XG5cbiAgLy8gZXN0YWJsaXNoIGJhc2Ugcm9vdFxuICB2YXIgcm9vdCA9ICcnO1xuICBpZihiYXNlLmhyZWYgIT09ICcnKSB7XG4gICAgcm9vdCArPSAoYmFzZS5wcm90b2NvbCB8fCAnJykgKyAnLy8nICsgKGJhc2UuYXV0aG9yaXR5IHx8ICcnKTtcbiAgfSBlbHNlIGlmKGlyaS5pbmRleE9mKCcvLycpKSB7XG4gICAgLy8gc3VwcG9ydCBuZXR3b3JrLXBhdGggcmVmZXJlbmNlIHdpdGggZW1wdHkgYmFzZVxuICAgIHJvb3QgKz0gJy8vJztcbiAgfVxuXG4gIC8vIElSSSBub3QgcmVsYXRpdmUgdG8gYmFzZVxuICBpZihpcmkuaW5kZXhPZihyb290KSAhPT0gMCkge1xuICAgIHJldHVybiBpcmk7XG4gIH1cblxuICAvLyByZW1vdmUgcm9vdCBmcm9tIElSSSBhbmQgcGFyc2UgcmVtYWluZGVyXG4gIHZhciByZWwgPSBqc29ubGQudXJsLnBhcnNlKGlyaS5zdWJzdHIocm9vdC5sZW5ndGgpKTtcblxuICAvLyByZW1vdmUgcGF0aCBzZWdtZW50cyB0aGF0IG1hdGNoIChkbyBub3QgcmVtb3ZlIGxhc3Qgc2VnbWVudCB1bmxlc3MgdGhlcmVcbiAgLy8gaXMgYSBoYXNoIG9yIHF1ZXJ5KVxuICB2YXIgYmFzZVNlZ21lbnRzID0gYmFzZS5ub3JtYWxpemVkUGF0aC5zcGxpdCgnLycpO1xuICB2YXIgaXJpU2VnbWVudHMgPSByZWwubm9ybWFsaXplZFBhdGguc3BsaXQoJy8nKTtcbiAgdmFyIGxhc3QgPSAocmVsLmZyYWdtZW50IHx8IHJlbC5xdWVyeSkgPyAwIDogMTtcbiAgd2hpbGUoYmFzZVNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgaXJpU2VnbWVudHMubGVuZ3RoID4gbGFzdCkge1xuICAgIGlmKGJhc2VTZWdtZW50c1swXSAhPT0gaXJpU2VnbWVudHNbMF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBiYXNlU2VnbWVudHMuc2hpZnQoKTtcbiAgICBpcmlTZWdtZW50cy5zaGlmdCgpO1xuICB9XG5cbiAgLy8gdXNlICcuLi8nIGZvciBlYWNoIG5vbi1tYXRjaGluZyBiYXNlIHNlZ21lbnRcbiAgdmFyIHJ2YWwgPSAnJztcbiAgaWYoYmFzZVNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBkb24ndCBjb3VudCB0aGUgbGFzdCBzZWdtZW50IChpZiBpdCBlbmRzIHdpdGggJy8nIGxhc3QgcGF0aCBkb2Vzbid0XG4gICAgLy8gY291bnQgYW5kIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggJy8nIGl0IGlzbid0IGEgcGF0aClcbiAgICBiYXNlU2VnbWVudHMucG9wKCk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhc2VTZWdtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgcnZhbCArPSAnLi4vJztcbiAgICB9XG4gIH1cblxuICAvLyBwcmVwZW5kIHJlbWFpbmluZyBzZWdtZW50c1xuICBydmFsICs9IGlyaVNlZ21lbnRzLmpvaW4oJy8nKTtcblxuICAvLyBhZGQgcXVlcnkgYW5kIGhhc2hcbiAgaWYocmVsLnF1ZXJ5ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnPycgKyByZWwucXVlcnk7XG4gIH1cbiAgaWYocmVsLmZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgcnZhbCArPSAnIycgKyByZWwuZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBoYW5kbGUgZW1wdHkgYmFzZVxuICBpZihydmFsID09PSAnJykge1xuICAgIHJ2YWwgPSAnLi8nO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW5pdGlhbCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiYXNlXSB0aGUgZG9jdW1lbnQgYmFzZSBJUkkuXG4gKlxuICogQHJldHVybiB0aGUgaW5pdGlhbCBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBfZ2V0SW5pdGlhbENvbnRleHQob3B0aW9ucykge1xuICB2YXIgYmFzZSA9IGpzb25sZC51cmwucGFyc2Uob3B0aW9ucy5iYXNlIHx8ICcnKTtcbiAgcmV0dXJuIHtcbiAgICAnQGJhc2UnOiBiYXNlLFxuICAgIG1hcHBpbmdzOiB7fSxcbiAgICBpbnZlcnNlOiBudWxsLFxuICAgIGdldEludmVyc2U6IF9jcmVhdGVJbnZlcnNlQ29udGV4dCxcbiAgICBjbG9uZTogX2Nsb25lQWN0aXZlQ29udGV4dFxuICB9O1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gaW52ZXJzZSBjb250ZXh0IGZvciB1c2UgaW4gdGhlIGNvbXBhY3Rpb24gYWxnb3JpdGhtLCBpZlxuICAgKiBub3QgYWxyZWFkeSBnZW5lcmF0ZWQgZm9yIHRoZSBnaXZlbiBhY3RpdmUgY29udGV4dC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgaW52ZXJzZSBjb250ZXh0LlxuICAgKi9cbiAgZnVuY3Rpb24gX2NyZWF0ZUludmVyc2VDb250ZXh0KCkge1xuICAgIHZhciBhY3RpdmVDdHggPSB0aGlzO1xuXG4gICAgLy8gbGF6aWx5IGNyZWF0ZSBpbnZlcnNlXG4gICAgaWYoYWN0aXZlQ3R4LmludmVyc2UpIHtcbiAgICAgIHJldHVybiBhY3RpdmVDdHguaW52ZXJzZTtcbiAgICB9XG4gICAgdmFyIGludmVyc2UgPSBhY3RpdmVDdHguaW52ZXJzZSA9IHt9O1xuXG4gICAgLy8gdmFyaWFibGVzIGZvciBidWlsZGluZyBmYXN0IENVUklFIG1hcFxuICAgIHZhciBmYXN0Q3VyaWVNYXAgPSBhY3RpdmVDdHguZmFzdEN1cmllTWFwID0ge307XG4gICAgdmFyIGlyaXNUb1Rlcm1zID0ge307XG5cbiAgICAvLyBoYW5kbGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgIHZhciBkZWZhdWx0TGFuZ3VhZ2UgPSBhY3RpdmVDdHhbJ0BsYW5ndWFnZSddIHx8ICdAbm9uZSc7XG5cbiAgICAvLyBjcmVhdGUgdGVybSBzZWxlY3Rpb25zIGZvciBlYWNoIG1hcHBpbmcgaW4gdGhlIGNvbnRleHQsIG9yZGVyZWQgYnlcbiAgICAvLyBzaG9ydGVzdCBhbmQgdGhlbiBsZXhpY29ncmFwaGljYWxseSBsZWFzdFxuICAgIHZhciBtYXBwaW5ncyA9IGFjdGl2ZUN0eC5tYXBwaW5ncztcbiAgICB2YXIgdGVybXMgPSBPYmplY3Qua2V5cyhtYXBwaW5ncykuc29ydChfY29tcGFyZVNob3J0ZXN0TGVhc3QpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0ZXJtcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHRlcm0gPSB0ZXJtc1tpXTtcbiAgICAgIHZhciBtYXBwaW5nID0gbWFwcGluZ3NbdGVybV07XG4gICAgICBpZihtYXBwaW5nID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGFpbmVyID0gbWFwcGluZ1snQGNvbnRhaW5lciddIHx8ICdAbm9uZSc7XG5cbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBldmVyeSBJUkkgaW4gdGhlIG1hcHBpbmdcbiAgICAgIHZhciBpZHMgPSBtYXBwaW5nWydAaWQnXTtcbiAgICAgIGlmKCFfaXNBcnJheShpZHMpKSB7XG4gICAgICAgIGlkcyA9IFtpZHNdO1xuICAgICAgfVxuICAgICAgZm9yKHZhciBpaSA9IDA7IGlpIDwgaWRzLmxlbmd0aDsgKytpaSkge1xuICAgICAgICB2YXIgaXJpID0gaWRzW2lpXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gaW52ZXJzZVtpcmldO1xuICAgICAgICB2YXIgaXNLZXl3b3JkID0gX2lzS2V5d29yZChpcmkpO1xuXG4gICAgICAgIGlmKCFlbnRyeSkge1xuICAgICAgICAgIC8vIGluaXRpYWxpemUgZW50cnlcbiAgICAgICAgICBpbnZlcnNlW2lyaV0gPSBlbnRyeSA9IHt9O1xuXG4gICAgICAgICAgaWYoIWlzS2V5d29yZCAmJiAhbWFwcGluZy5fdGVybUhhc0NvbG9uKSB7XG4gICAgICAgICAgICAvLyBpbml0IElSSSB0byB0ZXJtIG1hcCBhbmQgZmFzdCBDVVJJRSBwcmVmaXhlc1xuICAgICAgICAgICAgaXJpc1RvVGVybXNbaXJpXSA9IFt0ZXJtXTtcbiAgICAgICAgICAgIHZhciBmYXN0Q3VyaWVFbnRyeSA9IHtpcmk6IGlyaSwgdGVybXM6IGlyaXNUb1Rlcm1zW2lyaV19O1xuICAgICAgICAgICAgaWYoaXJpWzBdIGluIGZhc3RDdXJpZU1hcCkge1xuICAgICAgICAgICAgICBmYXN0Q3VyaWVNYXBbaXJpWzBdXS5wdXNoKGZhc3RDdXJpZUVudHJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZhc3RDdXJpZU1hcFtpcmlbMF1dID0gW2Zhc3RDdXJpZUVudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZighaXNLZXl3b3JkICYmICFtYXBwaW5nLl90ZXJtSGFzQ29sb24pIHtcbiAgICAgICAgICAvLyBhZGQgSVJJIHRvIHRlcm0gbWF0Y2hcbiAgICAgICAgICBpcmlzVG9UZXJtc1tpcmldLnB1c2godGVybSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbmV3IGVudHJ5XG4gICAgICAgIGlmKCFlbnRyeVtjb250YWluZXJdKSB7XG4gICAgICAgICAgZW50cnlbY29udGFpbmVyXSA9IHtcbiAgICAgICAgICAgICdAbGFuZ3VhZ2UnOiB7fSxcbiAgICAgICAgICAgICdAdHlwZSc6IHt9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyeSA9IGVudHJ5W2NvbnRhaW5lcl07XG5cbiAgICAgICAgaWYobWFwcGluZy5yZXZlcnNlKSB7XG4gICAgICAgICAgLy8gdGVybSBpcyBwcmVmZXJyZWQgZm9yIHZhbHVlcyB1c2luZyBAcmV2ZXJzZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCAnQHJldmVyc2UnKTtcbiAgICAgICAgfSBlbHNlIGlmKCdAdHlwZScgaW4gbWFwcGluZykge1xuICAgICAgICAgIC8vIHRlcm0gaXMgcHJlZmVycmVkIGZvciB2YWx1ZXMgdXNpbmcgc3BlY2lmaWMgdHlwZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCBtYXBwaW5nWydAdHlwZSddKTtcbiAgICAgICAgfSBlbHNlIGlmKCdAbGFuZ3VhZ2UnIGluIG1hcHBpbmcpIHtcbiAgICAgICAgICAvLyB0ZXJtIGlzIHByZWZlcnJlZCBmb3IgdmFsdWVzIHVzaW5nIHNwZWNpZmljIGxhbmd1YWdlXG4gICAgICAgICAgdmFyIGxhbmd1YWdlID0gbWFwcGluZ1snQGxhbmd1YWdlJ10gfHwgJ0BudWxsJztcbiAgICAgICAgICBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeVsnQGxhbmd1YWdlJ10sIGxhbmd1YWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0ZXJtIGlzIHByZWZlcnJlZCBmb3IgdmFsdWVzIHcvZGVmYXVsdCBsYW5ndWFnZSBvciBubyB0eXBlIGFuZFxuICAgICAgICAgIC8vIG5vIGxhbmd1YWdlXG4gICAgICAgICAgLy8gYWRkIGFuIGVudHJ5IGZvciB0aGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAbGFuZ3VhZ2UnXSwgZGVmYXVsdExhbmd1YWdlKTtcblxuICAgICAgICAgIC8vIGFkZCBlbnRyaWVzIGZvciBubyB0eXBlIGFuZCBubyBsYW5ndWFnZVxuICAgICAgICAgIF9hZGRQcmVmZXJyZWRUZXJtKG1hcHBpbmcsIHRlcm0sIGVudHJ5WydAdHlwZSddLCAnQG5vbmUnKTtcbiAgICAgICAgICBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeVsnQGxhbmd1YWdlJ10sICdAbm9uZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnVpbGQgZmFzdCBDVVJJRSBtYXBcbiAgICBmb3IodmFyIGtleSBpbiBmYXN0Q3VyaWVNYXApIHtcbiAgICAgIF9idWlsZElyaU1hcChmYXN0Q3VyaWVNYXAsIGtleSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludmVyc2U7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gdG8gYnVpbGQgYSBsb29rdXAgbWFwIGZvciBxdWlja2x5IGZpbmRpbmdcbiAgICogcG90ZW50aWFsIENVUklFcy5cbiAgICpcbiAgICogQHBhcmFtIGlyaU1hcCB0aGUgbWFwIHRvIGJ1aWxkLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBjdXJyZW50IGtleSBpbiB0aGUgbWFwIHRvIHdvcmsgb24uXG4gICAqIEBwYXJhbSBpZHggdGhlIGluZGV4IGludG8gdGhlIElSSSB0byBjb21wYXJlLlxuICAgKi9cbiAgZnVuY3Rpb24gX2J1aWxkSXJpTWFwKGlyaU1hcCwga2V5LCBpZHgpIHtcbiAgICB2YXIgZW50cmllcyA9IGlyaU1hcFtrZXldO1xuICAgIHZhciBuZXh0ID0gaXJpTWFwW2tleV0gPSB7fTtcblxuICAgIHZhciBpcmk7XG4gICAgdmFyIGxldHRlcjtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgaXJpID0gZW50cmllc1tpXS5pcmk7XG4gICAgICBpZihpZHggPj0gaXJpLmxlbmd0aCkge1xuICAgICAgICBsZXR0ZXIgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldHRlciA9IGlyaVtpZHhdO1xuICAgICAgfVxuICAgICAgaWYobGV0dGVyIGluIG5leHQpIHtcbiAgICAgICAgbmV4dFtsZXR0ZXJdLnB1c2goZW50cmllc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0W2xldHRlcl0gPSBbZW50cmllc1tpXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKHZhciBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYoa2V5ID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIF9idWlsZElyaU1hcChuZXh0LCBrZXksIGlkeCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSB0ZXJtIGZvciB0aGUgZ2l2ZW4gZW50cnkgaWYgbm90IGFscmVhZHkgYWRkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBtYXBwaW5nIHRoZSB0ZXJtIG1hcHBpbmcuXG4gICAqIEBwYXJhbSB0ZXJtIHRoZSB0ZXJtIHRvIGFkZC5cbiAgICogQHBhcmFtIGVudHJ5IHRoZSBpbnZlcnNlIGNvbnRleHQgdHlwZU9yTGFuZ3VhZ2UgZW50cnkgdG8gYWRkIHRvLlxuICAgKiBAcGFyYW0gdHlwZU9yTGFuZ3VhZ2VWYWx1ZSB0aGUga2V5IGluIHRoZSBlbnRyeSB0byBhZGQgdG8uXG4gICAqL1xuICBmdW5jdGlvbiBfYWRkUHJlZmVycmVkVGVybShtYXBwaW5nLCB0ZXJtLCBlbnRyeSwgdHlwZU9yTGFuZ3VhZ2VWYWx1ZSkge1xuICAgIGlmKCEodHlwZU9yTGFuZ3VhZ2VWYWx1ZSBpbiBlbnRyeSkpIHtcbiAgICAgIGVudHJ5W3R5cGVPckxhbmd1YWdlVmFsdWVdID0gdGVybTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvbmVzIGFuIGFjdGl2ZSBjb250ZXh0LCBjcmVhdGluZyBhIGNoaWxkIGFjdGl2ZSBjb250ZXh0LlxuICAgKlxuICAgKiBAcmV0dXJuIGEgY2xvbmUgKGNoaWxkKSBvZiB0aGUgYWN0aXZlIGNvbnRleHQuXG4gICAqL1xuICBmdW5jdGlvbiBfY2xvbmVBY3RpdmVDb250ZXh0KCkge1xuICAgIHZhciBjaGlsZCA9IHt9O1xuICAgIGNoaWxkWydAYmFzZSddID0gdGhpc1snQGJhc2UnXTtcbiAgICBjaGlsZC5tYXBwaW5ncyA9IF9jbG9uZSh0aGlzLm1hcHBpbmdzKTtcbiAgICBjaGlsZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgY2hpbGQuaW52ZXJzZSA9IG51bGw7XG4gICAgY2hpbGQuZ2V0SW52ZXJzZSA9IHRoaXMuZ2V0SW52ZXJzZTtcbiAgICBpZignQGxhbmd1YWdlJyBpbiB0aGlzKSB7XG4gICAgICBjaGlsZFsnQGxhbmd1YWdlJ10gPSB0aGlzWydAbGFuZ3VhZ2UnXTtcbiAgICB9XG4gICAgaWYoJ0B2b2NhYicgaW4gdGhpcykge1xuICAgICAgY2hpbGRbJ0B2b2NhYiddID0gdGhpc1snQHZvY2FiJ107XG4gICAgfVxuICAgIHJldHVybiBjaGlsZDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIHZhbHVlIGlzIGEga2V5d29yZC5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGtleXdvcmQsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzS2V5d29yZCh2KSB7XG4gIGlmKCFfaXNTdHJpbmcodikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3dpdGNoKHYpIHtcbiAgY2FzZSAnQGJhc2UnOlxuICBjYXNlICdAY29udGV4dCc6XG4gIGNhc2UgJ0Bjb250YWluZXInOlxuICBjYXNlICdAZGVmYXVsdCc6XG4gIGNhc2UgJ0BlbWJlZCc6XG4gIGNhc2UgJ0BleHBsaWNpdCc6XG4gIGNhc2UgJ0BncmFwaCc6XG4gIGNhc2UgJ0BpZCc6XG4gIGNhc2UgJ0BpbmRleCc6XG4gIGNhc2UgJ0BsYW5ndWFnZSc6XG4gIGNhc2UgJ0BsaXN0JzpcbiAgY2FzZSAnQG9taXREZWZhdWx0JzpcbiAgY2FzZSAnQHByZXNlcnZlJzpcbiAgY2FzZSAnQHJlcXVpcmVBbGwnOlxuICBjYXNlICdAcmV2ZXJzZSc6XG4gIGNhc2UgJ0BzZXQnOlxuICBjYXNlICdAdHlwZSc6XG4gIGNhc2UgJ0B2YWx1ZSc6XG4gIGNhc2UgJ0B2b2NhYic6XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gT2JqZWN0LlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIE9iamVjdCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNPYmplY3Qodikge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gZW1wdHkgT2JqZWN0LlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGVtcHR5IE9iamVjdCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNFbXB0eU9iamVjdCh2KSB7XG4gIHJldHVybiBfaXNPYmplY3QodikgJiYgT2JqZWN0LmtleXModikubGVuZ3RoID09PSAwO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gQXJyYXkuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gQXJyYXksIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzQXJyYXkodikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KTtcbn1cblxuLyoqXG4gKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBAdHlwZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIF92YWxpZGF0ZVR5cGVWYWx1ZSh2KSB7XG4gIC8vIGNhbiBiZSBhIHN0cmluZyBvciBhbiBlbXB0eSBvYmplY3RcbiAgaWYoX2lzU3RyaW5nKHYpIHx8IF9pc0VtcHR5T2JqZWN0KHYpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBhcnJheVxuICB2YXIgaXNWYWxpZCA9IGZhbHNlO1xuICBpZihfaXNBcnJheSh2KSkge1xuICAgIC8vIG11c3QgY29udGFpbiBvbmx5IHN0cmluZ3NcbiAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSkge1xuICAgICAgaWYoIShfaXNTdHJpbmcodltpXSkpKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYoIWlzVmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAnSW52YWxpZCBKU09OLUxEIHN5bnRheDsgXCJAdHlwZVwiIHZhbHVlIG11c3QgYSBzdHJpbmcsIGFuIGFycmF5IG9mICcgK1xuICAgICAgJ3N0cmluZ3MsIG9yIGFuIGVtcHR5IG9iamVjdC4nLCAnanNvbmxkLlN5bnRheEVycm9yJyxcbiAgICAgIHtjb2RlOiAnaW52YWxpZCB0eXBlIHZhbHVlJywgdmFsdWU6IHZ9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBTdHJpbmcuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBTdHJpbmcsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzU3RyaW5nKHYpIHtcbiAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHxcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodikgPT09ICdbb2JqZWN0IFN0cmluZ10nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgTnVtYmVyLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgTnVtYmVyLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc051bWJlcih2KSB7XG4gIHJldHVybiAodHlwZW9mIHYgPT09ICdudW1iZXInIHx8XG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBOdW1iZXJdJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRvdWJsZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGRvdWJsZSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNEb3VibGUodikge1xuICByZXR1cm4gX2lzTnVtYmVyKHYpICYmIFN0cmluZyh2KS5pbmRleE9mKCcuJykgIT09IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgbnVtZXJpYy5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBudW1lcmljLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc051bWVyaWModikge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodikpICYmIGlzRmluaXRlKHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBCb29sZWFuLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgQm9vbGVhbiwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNCb29sZWFuKHYpIHtcbiAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBCb29sZWFuXScpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNVbmRlZmluZWQodikge1xuICByZXR1cm4gKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHN1YmplY3Qgd2l0aCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3ViamVjdCB3aXRoIHByb3BlcnRpZXMsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzU3ViamVjdCh2KSB7XG4gIC8vIE5vdGU6IEEgdmFsdWUgaXMgYSBzdWJqZWN0IGlmIGFsbCBvZiB0aGVzZSBob2xkIHRydWU6XG4gIC8vIDEuIEl0IGlzIGFuIE9iamVjdC5cbiAgLy8gMi4gSXQgaXMgbm90IGEgQHZhbHVlLCBAc2V0LCBvciBAbGlzdC5cbiAgLy8gMy4gSXQgaGFzIG1vcmUgdGhhbiAxIGtleSBPUiBhbnkgZXhpc3Rpbmcga2V5IGlzIG5vdCBAaWQuXG4gIHZhciBydmFsID0gZmFsc2U7XG4gIGlmKF9pc09iamVjdCh2KSAmJlxuICAgICEoKCdAdmFsdWUnIGluIHYpIHx8ICgnQHNldCcgaW4gdikgfHwgKCdAbGlzdCcgaW4gdikpKSB7XG4gICAgdmFyIGtleUNvdW50ID0gT2JqZWN0LmtleXModikubGVuZ3RoO1xuICAgIHJ2YWwgPSAoa2V5Q291bnQgPiAxIHx8ICEoJ0BpZCcgaW4gdikpO1xuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBzdWJqZWN0IHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN1YmplY3QgcmVmZXJlbmNlLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc1N1YmplY3RSZWZlcmVuY2Uodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgc3ViamVjdCByZWZlcmVuY2UgaWYgYWxsIG9mIHRoZXNlIGhvbGQgdHJ1ZTpcbiAgLy8gMS4gSXQgaXMgYW4gT2JqZWN0LlxuICAvLyAyLiBJdCBoYXMgYSBzaW5nbGUga2V5OiBAaWQuXG4gIHJldHVybiAoX2lzT2JqZWN0KHYpICYmIE9iamVjdC5rZXlzKHYpLmxlbmd0aCA9PT0gMSAmJiAoJ0BpZCcgaW4gdikpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBAdmFsdWUuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBAdmFsdWUsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2lzVmFsdWUodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgQHZhbHVlIGlmIGFsbCBvZiB0aGVzZSBob2xkIHRydWU6XG4gIC8vIDEuIEl0IGlzIGFuIE9iamVjdC5cbiAgLy8gMi4gSXQgaGFzIHRoZSBAdmFsdWUgcHJvcGVydHkuXG4gIHJldHVybiBfaXNPYmplY3QodikgJiYgKCdAdmFsdWUnIGluIHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBAbGlzdC5cbiAqXG4gKiBAcGFyYW0gdiB0aGUgdmFsdWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIEBsaXN0LCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc0xpc3Qodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgQGxpc3QgaWYgYWxsIG9mIHRoZXNlIGhvbGQgdHJ1ZTpcbiAgLy8gMS4gSXQgaXMgYW4gT2JqZWN0LlxuICAvLyAyLiBJdCBoYXMgdGhlIEBsaXN0IHByb3BlcnR5LlxuICByZXR1cm4gX2lzT2JqZWN0KHYpICYmICgnQGxpc3QnIGluIHYpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBibGFuayBub2RlLlxuICpcbiAqIEBwYXJhbSB2IHRoZSB2YWx1ZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgYmxhbmsgbm9kZSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfaXNCbGFua05vZGUodikge1xuICAvLyBOb3RlOiBBIHZhbHVlIGlzIGEgYmxhbmsgbm9kZSBpZiBhbGwgb2YgdGhlc2UgaG9sZCB0cnVlOlxuICAvLyAxLiBJdCBpcyBhbiBPYmplY3QuXG4gIC8vIDIuIElmIGl0IGhhcyBhbiBAaWQga2V5IGl0cyB2YWx1ZSBiZWdpbnMgd2l0aCAnXzonLlxuICAvLyAzLiBJdCBoYXMgbm8ga2V5cyBPUiBpcyBub3QgYSBAdmFsdWUsIEBzZXQsIG9yIEBsaXN0LlxuICB2YXIgcnZhbCA9IGZhbHNlO1xuICBpZihfaXNPYmplY3QodikpIHtcbiAgICBpZignQGlkJyBpbiB2KSB7XG4gICAgICBydmFsID0gKHZbJ0BpZCddLmluZGV4T2YoJ186JykgPT09IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBydmFsID0gKE9iamVjdC5rZXlzKHYpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAhKCgnQHZhbHVlJyBpbiB2KSB8fCAoJ0BzZXQnIGluIHYpIHx8ICgnQGxpc3QnIGluIHYpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gYWJzb2x1dGUgSVJJLCBmYWxzZSBpZiBub3QuXG4gKlxuICogQHBhcmFtIHYgdGhlIHZhbHVlIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYWJzb2x1dGUgSVJJLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9pc0Fic29sdXRlSXJpKHYpIHtcbiAgcmV0dXJuIF9pc1N0cmluZyh2KSAmJiB2LmluZGV4T2YoJzonKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQ2xvbmVzIGFuIG9iamVjdCwgYXJyYXksIG9yIHN0cmluZy9udW1iZXIuIElmIGEgdHlwZWQgSmF2YVNjcmlwdCBvYmplY3RcbiAqIGlzIGdpdmVuLCBzdWNoIGFzIGEgRGF0ZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIF9jbG9uZSh2YWx1ZSkge1xuICBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJ2YWw7XG4gICAgaWYoX2lzQXJyYXkodmFsdWUpKSB7XG4gICAgICBydmFsID0gW107XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcnZhbFtpXSA9IF9jbG9uZSh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKF9pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHJ2YWwgPSB7fTtcbiAgICAgIGZvcih2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHJ2YWxba2V5XSA9IF9jbG9uZSh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcnZhbCA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBydmFsO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbGwgQGNvbnRleHQgVVJMcyBpbiB0aGUgZ2l2ZW4gSlNPTi1MRCBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIEpTT04tTEQgaW5wdXQuXG4gKiBAcGFyYW0gdXJscyBhIG1hcCBvZiBVUkxzICh1cmwgPT4gZmFsc2UvQGNvbnRleHRzKS5cbiAqIEBwYXJhbSByZXBsYWNlIHRydWUgdG8gcmVwbGFjZSB0aGUgVVJMcyBpbiB0aGUgZ2l2ZW4gaW5wdXQgd2l0aCB0aGVcbiAqICAgICAgICAgICBAY29udGV4dHMgZnJvbSB0aGUgdXJscyBtYXAsIGZhbHNlIG5vdCB0by5cbiAqIEBwYXJhbSBiYXNlIHRoZSBiYXNlIElSSSB0byB1c2UgdG8gcmVzb2x2ZSByZWxhdGl2ZSBJUklzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgVVJMcyB0byByZXRyaWV2ZSB3ZXJlIGZvdW5kLCBmYWxzZSBpZiBub3QuXG4gKi9cbmZ1bmN0aW9uIF9maW5kQ29udGV4dFVybHMoaW5wdXQsIHVybHMsIHJlcGxhY2UsIGJhc2UpIHtcbiAgdmFyIGNvdW50ID0gT2JqZWN0LmtleXModXJscykubGVuZ3RoO1xuICBpZihfaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9maW5kQ29udGV4dFVybHMoaW5wdXRbaV0sIHVybHMsIHJlcGxhY2UsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gKGNvdW50IDwgT2JqZWN0LmtleXModXJscykubGVuZ3RoKTtcbiAgfSBlbHNlIGlmKF9pc09iamVjdChpbnB1dCkpIHtcbiAgICBmb3IodmFyIGtleSBpbiBpbnB1dCkge1xuICAgICAgaWYoa2V5ICE9PSAnQGNvbnRleHQnKSB7XG4gICAgICAgIF9maW5kQ29udGV4dFVybHMoaW5wdXRba2V5XSwgdXJscywgcmVwbGFjZSwgYmFzZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgQGNvbnRleHRcbiAgICAgIHZhciBjdHggPSBpbnB1dFtrZXldO1xuXG4gICAgICAvLyBhcnJheSBAY29udGV4dFxuICAgICAgaWYoX2lzQXJyYXkoY3R4KSkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gY3R4Lmxlbmd0aDtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIF9jdHggPSBjdHhbaV07XG4gICAgICAgICAgaWYoX2lzU3RyaW5nKF9jdHgpKSB7XG4gICAgICAgICAgICBfY3R4ID0ganNvbmxkLnByZXBlbmRCYXNlKGJhc2UsIF9jdHgpO1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB3L0Bjb250ZXh0IGlmIHJlcXVlc3RlZFxuICAgICAgICAgICAgaWYocmVwbGFjZSkge1xuICAgICAgICAgICAgICBfY3R4ID0gdXJsc1tfY3R4XTtcbiAgICAgICAgICAgICAgaWYoX2lzQXJyYXkoX2N0eCkpIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgZmxhdHRlbmVkIGNvbnRleHRcbiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGN0eCwgW2ksIDFdLmNvbmNhdChfY3R4KSk7XG4gICAgICAgICAgICAgICAgaSArPSBfY3R4Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gY3R4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdHhbaV0gPSBfY3R4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYoIShfY3R4IGluIHVybHMpKSB7XG4gICAgICAgICAgICAgIC8vIEBjb250ZXh0IFVSTCBmb3VuZFxuICAgICAgICAgICAgICB1cmxzW19jdHhdID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoX2lzU3RyaW5nKGN0eCkpIHtcbiAgICAgICAgLy8gc3RyaW5nIEBjb250ZXh0XG4gICAgICAgIGN0eCA9IGpzb25sZC5wcmVwZW5kQmFzZShiYXNlLCBjdHgpO1xuICAgICAgICAvLyByZXBsYWNlIHcvQGNvbnRleHQgaWYgcmVxdWVzdGVkXG4gICAgICAgIGlmKHJlcGxhY2UpIHtcbiAgICAgICAgICBpbnB1dFtrZXldID0gdXJsc1tjdHhdO1xuICAgICAgICB9IGVsc2UgaWYoIShjdHggaW4gdXJscykpIHtcbiAgICAgICAgICAvLyBAY29udGV4dCBVUkwgZm91bmRcbiAgICAgICAgICB1cmxzW2N0eF0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKGNvdW50IDwgT2JqZWN0LmtleXModXJscykubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGV4dGVybmFsIEBjb250ZXh0IFVSTHMgdXNpbmcgdGhlIGdpdmVuIGRvY3VtZW50IGxvYWRlci4gRXZlcnlcbiAqIGluc3RhbmNlIG9mIEBjb250ZXh0IGluIHRoZSBpbnB1dCB0aGF0IHJlZmVycyB0byBhIFVSTCB3aWxsIGJlIHJlcGxhY2VkXG4gKiB3aXRoIHRoZSBKU09OIEBjb250ZXh0IGZvdW5kIGF0IHRoYXQgVVJMLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgSlNPTi1MRCBpbnB1dCB3aXRoIHBvc3NpYmxlIGNvbnRleHRzLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgZG9jdW1lbnRMb2FkZXIodXJsLCBjYWxsYmFjayhlcnIsIHJlbW90ZURvYykpIHRoZSBkb2N1bWVudCBsb2FkZXIuXG4gKiBAcGFyYW0gY2FsbGJhY2soZXJyLCBpbnB1dCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmZ1bmN0aW9uIF9yZXRyaWV2ZUNvbnRleHRVcmxzKGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAvLyBpZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyBVUkwgcmVzb2x1dGlvbiwgcXVpdFxuICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gIC8vIHJlY3Vyc2l2ZSBkb2N1bWVudCBsb2FkZXJcbiAgdmFyIGRvY3VtZW50TG9hZGVyID0gb3B0aW9ucy5kb2N1bWVudExvYWRlcjtcbiAgdmFyIHJldHJpZXZlID0gZnVuY3Rpb24oaW5wdXQsIGN5Y2xlcywgZG9jdW1lbnRMb2FkZXIsIGJhc2UsIGNhbGxiYWNrKSB7XG4gICAgaWYoT2JqZWN0LmtleXMoY3ljbGVzKS5sZW5ndGggPiBNQVhfQ09OVEVYVF9VUkxTKSB7XG4gICAgICBlcnJvciA9IG5ldyBKc29uTGRFcnJvcihcbiAgICAgICAgJ01heGltdW0gbnVtYmVyIG9mIEBjb250ZXh0IFVSTHMgZXhjZWVkZWQuJyxcbiAgICAgICAgJ2pzb25sZC5Db250ZXh0VXJsRXJyb3InLFxuICAgICAgICB7Y29kZTogJ2xvYWRpbmcgcmVtb3RlIGNvbnRleHQgZmFpbGVkJywgbWF4OiBNQVhfQ09OVEVYVF9VUkxTfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIGZvciB0cmFja2luZyB0aGUgVVJMcyB0byByZXRyaWV2ZVxuICAgIHZhciB1cmxzID0ge307XG5cbiAgICAvLyBmaW5pc2hlZCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBVUkwgcXVldWUgaXMgZW1wdHlcbiAgICB2YXIgZmluaXNoZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIHJlcGxhY2UgYWxsIFVSTHMgaW4gdGhlIGlucHV0XG4gICAgICBfZmluZENvbnRleHRVcmxzKGlucHV0LCB1cmxzLCB0cnVlLCBiYXNlKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gZmluZCBhbGwgVVJMcyBpbiB0aGUgZ2l2ZW4gaW5wdXRcbiAgICBpZighX2ZpbmRDb250ZXh0VXJscyhpbnB1dCwgdXJscywgZmFsc2UsIGJhc2UpKSB7XG4gICAgICAvLyBubyBuZXcgVVJMcyBpbiBpbnB1dFxuICAgICAgcmV0dXJuIGZpbmlzaGVkKCk7XG4gICAgfVxuXG4gICAgLy8gcXVldWUgYWxsIHVucmV0cmlldmVkIFVSTHNcbiAgICB2YXIgcXVldWUgPSBbXTtcbiAgICBmb3IodmFyIHVybCBpbiB1cmxzKSB7XG4gICAgICBpZih1cmxzW3VybF0gPT09IGZhbHNlKSB7XG4gICAgICAgIHF1ZXVlLnB1c2godXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXRyaWV2ZSBVUkxzIGluIHF1ZXVlXG4gICAgdmFyIGNvdW50ID0gcXVldWUubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgKGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgY29udGV4dCBVUkwgY3ljbGVcbiAgICAgICAgaWYodXJsIGluIGN5Y2xlcykge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgJ0N5Y2xpY2FsIEBjb250ZXh0IFVSTHMgZGV0ZWN0ZWQuJyxcbiAgICAgICAgICAgICdqc29ubGQuQ29udGV4dFVybEVycm9yJyxcbiAgICAgICAgICAgIHtjb2RlOiAncmVjdXJzaXZlIGNvbnRleHQgaW5jbHVzaW9uJywgdXJsOiB1cmx9KTtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfY3ljbGVzID0gX2Nsb25lKGN5Y2xlcyk7XG4gICAgICAgIF9jeWNsZXNbdXJsXSA9IHRydWU7XG4gICAgICAgIHZhciBkb25lID0gZnVuY3Rpb24oZXJyLCByZW1vdGVEb2MpIHtcbiAgICAgICAgICAvLyBzaG9ydC1jaXJjdWl0IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aXRoIGFub3RoZXIgVVJMXG4gICAgICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3R4ID0gcmVtb3RlRG9jID8gcmVtb3RlRG9jLmRvY3VtZW50IDogbnVsbDtcblxuICAgICAgICAgIC8vIHBhcnNlIHN0cmluZyBjb250ZXh0IGFzIEpTT05cbiAgICAgICAgICBpZighZXJyICYmIF9pc1N0cmluZyhjdHgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjdHggPSBKU09OLnBhcnNlKGN0eCk7XG4gICAgICAgICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgICAgICAgIGVyciA9IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGVuc3VyZSBjdHggaXMgYW4gb2JqZWN0XG4gICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICAgICAgICdEZXJlZmVyZW5jaW5nIGEgVVJMIGRpZCBub3QgcmVzdWx0IGluIGEgdmFsaWQgSlNPTi1MRCBvYmplY3QuICcgK1xuICAgICAgICAgICAgICAnUG9zc2libGUgY2F1c2VzIGFyZSBhbiBpbmFjY2Vzc2libGUgVVJMIHBlcmhhcHMgZHVlIHRvICcgK1xuICAgICAgICAgICAgICAnYSBzYW1lLW9yaWdpbiBwb2xpY3kgKGVuc3VyZSB0aGUgc2VydmVyIHVzZXMgQ09SUyBpZiB5b3UgYXJlICcgK1xuICAgICAgICAgICAgICAndXNpbmcgY2xpZW50LXNpZGUgSmF2YVNjcmlwdCksIHRvbyBtYW55IHJlZGlyZWN0cywgYSAnICtcbiAgICAgICAgICAgICAgJ25vbi1KU09OIHJlc3BvbnNlLCBvciBtb3JlIHRoYW4gb25lIEhUVFAgTGluayBIZWFkZXIgd2FzICcgK1xuICAgICAgICAgICAgICAncHJvdmlkZWQgZm9yIGEgcmVtb3RlIGNvbnRleHQuJyxcbiAgICAgICAgICAgICAgJ2pzb25sZC5JbnZhbGlkVXJsJyxcbiAgICAgICAgICAgICAge2NvZGU6ICdsb2FkaW5nIHJlbW90ZSBjb250ZXh0IGZhaWxlZCcsIHVybDogdXJsLCBjYXVzZTogZXJyfSk7XG4gICAgICAgICAgfSBlbHNlIGlmKCFfaXNPYmplY3QoY3R4KSkge1xuICAgICAgICAgICAgZXJyID0gbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICAgICAnRGVyZWZlcmVuY2luZyBhIFVSTCBkaWQgbm90IHJlc3VsdCBpbiBhIEpTT04gb2JqZWN0LiBUaGUgJyArXG4gICAgICAgICAgICAgICdyZXNwb25zZSB3YXMgdmFsaWQgSlNPTiwgYnV0IGl0IHdhcyBub3QgYSBKU09OIG9iamVjdC4nLFxuICAgICAgICAgICAgICAnanNvbmxkLkludmFsaWRVcmwnLFxuICAgICAgICAgICAgICB7Y29kZTogJ2ludmFsaWQgcmVtb3RlIGNvbnRleHQnLCB1cmw6IHVybCwgY2F1c2U6IGVycn0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB1c2UgZW1wdHkgY29udGV4dCBpZiBubyBAY29udGV4dCBrZXkgaXMgcHJlc2VudFxuICAgICAgICAgIGlmKCEoJ0Bjb250ZXh0JyBpbiBjdHgpKSB7XG4gICAgICAgICAgICBjdHggPSB7J0Bjb250ZXh0Jzoge319O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHggPSB7J0Bjb250ZXh0JzogY3R4WydAY29udGV4dCddfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhcHBlbmQgY29udGV4dCBVUkwgdG8gY29udGV4dCBpZiBnaXZlblxuICAgICAgICAgIGlmKHJlbW90ZURvYy5jb250ZXh0VXJsKSB7XG4gICAgICAgICAgICBpZighX2lzQXJyYXkoY3R4WydAY29udGV4dCddKSkge1xuICAgICAgICAgICAgICBjdHhbJ0Bjb250ZXh0J10gPSBbY3R4WydAY29udGV4dCddXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eFsnQGNvbnRleHQnXS5wdXNoKHJlbW90ZURvYy5jb250ZXh0VXJsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyByZWN1cnNlXG4gICAgICAgICAgcmV0cmlldmUoY3R4LCBfY3ljbGVzLCBkb2N1bWVudExvYWRlciwgdXJsLCBmdW5jdGlvbihlcnIsIGN0eCkge1xuICAgICAgICAgICAgaWYoZXJyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsc1t1cmxdID0gY3R4WydAY29udGV4dCddO1xuICAgICAgICAgICAgY291bnQgLT0gMTtcbiAgICAgICAgICAgIGlmKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgIGZpbmlzaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBwcm9taXNlID0gZG9jdW1lbnRMb2FkZXIodXJsLCBkb25lKTtcbiAgICAgICAgaWYocHJvbWlzZSAmJiAndGhlbicgaW4gcHJvbWlzZSkge1xuICAgICAgICAgIHByb21pc2UudGhlbihkb25lLmJpbmQobnVsbCwgbnVsbCksIGRvbmUpO1xuICAgICAgICB9XG4gICAgICB9KHF1ZXVlW2ldKSk7XG4gICAgfVxuICB9O1xuICByZXRyaWV2ZShpbnB1dCwge30sIGRvY3VtZW50TG9hZGVyLCBvcHRpb25zLmJhc2UsIGNhbGxiYWNrKTtcbn1cblxuLy8gZGVmaW5lIGpzIDEuOC41IE9iamVjdC5rZXlzIG1ldGhvZCBpZiBub3QgcHJlc2VudFxuaWYoIU9iamVjdC5rZXlzKSB7XG4gIE9iamVjdC5rZXlzID0gZnVuY3Rpb24obykge1xuICAgIGlmKG8gIT09IE9iamVjdChvKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIG5vbi1vYmplY3QnKTtcbiAgICB9XG4gICAgdmFyIHJ2YWwgPSBbXTtcbiAgICBmb3IodmFyIHAgaW4gbykge1xuICAgICAgaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSB7XG4gICAgICAgIHJ2YWwucHVzaChwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIFJERiBpbiB0aGUgZm9ybSBvZiBOLVF1YWRzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCB0aGUgTi1RdWFkcyBpbnB1dCB0byBwYXJzZS5cbiAqXG4gKiBAcmV0dXJuIGFuIFJERiBkYXRhc2V0LlxuICovXG5mdW5jdGlvbiBfcGFyc2VOUXVhZHMoaW5wdXQpIHtcbiAgLy8gZGVmaW5lIHBhcnRpYWwgcmVnZXhlc1xuICB2YXIgaXJpID0gJyg/OjwoW146XSs6W14+XSopPiknO1xuICB2YXIgYm5vZGUgPSAnKF86KD86W0EtWmEtejAtOV0rKSknO1xuICB2YXIgcGxhaW4gPSAnXCIoW15cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlwiXFxcXFxcXFxdKikqKVwiJztcbiAgdmFyIGRhdGF0eXBlID0gJyg/OlxcXFxeXFxcXF4nICsgaXJpICsgJyknO1xuICB2YXIgbGFuZ3VhZ2UgPSAnKD86QChbYS16XSsoPzotW2EtejAtOV0rKSopKSc7XG4gIHZhciBsaXRlcmFsID0gJyg/OicgKyBwbGFpbiArICcoPzonICsgZGF0YXR5cGUgKyAnfCcgKyBsYW5ndWFnZSArICcpPyknO1xuICB2YXIgY29tbWVudCA9ICcoPzojLiopPyc7XG4gIHZhciB3cyA9ICdbIFxcXFx0XSsnO1xuICB2YXIgd3NvID0gJ1sgXFxcXHRdKic7XG4gIHZhciBlb2xuID0gLyg/Olxcclxcbil8KD86XFxuKXwoPzpcXHIpL2c7XG4gIHZhciBlbXB0eSA9IG5ldyBSZWdFeHAoJ14nICsgd3NvICsgY29tbWVudCArICckJyk7XG5cbiAgLy8gZGVmaW5lIHF1YWQgcGFydCByZWdleGVzXG4gIHZhciBzdWJqZWN0ID0gJyg/OicgKyBpcmkgKyAnfCcgKyBibm9kZSArICcpJyArIHdzO1xuICB2YXIgcHJvcGVydHkgPSBpcmkgKyB3cztcbiAgdmFyIG9iamVjdCA9ICcoPzonICsgaXJpICsgJ3wnICsgYm5vZGUgKyAnfCcgKyBsaXRlcmFsICsgJyknICsgd3NvO1xuICB2YXIgZ3JhcGhOYW1lID0gJyg/OlxcXFwufCg/Oig/OicgKyBpcmkgKyAnfCcgKyBibm9kZSArICcpJyArIHdzbyArICdcXFxcLikpJztcblxuICAvLyBmdWxsIHF1YWQgcmVnZXhcbiAgdmFyIHF1YWQgPSBuZXcgUmVnRXhwKFxuICAgICdeJyArIHdzbyArIHN1YmplY3QgKyBwcm9wZXJ0eSArIG9iamVjdCArIGdyYXBoTmFtZSArIHdzbyArIGNvbW1lbnQgKyAnJCcpO1xuXG4gIC8vIGJ1aWxkIFJERiBkYXRhc2V0XG4gIHZhciBkYXRhc2V0ID0ge307XG5cbiAgLy8gc3BsaXQgTi1RdWFkIGlucHV0IGludG8gbGluZXNcbiAgdmFyIGxpbmVzID0gaW5wdXQuc3BsaXQoZW9sbik7XG4gIHZhciBsaW5lTnVtYmVyID0gMDtcbiAgZm9yKHZhciBsaSA9IDA7IGxpIDwgbGluZXMubGVuZ3RoOyArK2xpKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc1tsaV07XG4gICAgbGluZU51bWJlcisrO1xuXG4gICAgLy8gc2tpcCBlbXB0eSBsaW5lc1xuICAgIGlmKGVtcHR5LnRlc3QobGluZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIHF1YWRcbiAgICB2YXIgbWF0Y2ggPSBsaW5lLm1hdGNoKHF1YWQpO1xuICAgIGlmKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSnNvbkxkRXJyb3IoXG4gICAgICAgICdFcnJvciB3aGlsZSBwYXJzaW5nIE4tUXVhZHM7IGludmFsaWQgcXVhZC4nLFxuICAgICAgICAnanNvbmxkLlBhcnNlRXJyb3InLCB7bGluZTogbGluZU51bWJlcn0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBSREYgdHJpcGxlXG4gICAgdmFyIHRyaXBsZSA9IHt9O1xuXG4gICAgLy8gZ2V0IHN1YmplY3RcbiAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzFdKSkge1xuICAgICAgdHJpcGxlLnN1YmplY3QgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBtYXRjaFsxXX07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IG1hdGNoWzJdfTtcbiAgICB9XG5cbiAgICAvLyBnZXQgcHJlZGljYXRlXG4gICAgdHJpcGxlLnByZWRpY2F0ZSA9IHt0eXBlOiAnSVJJJywgdmFsdWU6IG1hdGNoWzNdfTtcblxuICAgIC8vIGdldCBvYmplY3RcbiAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzRdKSkge1xuICAgICAgdHJpcGxlLm9iamVjdCA9IHt0eXBlOiAnSVJJJywgdmFsdWU6IG1hdGNoWzRdfTtcbiAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs1XSkpIHtcbiAgICAgIHRyaXBsZS5vYmplY3QgPSB7dHlwZTogJ2JsYW5rIG5vZGUnLCB2YWx1ZTogbWF0Y2hbNV19O1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlwbGUub2JqZWN0ID0ge3R5cGU6ICdsaXRlcmFsJ307XG4gICAgICBpZighX2lzVW5kZWZpbmVkKG1hdGNoWzddKSkge1xuICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gbWF0Y2hbN107XG4gICAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs4XSkpIHtcbiAgICAgICAgdHJpcGxlLm9iamVjdC5kYXRhdHlwZSA9IFJERl9MQU5HU1RSSU5HO1xuICAgICAgICB0cmlwbGUub2JqZWN0Lmxhbmd1YWdlID0gbWF0Y2hbOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gWFNEX1NUUklORztcbiAgICAgIH1cbiAgICAgIHZhciB1bmVzY2FwZWQgPSBtYXRjaFs2XVxuICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcdC9nLCAnXFx0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgICAucmVwbGFjZSgvXFxcXHIvZywgJ1xccicpXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgdHJpcGxlLm9iamVjdC52YWx1ZSA9IHVuZXNjYXBlZDtcbiAgICB9XG5cbiAgICAvLyBnZXQgZ3JhcGggbmFtZSAoJ0BkZWZhdWx0JyBpcyB1c2VkIGZvciB0aGUgZGVmYXVsdCBncmFwaClcbiAgICB2YXIgbmFtZSA9ICdAZGVmYXVsdCc7XG4gICAgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFs5XSkpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFs5XTtcbiAgICB9IGVsc2UgaWYoIV9pc1VuZGVmaW5lZChtYXRjaFsxMF0pKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMTBdO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgZ3JhcGggaW4gZGF0YXNldFxuICAgIGlmKCEobmFtZSBpbiBkYXRhc2V0KSkge1xuICAgICAgZGF0YXNldFtuYW1lXSA9IFt0cmlwbGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhZGQgdHJpcGxlIGlmIHVuaXF1ZSB0byBpdHMgZ3JhcGhcbiAgICAgIHZhciB1bmlxdWUgPSB0cnVlO1xuICAgICAgdmFyIHRyaXBsZXMgPSBkYXRhc2V0W25hbWVdO1xuICAgICAgZm9yKHZhciB0aSA9IDA7IHVuaXF1ZSAmJiB0aSA8IHRyaXBsZXMubGVuZ3RoOyArK3RpKSB7XG4gICAgICAgIGlmKF9jb21wYXJlUkRGVHJpcGxlcyh0cmlwbGVzW3RpXSwgdHJpcGxlKSkge1xuICAgICAgICAgIHVuaXF1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih1bmlxdWUpIHtcbiAgICAgICAgdHJpcGxlcy5wdXNoKHRyaXBsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGFzZXQ7XG59XG5cbi8vIHJlZ2lzdGVyIHRoZSBOLVF1YWRzIFJERiBwYXJzZXJcbmpzb25sZC5yZWdpc3RlclJERlBhcnNlcignYXBwbGljYXRpb24vbnF1YWRzJywgX3BhcnNlTlF1YWRzKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgZGF0YXNldCB0byBOLVF1YWRzLlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0IHRoZSBSREYgZGF0YXNldCB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIE4tUXVhZHMgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBfdG9OUXVhZHMoZGF0YXNldCkge1xuICB2YXIgcXVhZHMgPSBbXTtcbiAgZm9yKHZhciBncmFwaE5hbWUgaW4gZGF0YXNldCkge1xuICAgIHZhciB0cmlwbGVzID0gZGF0YXNldFtncmFwaE5hbWVdO1xuICAgIGZvcih2YXIgdGkgPSAwOyB0aSA8IHRyaXBsZXMubGVuZ3RoOyArK3RpKSB7XG4gICAgICB2YXIgdHJpcGxlID0gdHJpcGxlc1t0aV07XG4gICAgICBpZihncmFwaE5hbWUgPT09ICdAZGVmYXVsdCcpIHtcbiAgICAgICAgZ3JhcGhOYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHF1YWRzLnB1c2goX3RvTlF1YWQodHJpcGxlLCBncmFwaE5hbWUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHF1YWRzLnNvcnQoKS5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSREYgdHJpcGxlIGFuZCBncmFwaCBuYW1lIHRvIGFuIE4tUXVhZCBzdHJpbmcgKGEgc2luZ2xlIHF1YWQpLlxuICpcbiAqIEBwYXJhbSB0cmlwbGUgdGhlIFJERiB0cmlwbGUgb3IgcXVhZCB0byBjb252ZXJ0IChhIHRyaXBsZSBvciBxdWFkIG1heSBiZVxuICogICAgICAgICAgcGFzc2VkLCBpZiBhIHRyaXBsZSBpcyBwYXNzZWQgdGhlbiBgZ3JhcGhOYW1lYCBzaG91bGQgYmUgZ2l2ZW5cbiAqICAgICAgICAgIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGdyYXBoIHRoZSB0cmlwbGUgaXMgaW4sIGBudWxsYCBmb3JcbiAqICAgICAgICAgIHRoZSBkZWZhdWx0IGdyYXBoKS5cbiAqIEBwYXJhbSBncmFwaE5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyYXBoIGNvbnRhaW5pbmcgdGhlIHRyaXBsZSwgbnVsbCBmb3JcbiAqICAgICAgICAgIHRoZSBkZWZhdWx0IGdyYXBoLlxuICpcbiAqIEByZXR1cm4gdGhlIE4tUXVhZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIF90b05RdWFkKHRyaXBsZSwgZ3JhcGhOYW1lKSB7XG4gIHZhciBzID0gdHJpcGxlLnN1YmplY3Q7XG4gIHZhciBwID0gdHJpcGxlLnByZWRpY2F0ZTtcbiAgdmFyIG8gPSB0cmlwbGUub2JqZWN0O1xuICB2YXIgZyA9IGdyYXBoTmFtZSB8fCBudWxsO1xuICBpZignbmFtZScgaW4gdHJpcGxlICYmIHRyaXBsZS5uYW1lKSB7XG4gICAgZyA9IHRyaXBsZS5uYW1lLnZhbHVlO1xuICB9XG5cbiAgdmFyIHF1YWQgPSAnJztcblxuICAvLyBzdWJqZWN0IGlzIGFuIElSSVxuICBpZihzLnR5cGUgPT09ICdJUkknKSB7XG4gICAgcXVhZCArPSAnPCcgKyBzLnZhbHVlICsgJz4nO1xuICB9IGVsc2Uge1xuICAgIHF1YWQgKz0gcy52YWx1ZTtcbiAgfVxuICBxdWFkICs9ICcgJztcblxuICAvLyBwcmVkaWNhdGUgaXMgYW4gSVJJXG4gIGlmKHAudHlwZSA9PT0gJ0lSSScpIHtcbiAgICBxdWFkICs9ICc8JyArIHAudmFsdWUgKyAnPic7XG4gIH0gZWxzZSB7XG4gICAgcXVhZCArPSBwLnZhbHVlO1xuICB9XG4gIHF1YWQgKz0gJyAnO1xuXG4gIC8vIG9iamVjdCBpcyBJUkksIGJub2RlLCBvciBsaXRlcmFsXG4gIGlmKG8udHlwZSA9PT0gJ0lSSScpIHtcbiAgICBxdWFkICs9ICc8JyArIG8udmFsdWUgKyAnPic7XG4gIH0gZWxzZSBpZihvLnR5cGUgPT09ICdibGFuayBub2RlJykge1xuICAgIHF1YWQgKz0gby52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXNjYXBlZCA9IG8udmFsdWVcbiAgICAgIC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpXG4gICAgICAucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpXG4gICAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgICAucmVwbGFjZSgvXFxyL2csICdcXFxccicpXG4gICAgICAucmVwbGFjZSgvXFxcIi9nLCAnXFxcXFwiJyk7XG4gICAgcXVhZCArPSAnXCInICsgZXNjYXBlZCArICdcIic7XG4gICAgaWYoby5kYXRhdHlwZSA9PT0gUkRGX0xBTkdTVFJJTkcpIHtcbiAgICAgIGlmKG8ubGFuZ3VhZ2UpIHtcbiAgICAgICAgcXVhZCArPSAnQCcgKyBvLmxhbmd1YWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihvLmRhdGF0eXBlICE9PSBYU0RfU1RSSU5HKSB7XG4gICAgICBxdWFkICs9ICdeXjwnICsgby5kYXRhdHlwZSArICc+JztcbiAgICB9XG4gIH1cblxuICAvLyBncmFwaFxuICBpZihnICE9PSBudWxsICYmIGcgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmKGcuaW5kZXhPZignXzonKSAhPT0gMCkge1xuICAgICAgcXVhZCArPSAnIDwnICsgZyArICc+JztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVhZCArPSAnICcgKyBnO1xuICAgIH1cbiAgfVxuXG4gIHF1YWQgKz0gJyAuXFxuJztcbiAgcmV0dXJuIHF1YWQ7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBSREYgZGF0YXNldCBmb3VuZCB2aWEgdGhlIGRhdGEgb2JqZWN0IGZyb20gdGhlIFJERmEgQVBJLlxuICpcbiAqIEBwYXJhbSBkYXRhIHRoZSBSREZhIEFQSSBkYXRhIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBSREYgZGF0YXNldC5cbiAqL1xuZnVuY3Rpb24gX3BhcnNlUmRmYUFwaURhdGEoZGF0YSkge1xuICB2YXIgZGF0YXNldCA9IHt9O1xuICBkYXRhc2V0WydAZGVmYXVsdCddID0gW107XG5cbiAgdmFyIHN1YmplY3RzID0gZGF0YS5nZXRTdWJqZWN0cygpO1xuICBmb3IodmFyIHNpID0gMDsgc2kgPCBzdWJqZWN0cy5sZW5ndGg7ICsrc2kpIHtcbiAgICB2YXIgc3ViamVjdCA9IHN1YmplY3RzW3NpXTtcbiAgICBpZihzdWJqZWN0ID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgYWxsIHJlbGF0ZWQgdHJpcGxlc1xuICAgIHZhciB0cmlwbGVzID0gZGF0YS5nZXRTdWJqZWN0VHJpcGxlcyhzdWJqZWN0KTtcbiAgICBpZih0cmlwbGVzID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHByZWRpY2F0ZXMgPSB0cmlwbGVzLnByZWRpY2F0ZXM7XG4gICAgZm9yKHZhciBwcmVkaWNhdGUgaW4gcHJlZGljYXRlcykge1xuICAgICAgLy8gaXRlcmF0ZSBvdmVyIG9iamVjdHNcbiAgICAgIHZhciBvYmplY3RzID0gcHJlZGljYXRlc1twcmVkaWNhdGVdLm9iamVjdHM7XG4gICAgICBmb3IodmFyIG9pID0gMDsgb2kgPCBvYmplY3RzLmxlbmd0aDsgKytvaSkge1xuICAgICAgICB2YXIgb2JqZWN0ID0gb2JqZWN0c1tvaV07XG5cbiAgICAgICAgLy8gY3JlYXRlIFJERiB0cmlwbGVcbiAgICAgICAgdmFyIHRyaXBsZSA9IHt9O1xuXG4gICAgICAgIC8vIGFkZCBzdWJqZWN0XG4gICAgICAgIGlmKHN1YmplY3QuaW5kZXhPZignXzonKSA9PT0gMCkge1xuICAgICAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdibGFuayBub2RlJywgdmFsdWU6IHN1YmplY3R9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyaXBsZS5zdWJqZWN0ID0ge3R5cGU6ICdJUkknLCB2YWx1ZTogc3ViamVjdH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcHJlZGljYXRlXG4gICAgICAgIGlmKHByZWRpY2F0ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgdHJpcGxlLnByZWRpY2F0ZSA9IHt0eXBlOiAnYmxhbmsgbm9kZScsIHZhbHVlOiBwcmVkaWNhdGV9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyaXBsZS5wcmVkaWNhdGUgPSB7dHlwZTogJ0lSSScsIHZhbHVlOiBwcmVkaWNhdGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VyaWFsaXplIFhNTCBsaXRlcmFsXG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdC52YWx1ZTtcbiAgICAgICAgaWYob2JqZWN0LnR5cGUgPT09IFJERl9YTUxfTElURVJBTCkge1xuICAgICAgICAgIC8vIGluaXRpYWxpemUgWE1MU2VyaWFsaXplclxuICAgICAgICAgIGlmKCFYTUxTZXJpYWxpemVyKSB7XG4gICAgICAgICAgICBfZGVmaW5lWE1MU2VyaWFsaXplcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICBmb3IodmFyIHggPSAwOyB4IDwgb2JqZWN0LnZhbHVlLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZihvYmplY3QudmFsdWVbeF0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcob2JqZWN0LnZhbHVlW3hdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihvYmplY3QudmFsdWVbeF0ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgIHZhbHVlICs9IG9iamVjdC52YWx1ZVt4XS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIG9iamVjdFxuICAgICAgICB0cmlwbGUub2JqZWN0ID0ge307XG5cbiAgICAgICAgLy8gb2JqZWN0IGlzIGFuIElSSVxuICAgICAgICBpZihvYmplY3QudHlwZSA9PT0gUkRGX09CSkVDVCkge1xuICAgICAgICAgIGlmKG9iamVjdC52YWx1ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgICB0cmlwbGUub2JqZWN0LnR5cGUgPSAnYmxhbmsgbm9kZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaXBsZS5vYmplY3QudHlwZSA9ICdJUkknO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvYmplY3QgaXMgYSBsaXRlcmFsXG4gICAgICAgICAgdHJpcGxlLm9iamVjdC50eXBlID0gJ2xpdGVyYWwnO1xuICAgICAgICAgIGlmKG9iamVjdC50eXBlID09PSBSREZfUExBSU5fTElURVJBTCkge1xuICAgICAgICAgICAgaWYob2JqZWN0Lmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgIHRyaXBsZS5vYmplY3QuZGF0YXR5cGUgPSBSREZfTEFOR1NUUklORztcbiAgICAgICAgICAgICAgdHJpcGxlLm9iamVjdC5sYW5ndWFnZSA9IG9iamVjdC5sYW5ndWFnZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaXBsZS5vYmplY3QuZGF0YXR5cGUgPSBYU0RfU1RSSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlwbGUub2JqZWN0LmRhdGF0eXBlID0gb2JqZWN0LnR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyaXBsZS5vYmplY3QudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAvLyBhZGQgdHJpcGxlIHRvIGRhdGFzZXQgaW4gZGVmYXVsdCBncmFwaFxuICAgICAgICBkYXRhc2V0WydAZGVmYXVsdCddLnB1c2godHJpcGxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YXNldDtcbn1cblxuLy8gcmVnaXN0ZXIgdGhlIFJERmEgQVBJIFJERiBwYXJzZXJcbmpzb25sZC5yZWdpc3RlclJERlBhcnNlcigncmRmYS1hcGknLCBfcGFyc2VSZGZhQXBpRGF0YSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJZGVudGlmaWVySXNzdWVyLiBBIElkZW50aWZpZXJJc3N1ZXIgaXNzdWVzIHVuaXF1ZVxuICogaWRlbnRpZmllcnMsIGtlZXBpbmcgdHJhY2sgb2YgYW55IHByZXZpb3VzbHkgaXNzdWVkIGlkZW50aWZpZXJzLlxuICpcbiAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0byB1c2UgKCc8cHJlZml4Pjxjb3VudGVyPicpLlxuICovXG5mdW5jdGlvbiBJZGVudGlmaWVySXNzdWVyKHByZWZpeCkge1xuICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgdGhpcy5jb3VudGVyID0gMDtcbiAgdGhpcy5leGlzdGluZyA9IHt9O1xufVxuanNvbmxkLklkZW50aWZpZXJJc3N1ZXIgPSBJZGVudGlmaWVySXNzdWVyO1xuLy8gYmFja3dhcmRzLWNvbXBhYmlsaXR5XG5qc29ubGQuVW5pcXVlTmFtZXIgPSBJZGVudGlmaWVySXNzdWVyO1xuXG4vKipcbiAqIENvcGllcyB0aGlzIElkZW50aWZpZXJJc3N1ZXIuXG4gKlxuICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBJZGVudGlmaWVySXNzdWVyLlxuICovXG5JZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29weSA9IG5ldyBJZGVudGlmaWVySXNzdWVyKHRoaXMucHJlZml4KTtcbiAgY29weS5jb3VudGVyID0gdGhpcy5jb3VudGVyO1xuICBjb3B5LmV4aXN0aW5nID0gX2Nsb25lKHRoaXMuZXhpc3RpbmcpO1xuICByZXR1cm4gY29weTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbmV3IGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiBvbGQgaWRlbnRpZmllciwgd2hlcmUgaWYgbm8gb2xkXG4gKiBpZGVudGlmaWVyIGlzIGdpdmVuIGEgbmV3IGlkZW50aWZpZXIgd2lsbCBiZSBnZW5lcmF0ZWQuXG4gKlxuICogQHBhcmFtIFtvbGRdIHRoZSBvbGQgaWRlbnRpZmllciB0byBnZXQgdGhlIG5ldyBpZGVudGlmaWVyIGZvci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXcgaWRlbnRpZmllci5cbiAqL1xuSWRlbnRpZmllcklzc3Vlci5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbihvbGQpIHtcbiAgLy8gcmV0dXJuIGV4aXN0aW5nIG9sZCBpZGVudGlmaWVyXG4gIGlmKG9sZCAmJiBvbGQgaW4gdGhpcy5leGlzdGluZykge1xuICAgIHJldHVybiB0aGlzLmV4aXN0aW5nW29sZF07XG4gIH1cblxuICAvLyBnZXQgbmV4dCBpZGVudGlmaWVyXG4gIHZhciBpZGVudGlmaWVyID0gdGhpcy5wcmVmaXggKyB0aGlzLmNvdW50ZXI7XG4gIHRoaXMuY291bnRlciArPSAxO1xuXG4gIC8vIHNhdmUgbWFwcGluZ1xuICBpZihvbGQpIHtcbiAgICB0aGlzLmV4aXN0aW5nW29sZF0gPSBpZGVudGlmaWVyO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59O1xuLy8gYWxpYXNcbklkZW50aWZpZXJJc3N1ZXIucHJvdG90eXBlLmdldE5hbWUgPSBJZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5nZXROYW1lO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2xkIGlkZW50aWZlciBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkIGEgbmV3XG4gKiBpZGVudGlmaWVyLlxuICpcbiAqIEBwYXJhbSBvbGQgdGhlIG9sZCBpZGVudGlmaWVyIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2xkIGlkZW50aWZpZXIgaGFzIGJlZW4gYXNzaWduZWQgYSBuZXcgaWRlbnRpZmllciwgZmFsc2VcbiAqICAgaWYgbm90LlxuICovXG5JZGVudGlmaWVySXNzdWVyLnByb3RvdHlwZS5oYXNJZCA9IGZ1bmN0aW9uKG9sZCkge1xuICByZXR1cm4gKG9sZCBpbiB0aGlzLmV4aXN0aW5nKTtcbn07XG4vLyBhbGlhc1xuSWRlbnRpZmllcklzc3Vlci5wcm90b3R5cGUuaXNOYW1lZCA9IElkZW50aWZpZXJJc3N1ZXIucHJvdG90eXBlLmhhc0lkO1xuXG4vKipcbiAqIEEgUGVybXV0YXRvciBpdGVyYXRlcyBvdmVyIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhlIGdpdmVuIGFycmF5XG4gKiBvZiBlbGVtZW50cy5cbiAqXG4gKiBAcGFyYW0gbGlzdCB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gaXRlcmF0ZSBvdmVyLlxuICovXG52YXIgUGVybXV0YXRvciA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgLy8gb3JpZ2luYWwgYXJyYXlcbiAgdGhpcy5saXN0ID0gbGlzdC5zb3J0KCk7XG4gIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBlcm11dGF0aW9uc1xuICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgLy8gZGlyZWN0aW9uYWwgaW5mbyBmb3IgcGVybXV0YXRpb24gYWxnb3JpdGhtXG4gIHRoaXMubGVmdCA9IHt9O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHRoaXMubGVmdFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFub3RoZXIgcGVybXV0YXRpb24uXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFub3RoZXIgcGVybXV0YXRpb24sIGZhbHNlIGlmIG5vdC5cbiAqL1xuUGVybXV0YXRvci5wcm90b3R5cGUuaGFzTmV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMuZG9uZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBwZXJtdXRhdGlvbi4gQ2FsbCBoYXNOZXh0KCkgdG8gZW5zdXJlIHRoZXJlIGlzIGFub3RoZXIgb25lXG4gKiBmaXJzdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXh0IHBlcm11dGF0aW9uLlxuICovXG5QZXJtdXRhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvcHkgY3VycmVudCBwZXJtdXRhdGlvblxuICB2YXIgcnZhbCA9IHRoaXMubGlzdC5zbGljZSgpO1xuXG4gIC8qIENhbGN1bGF0ZSB0aGUgbmV4dCBwZXJtdXRhdGlvbiB1c2luZyB0aGUgU3RlaW5oYXVzLUpvaG5zb24tVHJvdHRlclxuICAgcGVybXV0YXRpb24gYWxnb3JpdGhtLiAqL1xuXG4gIC8vIGdldCBsYXJnZXN0IG1vYmlsZSBlbGVtZW50IGtcbiAgLy8gKG1vYmlsZTogZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIG9uZSBpdCBpcyBsb29raW5nIGF0KVxuICB2YXIgayA9IG51bGw7XG4gIHZhciBwb3MgPSAwO1xuICB2YXIgbGVuZ3RoID0gdGhpcy5saXN0Lmxlbmd0aDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLmxpc3RbaV07XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxlZnRbZWxlbWVudF07XG4gICAgaWYoKGsgPT09IG51bGwgfHwgZWxlbWVudCA+IGspICYmXG4gICAgICAoKGxlZnQgJiYgaSA+IDAgJiYgZWxlbWVudCA+IHRoaXMubGlzdFtpIC0gMV0pIHx8XG4gICAgICAoIWxlZnQgJiYgaSA8IChsZW5ndGggLSAxKSAmJiBlbGVtZW50ID4gdGhpcy5saXN0W2kgKyAxXSkpKSB7XG4gICAgICBrID0gZWxlbWVudDtcbiAgICAgIHBvcyA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gbm8gbW9yZSBwZXJtdXRhdGlvbnNcbiAgaWYoayA9PT0gbnVsbCkge1xuICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gc3dhcCBrIGFuZCB0aGUgZWxlbWVudCBpdCBpcyBsb29raW5nIGF0XG4gICAgdmFyIHN3YXAgPSB0aGlzLmxlZnRba10gPyBwb3MgLSAxIDogcG9zICsgMTtcbiAgICB0aGlzLmxpc3RbcG9zXSA9IHRoaXMubGlzdFtzd2FwXTtcbiAgICB0aGlzLmxpc3Rbc3dhcF0gPSBrO1xuXG4gICAgLy8gcmV2ZXJzZSB0aGUgZGlyZWN0aW9uIG9mIGFsbCBlbGVtZW50cyBsYXJnZXIgdGhhbiBrXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZih0aGlzLmxpc3RbaV0gPiBrKSB7XG4gICAgICAgIHRoaXMubGVmdFt0aGlzLmxpc3RbaV1dID0gIXRoaXMubGVmdFt0aGlzLmxpc3RbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBOT1JNQUxJWkFUSU9OIEhBU0ggQVBJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTm9ybWFsaXplSGFzaCBmb3IgdXNlIGJ5IHRoZSBnaXZlbiBub3JtYWxpemF0aW9uIGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0gYWxnb3JpdGhtIHRoZSBSREYgRGF0YXNldCBOb3JtYWxpemF0aW9uIGFsZ29yaXRobSB0byB1c2U6XG4gKiAgICAgICAgICAnVVJETkEyMDE1JyBvciAnVVJHTkEyMDEyJy5cbiAqL1xudmFyIE5vcm1hbGl6ZUhhc2ggPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgTm9ybWFsaXplSGFzaCkpIHtcbiAgICByZXR1cm4gbmV3IE5vcm1hbGl6ZUhhc2goYWxnb3JpdGhtKTtcbiAgfVxuICBpZihbJ1VSRE5BMjAxNScsICdVUkdOQTIwMTInXS5pbmRleE9mKGFsZ29yaXRobSkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgUkRGIERhdGFzZXQgTm9ybWFsaXphdGlvbiBhbGdvcml0aG06ICcgKyBhbGdvcml0aG0pO1xuICB9XG4gIE5vcm1hbGl6ZUhhc2guX2luaXQuY2FsbCh0aGlzLCBhbGdvcml0aG0pO1xufTtcbk5vcm1hbGl6ZUhhc2guaGFzaE5RdWFkcyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwgbnF1YWRzKSB7XG4gIHZhciBtZCA9IG5ldyBOb3JtYWxpemVIYXNoKGFsZ29yaXRobSk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBucXVhZHMubGVuZ3RoOyArK2kpIHtcbiAgICBtZC51cGRhdGUobnF1YWRzW2ldKTtcbiAgfVxuICByZXR1cm4gbWQuZGlnZXN0KCk7XG59O1xuXG4vLyBzd2l0Y2ggZGVmaW5pdGlvbiBvZiBOb3JtYWxpemVIYXNoIGJhc2VkIG9uIGVudmlyb25tZW50XG4oZnVuY3Rpb24oX25vZGVqcykge1xuXG5pZihfbm9kZWpzKSB7XG4gIC8vIGRlZmluZSBOb3JtYWxpemVIYXNoIHVzaW5nIG5hdGl2ZSBjcnlwdG8gbGliXG4gIHZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgTm9ybWFsaXplSGFzaC5faW5pdCA9IGZ1bmN0aW9uKGFsZ29yaXRobSkge1xuICAgIGlmKGFsZ29yaXRobSA9PT0gJ1VSRE5BMjAxNScpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEyNTYnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhc3N1bWUgVVJHTkEyMDEyXG4gICAgICBhbGdvcml0aG0gPSAnc2hhMSc7XG4gICAgfVxuICAgIHRoaXMubWQgPSBjcnlwdG8uY3JlYXRlSGFzaChhbGdvcml0aG0pO1xuICB9O1xuICBOb3JtYWxpemVIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihtc2cpIHtcbiAgICByZXR1cm4gdGhpcy5tZC51cGRhdGUobXNnLCAndXRmOCcpO1xuICB9O1xuICBOb3JtYWxpemVIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tZC5kaWdlc3QoJ2hleCcpO1xuICB9O1xuICByZXR1cm47XG59XG5cbi8vIGRlZmluZSBOb3JtYWxpemVIYXNoIHVzaW5nIEphdmFTY3JpcHRcbk5vcm1hbGl6ZUhhc2guX2luaXQgPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoYWxnb3JpdGhtID09PSAnVVJETkEyMDE1Jykge1xuICAgIGFsZ29yaXRobSA9IG5ldyBzaGEyNTYuQWxnb3JpdGhtKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYXNzdW1lIFVSR05BMjAxMlxuICAgIGFsZ29yaXRobSA9IG5ldyBzaGExLkFsZ29yaXRobSgpO1xuICB9XG4gIHRoaXMubWQgPSBuZXcgTWVzc2FnZURpZ2VzdChhbGdvcml0aG0pO1xufTtcbk5vcm1hbGl6ZUhhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1zZykge1xuICByZXR1cm4gdGhpcy5tZC51cGRhdGUobXNnKTtcbn07XG5Ob3JtYWxpemVIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubWQuZGlnZXN0KCkudG9IZXgoKTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBERUZJTkUgTUVTU0FHRSBESUdFU1QgQVBJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IE1lc3NhZ2VEaWdlc3QuXG4gKlxuICogQHBhcmFtIGFsZ29yaXRobSB0aGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAqL1xudmFyIE1lc3NhZ2VEaWdlc3QgPSBmdW5jdGlvbihhbGdvcml0aG0pIHtcbiAgaWYoISh0aGlzIGluc3RhbmNlb2YgTWVzc2FnZURpZ2VzdCkpIHtcbiAgICByZXR1cm4gbmV3IE1lc3NhZ2VEaWdlc3QoYWxnb3JpdGhtKTtcbiAgfVxuXG4gIHRoaXMuX2FsZ29yaXRobSA9IGFsZ29yaXRobTtcblxuICAvLyBjcmVhdGUgc2hhcmVkIHBhZGRpbmcgYXMgbmVlZGVkXG4gIGlmKCFNZXNzYWdlRGlnZXN0Ll9wYWRkaW5nIHx8XG4gICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZy5sZW5ndGggPCB0aGlzLl9hbGdvcml0aG0uYmxvY2tTaXplKSB7XG4gICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTI4KTtcbiAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMCk7XG4gICAgdmFyIG4gPSA2NDtcbiAgICB3aGlsZShuID4gMCkge1xuICAgICAgaWYobiAmIDEpIHtcbiAgICAgICAgTWVzc2FnZURpZ2VzdC5fcGFkZGluZyArPSBjO1xuICAgICAgfVxuICAgICAgbiA+Pj49IDE7XG4gICAgICBpZihuID4gMCkge1xuICAgICAgICBjICs9IGM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gc3RhcnQgZGlnZXN0IGF1dG9tYXRpY2FsbHkgZm9yIGZpcnN0IHRpbWVcbiAgdGhpcy5zdGFydCgpO1xufTtcblxuLyoqXG4gKiBTdGFydHMgdGhlIGRpZ2VzdC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgZGlnZXN0IG9iamVjdC5cbiAqL1xuTWVzc2FnZURpZ2VzdC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgLy8gdXAgdG8gNTYtYml0IG1lc3NhZ2UgbGVuZ3RoIGZvciBjb252ZW5pZW5jZVxuICB0aGlzLm1lc3NhZ2VMZW5ndGggPSAwO1xuXG4gIC8vIGZ1bGwgbWVzc2FnZSBsZW5ndGhcbiAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aCA9IFtdO1xuICB2YXIgaW50MzJzID0gdGhpcy5fYWxnb3JpdGhtLm1lc3NhZ2VMZW5ndGhTaXplIC8gNDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGludDMyczsgKytpKSB7XG4gICAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aC5wdXNoKDApO1xuICB9XG5cbiAgLy8gaW5wdXQgYnVmZmVyXG4gIHRoaXMuX2lucHV0ID0gbmV3IE1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlcigpO1xuXG4gIC8vIGdldCBzdGFydGluZyBzdGF0ZVxuICB0aGlzLnN0YXRlID0gdGhpcy5fYWxnb3JpdGhtLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGRpZ2VzdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGlucHV0LiBUaGUgaW5wdXQgbXVzdCBiZVxuICogYSBzdHJpbmcgb2YgY2hhcmFjdGVycy5cbiAqXG4gKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlIGlucHV0IHRvIHVwZGF0ZSB3aXRoIChCeXRlQnVmZmVyIG9yIHN0cmluZykuXG4gKlxuICogQHJldHVybiB0aGlzIGRpZ2VzdCBvYmplY3QuXG4gKi9cbk1lc3NhZ2VEaWdlc3QucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1zZykge1xuICAvLyBlbmNvZGUgbWVzc2FnZSBhcyBhIFVURi04IGVuY29kZWQgYmluYXJ5IHN0cmluZ1xuICBtc2cgPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChtc2cpKSk7XG5cbiAgLy8gdXBkYXRlIG1lc3NhZ2UgbGVuZ3RoXG4gIHRoaXMubWVzc2FnZUxlbmd0aCArPSBtc2cubGVuZ3RoKCk7XG4gIHZhciBsZW4gPSBtc2cubGVuZ3RoKCk7XG4gIGxlbiA9IFsobGVuIC8gMHgxMDAwMDAwMDApID4+PiAwLCBsZW4gPj4+IDBdO1xuICBmb3IodmFyIGkgPSB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgdGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSArPSBsZW5bMV07XG4gICAgbGVuWzFdID0gbGVuWzBdICsgKCh0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldID0gdGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSA+Pj4gMDtcbiAgICBsZW5bMF0gPSAoKGxlblsxXSAvIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIH1cblxuICAvLyBhZGQgYnl0ZXMgdG8gaW5wdXQgYnVmZmVyXG4gIHRoaXMuX2lucHV0LnB1dEJ5dGVzKG1zZy5ieXRlcygpKTtcblxuICAvLyBkaWdlc3QgYmxvY2tzXG4gIHdoaWxlKHRoaXMuX2lucHV0Lmxlbmd0aCgpID49IHRoaXMuX2FsZ29yaXRobS5ibG9ja1NpemUpIHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5fYWxnb3JpdGhtLmRpZ2VzdCh0aGlzLnN0YXRlLCB0aGlzLl9pbnB1dCk7XG4gIH1cblxuICAvLyBjb21wYWN0IGlucHV0IGJ1ZmZlciBldmVyeSAySyBvciBpZiBlbXB0eVxuICBpZih0aGlzLl9pbnB1dC5yZWFkID4gMjA0OCB8fCB0aGlzLl9pbnB1dC5sZW5ndGgoKSA9PT0gMCkge1xuICAgIHRoaXMuX2lucHV0LmNvbXBhY3QoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQcm9kdWNlcyB0aGUgZGlnZXN0LlxuICpcbiAqIEByZXR1cm4gYSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkaWdlc3QgdmFsdWUuXG4gKi9cbk1lc3NhZ2VEaWdlc3QucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uKCkge1xuICAvKiBOb3RlOiBIZXJlIHdlIGNvcHkgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZCBhZGQgdGhlXG4gIGFwcHJvcHJpYXRlIHBhZGRpbmcuIFRoZW4gd2UgZG8gdGhlIGZpbmFsIHVwZGF0ZSBvbiBhIGNvcHkgb2YgdGhlIHN0YXRlIHNvXG4gIHRoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZ2V0IGludGVybWVkaWF0ZSBkaWdlc3RzIHRoZXkgY2FuIGRvIHNvLiAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZSB0b1xuICBlbnN1cmUgaXRzIGxlbmd0aCBpcyBhcHByb3ByaWF0ZWx5IGNvbmdydWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBkYXRhIHRvXG4gIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBgYmxvY2tTaXplYC4gVGhpcyBkYXRhIGluY2x1ZGVzIHRoZVxuICBtZXNzYWdlLCBzb21lIHBhZGRpbmcsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLiBTaW5jZSB0aGUgbGVuZ3RoIG9mXG4gIHRoZSBtZXNzYWdlIHdpbGwgYmUgZW5jb2RlZCBhcyBgbWVzc2FnZUxlbmd0aFNpemVgIGJ5dGVzLCB0aGF0IG1lYW5zIHRoYXRcbiAgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgZGF0YSBtdXN0IGhhdmUgYGJsb2NrU2l6ZWAgLSBgbWVzc2FnZUxlbmd0aFNpemVgXG4gIGJ5dGVzIG9mIG1lc3NhZ2UgYW5kIHBhZGRpbmcuIFRoZXJlZm9yZSwgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBwbHVzIHRoZVxuICBwYWRkaW5nIG11c3QgYmUgY29uZ3J1ZW50IHRvIFggbW9kIGBibG9ja1NpemVgIGJlY2F1c2VcbiAgYGJsb2NrU2l6ZWAgLSBgbWVzc2FnZUxlbmd0aFNpemVgID0gWC5cblxuICBGb3IgZXhhbXBsZSwgU0hBLTEgaXMgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyIGFuZCBTSEEtNTEyIGlzIGNvbmdydWVudCB0b1xuICA4OTYgbW9kIDEwMjQuIFNIQS0xIHVzZXMgYSBgYmxvY2tTaXplYCBvZiA2NCBieXRlcyAoNTEyIGJpdHMpIGFuZCBhXG4gIGBtZXNzYWdlTGVuZ3RoU2l6ZWAgb2YgOCBieXRlcyAoNjQgYml0cykuIFNIQS01MTIgdXNlcyBhIGBibG9ja1NpemVgIG9mXG4gIDEyOCBieXRlcyAoMTAyNCBiaXRzKSBhbmQgYSBgbWVzc2FnZUxlbmd0aFNpemVgIG9mIDE2IGJ5dGVzICgxMjggYml0cykuXG5cbiAgSW4gb3JkZXIgdG8gZmlsbCB1cCB0aGUgbWVzc2FnZSBsZW5ndGggaXQgbXVzdCBiZSBmaWxsZWQgd2l0aCBwYWRkaW5nIHRoYXRcbiAgYmVnaW5zIHdpdGggMSBiaXQgZm9sbG93ZWQgYnkgYWxsIDAgYml0cy4gUGFkZGluZyBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsXG4gIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5IGNvbmdydWVudCwgdGhlbiBgYmxvY2tTaXplYCBwYWRkaW5nIGJpdHNcbiAgbXVzdCBiZSBhZGRlZC4gKi9cblxuICAvLyBjcmVhdGUgZmluYWwgYmxvY2tcbiAgdmFyIGZpbmFsQmxvY2sgPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKCk7XG4gIGZpbmFsQmxvY2sucHV0Qnl0ZXModGhpcy5faW5wdXQuYnl0ZXMoKSk7XG5cbiAgLy8gY29tcHV0ZSByZW1haW5pbmcgc2l6ZSB0byBiZSBkaWdlc3RlZCAoaW5jbHVkZSBtZXNzYWdlIGxlbmd0aCBzaXplKVxuICB2YXIgcmVtYWluaW5nID0gKFxuICAgIHRoaXMuZnVsbE1lc3NhZ2VMZW5ndGhbdGhpcy5mdWxsTWVzc2FnZUxlbmd0aC5sZW5ndGggLSAxXSArXG4gICAgdGhpcy5fYWxnb3JpdGhtLm1lc3NhZ2VMZW5ndGhTaXplKTtcblxuICAvLyBhZGQgcGFkZGluZyBmb3Igb3ZlcmZsb3cgYmxvY2tTaXplIC0gb3ZlcmZsb3dcbiAgLy8gX3BhZGRpbmcgc3RhcnRzIHdpdGggMSBieXRlIHdpdGggZmlyc3QgYml0IGlzIHNldCAoYnl0ZSB2YWx1ZSAxMjgpLCB0aGVuXG4gIC8vIHRoZXJlIG1heSBiZSB1cCB0byAoYmxvY2tTaXplIC0gMSkgb3RoZXIgcGFkIGJ5dGVzXG4gIHZhciBvdmVyZmxvdyA9IHJlbWFpbmluZyAmICh0aGlzLl9hbGdvcml0aG0uYmxvY2tTaXplIC0gMSk7XG4gIGZpbmFsQmxvY2sucHV0Qnl0ZXMoTWVzc2FnZURpZ2VzdC5fcGFkZGluZy5zdWJzdHIoXG4gICAgMCwgdGhpcy5fYWxnb3JpdGhtLmJsb2NrU2l6ZSAtIG92ZXJmbG93KSk7XG5cbiAgLy8gc2VyaWFsaXplIG1lc3NhZ2UgbGVuZ3RoIGluIGJpdHMgaW4gYmlnLWVuZGlhbiBvcmRlcjsgc2luY2UgbGVuZ3RoXG4gIC8vIGlzIHN0b3JlZCBpbiBieXRlcyB3ZSBtdWx0aXBseSBieSA4IChsZWZ0IHNoaWZ0IGJ5IDMgYW5kIG1lcmdlIGluXG4gIC8vIHJlbWFpbmRlciBmcm9tIClcbiAgdmFyIG1lc3NhZ2VMZW5ndGggPSBuZXcgTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyKCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aDsgKytpKSB7XG4gICAgbWVzc2FnZUxlbmd0aC5wdXRJbnQzMigodGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpXSA8PCAzKSB8XG4gICAgICAodGhpcy5mdWxsTWVzc2FnZUxlbmd0aFtpICsgMV0gPj4+IDI4KSk7XG4gIH1cblxuICAvLyB3cml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIChhbGdvcml0aG0tc3BlY2lmaWMpXG4gIHRoaXMuX2FsZ29yaXRobS53cml0ZU1lc3NhZ2VMZW5ndGgoZmluYWxCbG9jaywgbWVzc2FnZUxlbmd0aCk7XG5cbiAgLy8gZGlnZXN0IGZpbmFsIGJsb2NrXG4gIHZhciBzdGF0ZSA9IHRoaXMuX2FsZ29yaXRobS5kaWdlc3QodGhpcy5zdGF0ZS5jb3B5KCksIGZpbmFsQmxvY2spO1xuXG4gIC8vIHdyaXRlIHN0YXRlIHRvIGJ1ZmZlclxuICB2YXIgcnZhbCA9IG5ldyBNZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIoKTtcbiAgc3RhdGUud3JpdGUocnZhbCk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2ltcGxlIGJ5dGUgYnVmZmVyIGZvciBtZXNzYWdlIGRpZ2VzdCBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHRvIHB1dCBpbiB0aGUgYnVmZmVyLlxuICovXG5NZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIgPSBmdW5jdGlvbihkYXRhKSB7XG4gIGlmKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cbiAgdGhpcy5yZWFkID0gMDtcbn07XG5cbi8qKlxuICogUHV0cyBhIDMyLWJpdCBpbnRlZ2VyIGludG8gdGhpcyBidWZmZXIgaW4gYmlnLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMzItYml0IGludGVnZXIuXG4gKi9cbk1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucHV0SW50MzIgPSBmdW5jdGlvbihpKSB7XG4gIHRoaXMuZGF0YSArPSAoXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDI0ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiAxNiAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgPj4gOCAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgJiAweEZGKSk7XG59O1xuXG4vKipcbiAqIEdldHMgYSAzMi1iaXQgaW50ZWdlciBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kXG4gKiBhZHZhbmNlcyB0aGUgcmVhZCBwb2ludGVyIGJ5IDQuXG4gKlxuICogQHJldHVybiB0aGUgd29yZC5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IChcbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQpIDw8IDI0IF5cbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQgKyAxKSA8PCAxNiBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMikgPDwgOCBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMykpO1xuICB0aGlzLnJlYWQgKz0gNDtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIFB1dHMgdGhlIGdpdmVuIGJ5dGVzIGludG8gdGhpcyBidWZmZXIuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZy5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5wdXRCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHRoaXMuZGF0YSArPSBieXRlcztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKlxuICogQHJldHVybiBhIHN0cmluZyBmdWxsIG9mIFVURi04IGVuY29kZWQgY2hhcmFjdGVycy5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLnNsaWNlKHRoaXMucmVhZCk7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKi9cbk1lc3NhZ2VEaWdlc3QuQnl0ZUJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoIC0gdGhpcy5yZWFkO1xufTtcblxuLyoqXG4gKiBDb21wYWN0cyB0aGlzIGJ1ZmZlci5cbiAqL1xuTWVzc2FnZURpZ2VzdC5CeXRlQnVmZmVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnJlYWQpO1xuICB0aGlzLnJlYWQgPSAwO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIGJ1ZmZlciB0byBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICovXG5NZXNzYWdlRGlnZXN0LkJ5dGVCdWZmZXIucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gJyc7XG4gIGZvcih2YXIgaSA9IHRoaXMucmVhZDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBiID0gdGhpcy5kYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYoYiA8IDE2KSB7XG4gICAgICBydmFsICs9ICcwJztcbiAgICB9XG4gICAgcnZhbCArPSBiLnRvU3RyaW5nKDE2KTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERFRklORSBTSEEtMSBBTEdPUklUSE0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIHNoYTEgPSB7XG4gIC8vIHVzZWQgZm9yIHdvcmQgc3RvcmFnZVxuICBfdzogbnVsbFxufTtcblxuc2hhMS5BbGdvcml0aG0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5uYW1lID0gJ3NoYTEnLFxuICB0aGlzLmJsb2NrU2l6ZSA9IDY0O1xuICB0aGlzLmRpZ2VzdExlbmd0aCA9IDIwO1xuICB0aGlzLm1lc3NhZ2VMZW5ndGhTaXplID0gODtcbn07XG5cbnNoYTEuQWxnb3JpdGhtLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICBpZighc2hhMS5fdykge1xuICAgIHNoYTEuX3cgPSBuZXcgQXJyYXkoODApO1xuICB9XG4gIHJldHVybiBzaGExLl9jcmVhdGVTdGF0ZSgpO1xufTtcblxuc2hhMS5BbGdvcml0aG0ucHJvdG90eXBlLndyaXRlTWVzc2FnZUxlbmd0aCA9IGZ1bmN0aW9uKFxuICBmaW5hbEJsb2NrLCBtZXNzYWdlTGVuZ3RoKSB7XG4gIC8vIG1lc3NhZ2UgbGVuZ3RoIGlzIGluIGJpdHMgYW5kIGluIGJpZy1lbmRpYW4gb3JkZXI7IHNpbXBseSBhcHBlbmRcbiAgZmluYWxCbG9jay5wdXRCeXRlcyhtZXNzYWdlTGVuZ3RoLmJ5dGVzKCkpO1xufTtcblxuc2hhMS5BbGdvcml0aG0ucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uKHMsIGlucHV0KSB7XG4gIC8vIGNvbnN1bWUgNTEyIGJpdCAoNjQgYnl0ZSkgY2h1bmtzXG4gIHZhciB0LCBhLCBiLCBjLCBkLCBlLCBmLCBpO1xuICB2YXIgbGVuID0gaW5wdXQubGVuZ3RoKCk7XG4gIHZhciBfdyA9IHNoYTEuX3c7XG4gIHdoaWxlKGxlbiA+PSA2NCkge1xuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuXG4gICAgLy8gdGhlIF93IGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc2l4dGVlbiAzMi1iaXQgYmlnLWVuZGlhbiB3b3Jkc1xuICAgIC8vIGFuZCB0aGVuIGV4dGVuZGVkIGludG8gODAgMzItYml0IHdvcmRzIGFjY29yZGluZyB0byBTSEEtMSBhbGdvcml0aG1cbiAgICAvLyBhbmQgZm9yIDMyLTc5IHVzaW5nIE1heCBMb2NrdHl1a2hpbidzIG9wdGltaXphdGlvblxuXG4gICAgLy8gcm91bmQgMVxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHQgPSBpbnB1dC5nZXRJbnQzMigpO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGQgXiAoYiAmIChjIF4gZCkpO1xuICAgICAgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyAweDVBODI3OTk5ICsgdDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDIwOyArK2kpIHtcbiAgICAgIHQgPSAoX3dbaSAtIDNdIF4gX3dbaSAtIDhdIF4gX3dbaSAtIDE0XSBeIF93W2kgLSAxNl0pO1xuICAgICAgdCA9ICh0IDw8IDEpIHwgKHQgPj4+IDMxKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSBkIF4gKGIgJiAoYyBeIGQpKTtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg1QTgyNzk5OSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDJcbiAgICBmb3IoOyBpIDwgMzI7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gM10gXiBfd1tpIC0gOF0gXiBfd1tpIC0gMTRdIF4gX3dbaSAtIDE2XSk7XG4gICAgICB0ID0gKHQgPDwgMSkgfCAodCA+Pj4gMzEpO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg2RUQ5RUJBMSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIGZvcig7IGkgPCA0MDsgKytpKSB7XG4gICAgICB0ID0gKF93W2kgLSA2XSBeIF93W2kgLSAxNl0gXiBfd1tpIC0gMjhdIF4gX3dbaSAtIDMyXSk7XG4gICAgICB0ID0gKHQgPDwgMikgfCAodCA+Pj4gMzApO1xuICAgICAgX3dbaV0gPSB0O1xuICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg2RUQ5RUJBMSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDNcbiAgICBmb3IoOyBpIDwgNjA7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gNl0gXiBfd1tpIC0gMTZdIF4gX3dbaSAtIDI4XSBeIF93W2kgLSAzMl0pO1xuICAgICAgdCA9ICh0IDw8IDIpIHwgKHQgPj4+IDMwKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiBeIGMpKTtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg4RjFCQkNEQyArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDRcbiAgICBmb3IoOyBpIDwgODA7ICsraSkge1xuICAgICAgdCA9IChfd1tpIC0gNl0gXiBfd1tpIC0gMTZdIF4gX3dbaSAtIDI4XSBeIF93W2kgLSAzMl0pO1xuICAgICAgdCA9ICh0IDw8IDIpIHwgKHQgPj4+IDMwKTtcbiAgICAgIF93W2ldID0gdDtcbiAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4Q0E2MkMxRDYgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSAoYiA8PCAzMCkgfCAoYiA+Pj4gMik7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSB0O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBoYXNoIHN0YXRlXG4gICAgcy5oMCA9IChzLmgwICsgYSkgfCAwO1xuICAgIHMuaDEgPSAocy5oMSArIGIpIHwgMDtcbiAgICBzLmgyID0gKHMuaDIgKyBjKSB8IDA7XG4gICAgcy5oMyA9IChzLmgzICsgZCkgfCAwO1xuICAgIHMuaDQgPSAocy5oNCArIGUpIHwgMDtcblxuICAgIGxlbiAtPSA2NDtcbiAgfVxuXG4gIHJldHVybiBzO1xufTtcblxuc2hhMS5fY3JlYXRlU3RhdGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YXRlID0ge1xuICAgIGgwOiAweDY3NDUyMzAxLFxuICAgIGgxOiAweEVGQ0RBQjg5LFxuICAgIGgyOiAweDk4QkFEQ0ZFLFxuICAgIGgzOiAweDEwMzI1NDc2LFxuICAgIGg0OiAweEMzRDJFMUYwXG4gIH07XG4gIHN0YXRlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcnZhbCA9IHNoYTEuX2NyZWF0ZVN0YXRlKCk7XG4gICAgcnZhbC5oMCA9IHN0YXRlLmgwO1xuICAgIHJ2YWwuaDEgPSBzdGF0ZS5oMTtcbiAgICBydmFsLmgyID0gc3RhdGUuaDI7XG4gICAgcnZhbC5oMyA9IHN0YXRlLmgzO1xuICAgIHJ2YWwuaDQgPSBzdGF0ZS5oNDtcbiAgICByZXR1cm4gcnZhbDtcbiAgfTtcbiAgc3RhdGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDApO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oMSk7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgyKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDMpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oNCk7XG4gIH07XG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gREVGSU5FIFNIQS0yNTYgQUxHT1JJVEhNIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIHNoYTI1NiA9IHtcbiAgLy8gc2hhcmVkIHN0YXRlXG4gIF9rOiBudWxsLFxuICBfdzogbnVsbFxufTtcblxuc2hhMjU2LkFsZ29yaXRobSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLm5hbWUgPSAnc2hhMjU2JyxcbiAgdGhpcy5ibG9ja1NpemUgPSA2NDtcbiAgdGhpcy5kaWdlc3RMZW5ndGggPSAzMjtcbiAgdGhpcy5tZXNzYWdlTGVuZ3RoU2l6ZSA9IDg7XG59O1xuXG5zaGEyNTYuQWxnb3JpdGhtLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICBpZighc2hhMjU2Ll9rKSB7XG4gICAgc2hhMjU2Ll9pbml0KCk7XG4gIH1cbiAgcmV0dXJuIHNoYTI1Ni5fY3JlYXRlU3RhdGUoKTtcbn07XG5cbnNoYTI1Ni5BbGdvcml0aG0ucHJvdG90eXBlLndyaXRlTWVzc2FnZUxlbmd0aCA9IGZ1bmN0aW9uKFxuICBmaW5hbEJsb2NrLCBtZXNzYWdlTGVuZ3RoKSB7XG4gIC8vIG1lc3NhZ2UgbGVuZ3RoIGlzIGluIGJpdHMgYW5kIGluIGJpZy1lbmRpYW4gb3JkZXI7IHNpbXBseSBhcHBlbmRcbiAgZmluYWxCbG9jay5wdXRCeXRlcyhtZXNzYWdlTGVuZ3RoLmJ5dGVzKCkpO1xufTtcblxuc2hhMjU2LkFsZ29yaXRobS5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24ocywgaW5wdXQpIHtcbiAgLy8gY29uc3VtZSA1MTIgYml0ICg2NCBieXRlKSBjaHVua3NcbiAgdmFyIHQxLCB0MiwgczAsIHMxLCBjaCwgbWFqLCBpLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoO1xuICB2YXIgbGVuID0gaW5wdXQubGVuZ3RoKCk7XG4gIHZhciBfayA9IHNoYTI1Ni5faztcbiAgdmFyIF93ID0gc2hhMjU2Ll93O1xuICB3aGlsZShsZW4gPj0gNjQpIHtcbiAgICAvLyB0aGUgdyBhcnJheSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHNpeHRlZW4gMzItYml0IGJpZy1lbmRpYW4gd29yZHNcbiAgICAvLyBhbmQgdGhlbiBleHRlbmRlZCBpbnRvIDY0IDMyLWJpdCB3b3JkcyBhY2NvcmRpbmcgdG8gU0hBLTI1NlxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIF93W2ldID0gaW5wdXQuZ2V0SW50MzIoKTtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDY0OyArK2kpIHtcbiAgICAgIC8vIFhPUiB3b3JkIDIgd29yZHMgYWdvIHJvdCByaWdodCAxNywgcm90IHJpZ2h0IDE5LCBzaGZ0IHJpZ2h0IDEwXG4gICAgICB0MSA9IF93W2kgLSAyXTtcbiAgICAgIHQxID1cbiAgICAgICAgKCh0MSA+Pj4gMTcpIHwgKHQxIDw8IDE1KSkgXlxuICAgICAgICAoKHQxID4+PiAxOSkgfCAodDEgPDwgMTMpKSBeXG4gICAgICAgICh0MSA+Pj4gMTApO1xuICAgICAgLy8gWE9SIHdvcmQgMTUgd29yZHMgYWdvIHJvdCByaWdodCA3LCByb3QgcmlnaHQgMTgsIHNoZnQgcmlnaHQgM1xuICAgICAgdDIgPSBfd1tpIC0gMTVdO1xuICAgICAgdDIgPVxuICAgICAgICAoKHQyID4+PiA3KSB8ICh0MiA8PCAyNSkpIF5cbiAgICAgICAgKCh0MiA+Pj4gMTgpIHwgKHQyIDw8IDE0KSkgXlxuICAgICAgICAodDIgPj4+IDMpO1xuICAgICAgLy8gc3VtKHQxLCB3b3JkIDcgYWdvLCB0Miwgd29yZCAxNiBhZ28pIG1vZHVsbyAyXjMyXG4gICAgICBfd1tpXSA9ICh0MSArIF93W2kgLSA3XSArIHQyICsgX3dbaSAtIDE2XSkgfCAwO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuICAgIGYgPSBzLmg1O1xuICAgIGcgPSBzLmg2O1xuICAgIGggPSBzLmg3O1xuXG4gICAgLy8gcm91bmQgZnVuY3Rpb25cbiAgICBmb3IoaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgICAvLyBTdW0xKGUpXG4gICAgICBzMSA9XG4gICAgICAgICgoZSA+Pj4gNikgfCAoZSA8PCAyNikpIF5cbiAgICAgICAgKChlID4+PiAxMSkgfCAoZSA8PCAyMSkpIF5cbiAgICAgICAgKChlID4+PiAyNSkgfCAoZSA8PCA3KSk7XG4gICAgICAvLyBDaChlLCBmLCBnKSAob3B0aW1pemVkIHRoZSBzYW1lIHdheSBhcyBTSEEtMSlcbiAgICAgIGNoID0gZyBeIChlICYgKGYgXiBnKSk7XG4gICAgICAvLyBTdW0wKGEpXG4gICAgICBzMCA9XG4gICAgICAgICgoYSA+Pj4gMikgfCAoYSA8PCAzMCkpIF5cbiAgICAgICAgKChhID4+PiAxMykgfCAoYSA8PCAxOSkpIF5cbiAgICAgICAgKChhID4+PiAyMikgfCAoYSA8PCAxMCkpO1xuICAgICAgLy8gTWFqKGEsIGIsIGMpIChvcHRpbWl6ZWQgdGhlIHNhbWUgd2F5IGFzIFNIQS0xKVxuICAgICAgbWFqID0gKGEgJiBiKSB8IChjICYgKGEgXiBiKSk7XG5cbiAgICAgIC8vIG1haW4gYWxnb3JpdGhtXG4gICAgICB0MSA9IGggKyBzMSArIGNoICsgX2tbaV0gKyBfd1tpXTtcbiAgICAgIHQyID0gczAgKyBtYWo7XG4gICAgICBoID0gZztcbiAgICAgIGcgPSBmO1xuICAgICAgZiA9IGU7XG4gICAgICBlID0gKGQgKyB0MSkgfCAwO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gYjtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9ICh0MSArIHQyKSB8IDA7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGhhc2ggc3RhdGVcbiAgICBzLmgwID0gKHMuaDAgKyBhKSB8IDA7XG4gICAgcy5oMSA9IChzLmgxICsgYikgfCAwO1xuICAgIHMuaDIgPSAocy5oMiArIGMpIHwgMDtcbiAgICBzLmgzID0gKHMuaDMgKyBkKSB8IDA7XG4gICAgcy5oNCA9IChzLmg0ICsgZSkgfCAwO1xuICAgIHMuaDUgPSAocy5oNSArIGYpIHwgMDtcbiAgICBzLmg2ID0gKHMuaDYgKyBnKSB8IDA7XG4gICAgcy5oNyA9IChzLmg3ICsgaCkgfCAwO1xuICAgIGxlbiAtPSA2NDtcbiAgfVxuXG4gIHJldHVybiBzO1xufTtcblxuc2hhMjU2Ll9jcmVhdGVTdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGUgPSB7XG4gICAgaDA6IDB4NkEwOUU2NjcsXG4gICAgaDE6IDB4QkI2N0FFODUsXG4gICAgaDI6IDB4M0M2RUYzNzIsXG4gICAgaDM6IDB4QTU0RkY1M0EsXG4gICAgaDQ6IDB4NTEwRTUyN0YsXG4gICAgaDU6IDB4OUIwNTY4OEMsXG4gICAgaDY6IDB4MUY4M0Q5QUIsXG4gICAgaDc6IDB4NUJFMENEMTlcbiAgfTtcbiAgc3RhdGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBydmFsID0gc2hhMjU2Ll9jcmVhdGVTdGF0ZSgpO1xuICAgIHJ2YWwuaDAgPSBzdGF0ZS5oMDtcbiAgICBydmFsLmgxID0gc3RhdGUuaDE7XG4gICAgcnZhbC5oMiA9IHN0YXRlLmgyO1xuICAgIHJ2YWwuaDMgPSBzdGF0ZS5oMztcbiAgICBydmFsLmg0ID0gc3RhdGUuaDQ7XG4gICAgcnZhbC5oNSA9IHN0YXRlLmg1O1xuICAgIHJ2YWwuaDYgPSBzdGF0ZS5oNjtcbiAgICBydmFsLmg3ID0gc3RhdGUuaDc7XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG4gIHN0YXRlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgwKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDEpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oMik7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmgzKTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDQpO1xuICAgIGJ1ZmZlci5wdXRJbnQzMihzdGF0ZS5oNSk7XG4gICAgYnVmZmVyLnB1dEludDMyKHN0YXRlLmg2KTtcbiAgICBidWZmZXIucHV0SW50MzIoc3RhdGUuaDcpO1xuICB9O1xuICByZXR1cm4gc3RhdGU7XG59O1xuXG5zaGEyNTYuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY3JlYXRlIEsgdGFibGUgZm9yIFNIQS0yNTZcbiAgc2hhMjU2Ll9rID0gW1xuICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gICAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gICAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gICAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdO1xuXG4gIC8vIHVzZWQgZm9yIHdvcmQgc3RvcmFnZVxuICBzaGEyNTYuX3cgPSBuZXcgQXJyYXkoNjQpO1xufTtcblxufSkoX25vZGVqcyk7IC8vIGVuZCBkZWZpbml0aW9uIG9mIE5vcm1hbGl6ZUhhc2hcblxuaWYoIVhNTFNlcmlhbGl6ZXIpIHtcblxudmFyIF9kZWZpbmVYTUxTZXJpYWxpemVyID0gZnVuY3Rpb24oKSB7XG4gIFhNTFNlcmlhbGl6ZXIgPSByZXF1aXJlKCd4bWxkb20nKS5YTUxTZXJpYWxpemVyO1xufTtcblxufSAvLyBlbmQgX2RlZmluZVhNTFNlcmlhbGl6ZXJcblxuLy8gZGVmaW5lIFVSTCBwYXJzZXJcbi8vIHBhcnNlVXJpIDEuMi4yXG4vLyAoYykgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4vLyBNSVQgTGljZW5zZVxuLy8gd2l0aCBsb2NhbCBqc29ubGQuanMgbW9kaWZpY2F0aW9uc1xuanNvbmxkLnVybCA9IHt9O1xuanNvbmxkLnVybC5wYXJzZXJzID0ge1xuICBzaW1wbGU6IHtcbiAgICAvLyBSRkMgMzk4NiBiYXNpYyBwYXJ0c1xuICAgIGtleXM6IFsnaHJlZicsJ3NjaGVtZScsJ2F1dGhvcml0eScsJ3BhdGgnLCdxdWVyeScsJ2ZyYWdtZW50J10sXG4gICAgcmVnZXg6IC9eKD86KFteOlxcLz8jXSspOik/KD86XFwvXFwvKFteXFwvPyNdKikpPyhbXj8jXSopKD86XFw/KFteI10qKSk/KD86IyguKikpPy9cbiAgfSxcbiAgZnVsbDoge1xuICAgIGtleXM6IFsnaHJlZicsJ3Byb3RvY29sJywnc2NoZW1lJywnYXV0aG9yaXR5JywnYXV0aCcsJ3VzZXInLCdwYXNzd29yZCcsJ2hvc3RuYW1lJywncG9ydCcsJ3BhdGgnLCdkaXJlY3RvcnknLCdmaWxlJywncXVlcnknLCdmcmFnbWVudCddLFxuICAgIHJlZ2V4OiAvXigoW146XFwvPyNdKyk6KT8oPzpcXC9cXC8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyg/OigoKD86W14/I1xcL10qXFwvKSopKFtePyNdKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvXG4gIH1cbn07XG5qc29ubGQudXJsLnBhcnNlID0gZnVuY3Rpb24oc3RyLCBwYXJzZXIpIHtcbiAgdmFyIHBhcnNlZCA9IHt9O1xuICB2YXIgbyA9IGpzb25sZC51cmwucGFyc2Vyc1twYXJzZXIgfHwgJ2Z1bGwnXTtcbiAgdmFyIG0gPSBvLnJlZ2V4LmV4ZWMoc3RyKTtcbiAgdmFyIGkgPSBvLmtleXMubGVuZ3RoO1xuICB3aGlsZShpLS0pIHtcbiAgICBwYXJzZWRbby5rZXlzW2ldXSA9IChtW2ldID09PSB1bmRlZmluZWQpID8gbnVsbCA6IG1baV07XG4gIH1cbiAgcGFyc2VkLm5vcm1hbGl6ZWRQYXRoID0gX3JlbW92ZURvdFNlZ21lbnRzKHBhcnNlZC5wYXRoLCAhIXBhcnNlZC5hdXRob3JpdHkpO1xuICByZXR1cm4gcGFyc2VkO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGRvdCBzZWdtZW50cyBmcm9tIGEgVVJMIHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gcmVtb3ZlIGRvdCBzZWdtZW50cyBmcm9tLlxuICogQHBhcmFtIGhhc0F1dGhvcml0eSB0cnVlIGlmIHRoZSBVUkwgaGFzIGFuIGF1dGhvcml0eSwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCwgaGFzQXV0aG9yaXR5KSB7XG4gIHZhciBydmFsID0gJyc7XG5cbiAgaWYocGF0aC5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICBydmFsID0gJy8nO1xuICB9XG5cbiAgLy8gUkZDIDM5ODYgNS4yLjQgKHJld29ya2VkKVxuICB2YXIgaW5wdXQgPSBwYXRoLnNwbGl0KCcvJyk7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgd2hpbGUoaW5wdXQubGVuZ3RoID4gMCkge1xuICAgIGlmKGlucHV0WzBdID09PSAnLicgfHwgKGlucHV0WzBdID09PSAnJyAmJiBpbnB1dC5sZW5ndGggPiAxKSkge1xuICAgICAgaW5wdXQuc2hpZnQoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZihpbnB1dFswXSA9PT0gJy4uJykge1xuICAgICAgaW5wdXQuc2hpZnQoKTtcbiAgICAgIGlmKGhhc0F1dGhvcml0eSB8fFxuICAgICAgICAob3V0cHV0Lmxlbmd0aCA+IDAgJiYgb3V0cHV0W291dHB1dC5sZW5ndGggLSAxXSAhPT0gJy4uJykpIHtcbiAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGVhZGluZyByZWxhdGl2ZSBVUkwgJy4uJ1xuICAgICAgICBvdXRwdXQucHVzaCgnLi4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBvdXRwdXQucHVzaChpbnB1dC5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBydmFsICsgb3V0cHV0LmpvaW4oJy8nKTtcbn1cblxuaWYoX25vZGVqcykge1xuICAvLyB1c2Ugbm9kZSBkb2N1bWVudCBsb2FkZXIgYnkgZGVmYXVsdFxuICBqc29ubGQudXNlRG9jdW1lbnRMb2FkZXIoJ25vZGUnKTtcbn0gZWxzZSBpZih0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIHVzZSB4aHIgZG9jdW1lbnQgbG9hZGVyIGJ5IGRlZmF1bHRcbiAganNvbmxkLnVzZURvY3VtZW50TG9hZGVyKCd4aHInKTtcbn1cblxuaWYoX25vZGVqcykge1xuICBqc29ubGQudXNlID0gZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgc3dpdGNoKGV4dGVuc2lvbikge1xuICAgICAgLy8gVE9ETzogRGVwcmVjYXRlZCBhcyBvZiAwLjQuMC4gUmVtb3ZlIGF0IHNvbWUgcG9pbnQuXG4gICAgICBjYXNlICdyZXF1ZXN0JzpcbiAgICAgICAgLy8gdXNlIG5vZGUgSlNPTi1MRCByZXF1ZXN0IGV4dGVuc2lvblxuICAgICAgICBqc29ubGQucmVxdWVzdCA9IHJlcXVpcmUoJ2pzb25sZC1yZXF1ZXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEpzb25MZEVycm9yKFxuICAgICAgICAgICdVbmtub3duIGV4dGVuc2lvbi4nLFxuICAgICAgICAgICdqc29ubGQuVW5rbm93bkV4dGVuc2lvbicsIHtleHRlbnNpb246IGV4dGVuc2lvbn0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBleHBvc2UgdmVyc2lvblxuICB2YXIgX21vZHVsZSA9IHtleHBvcnRzOiB7fSwgZmlsZW5hbWU6IF9fZGlybmFtZX07XG4gIHJlcXVpcmUoJ3BrZ2luZm8nKShfbW9kdWxlLCAndmVyc2lvbicpO1xuICBqc29ubGQudmVyc2lvbiA9IF9tb2R1bGUuZXhwb3J0cy52ZXJzaW9uO1xufVxuXG4vLyBlbmQgb2YganNvbmxkIEFQSSBmYWN0b3J5XG5yZXR1cm4ganNvbmxkO1xufTtcblxuLy8gZXh0ZXJuYWwgQVBJczpcblxuLy8gdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBqc29ubGQgQVBJIGluc3RhbmNlXG52YXIgZmFjdG9yeSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gd3JhcHBlcihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFjdG9yeSgpO1xuICB9KTtcbn07XG5cbmlmKCFfbm9kZWpzICYmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpKSB7XG4gIC8vIGV4cG9ydCBBTUQgQVBJXG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgLy8gbm93IHRoYXQgbW9kdWxlIGlzIGRlZmluZWQsIHdyYXAgbWFpbiBqc29ubGQgQVBJIGluc3RhbmNlXG4gICAgd3JhcHBlcihmYWN0b3J5KTtcbiAgICByZXR1cm4gZmFjdG9yeTtcbiAgfSk7XG59IGVsc2Uge1xuICAvLyB3cmFwIHRoZSBtYWluIGpzb25sZCBBUEkgaW5zdGFuY2VcbiAgd3JhcHBlcihmYWN0b3J5KTtcblxuICBpZih0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgLy8gZXhwb3J0IENvbW1vbkpTL25vZGVqcyBBUElcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG4gIH1cblxuICBpZihfYnJvd3Nlcikge1xuICAgIC8vIGV4cG9ydCBzaW1wbGUgYnJvd3NlciBBUElcbiAgICBpZih0eXBlb2YganNvbmxkID09PSAndW5kZWZpbmVkJykge1xuICAgICAganNvbmxkID0ganNvbmxkanMgPSBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICBqc29ubGRqcyA9IGZhY3Rvcnk7XG4gICAgfVxuICB9XG59XG5cbnJldHVybiBmYWN0b3J5O1xuXG59KSgpO1xuIiwidmFyIHBrZyA9IHJlcXVpcmUoJy4vc3JjL2xpYnNiZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwa2c7XG4iLCJ2YXIgTjMgPSByZXF1aXJlKCduMycpO1xuXG52YXIgbnMgPSB7fTtcblxubnMucHJlZml4ZXMgPSB7XHRyZGY6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1wiLFxuXHRcdFx0ICAgIGJxbW9kZWw6IFwiaHR0cDovL2Jpb21vZGVscy5uZXQvbW9kZWwtcXVhbGlmaWVycy9cIixcblx0XHRcdCAgICBicWJpb2w6IFwiaHR0cDovL2Jpb21vZGVscy5uZXQvYmlvbG9neS1xdWFsaWZpZXJzL1wiLFxuXHRcdFx0ICAgIHNpbzogXCJodHRwOi8vc2VtYW50aWNzY2llbmNlLm9yZy9yZXNvdXJjZS9cIixcblx0XHRcdCAgICBlaXNibTogXCJodHRwOi8vd3d3LmVpc2JtLm9yZy9cIn07XG5cbi8vIHB1cmUgc2hvcnRjdXQgZnVuY3Rpb25cbm5zLmV4cGFuZFByZWZpeCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuXHRyZXR1cm4gTjMuVXRpbC5leHBhbmRQcmVmaXhlZE5hbWUocHJlZml4LCBucy5wcmVmaXhlcylcbn07XG5cbi8vIGNvbW1vbmx5IHVzZWQgc3RyaW5nc1xuc3RyX3NpbzIyMyA9IFwic2lvOlNJT18wMDAyMjNcIjtcbnN0cl9zaW8yMjNleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3NpbzIyMyk7XG5zdHJfc2lvMTE2ID0gXCJzaW86U0lPXzAwMDExNlwiO1xuc3RyX3NpbzExNmV4cCA9IG5zLmV4cGFuZFByZWZpeChzdHJfc2lvMTE2KTtcbnN0cl9yZGZ2YWx1ZSA9IFwicmRmOnZhbHVlXCI7XG5zdHJfcmRmdmFsdWVleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3JkZnZhbHVlKTtcbnN0cl9yZGZ0eXBlID0gXCJyZGY6dHlwZVwiO1xuc3RyX3JkZnR5cGVleHAgPSBucy5leHBhbmRQcmVmaXgoc3RyX3JkZnR5cGUpO1xuc3RyX3JkZmJhZyA9IFwicmRmOkJhZ1wiO1xuc3RyX3JkZmJhZ2V4cCA9IG5zLmV4cGFuZFByZWZpeChzdHJfcmRmYmFnKTtcblxuY29udHJvbGxlZFZvY2FidWxhcnlMaXN0ID0gW1xuXHRcImJxbW9kZWw6aXNcIixcblx0XCJicW1vZGVsOmlzRGVyaXZlZEZyb21cIixcblx0XCJicW1vZGVsOmlzRGVzY3JpYmVkQnlcIixcblx0XCJicW1vZGVsOmlzSW5zdGFuY2VPZlwiLFxuXHRcImJxbW9kZWw6aGFzSW5zdGFuY2VcIixcblxuXHRcImJxYmlvbDppc1wiLFxuXHRcImJxYmlvbDplbmNvZGVzXCIsXG5cdFwiYnFiaW9sOmhhc1BhcnRcIixcblx0XCJicWJpb2w6aGFzUHJvcGVydHlcIixcblx0XCJicWJpb2w6aGFzVmVyc2lvblwiLFxuXHRcImJxYmlvbDppc0Rlc2NyaWJlZEJ5XCIsXG5cdFwiYnFiaW9sOmlzRW5jb2RlZEJ5XCIsXG5cdFwiYnFiaW9sOmlzSG9tb2xvZ1RvXCIsXG5cdFwiYnFiaW9sOmlzUGFydE9mXCIsXG5cdFwiYnFiaW9sOmlzUHJvcGVydHlPZlwiLFxuXHRcImJxYmlvbDppc1ZlcnNpb25PZlwiLFxuXHRcImJxYmlvbDpvY2N1cnNJblwiLFxuXHRcImJxYmlvbDpoYXNUYXhvblwiLFxuXG5cdFwic2lvOlNJT18wMDAyMjNcIlxuXTtcblxubnMuaXNDb250cm9sbGVkVm9jYWJ1bGFyeSA9IHt9O1xuZm9yKHZhciBpPTA7IGk8Y29udHJvbGxlZFZvY2FidWxhcnlMaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdHZhciB0ZXJtID0gY29udHJvbGxlZFZvY2FidWxhcnlMaXN0W2ldO1xuXHRucy5pc0NvbnRyb2xsZWRWb2NhYnVsYXJ5W25zLmV4cGFuZFByZWZpeCh0ZXJtKV0gPSB0cnVlO1xufVxuXG5ucy5yZWR1Y2VQcmVmaXggPSBmdW5jdGlvbiAoZXhwYW5kZWRTdHJpbmcpIHtcblx0Zm9yICh2YXIga2V5IGluIG5zLnByZWZpeGVzKSB7XG5cdFx0dmFyIGNvbXBsZXRlUHJlZml4ID0gbnMucHJlZml4ZXNba2V5XTtcblx0XHRpZiAoZXhwYW5kZWRTdHJpbmcuc3RhcnRzV2l0aChjb21wbGV0ZVByZWZpeCkpIHtcblx0XHRcdHJldHVybiBleHBhbmRlZFN0cmluZy5yZXBsYWNlKGNvbXBsZXRlUHJlZml4LCBrZXkrJzonKTtcblx0XHR9XG5cdH1cblx0Ly8gbm8gcHJlZml4IGNvdWxkIGJlIHJlY29nbml6ZWRcblx0cmV0dXJuIGV4cGFuZGVkU3RyaW5nO1xufTtcblxubnMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkKSB7XG5cdHZhciBrdnJlc3VsdCA9IHt9O1xuXHQvL2NvbnNvbGUubG9nKGdyYXBoLmdldFRyaXBsZXMoKSk7XG5cdHZhciBwcm9wQmFncyA9IGdyYXBoLmdldFRyaXBsZXMoaWQsIHN0cl9zaW8yMjMsIG51bGwpO1xuXHQvL2NvbnNvbGUubG9nKHByb3BCYWdzKTtcblx0Zm9yKHZhciBpPTA7IGk8cHJvcEJhZ3MubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgcHJvcEJhZyA9IHByb3BCYWdzW2ldLm9iamVjdDtcblx0XHQvL2NvbnNvbGUubG9nKHByb3BCYWcpO1xuXHRcdHZhciBwcm9wZXJ0eUNvbnRhaW5lcnMgPSBncmFwaC5nZXRUcmlwbGVzKHByb3BCYWcsIG51bGwsIG51bGwpO1xuXHRcdC8vY29uc29sZS5sb2cocHJvcGVydHlDb250YWluZXJzKTtcblx0XHRmb3IodmFyIGo9MDsgajxwcm9wZXJ0eUNvbnRhaW5lcnMubGVuZ3RoOyBqKyspIHtcblx0XHRcdHZhciBwcm9wZXJ0eUNvbnRhaW5lciA9IHByb3BlcnR5Q29udGFpbmVyc1tqXS5vYmplY3Q7XG5cdFx0XHRpZihwcm9wZXJ0eUNvbnRhaW5lciA9PSBzdHJfcmRmYmFnZXhwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Ly9jb25zb2xlLmxvZyhcImNvbnRhaW5lclwiLCBwcm9wZXJ0eUNvbnRhaW5lcik7XG5cdFx0XHR2YXIgdmFsdWUgPSBncmFwaC5nZXRPYmplY3RzKHByb3BlcnR5Q29udGFpbmVyLCBzdHJfcmRmdmFsdWVleHAsIG51bGwpWzBdO1xuXHRcdFx0dmFsdWUgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR2YXIga2V5ID0gZ3JhcGguZ2V0T2JqZWN0cyhwcm9wZXJ0eUNvbnRhaW5lciwgc3RyX3NpbzExNmV4cCwgbnVsbClbMF07XG5cdFx0XHRrZXkgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZShrZXkpO1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcblx0XHRcdGt2cmVzdWx0W2tleV0gPSB2YWx1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGt2cmVzdWx0O1xufTtcblxubnMuZ2V0QWxsSWRzID0gZnVuY3Rpb24gKGdyYXBoKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0dmFyIGFsbCA9IGdyYXBoLmdldFN1YmplY3RzKCk7XG5cdC8vY29uc29sZS5sb2coZ3JhcGguZ2V0VHJpcGxlcygpKTtcblx0Ly9jb25zb2xlLmxvZyhhbGwpO1xuXHRmb3IodmFyIGk9MDsgaTxhbGwubGVuZ3RoOyBpKyspIHtcblx0XHRpZighIE4zLlV0aWwuaXNCbGFuayhhbGxbaV0pKSB7XG5cdFx0XHR2YXIgc3ViamVjdCA9IGFsbFtpXTsgLy8gcG90ZW50aWFsIElEc1xuXHRcdFx0Ly8gbm93IGNoZWNrIGlmIHRoZXkgYXJlbid0IHVzZWQgYXMgb2JqZWN0IG9mIG90aGVyIHRyaXBsZXNcblx0XHRcdHZhciBpZEFzT2JqZWN0ID0gZ3JhcGguY291bnRUcmlwbGVzKG51bGwsIG51bGwsIHN1YmplY3QpO1xuXHRcdFx0aWYgKGlkQXNPYmplY3QgPT0gMCkgeyAvLyBub3RoaW5nIGlzIG92ZXIgdGhpcyBpZCwgdHJ1ZSBpZFxuXHRcdFx0XHRyZXN1bHQucHVzaChzdWJqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2lsbCBhZGQgdHJpcGxlcyB0byByZXByZXNlbnQga2V5L3ZhbHVlIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8gdGhlIGlkXG4gKiBrdk9iamVjdCBjYW4gaGF2ZSBvbmUgb3IgbXVsdGlwbGUgcHJvcGVydGllc1xuICovXG5ucy5hZGRDdXN0b21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChncmFwaCwgaWQsIGt2T2JqZWN0KSB7XG5cdHZhciBzaW8yMjNFbGVtZW50ID0gbnMuZ2V0UmVsYXRpb25zaGlwKGdyYXBoLCBpZCwgc3RyX3NpbzIyMylbMF07IC8vIGRvZXNuJ3QgbWF0dGVyIGlmIG1vcmUgdGhhbiBvbmVcblx0Ly9jb25zb2xlLmxvZyhcImFkZCBrdiB0b1wiLCBoYXNQcm9wRWxlbWVudCk7XG5cdGZvcih2YXIga2V5IGluIGt2T2JqZWN0KSB7XG5cdFx0Ly8gdXNpbmcgZWxlbW50IGNvdW50IGFzIGluZGV4IG1heSBiZSBkYW5nZXJvdXMgaWYgcHJldmlvdXMgbWFuaXB1bGF0aW9uIG9mXG5cdFx0Ly8gdGhlIGVsZW1lbnRzIGhhcyBoYXBwZW5lZC4gTGlrZSByZW1vdmluZyBvbmUuIFxuXHRcdHZhciBwcm9wSW5kZXggPSBucy5jb3VudEJhZ0VsZW1lbnRzKGdyYXBoLCBzaW8yMjNFbGVtZW50KSArIDE7XG5cdFx0Ly9jb25zb2xlLmxvZyhcImVsZW1lbnRzIGluIGJhZzpcIiwgcHJvcEluZGV4KTtcblx0XHR2YXIgbmV3QmxhbmsgPSBncmFwaC5jcmVhdGVCbGFua05vZGUoKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiZXhwYW5kIGxpc3QgZWxlbWVudFwiLCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCkpO1xuXHRcdGdyYXBoLmFkZFRyaXBsZShzaW8yMjNFbGVtZW50LCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCksIG5ld0JsYW5rKTtcblx0XHRncmFwaC5hZGRUcmlwbGUobmV3QmxhbmssIHN0cl9zaW8xMTZleHAsIE4zLlV0aWwuY3JlYXRlTGl0ZXJhbChrZXkpKTtcblx0XHRncmFwaC5hZGRUcmlwbGUobmV3QmxhbmssIHN0cl9yZGZ2YWx1ZWV4cCwgTjMuVXRpbC5jcmVhdGVMaXRlcmFsKGt2T2JqZWN0W2tleV0pKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWRkZWRcIiwga2V5LCBrdk9iamVjdFtrZXldKTtcblx0fVxufTtcblxubnMuaGFzUmVsYXRpb25zaGlwID0gZnVuY3Rpb24gKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKSB7XG5cdHZhciBjb3VudFByb3AgPSBncmFwaC5jb3VudFRyaXBsZXMoaWQsIHJlbGF0aW9uc2hpcCwgbnVsbCk7XG5cdHJldHVybiBjb3VudFByb3AgPiAwO1xufTtcblxubnMuY291bnRCYWdFbGVtZW50cyA9IGZ1bmN0aW9uKGdyYXBoLCBzdWJqZWN0KSB7XG5cdHJldHVybiBncmFwaC5jb3VudFRyaXBsZXMoc3ViamVjdCwgbnVsbCwgbnVsbCkgLSAxO1xufTtcblxubnMuZ2V0UmVzb3VyY2VzT2ZJZCA9IGZ1bmN0aW9uKGdyYXBoLCBpZCkge1xuXHR2YXIgcmVzdWx0ID0ge307XG5cdGdyYXBoLmZvckVhY2goZnVuY3Rpb24oaW5pdF90cmlwbGUpeyAvLyBpdGVyYXRlIG92ZXIgYWxsIGlkIHJlbGF0aW9uc2hpcHNcblx0XHQvLyB3ZSB3YW50IGV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYSBzaW1wZWwga2V5L3ZhbHVlIHByb3BlcnR5XG5cdFx0aWYoaW5pdF90cmlwbGUucHJlZGljYXRlICE9IHN0cl9zaW8yMjNleHApIHtcblx0XHRcdHZhciByZWxhdGlvbiA9IGluaXRfdHJpcGxlLnByZWRpY2F0ZTtcblx0XHRcdC8vIGluaXRpYWxpemUgcmVsYXRpb24gYXJyYXkgaWYgbmV2ZXIgZW5jb3VudGVyZWQgYmVmb3JlXG5cdFx0XHRpZighcmVzdWx0Lmhhc093blByb3BlcnR5KHJlbGF0aW9uKSkge1xuXHRcdFx0XHRyZXN1bHRbcmVsYXRpb25dID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIG11bHRpcGxlIHJlc291cmNlcyBzcGVjaWZpZWQsIG9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBzZXZlcmFsIGF0dHJpYnV0ZXMsXG5cdFx0XHQvLyBibGFuayBub2RlIGlzIGludm9sdmVkLCBwb3NzaWJseSB3aXRoIGEgYmFnIGF0dHJpYnV0ZVxuXHRcdFx0aWYoTjMuVXRpbC5pc0JsYW5rKGluaXRfdHJpcGxlLm9iamVjdCkpIHtcblx0XHRcdFx0dmFyIHJlc291cmNlQ29udGFpbmVyID0gaW5pdF90cmlwbGUub2JqZWN0O1xuXHRcdFx0XHRncmFwaC5mb3JFYWNoKGZ1bmN0aW9uKHRyaXBsZSl7IC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJlbGF0aW9uc2hpcFxuXHRcdFx0XHRcdC8vIHJlbGF0aW9uc2hpcCBtYXkgYmUgYSBiYWcsIGFuZCB0aHVzIGNvbnRhaW5zIHVuZGVzaXJhYmxlIHJkZjp0eXBlIGJhZyBsaW5lXG5cdFx0XHRcdFx0aWYodHJpcGxlLm9iamVjdCAhPSBzdHJfcmRmYmFnZXhwKSB7XG5cdFx0XHRcdFx0XHR2YXIgcmVzb3VyY2UgPSB0cmlwbGUub2JqZWN0O1xuXHRcdFx0XHRcdFx0cmVzdWx0W3JlbGF0aW9uXS5wdXNoKHJlc291cmNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sIHJlc291cmNlQ29udGFpbmVyLCBudWxsLCBudWxsKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgeyBcblx0XHRcdFx0Ly8gc2ltcGxlIGNhc2UsIG5vIGJhZywgb25seSAxIHJlc291cmNlIGlzIGxpbmtlZCB3aXRoIDEgYXR0cmlidXRlXG5cdFx0XHRcdHZhciByZXNvdXJjZSA9IGluaXRfdHJpcGxlLm9iamVjdDtcblx0XHRcdFx0cmVzdWx0W3JlbGF0aW9uXS5wdXNoKHJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIGlkLCBudWxsLCBudWxsKTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogcmV0dXJucyB0aGUgaWQgb2YgYSBuZXdseSBjcmVhdGVkIGJsYW5rIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBIYXNQcm9wZXJ0eSBwcmVkaWNhdGVcbiAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyBpdHMgaWRcbiAqIHJldHVybnMgYXJyYXksIHBvdGVudGlhbGx5IHNldmVyYWwgU0lPMjIzIHByZXNlbnRcbiAqL1xubnMuZ2V0UmVsYXRpb25zaGlwID0gZnVuY3Rpb24gKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKSB7XG5cdGlmIChucy5oYXNSZWxhdGlvbnNoaXAoZ3JhcGgsIGlkLCByZWxhdGlvbnNoaXApKSB7XG5cdFx0dmFyIG9iamVjdCA9IGdyYXBoLmdldE9iamVjdHMoaWQsIHJlbGF0aW9uc2hpcCwgbnVsbClbMF07IC8vIGNhcmVmdWwgaGVyZVxuXHRcdGlmICghTjMuVXRpbC5pc0JsYW5rKG9iamVjdCkpe1xuXHRcdFx0Ly8gb2JqZWN0IG9mIHJlbGF0aW9uc2hpcCBpc24ndCBhIGJhZy4gTmVlZCB0byB0dXJuIGl0IGludG8gYSBiYWcuXG5cdFx0XHR2YXIgbmV3QmFnID0gbnMuY3JlYXRlQmFnKGdyYXBoLCBpZCwgcmVsYXRpb25zaGlwKTtcblx0XHRcdGdyYXBoLmFkZFRyaXBsZShpZCwgcmVsYXRpb25zaGlwLCBuZXdCYWcpO1xuXHRcdFx0Z3JhcGguYWRkVHJpcGxlKG5ld0JhZywgbnMuZXhwYW5kUHJlZml4KFwicmRmOl8xXCIpLCBvYmplY3QpO1xuXHRcdFx0cmV0dXJuIFtuZXdCYWddO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJldHVybiBncmFwaC5nZXRPYmplY3RzKGlkLCByZWxhdGlvbnNoaXAsIG51bGwpO1xuXHRcdH1cblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm4gW25zLmNyZWF0ZUJhZyhncmFwaCwgaWQsIHJlbGF0aW9uc2hpcCldO1xuXHR9XG59O1xuXG5ucy5jcmVhdGVCYWcgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkLCByZWxhdGlvbnNoaXApIHtcblx0dmFyIG5ld0JsYW5rID0gZ3JhcGguY3JlYXRlQmxhbmtOb2RlKCk7XG5cdGdyYXBoLmFkZFRyaXBsZShpZCwgbnMuZXhwYW5kUHJlZml4KHJlbGF0aW9uc2hpcCksIG5ld0JsYW5rKTtcblx0Z3JhcGguYWRkVHJpcGxlKG5ld0JsYW5rLCBzdHJfcmRmdHlwZWV4cCwgc3RyX3JkZmJhZ2V4cCk7XG5cdHJldHVybiBuZXdCbGFuaztcbn07XG5cbi8qKlxuICoga3ZvYmplY3QgY29udGFpbnMgYmlvbG9neSBxdWFsaWZpZXIgYXMga2V5IGFuZCBtaXJpYW0gcmVzb3VyY2UgYXMgdmFsdWVcbiAqL1xubnMuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbiAoZ3JhcGgsIGlkLCBrdk9iamVjdCkge1xuXHRmb3IodmFyIHJlbGF0aW9uIGluIGt2T2JqZWN0KSB7XG5cdFx0Ly9jb25zb2xlLmxvZyhcInJlbGF0aW9uXCIsIHJlbGF0aW9uKTtcblx0XHR2YXIgcmVsYXRpb25FbGVtZW50ID0gbnMuZ2V0UmVsYXRpb25zaGlwKGdyYXBoLCBpZCwgcmVsYXRpb24pWzBdOyAvLyBkb2Vzbid0IG1hdHRlciBpZiBtb3JlIHRoYW4gb25lXG5cdFx0Ly9jb25zb2xlLmxvZyhcImFmdGVyIGdldCByZWxhdGlvblwiLHJlbGF0aW9uRWxlbWVudCwgZ3JhcGguZ2V0VHJpcGxlcyhpZCwgcmVsYXRpb24pKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWZ0ZXIgZ2V0IHJlYWx0aW9uXCIsIGdyYXBoLmdldFRyaXBsZXMoKSk7XG5cdFx0Ly8gdXNpbmcgZWxlbW50IGNvdW50IGFzIGluZGV4IG1heSBiZSBkYW5nZXJvdXMgaWYgcHJldmlvdXMgbWFuaXB1bGF0aW9uIG9mXG5cdFx0Ly8gdGhlIGVsZW1lbnRzIGhhcyBoYXBwZW5lZC4gTGlrZSByZW1vdmluZyBvbmUuIFxuXHRcdHZhciBwcm9wSW5kZXggPSBucy5jb3VudEJhZ0VsZW1lbnRzKGdyYXBoLCByZWxhdGlvbkVsZW1lbnQpICsgMTtcblx0XHQvL2NvbnNvbGUubG9nKFwiZWxlbWVudHMgaW4gYmFnOlwiLCBwcm9wSW5kZXgpO1xuXHRcdC8vY29uc29sZS5sb2coXCJuZXcgYmxhbmsgbm9kZVwiLCBncmFwaC5nZXRUcmlwbGVzKCkpO1xuXHRcdC8vY29uc29sZS5sb2coXCJXaWxsIGFkZFwiLCByZWxhdGlvbkVsZW1lbnQsIG5zLmV4cGFuZFByZWZpeChcInJkZjpfXCIrcHJvcEluZGV4KSwga3ZPYmplY3RbcmVsYXRpb25dKTtcblx0XHRncmFwaC5hZGRUcmlwbGUocmVsYXRpb25FbGVtZW50LCBucy5leHBhbmRQcmVmaXgoXCJyZGY6X1wiK3Byb3BJbmRleCksIGt2T2JqZWN0W3JlbGF0aW9uXSk7XG5cdFx0Ly9jb25zb2xlLmxvZyhcImVuZCByZXN1bHRcIiwgZ3JhcGguZ2V0VHJpcGxlcygpKTtcblx0XHQvL2NvbnNvbGUubG9nKFwiYWRkZWRcIiwgcmVsYXRpb24sIGt2T2JqZWN0W3JlbGF0aW9uXSk7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbnM7IiwiLyoqXG4gKiBUaGlzIHN1Ym1vZHVsZSBtYW5hZ2VzIHRoZSBhbm5vdGF0aW9ucyBleHRlbnNpb24uIEl0IGFkZHMgdGhlIGFiaWxpdHkgdG8gc2F2ZSBzZW1hbnRpYyBkYXRhIGludG9cbiAqIFNCR04tTUwgaW4gdGhlIGZvcm0gb2YgUkRGIGVsZW1lbnRzLiBBbnkgU0JHTiBlbGVtZW50IHRoYXQgY2FuIGhvc3QgYW4gZXh0ZW5zaW9uIHRhZyBjYW4gYWxzbyBcbiAqIGdldCBSREYgYW5ub3RhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBhbG1vc3QgZXZlcnkgZWxlbWVudCBjYW4gZ2V0IGFubm90YXRlZC5cbiAqXG4gKiBUaGUgYW5ub3RhdGlvbnMgaGVyZSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0d28gd2F5czpcbiAqIC0gd2l0aCBjb250cm9sbGVkIHZvY2FidWxhcnkgYW5kIHJlc291cmNlcywgYXMgc3VnZ2VzdGVkIGJ5IENPTUJJTkUsIHdpdGggdGhlIGhlbHAgb2YgTUlSSUFNXG4gKiAgIGlkZW50aWZpZXJzLlxuICogLSBhcyBhIG1lYW4gdG8gYXR0YWNoIGFyYml0cmFyeSBkYXRhIGluIHRoZSBmb3JtIG9mIGtleS12YWx1ZSBwcm9wZXJ0aWVzLlxuICpcbiAqICMgQ29udHJvbGxlZCB2b2NhYnVsYXJ5XG4gKlxuICogVGhlIGZvcm1hbCB3YXkgb2YgdXNpbmcgYW5ub3RhdGlvbnMgaXMgdG8gdXNlIHNwZWNpZmljIHZvY2FidWxhcnkgd2l0aCBzcGVjaWZpYyBpZGVudGlmaWVycyB0b1xuICogcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIG5vdCBiZSBjb252ZXllZCBvdGhlcndpc2UgdGhyb3VnaCB0aGUgU0JHTiBmb3JtYXQuXG4gKiBTZWUgLS1saW5rIHRvIGNvbWJpbmUgcXVhbGlmaWVycy0tIGFuZCAtLWxpbmsgdG8gaWRlbnRpZmllcnMub3JnIGFuZCBNSVJJQU0tLS1cbiAqIFRoaXMgd2FzIGFsc28gYmFzZWQgb24gdGhlIGFubm90YXRpb24gZXh0ZW5zaW9uIG9mIFNCTUwgLS1saW5rIHRvIGFubm90YXRpb24gcHJvcG9zYWwgZm9yIFNCTUwtLVxuICpcbiAqXG4gKiBTZWUge0BsaW5rIEV4dGVuc2lvbn0gZm9yIG1vcmUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiBleHRlbnNpb25zIGluIHRoZSBTQkdOLU1MIGZvcm1hdC5cbiAqXG4gKiBZb3UgY2FuIGFjY2VzcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMgbGlrZSB0aGlzOiA8Y29kZT5saWJzYmduLmFubm90LkFubm90YXRpb248L2NvZGU+XG4gKlxuICogQG1vZHVsZSBsaWJzYmduLWFubm90YXRpb25zXG4gKiBAbmFtZXNwYWNlIGxpYnNiZ24uYW5ub3RcbiovXG5cbnZhciBjaGVja1BhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzJykuY2hlY2tQYXJhbXM7XG52YXIgJHJkZiA9IHJlcXVpcmUoJ3JkZmxpYicpO1xudmFyIE4zID0gcmVxdWlyZSgnbjMnKTtcbnZhciBVdGlsID0gcmVxdWlyZSgnLi9hbm5vdGF0aW9uLXV0aWxzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxpdGllcycpO1xuXG52YXIgbnMgPSB7fTtcblxuLy9ucy54bWxucyA9IFwiaHR0cDovL3d3dy5zYm1sLm9yZy9zYm1sL2xldmVsMy92ZXJzaW9uMS9yZW5kZXIvdmVyc2lvbjFcIjtcblxuLy8gLS0tLS0tLSBBTk5PVEFUSU9OIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2Fubm90YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1JkZkVsZW1lbnQ9fSBwYXJhbXMucmRmRWxlbWVudFxuICovXG52YXIgQW5ub3RhdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydyZGZFbGVtZW50J10pO1xuXHR0aGlzLnJkZkVsZW1lbnQgPSBwYXJhbXMucmRmRWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSZGZFbGVtZW50fSByZGZFbGVtZW50XG4gKi9cbkFubm90YXRpb24ucHJvdG90eXBlLnNldFJkZkVsZW1lbnQgPSBmdW5jdGlvbihyZGZFbGVtZW50KSB7XG5cdHRoaXMucmRmRWxlbWVudCA9IHJkZkVsZW1lbnQ7XG59O1xuXG5Bbm5vdGF0aW9uLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgYW5ub3RhdGlvbkpzb25PYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoYW5ub3RhdGlvbkpzb25PYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gYW5ub3RhdGlvbkpzb25PYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuQW5ub3RhdGlvbi5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHthbm5vdGF0aW9uOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG5Bbm5vdGF0aW9uLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhbm5vdGF0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb24uZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmdLZWVwUHJlZml4KHN0cmluZywgZm4pO1xuICAgIHJldHVybiBhbm5vdGF0aW9uO1xufTtcblxuQW5ub3RhdGlvbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouYW5ub3RhdGlvbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgYW5ub3RhdGlvbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgYW5ub3RhdGlvbiA9IG5ldyBucy5Bbm5vdGF0aW9uKCk7XG5cdGpzT2JqID0ganNPYmouYW5ub3RhdGlvbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gYW5ub3RhdGlvbjtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqWydyZGY6UkRGJ10pIHtcblx0XHQvKnZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbnMuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5mcm9tT2JqKHtsaXN0T2ZDb2xvckRlZmluaXRpb25zOiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mQ29sb3JEZWZpbml0aW9ucyhsaXN0T2ZDb2xvckRlZmluaXRpb25zKTsqL1xuXG5cdFx0dmFyIG9iaiA9IHt9O1xuXHRcdG9ialsncmRmOlJERiddID0ganNPYmpbJ3JkZjpSREYnXVswXTtcblx0XHR2YXIgcmRmID0gbnMuUmRmRWxlbWVudC5mcm9tT2JqKG9iaik7XG5cdFx0YW5ub3RhdGlvbi5zZXRSZGZFbGVtZW50KHJkZik7XG5cdH1cblxuXHRyZXR1cm4gYW5ub3RhdGlvbjtcbn07XG5cbm5zLkFubm90YXRpb24gPSBBbm5vdGF0aW9uO1xuLy8gLS0tLS0tLSBFTkQgQU5OT1RBVElPTiAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gU1RPUkVPQkpFQ1QgLS0tLS0tLVxudmFyIFN0b3JlT2JqZWN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3N0b3JlJ10pO1xuXHRpZiAocGFyYW1zLnN0b3JlKSB7XG5cdFx0dGhpcy5zdG9yZSA9IHBhcmFtcy5zdG9yZTtcblx0fVxuXHRlbHNlIHtcblx0XHR2YXIgc3RvcmUgPSBOMy5TdG9yZSgpO1xuXHRcdHN0b3JlLmFkZFByZWZpeGVzKFV0aWwucHJlZml4ZXMpO1xuXHRcdHRoaXMuc3RvcmUgPSBzdG9yZTtcblx0fVxufTtcblxuU3RvcmVPYmplY3QucHJvdG90eXBlLmdldEN1c3RvbVByb3BlcnRpZXNPZklkID0gZnVuY3Rpb24gKGlkKSB7XG5cdHJldHVybiBVdGlsLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKHRoaXMuc3RvcmUsIGlkKTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5nZXRBbGxJZHMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBVdGlsLmdldEFsbElkcyh0aGlzLnN0b3JlKTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5hZGRDdXN0b21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChpZCwga3ZPYmplY3QpIHtcblx0cmV0dXJuIFV0aWwuYWRkQ3VzdG9tUHJvcGVydHkodGhpcy5zdG9yZSwgaWQsIGt2T2JqZWN0KTtcbn07XG5cblN0b3JlT2JqZWN0LnByb3RvdHlwZS5nZXRSZXNvdXJjZXNPZklkID0gZnVuY3Rpb24oaWQpIHtcblx0cmV0dXJuIFV0aWwuZ2V0UmVzb3VyY2VzT2ZJZCh0aGlzLnN0b3JlLCBpZCk7XG59O1xuXG5TdG9yZU9iamVjdC5wcm90b3R5cGUuYWRkUmVzb3VyY2UgPSBmdW5jdGlvbiAoaWQsIGt2T2JqZWN0KSB7XG5cdHJldHVybiBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkLCBrdk9iamVjdCk7XG59O1xuXG5ucy5TdG9yZU9iamVjdCA9IFN0b3JlT2JqZWN0O1xuLy8gLS0tLS0tLSBFTkQgU1RPUkVPQkpFQ1QgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEdMT0JBTFNUT1JFIC0tLS0tLS1cbnZhciBHbG9iYWxSZGZTdG9yZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0bnMuU3RvcmVPYmplY3QuY2FsbCh0aGlzLCBwYXJhbXMpO1xufTtcbkdsb2JhbFJkZlN0b3JlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU3RvcmVPYmplY3QucHJvdG90eXBlKTtcbkdsb2JhbFJkZlN0b3JlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdsb2JhbFJkZlN0b3JlO1xuXG5HbG9iYWxSZGZTdG9yZS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChhbm5vdGF0aW9ucykge1xuXHRmb3IodmFyIGk9MDsgaTxhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBhbm5vdCA9IGFubm90YXRpb25zW2ldO1xuXHRcdGlmKGFubm90LnJkZkVsZW1lbnQgIT0gbnVsbCkge1xuXHRcdFx0dmFyIHJkZkVsZW1lbnQgPSBhbm5vdC5yZGZFbGVtZW50cztcblx0XHRcdHRoaXMuc3RvcmUuYWRkVHJpcGxlcyhyZGZFbGVtZW50LnN0b3JlLmdldFRyaXBsZXMoKSk7XG5cdFx0fVxuXHR9XG5cdHRoaXMuc3RvcmUuYWRkUHJlZml4ZXMoVXRpbC5wcmVmaXhlcyk7XG59O1xuXG5HbG9iYWxSZGZTdG9yZS5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uICgpIHtcblx0Y29uc29sZS5sb2coXCJnbG9iYWxzdG9yZSB0ZXN0XCIpO1xuXHR2YXIgaWQyID0gXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMlwiO1xuXHR2YXIgaWQxID0gXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMVwiO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkMlwiLCB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkMikpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBpZHNcIiwgdGhpcy5nZXRBbGxJZHMoKSk7XG5cdGNvbnNvbGUubG9nKFwiaGFzU0lPXCIsIFV0aWwuaGFzUmVsYXRpb25zaGlwKHRoaXMuc3RvcmUsIGlkMiwgXCJzaW86U0lPXzAwMDIyM1wiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWRkIGhhc3Byb3BcIiwgVXRpbC5nZXRSZWxhdGlvbnNoaXAodGhpcy5zdG9yZSwgaWQxLCBcInNpbzpTSU9fMDAwMjIzXCIpKTtcblx0Y29uc29sZS5sb2coXCJhZGQgaGFzcHJvcDJcIiwgVXRpbC5nZXRSZWxhdGlvbnNoaXAodGhpcy5zdG9yZSwgaWQyLCBcInNpbzpTSU9fMDAwMjIzXCIpKTtcblx0Y29uc29sZS5sb2coXCJoYXNTSU8yXCIsIFV0aWwuaGFzUmVsYXRpb25zaGlwKHRoaXMuc3RvcmUsIGlkMiwgXCJzaW86U0lPXzAwMDIyM1wiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWRkIGt2cHJvcFwiLCBVdGlsLmFkZEN1c3RvbVByb3BlcnR5KHRoaXMuc3RvcmUsIGlkMiwge3Rlc3Q6IFwidGVzdHZhbHVlXCJ9KSk7XG5cdGNvbnNvbGUubG9nKFwiYWxsIHByb3BlcnRpZXMgb2YgaWQyXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoaWQyKSk7XG5cdGNvbnNvbGUubG9nKFwiLS0tLS0tLVwiKTtcblx0Y29uc29sZS5sb2coXCJhbGwgcHJvcGVydGllcyBvZiBpZFwiLCB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkMSkpO1xuXHRjb25zb2xlLmxvZyhcImFkZCBrdnByb3BcIiwgVXRpbC5hZGRDdXN0b21Qcm9wZXJ0eSh0aGlzLnN0b3JlLCBpZDEsIHt0ZXN0OiBcInRlc3R2YWx1ZVwifSkpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoaWQxKSk7XG5cdGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcblx0Y29uc29sZS5sb2coXCJnZXQgYWxsIHJlc291cmNlc1wiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQxKSk7XG5cdGNvbnNvbGUubG9nKFwiZ2V0IGFsbCByZXNvdXJjZXMgZm9yIGlkMlwiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQyKSk7XG5cdGNvbnNvbGUubG9nKFwiKioqKioqKioqKlwiKTtcblx0Y29uc29sZS5sb2coXCJhZGQgcmVzb3VyY2UgZm9yIGlkMlwiLCBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkMiwge1wiYnFiaW9sOmlzXCI6IFwiaHR0cDovL2FVUkxcIn0pKTtcblx0Y29uc29sZS5sb2coXCJnZXQgYWxsIHJlc291cmNlcyBmb3IgaWQyXCIsIFV0aWwuZ2V0UmVzb3VyY2VzT2ZJZCh0aGlzLnN0b3JlLCBpZDIpKTtcblx0Y29uc29sZS5sb2coXCJhZGQgcmVzb3VyY2UgZm9yIGlkMlwiLCBVdGlsLmFkZFJlc291cmNlKHRoaXMuc3RvcmUsIGlkMiwge1wiYnFtb2RlbDppc1wiOiBcImh0dHA6Ly9hVVJMWlpaXCJ9KSk7XG5cdGNvbnNvbGUubG9nKFwiZ2V0IGFsbCByZXNvdXJjZXMgZm9yIGlkMlwiLCBVdGlsLmdldFJlc291cmNlc09mSWQodGhpcy5zdG9yZSwgaWQyKSk7XG5cdC8qdmFyIHNlbGYgPSB0aGlzO1xuXHR0aGlzLmdldEFsbElkcygpLmZvckVhY2goZnVuY3Rpb24oZSl7XG5cdFx0Y29uc29sZS5sb2coZSwgc2VsZi5nZXRDdXN0b21Qcm9wZXJ0aWVzT2ZJZChlKSk7XG5cdH0pOyovXG59O1xuXG5ucy5HbG9iYWxSZGZTdG9yZSA9IEdsb2JhbFJkZlN0b3JlO1xuLy8gLS0tLS0tLSBFTkQgR0xPQkFMU1RPUkUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFJERkVMRU1FTlQgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cmQ6UkRGZiZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqL1xudmFyIFJkZkVsZW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdG5zLlN0b3JlT2JqZWN0LmNhbGwodGhpcywgcGFyYW1zKTtcbn07XG5SZGZFbGVtZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU3RvcmVPYmplY3QucHJvdG90eXBlKTtcblJkZkVsZW1lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmRmRWxlbWVudDtcblxuUmRmRWxlbWVudC51cmkgPSAnaHR0cDovL3d3dy5laXNibS5vcmcvJztcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblJkZkVsZW1lbnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24oKSB7XG5cdC8qXG5cdFx0QWRkIHNvbWUgZnVuY3Rpb25zIHRvIHRoZSB3cml0ZXIgb2JqZWN0IG9mIE4zXG5cdFx0VGhvc2UgZnVuY3Rpb25zIHdpbGwgYWxsb3cgdXMgdG8gc2VyaWFsaXplIHRyaXBsZXMgc3luY2hyb25vdXNseS5cblx0XHRXaXRob3V0IGl0LCB3ZSB3b3VsZCBiZSBmb3JjZWQgdG8gdXNlIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb25zLlxuXHQqL1xuXHRmdW5jdGlvbiBhZGRTaW1wbGVXcml0ZSAod3JpdGVyKSB7XG5cdFx0Ly8gcmVwbGljYXRlcyB0aGUgd3JpdGVyLl93cml0ZSBmdW5jdGlvbiBidXQgcmV0dXJucyBhIHN0cmluZ1xuXHRcdHdyaXRlci5zaW1wbGVXcml0ZVRyaXBsZSA9IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpICtcblx0XHRcdChncmFwaCA/ICcgJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcuXFxuJyA6ICcuXFxuJylcblx0XHR9O1xuXHRcdC8vIGFsbG93cyB0byBwcm92aWRlIGFuIGFycmF5IG9mIHRyaXBsZXMgYW5kIGNvbmNhdGVuYXRlIHRoZWlyIHNlcmlhbGl6ZWQgc3RyaW5nc1xuXHRcdHdyaXRlci5zaW1wbGVXcml0ZVRyaXBsZXMgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0XHRcdHZhciBzdHJpbmdOMyA9ICcnO1xuXHRcdFx0Zm9yICh2YXIgaT0wOyBpPGFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciB0cmlwbGUgPSBhcnJheVtpXTtcblx0XHRcdFx0c3RyaW5nTjMgKz0gdGhpcy5zaW1wbGVXcml0ZVRyaXBsZSh0cmlwbGUuc3ViamVjdCwgdHJpcGxlLnByZWRpY2F0ZSwgdHJpcGxlLm9iamVjdCwgdHJpcGxlLmdyYXBoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzdHJpbmdOMztcblx0XHR9O1xuXHR9XG5cblx0Ly8gc2VyaWFsaXplIHRoZSBzdG9yZWQgZ3JhcGggdG8gTjNcblx0dmFyIHdyaXRlciA9IE4zLldyaXRlcih7IHByZWZpeGVzOiBVdGlsLnByZWZpeGVzLCBmb3JtYXQ6ICdOLVRyaXBsZXMnIH0pO1xuXHRhZGRTaW1wbGVXcml0ZSh3cml0ZXIpOyAvLyBhZGQgb3VyIGN1c3RvbSBtZXRob2RzIHRvIHRoZSB3cml0ZXJcblx0dmFyIHN0cmluZ04zID0gd3JpdGVyLnNpbXBsZVdyaXRlVHJpcGxlcyh0aGlzLnN0b3JlLmdldFRyaXBsZXMoKSk7IC8vIHVzZSBjdXN0b20gbWV0aG9kIHRvIHNlcmlhbGl6ZSB0cmlwbGVzXG5cblx0Ly8gcmVhZCBOMyBmb3JtYXRcblx0dmFyIGdyYXBoID0gJHJkZi5ncmFwaCgpO1xuXHR0cnkge1xuXHQgICAgJHJkZi5wYXJzZShzdHJpbmdOMywgZ3JhcGgsIFJkZkVsZW1lbnQudXJpLCAndGV4dC9uMycpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0ICAgIGNvbnNvbGUubG9nKGVycik7XG5cdH1cblx0Lypcblx0XHRUaGUgbmFtZXNwYWNlIHByZWZpeGVzIGFyZSBsb3N0IGluIHRoZSBuMyBmb3JtYXQsIHNvIHJkZmxpYiB3aWxsIGd1ZXNzIHRoZW0gb24gaXRzIG93bi5cblx0XHRUaGUgcmVzdWx0IGdpdmVzIHdlaXJkIHdyb25nIHByZWZpeGVzLiBIZXJlIHdlIHByb3ZpZGUgdGhlIG9yaWdpbmFsIG5hbWVzLiBBZXN0aGV0aWMgcHVycG9zZSBvbmx5LlxuXHQqL1xuXHRncmFwaC5uYW1lc3BhY2VzID0gVXRpbC5wcmVmaXhlcztcblxuXHQvKlxuXHRcdHNlcmlhbGl6ZSB0byBSREYrWE1MIFxuXHRcdHByb2JsZW0sIHRoZSBvdXRwdXQgZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCBYTUwuIHJkZmxpYiBleHBhbmRzIGNvbGxlY3Rpb25zIGxpa2UgQmFnLCBhbmQgXG5cdFx0ZWxlbWVudHMgd2l0aCBvbmx5IGF0cmlidXRlcy4gSXQgYWxzbyBtYWtlcyB0aGluZ3MgbGVzcyByZWFkYWJsZS5cblx0XHRXZSBuZWVkIHRvIHJlcGxhY2Ugc2V2ZXJhbCB0aGluZ3MgdG8ga2VlcCBvdXRwdXQgdGhlIHNhbWUgYXMgaW5wdXQuIFxuXHQqL1xuXHR2YXIgc2VyaWFsaXplID0gJHJkZi5zZXJpYWxpemUoJHJkZi5zeW0oUmRmRWxlbWVudC51cmkpLCBncmFwaCwgdW5kZWZpbmVkLCAnYXBwbGljYXRpb24vcmRmK3htbCcpO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2VMaShzdHJpbmcpIHtcblx0XHR2YXIgcmVnZXhwTGkgPSAvPHJkZjpsaSggcmRmOnBhcnNlVHlwZT1cIlJlc291cmNlXCIpPz5bXFxzXFxTXSo/PChcXHcrKTpTSU9fMDAwMTE2PihbXFxzXFxTXSo/KTxcXC9cXDI6U0lPXzAwMDExNj5bXFxzXFxTXSo/PHJkZjp2YWx1ZT4oW1xcc1xcU10qPyk8XFwvcmRmOnZhbHVlPltcXHNcXFNdKj88XFwvcmRmOmxpPi9nO1xuXHRcdHZhciByZXN1bHQgPSBzdHJpbmcucmVwbGFjZShyZWdleHBMaSwgJzxyZGY6bGkgJDI6U0lPXzAwMDExNj1cIiQzXCIgcmRmOnZhbHVlPVwiJDRcIi8+Jyk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlcGxhY2VCYWcoc3RyaW5nKSB7XG5cdFx0Ly8gcmVnZXhwIHdpbGwgc3BvdCBhIHRyYW5zZm9ybWVkIGJhZyBhbmQgY2FwdHVyZSBpdHMgY29udGVudFxuXHRcdHZhciByZWdleHBCYWcgPSAvKDxyZGY6RGVzY3JpcHRpb24+KFtcXHNcXFNdKj8pPHJkZjp0eXBlIHJkZjpyZXNvdXJjZT1cImh0dHA6XFwvXFwvd3d3XFwudzNcXC5vcmdcXC8xOTk5XFwvMDJcXC8yMi1yZGYtc3ludGF4LW5zI0JhZ1wiXFwvPltcXHNcXFNdKj88XFwvcmRmOkRlc2NyaXB0aW9uPikvZztcblx0XHR2YXIgcmVzdWx0MSA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4cEJhZywgJzxyZGY6QmFnPiQyPC9yZGY6QmFnPicpO1xuXHRcdHZhciByZXN1bHQyID0gcmVzdWx0MS5yZXBsYWNlKC8gICAgPFxcL3JkZjpCYWc+L2csICc8L3JkZjpCYWc+Jyk7XG5cdFx0cmV0dXJuIHJlc3VsdDI7XG5cdH1cblxuXHRmdW5jdGlvbiByZXBsYWNlUGFyc2VUeXBlKHN0cmluZykge1xuXHRcdHZhciByZWdleHAgPSAvIHJkZjpwYXJzZVR5cGU9XCJSZXNvdXJjZVwiL2c7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlZ2V4cCwgJycpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcmVwbGFjZVNsYXNoSW5JRChzdHJpbmcpIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UobmV3IFJlZ0V4cCgvcmRmOmFib3V0PVwiXFwvL2cpLCAncmRmOmFib3V0PVwiJyk7XG5cdH1cblx0XG5cdHZhciByZXN1bHQgPSByZXBsYWNlU2xhc2hJbklEKHJlcGxhY2VQYXJzZVR5cGUocmVwbGFjZUxpKHJlcGxhY2VCYWcoc2VyaWFsaXplKSkpKTtcblx0XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0geG1sXG4gKiBAcmV0dXJuIHtSZGZFbGVtZW50fVxuICovXG5SZGZFbGVtZW50LmZyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyaW5nWG1sKSB7XG5cblx0dmFyIHJkZkVsZW1lbnQgPSBuZXcgUmRmRWxlbWVudCgpO1xuXHR2YXIgZ3JhcGggPSAkcmRmLmdyYXBoKCk7XG5cblx0Ly8gcmRmbGliIG9ubHkgYWNjZXB0cyBzdHJpbmcgYXMgaW5wdXQsIG5vdCB4bWwgZWxlbWVudHNcblx0dHJ5IHtcblx0ICAgICRyZGYucGFyc2Uoc3RyaW5nWG1sLCBncmFwaCwgUmRmRWxlbWVudC51cmksICdhcHBsaWNhdGlvbi9yZGYreG1sJyk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHQgICAgY29uc29sZS5sb2coZXJyKTtcblx0fVxuXHRcblx0Ly8gY29udmVydCB0byB0dXJ0bGUgdG8gZmVlZCB0byBOM1xuXHR2YXIgdHVydGxlID0gJHJkZi5zZXJpYWxpemUoJHJkZi5zeW0oUmRmRWxlbWVudC51cmkpLCBncmFwaCwgdW5kZWZpbmVkLCAndGV4dC90dXJ0bGUnKTtcblxuXHR2YXIgcGFyc2VyID0gTjMuUGFyc2VyKCk7XG5cdHZhciBzdG9yZSA9IE4zLlN0b3JlKCk7XG5cdHN0b3JlLmFkZFByZWZpeGVzKFV0aWwucHJlZml4ZXMpO1xuXHRzdG9yZS5hZGRUcmlwbGVzKHBhcnNlci5wYXJzZSh0dXJ0bGUpKTtcblx0XG5cdHJkZkVsZW1lbnQuc3RvcmUgPSBzdG9yZTtcblxuXHRyZXR1cm4gcmRmRWxlbWVudDtcbn07XG5cblJkZkVsZW1lbnQuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHJkZkVsZW1lbnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICByZGZFbGVtZW50ID0gUmRmRWxlbWVudC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZ0tlZXBQcmVmaXgoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIHJkZkVsZW1lbnQ7XG59O1xuXG5SZGZFbGVtZW50LmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09ialsncmRmOlJERiddID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSByZGY6UkRGLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciByZGZFbGVtZW50ID0gbmV3IG5zLlJkZkVsZW1lbnQoKTtcblx0anNPYmogPSBqc09ialsncmRmOlJERiddO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiByZGZFbGVtZW50O1xuXHR9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHRvYmpbJ3JkZjpSREYnXSA9IGpzT2JqO1xuXHRyZGZFbGVtZW50ID0gbnMuUmRmRWxlbWVudC5mcm9tU3RyaW5nKHV0aWxzLmJ1aWxkU3RyaW5nKG9iaikpO1xuXG5cdHJldHVybiByZGZFbGVtZW50O1xufTtcblxuUmRmRWxlbWVudC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKCkge1xuXHQvL2NvbnNvbGUubG9nKHRoaXMuc3RvcmUpO1xuXHQvL2NvbnNvbGUubG9nKHRoaXMuc3RvcmUuZ2V0VHJpcGxlcyhcImh0dHA6Ly9sb2NhbC9hbklEMDAwMDAxXCIsIG51bGwsIG51bGwpKTtcblx0Y29uc29sZS5sb2coXCJleHBhbmQgcHJlZml4IHNob3J0Y3V0XCIsIFV0aWwuZXhwYW5kUHJlZml4KFwic2lvOlNJT18wMDAxMTZcIikpO1xuXHRjb25zb2xlLmxvZyhcImFsbCBwcm9wZXJ0aWVzIG9mIGlkXCIsIHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc09mSWQoXCJodHRwOi8vbG9jYWwvYW5JRDAwMDAwMVwiKSk7XG5cdGNvbnNvbGUubG9nKFwiYWxsIGlkc1wiLCB0aGlzLmdldEFsbElkcygpKTtcbn07XG5cbm5zLlJkZkVsZW1lbnQgPSBSZGZFbGVtZW50O1xuLy8gLS0tLS0tLSBFTkQgUkRGRUxFTUVOVCAtLS0tLS0tXG5cblxubnMucmRmbGliID0gJHJkZjtcbm5zLlV0aWwgPSBVdGlsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5zO1xuIiwiLyoqXG4gKiBUaGlzIHN1Ym1vZHVsZSBjb250YWlucyB0aGUgY2xhc3NlcyB0byBtYW5hZ2UgdGhlIHJlbmRlciBleHRlbnNpb24ncyB4bWwgYW5kIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKiBJdCBhZGRzIHRoZSBhYmlsaXR5IHRvIHNhdmUgdGhlIHN0eWxlcyBhbmQgY29sb3JzIHVzZWQgaW4gYW4gU0JHTiBtYXAsIGFzIGZlYXR1cmVzIGxpa2UgYmFja2dyb3VuZC1jb2xvcixcbiAqIGJvcmRlciB0aGlja25lc3Mgb3IgZm9udCBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgU0JHTiBzdGFuZGFyZC5cbiAqXG4gKiBJdCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSB7QGxpbmsgaHR0cDovL3NibWwub3JnL0RvY3VtZW50cy9TcGVjaWZpY2F0aW9ucy9TQk1MX0xldmVsXzMvUGFja2FnZXMvcmVuZGVyfHJlbmRlciBleHRlbnNpb24gb2YgdGhlIFNCTUwgZm9ybWF0fS5cbiAqIEEgc3Vic2V0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBoYXMgYmVlbiBhZGFwdGVkIGZvciBTQkdOLU1MIGludGVncmF0aW9uLlxuICpcbiAqIFNlZSB7QGxpbmsgRXh0ZW5zaW9ufSBmb3IgbW9yZSBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIGV4dGVuc2lvbnMgaW4gdGhlIFNCR04tTUwgZm9ybWF0LlxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBsaWtlIHRoaXM6IDxjb2RlPmxpYnNiZ24ucmVuZGVyLkNvbG9yRGVmaW5pdGlvbjwvY29kZT5cbiAqXG4gKiBAbW9kdWxlIGxpYnNiZ24tcmVuZGVyXG4gKiBAbmFtZXNwYWNlIGxpYnNiZ24ucmVuZGVyXG4qL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxpdGllcycpO1xudmFyIGNoZWNrUGFyYW1zID0gdXRpbHMuY2hlY2tQYXJhbXM7XG52YXIgeG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG5cbnZhciBucyA9IHt9O1xuXG5ucy54bWxucyA9IFwiaHR0cDovL3d3dy5zYm1sLm9yZy9zYm1sL2xldmVsMy92ZXJzaW9uMS9yZW5kZXIvdmVyc2lvbjFcIjtcblxuLy8gLS0tLS0tLSBDT0xPUkRFRklOSVRJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7Y29sb3JEZWZpbml0aW9uJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuaWRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnZhbHVlXG4gKi9cbnZhciBDb2xvckRlZmluaXRpb24gPSBmdW5jdGlvbihwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydpZCcsICd2YWx1ZSddKTtcblx0dGhpcy5pZCBcdD0gcGFyYW1zLmlkO1xuXHR0aGlzLnZhbHVlIFx0PSBwYXJhbXMudmFsdWU7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5Db2xvckRlZmluaXRpb24ucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBjb2xvcmRlZk9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5pZCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7XG5cdH1cblx0aWYodGhpcy52YWx1ZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy52YWx1ZSA9IHRoaXMudmFsdWU7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhjb2xvcmRlZk9iaiwgYXR0cmlidXRlcyk7XG5cdHJldHVybiBjb2xvcmRlZk9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5Db2xvckRlZmluaXRpb24ucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2NvbG9yRGVmaW5pdGlvbjogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtDb2xvckRlZmluaXRpb259XG4gKi9cbkNvbG9yRGVmaW5pdGlvbi5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgY29sb3JEZWZpbml0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgY29sb3JEZWZpbml0aW9uID0gQ29sb3JEZWZpbml0aW9uLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBjb2xvckRlZmluaXRpb247XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtDb2xvckRlZmluaXRpb259XG4gKi9cbkNvbG9yRGVmaW5pdGlvbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouY29sb3JEZWZpbml0aW9uID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBjb2xvckRlZmluaXRpb24sIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGNvbG9yRGVmaW5pdGlvbiA9IG5ldyBucy5Db2xvckRlZmluaXRpb24oKTtcblx0anNPYmogPSBqc09iai5jb2xvckRlZmluaXRpb247XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGNvbG9yRGVmaW5pdGlvbjtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0Y29sb3JEZWZpbml0aW9uLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdGNvbG9yRGVmaW5pdGlvbi52YWx1ZSA9IGF0dHJpYnV0ZXMudmFsdWUgfHwgbnVsbDtcblx0fVxuXHRyZXR1cm4gY29sb3JEZWZpbml0aW9uO1xufTtcblxubnMuQ29sb3JEZWZpbml0aW9uID0gQ29sb3JEZWZpbml0aW9uO1xuLy8gLS0tLS0tLSBFTkQgQ09MT1JERUZJTklUSU9OIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBMSVNUT0ZDT0xPUkRFRklOSVRJT05TIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2xpc3RPZkNvbG9yRGVmaW5pdGlvbnMmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKi9cbnZhciBMaXN0T2ZDb2xvckRlZmluaXRpb25zID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLmNvbG9yRGVmaW5pdGlvbnMgPSBbXTtcblx0dGhpcy5jb2xvckluZGV4ID0ge307XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29sb3JEZWZpbml0aW9ufSBjb2xvckRlZmluaXRpb25cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuYWRkQ29sb3JEZWZpbml0aW9uID0gZnVuY3Rpb24gKGNvbG9yRGVmaW5pdGlvbikge1xuXHR0aGlzLmNvbG9yRGVmaW5pdGlvbnMucHVzaChjb2xvckRlZmluaXRpb24pO1xuXHR0aGlzLmNvbG9ySW5kZXhbY29sb3JEZWZpbml0aW9uLmlkXSA9IGNvbG9yRGVmaW5pdGlvbi52YWx1ZTtcbn07XG5cbi8qKlxuICogQ29udmVuaWVudCBtZXRob2QgdG8gZ2V0IGEgY29sb3IgdmFsdWUgZGlyZWN0bHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuZ2V0Q29sb3JCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG5cdHJldHVybiB0aGlzLmNvbG9ySW5kZXhbaWRdO1xufTtcblxuLyoqXG4gKiBDb252ZW5pZW50IG1ldGhvZCB0byBnZXQgYWxsIHRoZSBjb2xvciB2YWx1ZXMgaW4gdGhlIGxpc3QuXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuZ2V0QWxsQ29sb3JzID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbG9ySW5kZXgpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnNPYmogPSB7fTtcblxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuY29sb3JEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRsaXN0T2ZDb2xvckRlZmluaXRpb25zT2JqLmNvbG9yRGVmaW5pdGlvbiA9IFtdO1xuXHRcdH1cblx0XHRsaXN0T2ZDb2xvckRlZmluaXRpb25zT2JqLmNvbG9yRGVmaW5pdGlvbi5wdXNoKHRoaXMuY29sb3JEZWZpbml0aW9uc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cblx0cmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7bGlzdE9mQ29sb3JEZWZpbml0aW9uczogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfVxuICovXG5MaXN0T2ZDb2xvckRlZmluaXRpb25zLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgbGlzdE9mQ29sb3JEZWZpbml0aW9ucyA9IExpc3RPZkNvbG9yRGVmaW5pdGlvbnMuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfVxuICovXG5MaXN0T2ZDb2xvckRlZmluaXRpb25zLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBsaXN0T2ZDb2xvckRlZmluaXRpb25zLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbmV3IG5zLkxpc3RPZkNvbG9yRGVmaW5pdGlvbnMoKTtcblx0anNPYmogPSBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmouY29sb3JEZWZpbml0aW9uKSB7XG5cdFx0dmFyIGNvbG9yRGVmaW5pdGlvbnMgPSBqc09iai5jb2xvckRlZmluaXRpb247XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgY29sb3JEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNvbG9yRGVmaW5pdGlvbiA9IG5zLkNvbG9yRGVmaW5pdGlvbi5mcm9tT2JqKHtjb2xvckRlZmluaXRpb246IGNvbG9yRGVmaW5pdGlvbnNbaV19KTtcblx0XHRcdGxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuYWRkQ29sb3JEZWZpbml0aW9uKGNvbG9yRGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG59O1xuXG5ucy5MaXN0T2ZDb2xvckRlZmluaXRpb25zID0gTGlzdE9mQ29sb3JEZWZpbml0aW9ucztcbi8vIC0tLS0tLS0gRU5EIExJU1RPRkNPTE9SREVGSU5JVElPTlMgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFJFTkRFUkdST1VQIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2cmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuZm9udFNpemVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRGYW1pbHlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRXZWlnaHRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZvbnRTdHlsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudGV4dEFuY2hvclxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudnRleHRBbmNob3JcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmZpbGwgVGhlIGVsZW1lbnQncyBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zdHJva2UgQm9yZGVyIGNvbG9yIGZvciBnbHlwaHMsIGxpbmUgY29sb3IgZm9yIGFyY3MuXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zdHJva2VXaWR0aFxuICovXG52YXIgUmVuZGVyR3JvdXAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdC8vIGVhY2ggb2YgdGhvc2UgYXJlIG9wdGlvbmFsLCBzbyB0ZXN0IGlmIGl0IGlzIGRlZmluZWQgaXMgbWFuZGF0b3J5XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnZm9udFNpemUnLCAnZm9udEZhbWlseScsICdmb250V2VpZ2h0JywgXG5cdFx0J2ZvbnRTdHlsZScsICd0ZXh0QW5jaG9yJywgJ3Z0ZXh0QW5jaG9yJywgJ2ZpbGwnLCAnaWQnLCAnc3Ryb2tlJywgJ3N0cm9rZVdpZHRoJ10pO1xuXHQvLyBzcGVjaWZpYyB0byByZW5kZXJHcm91cFxuXHR0aGlzLmZvbnRTaXplIFx0XHQ9IHBhcmFtcy5mb250U2l6ZTtcblx0dGhpcy5mb250RmFtaWx5IFx0PSBwYXJhbXMuZm9udEZhbWlseTtcblx0dGhpcy5mb250V2VpZ2h0IFx0PSBwYXJhbXMuZm9udFdlaWdodDtcblx0dGhpcy5mb250U3R5bGUgXHRcdD0gcGFyYW1zLmZvbnRTdHlsZTtcblx0dGhpcy50ZXh0QW5jaG9yIFx0PSBwYXJhbXMudGV4dEFuY2hvcjsgLy8gcHJvYmFibHkgdXNlbGVzc1xuXHR0aGlzLnZ0ZXh0QW5jaG9yIFx0PSBwYXJhbXMudnRleHRBbmNob3I7IC8vIHByb2JhYmx5IHVzZWxlc3Ncblx0Ly8gZnJvbSBHcmFwaGljYWxQcmltaXRpdmUyRFxuXHR0aGlzLmZpbGwgXHRcdFx0PSBwYXJhbXMuZmlsbDsgLy8gZmlsbCBjb2xvclxuXHQvLyBmcm9tIEdyYXBoaWNhbFByaW1pdGl2ZTFEXG5cdHRoaXMuaWQgXHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMuc3Ryb2tlIFx0XHQ9IHBhcmFtcy5zdHJva2U7IC8vIHN0cm9rZSBjb2xvclxuXHR0aGlzLnN0cm9rZVdpZHRoIFx0PSBwYXJhbXMuc3Ryb2tlV2lkdGg7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5SZW5kZXJHcm91cC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJlbmRlckdyb3VwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmlkICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkID0gdGhpcy5pZDtcblx0fVxuXHRpZih0aGlzLmZvbnRTaXplICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcblx0fVxuXHRpZih0aGlzLmZvbnRGYW1pbHkgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZm9udEZhbWlseSA9IHRoaXMuZm9udEZhbWlseTtcblx0fVxuXHRpZih0aGlzLmZvbnRXZWlnaHQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZm9udFdlaWdodCA9IHRoaXMuZm9udFdlaWdodDtcblx0fVxuXHRpZih0aGlzLmZvbnRTdHlsZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5mb250U3R5bGUgPSB0aGlzLmZvbnRTdHlsZTtcblx0fVxuXHRpZih0aGlzLnRleHRBbmNob3IgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGV4dEFuY2hvciA9IHRoaXMudGV4dEFuY2hvcjtcblx0fVxuXHRpZih0aGlzLnZ0ZXh0QW5jaG9yICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnZ0ZXh0QW5jaG9yID0gdGhpcy52dGV4dEFuY2hvcjtcblx0fVxuXHRpZih0aGlzLnN0cm9rZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5zdHJva2UgPSB0aGlzLnN0cm9rZTtcblx0fVxuXHRpZih0aGlzLnN0cm9rZVdpZHRoICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnN0cm9rZVdpZHRoID0gdGhpcy5zdHJva2VXaWR0aDtcblx0fVxuXHRpZih0aGlzLmZpbGwgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuZmlsbCA9IHRoaXMuZmlsbDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKHJlbmRlckdyb3VwT2JqLCBhdHRyaWJ1dGVzKTtcblx0cmV0dXJuIHJlbmRlckdyb3VwT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblJlbmRlckdyb3VwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtnOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1JlbmRlckdyb3VwfVxuICovXG5SZW5kZXJHcm91cC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgZztcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGcgPSBSZW5kZXJHcm91cC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge1JlbmRlckdyb3VwfVxuICovXG5SZW5kZXJHcm91cC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouZyA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZywgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZyA9IG5ldyBucy5SZW5kZXJHcm91cCgpO1xuXHRqc09iaiA9IGpzT2JqLmc7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGc7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGcuaWQgXHRcdFx0PSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0Zy5mb250U2l6ZSBcdFx0PSBhdHRyaWJ1dGVzLmZvbnRTaXplIHx8IG51bGw7XG5cdFx0Zy5mb250RmFtaWx5IFx0PSBhdHRyaWJ1dGVzLmZvbnRGYW1pbHkgfHwgbnVsbDtcblx0XHRnLmZvbnRXZWlnaHQgXHQ9IGF0dHJpYnV0ZXMuZm9udFdlaWdodCB8fCBudWxsO1xuXHRcdGcuZm9udFN0eWxlIFx0PSBhdHRyaWJ1dGVzLmZvbnRTdHlsZSB8fCBudWxsO1xuXHRcdGcudGV4dEFuY2hvciBcdD0gYXR0cmlidXRlcy50ZXh0QW5jaG9yIHx8IG51bGw7XG5cdFx0Zy52dGV4dEFuY2hvciBcdD0gYXR0cmlidXRlcy52dGV4dEFuY2hvciB8fCBudWxsO1xuXHRcdGcuc3Ryb2tlIFx0XHQ9IGF0dHJpYnV0ZXMuc3Ryb2tlIHx8IG51bGw7XG5cdFx0Zy5zdHJva2VXaWR0aCBcdD0gYXR0cmlidXRlcy5zdHJva2VXaWR0aCB8fCBudWxsO1xuXHRcdGcuZmlsbCBcdFx0XHQ9IGF0dHJpYnV0ZXMuZmlsbCB8fCBudWxsO1xuXHR9XG5cdHJldHVybiBnO1xufTtcblxubnMuUmVuZGVyR3JvdXAgPSBSZW5kZXJHcm91cDtcbi8vIC0tLS0tLS0gRU5EIFJFTkRFUkdST1VQIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBTVFlMRSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5uYW1lXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZExpc3RcbiAqIEBwYXJhbSB7UmVuZGVyR3JvdXA9fSBwYXJhbXMucmVuZGVyR3JvdXBcbiAqL1xudmFyIFN0eWxlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnbmFtZScsICdpZExpc3QnLCAncmVuZGVyR3JvdXAnXSk7XG5cdHRoaXMuaWQgXHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMubmFtZSBcdFx0XHQ9IHBhcmFtcy5uYW1lO1xuXHR0aGlzLmlkTGlzdCBcdFx0PSBwYXJhbXMuaWRMaXN0OyAvLyBUT0RPIGFkZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhpcyAoc2hvdWxkIGJlIGFycmF5KVxuXHR0aGlzLnJlbmRlckdyb3VwIFx0PSBwYXJhbXMucmVuZGVyR3JvdXA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVuZGVyR3JvdXB9IHJlbmRlckdyb3VwXG4gKi9cblN0eWxlLnByb3RvdHlwZS5zZXRSZW5kZXJHcm91cCA9IGZ1bmN0aW9uIChyZW5kZXJHcm91cCkge1xuXHR0aGlzLnJlbmRlckdyb3VwID0gcmVuZGVyR3JvdXA7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5TdHlsZS5wcm90b3R5cGUuZ2V0SWRMaXN0QXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuaWRMaXN0LnNwbGl0KCcgJyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gaWRBcnJheVxuICovXG5TdHlsZS5wcm90b3R5cGUuc2V0SWRMaXN0RnJvbUFycmF5ID0gZnVuY3Rpb24gKGlkQXJyYXkpIHtcblx0dGhpcy5pZExpc3QgPSBpZEFycmF5LmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiByZXR1cm5pbmcgYSBtYXAgb2YgaWRzIHRvIHRoZWlyIHJlc3BlY3RpdmUgUmVuZGVyR3JvdXAgb2JqZWN0LlxuICogVGhlIHN0eWxlIHByb3BlcnRpZXMgY2FuIHRoZW4gYmUgZGlyZWN0bHkgYWNjZXNzZWQuIEV4YW1wbGU6IG1hcFtpZF0uc3Ryb2tlXG4gKiBAcmV0dXJuIHtPYmplY3QuPHN0cmluZywgUmVuZGVyR3JvdXA+fVxuICovXG5TdHlsZS5wcm90b3R5cGUuZ2V0U3R5bGVNYXAgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBpbmRleCA9IHt9O1xuXHR2YXIgaWRzID0gdGhpcy5nZXRJZExpc3RBc0FycmF5KCk7XG5cdGZvcih2YXIgaT0wOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGlkID0gaWRzW2ldO1xuXHRcdGluZGV4W2lkXSA9IHRoaXMucmVuZGVyR3JvdXA7XG5cdH1cblx0cmV0dXJuIGluZGV4O1xufTtcbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblN0eWxlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3R5bGVPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMubmFtZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lO1xuXHR9XG5cdGlmKHRoaXMuaWRMaXN0ICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkTGlzdCA9IHRoaXMuaWRMaXN0O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3R5bGVPYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKHRoaXMucmVuZGVyR3JvdXAgIT0gbnVsbCkge1xuXHRcdHN0eWxlT2JqLmcgPSAgdGhpcy5yZW5kZXJHcm91cC5idWlsZEpzT2JqKCk7XG5cdH1cblx0cmV0dXJuIHN0eWxlT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblN0eWxlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdHlsZTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdHlsZX1cbiAqL1xuU3R5bGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHN0eWxlO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgc3R5bGUgPSBTdHlsZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3R5bGU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHlsZX1cbiAqL1xuU3R5bGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLnN0eWxlID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBzdHlsZSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgc3R5bGUgPSBuZXcgbnMuU3R5bGUoKTtcblx0anNPYmogPSBqc09iai5zdHlsZTtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3R5bGU7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0eWxlLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdHN0eWxlLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgbnVsbDtcblx0XHRzdHlsZS5pZExpc3QgPSBhdHRyaWJ1dGVzLmlkTGlzdCB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmouZykge1xuXHRcdHZhciBnID0gbnMuUmVuZGVyR3JvdXAuZnJvbU9iaih7ZzoganNPYmouZ1swXX0pO1xuXHRcdHN0eWxlLnNldFJlbmRlckdyb3VwKGcpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlO1xufTtcblxubnMuU3R5bGUgPSBTdHlsZTtcbi8vIC0tLS0tLS0gRU5EIFNUWUxFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBMSVNUT0ZTVFlMRVMgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bGlzdE9mU3R5bGVzJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICovXG52YXIgTGlzdE9mU3R5bGVzID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc3R5bGVzID0gW107XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3R5bGV9IHN0eWxlXG4gKi9cbkxpc3RPZlN0eWxlcy5wcm90b3R5cGUuYWRkU3R5bGUgPSBmdW5jdGlvbiAoc3R5bGUpIHtcblx0dGhpcy5zdHlsZXMucHVzaChzdHlsZSk7XG59O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHJldHVybmluZyBhIG1hcCBvZiBpZHMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBSZW5kZXJHcm91cCBvYmplY3QsXG4gKiBmb3IgYWxsIHRoZSBzdHlsZXMuXG4gKiBUaGUgc3R5bGUgcHJvcGVydGllcyBjYW4gdGhlbiBiZSBkaXJlY3RseSBhY2Nlc3NlZC4gRXhhbXBsZTogbWFwW2lkXS5zdHJva2VcbiAqIEByZXR1cm4ge09iamVjdC48c3RyaW5nLCBSZW5kZXJHcm91cD59XG4gKi9cbkxpc3RPZlN0eWxlcy5wcm90b3R5cGUuZ2V0U3R5bGVNYXAgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBpbmRleCA9IHt9O1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIHN0eWxlID0gdGhpcy5zdHlsZXNbaV07XG5cdFx0dmFyIHN1YkluZGV4ID0gc3R5bGUuZ2V0U3R5bGVNYXAoKTtcblx0XHRmb3IodmFyIGlkIGluIHN1YkluZGV4KSB7XG5cdFx0XHRpbmRleFtpZF0gPSBzdWJJbmRleFtpZF07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGlzdE9mU3R5bGVzLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbGlzdE9mU3R5bGVzT2JqID0ge307XG5cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLnN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRsaXN0T2ZTdHlsZXNPYmouc3R5bGUgPSBbXTtcblx0XHR9XG5cdFx0bGlzdE9mU3R5bGVzT2JqLnN0eWxlLnB1c2godGhpcy5zdHlsZXNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXG5cdHJldHVybiBsaXN0T2ZTdHlsZXNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTGlzdE9mU3R5bGVzLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtsaXN0T2ZTdHlsZXM6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TGlzdE9mU3R5bGVzfVxuICovXG5MaXN0T2ZTdHlsZXMuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGxpc3RPZlN0eWxlcztcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGxpc3RPZlN0eWxlcyA9IExpc3RPZlN0eWxlcy5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gbGlzdE9mU3R5bGVzO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TGlzdE9mU3R5bGVzfVxuICovXG5MaXN0T2ZTdHlsZXMuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmxpc3RPZlN0eWxlcyA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgbGlzdE9mU3R5bGVzLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBsaXN0T2ZTdHlsZXMgPSBuZXcgbnMuTGlzdE9mU3R5bGVzKCk7XG5cdGpzT2JqID0ganNPYmoubGlzdE9mU3R5bGVzO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBsaXN0T2ZTdHlsZXM7XG5cdH1cblxuXHQvLyBjaGlsZHJlblxuXHRpZihqc09iai5zdHlsZSkge1xuXHRcdHZhciBzdHlsZXMgPSBqc09iai5zdHlsZTtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBzdHlsZSA9IG5zLlN0eWxlLmZyb21PYmooe3N0eWxlOiBzdHlsZXNbaV19KTtcblx0XHRcdGxpc3RPZlN0eWxlcy5hZGRTdHlsZShzdHlsZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGxpc3RPZlN0eWxlcztcbn07XG5cbm5zLkxpc3RPZlN0eWxlcyA9IExpc3RPZlN0eWxlcztcbi8vIC0tLS0tLS0gRU5EIExJU1RPRlNUWUxFUyAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gUkVOREVSSU5GT1JNQVRJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cmVuZGVySW5mb3JtYXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMubmFtZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMucHJvZ3JhbU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnByb2dyYW1WZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5iYWNrZ3JvdW5kQ29sb3JcbiAqIEBwYXJhbSB7TGlzdE9mQ29sb3JEZWZpbml0aW9ucz19IHBhcmFtcy5saXN0T2ZDb2xvckRlZmluaXRpb25zXG4gKiBAcGFyYW0ge0xpc3RPZlN0eWxlcz19IHBhcmFtcy5saXN0T2ZTdHlsZXNcbiAqL1xudmFyIFJlbmRlckluZm9ybWF0aW9uID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ25hbWUnLCAncHJvZ3JhbU5hbWUnLCBcblx0XHQncHJvZ3JhbVZlcnNpb24nLCAnYmFja2dyb3VuZENvbG9yJywgJ2xpc3RPZkNvbG9yRGVmaW5pdGlvbnMnLCAnbGlzdE9mU3R5bGVzJ10pO1xuXHR0aGlzLmlkIFx0XHRcdFx0XHQ9IHBhcmFtcy5pZDsgLy8gcmVxdWlyZWQsIHJlc3QgaXMgb3B0aW9uYWxcblx0dGhpcy5uYW1lIFx0XHRcdFx0XHQ9IHBhcmFtcy5uYW1lO1xuXHR0aGlzLnByb2dyYW1OYW1lIFx0XHRcdD0gcGFyYW1zLnByb2dyYW1OYW1lO1xuXHR0aGlzLnByb2dyYW1WZXJzaW9uIFx0XHQ9IHBhcmFtcy5wcm9ncmFtVmVyc2lvbjtcblx0dGhpcy5iYWNrZ3JvdW5kQ29sb3IgXHRcdD0gcGFyYW1zLmJhY2tncm91bmRDb2xvcjtcblx0dGhpcy5saXN0T2ZDb2xvckRlZmluaXRpb25zID0gcGFyYW1zLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnM7XG5cdHRoaXMubGlzdE9mU3R5bGVzIFx0XHRcdD0gcGFyYW1zLmxpc3RPZlN0eWxlcztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtMaXN0T2ZDb2xvckRlZmluaXRpb25zfSBsaXN0T2ZDb2xvckRlZmluaXRpb25zXG4gKi9cblJlbmRlckluZm9ybWF0aW9uLnByb3RvdHlwZS5zZXRMaXN0T2ZDb2xvckRlZmluaXRpb25zID0gZnVuY3Rpb24obGlzdE9mQ29sb3JEZWZpbml0aW9ucykge1xuXHR0aGlzLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnMgPSBsaXN0T2ZDb2xvckRlZmluaXRpb25zO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0xpc3RPZlN0eWxlc30gbGlzdE9mU3R5bGVzXG4gKi9cblJlbmRlckluZm9ybWF0aW9uLnByb3RvdHlwZS5zZXRMaXN0T2ZTdHlsZXMgPSBmdW5jdGlvbihsaXN0T2ZTdHlsZXMpIHtcblx0dGhpcy5saXN0T2ZTdHlsZXMgPSBsaXN0T2ZTdHlsZXM7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5SZW5kZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJlbmRlckluZm9ybWF0aW9uT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRhdHRyaWJ1dGVzLnhtbG5zID0gbnMueG1sbnM7XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMubmFtZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lO1xuXHR9XG5cdGlmKHRoaXMucHJvZ3JhbU5hbWUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMucHJvZ3JhbU5hbWUgPSB0aGlzLnByb2dyYW1OYW1lO1xuXHR9XG5cdGlmKHRoaXMucHJvZ3JhbVZlcnNpb24gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMucHJvZ3JhbVZlcnNpb24gPSB0aGlzLnByb2dyYW1WZXJzaW9uO1xuXHR9XG5cdGlmKHRoaXMuYmFja2dyb3VuZENvbG9yICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmJhY2tncm91bmRDb2xvciA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMocmVuZGVySW5mb3JtYXRpb25PYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKHRoaXMubGlzdE9mQ29sb3JEZWZpbml0aW9ucyAhPSBudWxsKSB7XG5cdFx0cmVuZGVySW5mb3JtYXRpb25PYmoubGlzdE9mQ29sb3JEZWZpbml0aW9ucyA9ICB0aGlzLmxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMubGlzdE9mU3R5bGVzICE9IG51bGwpIHtcblx0XHRyZW5kZXJJbmZvcm1hdGlvbk9iai5saXN0T2ZTdHlsZXMgPSAgdGhpcy5saXN0T2ZTdHlsZXMuYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiByZW5kZXJJbmZvcm1hdGlvbk9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5SZW5kZXJJbmZvcm1hdGlvbi5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtyZW5kZXJJbmZvcm1hdGlvbjogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtSZW5kZXJJbmZvcm1hdGlvbn1cbiAqL1xuUmVuZGVySW5mb3JtYXRpb24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHJlbmRlckluZm9ybWF0aW9uO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24gPSBSZW5kZXJJbmZvcm1hdGlvbi5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtSZW5kZXJJbmZvcm1hdGlvbn1cbiAqL1xuUmVuZGVySW5mb3JtYXRpb24uZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLnJlbmRlckluZm9ybWF0aW9uID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSByZW5kZXJJbmZvcm1hdGlvbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgcmVuZGVySW5mb3JtYXRpb24gPSBuZXcgbnMuUmVuZGVySW5mb3JtYXRpb24oKTtcblx0anNPYmogPSBqc09iai5yZW5kZXJJbmZvcm1hdGlvbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHJlbmRlckluZm9ybWF0aW9uLmlkIFx0XHRcdFx0PSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24ubmFtZSBcdFx0XHRcdD0gYXR0cmlidXRlcy5uYW1lIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24ucHJvZ3JhbU5hbWUgXHRcdD0gYXR0cmlidXRlcy5wcm9ncmFtTmFtZSB8fCBudWxsO1xuXHRcdHJlbmRlckluZm9ybWF0aW9uLnByb2dyYW1WZXJzaW9uIFx0PSBhdHRyaWJ1dGVzLnByb2dyYW1WZXJzaW9uIHx8IG51bGw7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uYmFja2dyb3VuZENvbG9yIFx0PSBhdHRyaWJ1dGVzLmJhY2tncm91bmRDb2xvciB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoubGlzdE9mQ29sb3JEZWZpbml0aW9ucykge1xuXHRcdHZhciBsaXN0T2ZDb2xvckRlZmluaXRpb25zID0gbnMuTGlzdE9mQ29sb3JEZWZpbml0aW9ucy5mcm9tT2JqKHtsaXN0T2ZDb2xvckRlZmluaXRpb25zOiBqc09iai5saXN0T2ZDb2xvckRlZmluaXRpb25zWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mQ29sb3JEZWZpbml0aW9ucyhsaXN0T2ZDb2xvckRlZmluaXRpb25zKTtcblx0fVxuXHRpZihqc09iai5saXN0T2ZTdHlsZXMpIHtcblx0XHR2YXIgbGlzdE9mU3R5bGVzID0gbnMuTGlzdE9mU3R5bGVzLmZyb21PYmooe2xpc3RPZlN0eWxlczoganNPYmoubGlzdE9mU3R5bGVzWzBdfSk7XG5cdFx0cmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mU3R5bGVzKGxpc3RPZlN0eWxlcyk7XG5cdH1cblxuXHRyZXR1cm4gcmVuZGVySW5mb3JtYXRpb247XG59O1xuXG5ucy5SZW5kZXJJbmZvcm1hdGlvbiA9IFJlbmRlckluZm9ybWF0aW9uO1xuLy8gLS0tLS0tLSBFTkQgUkVOREVSSU5GT1JNQVRJT04gLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5zOyIsIi8qKlxuICogVGhlIEFQSSBjb250YWlucyB0d28gb3RoZXIgc3VibW9kdWxlczoge0BsaW5rIGxpYnNiZ24ucmVuZGVyfSBhbmQge0BsaW5rIGxpYnNiZ24uYW5ub3R9XG4gKiBAbW9kdWxlIGxpYnNiZ25cbiAqIEBuYW1lc3BhY2UgbGlic2JnblxuKi9cblxudmFyIHJlbmRlckV4dCA9IHJlcXVpcmUoJy4vbGlic2Jnbi1yZW5kZXInKTtcbnZhciBhbm5vdEV4dCA9IHJlcXVpcmUoJy4vbGlic2Jnbi1hbm5vdGF0aW9ucycpO1xudmFyIHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMnKTtcbnZhciBjaGVja1BhcmFtcyA9IHV0aWxzLmNoZWNrUGFyYW1zO1xuXG52YXIgbnMgPSB7fTsgLy8gbmFtZXNwYWNlIHRoYXQgZW5jYXBzdWxhdGVzIGFsbCBleHBvcnRhYmxlIGZlYXR1cmVzXG5cbm5zLnhtbG5zID0gXCJodHRwOi8vc2Jnbi5vcmcvbGlic2Jnbi8wLjNcIjtcblxuLy8gLS0tLS0tLSBTQkdOQmFzZSAtLS0tLS0tXG4vKipcbiAqIFBhcmVudCBjbGFzcyBmb3Igc2V2ZXJhbCBzYmduIGVsZW1lbnRzLiBVc2VkIHRvIHByb3ZpZGUgZXh0ZW5zaW9uIGFuZCBub3RlcyBlbGVtZW50LlxuICogRW5kIHVzZXJzIGRvbid0IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBpdC4gSXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge0V4dGVuc2lvbj19IHBhcmFtcy5leHRlbnNpb25cbiAqIEBwYXJhbSB7Tm90ZXM9fSBwYXJhbXMubm90ZXNcbiAqL1xudmFyIFNCR05CYXNlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2V4dGVuc2lvbicsICdub3RlcyddKTtcblx0dGhpcy5leHRlbnNpb24gXHQ9IHBhcmFtcy5leHRlbnNpb247XG5cdHRoaXMubm90ZXMgPSBwYXJhbXMubm90ZXM7XG59O1xuXG4vKipcbiAqIEFsbG93cyBpbmhlcml0aW5nIG9iamVjdHMgdG8gZ2V0IGFuIGV4dGVuc2lvbiBlbGVtZW50LlxuICogQHBhcmFtIHtFeHRlbnNpb259IGV4dGVuc2lvblxuICovXG5TQkdOQmFzZS5wcm90b3R5cGUuc2V0RXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuXHR0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjtcbn07XG5cbi8qKlxuICogQWxsb3dzIGluaGVyaXRpbmcgb2JqZWN0cyB0byBnZXQgYSBub3RlcyBlbGVtZW50LlxuICogQHBhcmFtIHtOb3Rlc30gbm90ZXNcbiAqL1xuU0JHTkJhc2UucHJvdG90eXBlLnNldE5vdGVzID0gZnVuY3Rpb24gKG5vdGVzKSB7XG5cdHRoaXMubm90ZXMgPSBub3Rlcztcbn07XG5cbi8qKlxuICogQWRkIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIHRvIGpzT2JqLlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU0JHTkJhc2UucHJvdG90eXBlLmJhc2VUb0pzT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmKHRoaXMuZXh0ZW5zaW9uICE9IG51bGwpIHtcblx0XHRqc09iai5leHRlbnNpb24gPSB0aGlzLmV4dGVuc2lvbi5idWlsZEpzT2JqKCk7XG5cdH1cblx0aWYodGhpcy5ub3RlcyAhPSBudWxsKSB7XG5cdFx0anNPYmoubm90ZXMgPSB0aGlzLm5vdGVzLmJ1aWxkSnNPYmooKTtcblx0fVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgZnJvbSBqc09iai5cbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblNCR05CYXNlLnByb3RvdHlwZS5iYXNlRnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAoanNPYmouZXh0ZW5zaW9uKSB7XG5cdFx0dmFyIGV4dGVuc2lvbiA9IG5zLkV4dGVuc2lvbi5mcm9tT2JqKHtleHRlbnNpb246IGpzT2JqLmV4dGVuc2lvblswXX0pO1xuXHRcdHRoaXMuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7XG5cdH1cblx0aWYgKGpzT2JqLm5vdGVzKSB7XG5cdFx0dmFyIG5vdGVzID0gbnMuTm90ZXMuZnJvbU9iaih7bm90ZXM6IGpzT2JqLm5vdGVzWzBdfSk7XG5cdFx0dGhpcy5zZXROb3Rlcyhub3Rlcyk7XG5cdH1cbn07XG5ucy5TQkdOQmFzZSA9IFNCR05CYXNlO1xuLy8gLS0tLS0tLSBFTkQgU0JHTkJhc2UgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFNCR04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7c2JnbiZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIFNCR05CYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy54bWxuc1xuICogQHBhcmFtIHtNYXBbXT19IHBhcmFtcy5tYXBzXG4gKi9cbnZhciBTYmduID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneG1sbnMnLCAnbWFwcyddKTtcblx0dGhpcy54bWxucyBcdD0gcGFyYW1zLnhtbG5zO1xuXHR0aGlzLm1hcHMgXHQ9IHBhcmFtcy5tYXBzIHx8IFtdO1xufTtcblxuU2Jnbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5TYmduLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNiZ247XG5cbi8qKlxuICogQHBhcmFtIHtNYXB9IG1hcFxuICovXG5TYmduLnByb3RvdHlwZS5hZGRNYXAgPSBmdW5jdGlvbiAobWFwKSB7XG5cdHRoaXMubWFwcy5wdXNoKG1hcCk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5TYmduLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2Jnbk9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy54bWxucyAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy54bWxucyA9IHRoaXMueG1sbnM7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhzYmduT2JqLCBhdHRyaWJ1dGVzKTtcblxuXHQvLyBjaGlsZHJlblxuXHR0aGlzLmJhc2VUb0pzT2JqKHNiZ25PYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMubWFwcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRzYmduT2JqLm1hcCA9IFtdO1xuXHRcdH1cblx0XHRzYmduT2JqLm1hcC5wdXNoKHRoaXMubWFwc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdHJldHVybiBzYmduT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblNiZ24ucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3NiZ246IHRoaXMuYnVpbGRKc09iaigpfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1NiZ259XG4gKi9cblNiZ24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICB2YXIgc2JnbjtcbiAgICBmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgc2JnbiA9IFNiZ24uZnJvbU9iaihyZXN1bHQpO1xuICAgIH1cbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc2JnbjtcblxufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7U2Jnbn1cbiAqL1xuU2Jnbi5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc2JnbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgc2JnbiwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgc2JnbiA9IG5ldyBucy5TYmduKCk7XG5cdGpzT2JqID0ganNPYmouc2Jnbjtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc2Jnbjtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRzYmduLnhtbG5zID0gYXR0cmlidXRlcy54bWxucyB8fCBudWxsO1xuXG5cdFx0Ly8gZ2V0dGluZyBhdHRyaWJ1dGUgd2l0aCAneG1sbnMnIGRvZXNuJ3Qgd29yayBpZiBzb21lIG5hbWVzcGFjZSBpcyBkZWZpbmVkIGxpa2UgJ3htbG5zOnNiZ24nXG5cdFx0Ly8gc28gaWYgdGhlcmUgaXMgc29tZSBhdHRyaWJ1dGUgdGhlcmUsIGFuZCB3ZSBkaWRuJ3QgZmluZCB0aGUgeG1sbnMgZGlyZWN0bHksIHdlIG5lZWQgdG8gaW50byBpdFxuXHRcdGlmKCFzYmduLnhtbG5zICYmIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vIHNiZ24gaXMgbm90IHN1cHBvc2VkIHRvIGhhdmUgYW55IG90aGVyIGF0dHJpYnV0ZSB0aGFuIGFuIHhtbG5zLCBzbyB3ZSBhc3N1bWUgdGhlIGZpcnN0IGF0dHIgaXMgdGhlIHhtbG5zXG5cdFx0XHR2YXIga2V5ID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcylbMF07XG5cdFx0XHRpZihrZXkuc3RhcnRzV2l0aCgneG1sbnMnKSkge1xuXHRcdFx0XHRzYmduLnhtbG5zID0gYXR0cmlidXRlc1trZXldO1xuXHRcdFx0XHRzYmduLm5hbWVzcGFjZVByZWZpeCA9IGtleS5yZXBsYWNlKCd4bWxuczonLCAnJyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCB4bWxucyBkZWZpbml0aW9uIGluIHNiZ24gZWxlbWVudFwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZihqc09iai5tYXApIHtcblx0XHR2YXIgbWFwcyA9IGpzT2JqLm1hcDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgbWFwID0gbnMuTWFwLmZyb21PYmooe21hcDogbWFwc1tpXX0pO1xuXHRcdFx0c2Jnbi5hZGRNYXAobWFwKTtcblx0XHR9XG5cdH1cblxuXHRzYmduLmJhc2VGcm9tT2JqKGpzT2JqKTsgLy8gY2FsbCB0byBwYXJlbnQgY2xhc3Ncblx0cmV0dXJuIHNiZ247XG59O1xubnMuU2JnbiA9IFNiZ247XG4vLyAtLS0tLS0tIEVORCBTQkdOIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBNQVAgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bWFwJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgU0JHTkJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5sYW5ndWFnZVxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudmVyc2lvblxuICogQHBhcmFtIHtHbHlwaFtdPX0gcGFyYW1zLmdseXBoc1xuICogQHBhcmFtIHtBcmNbXT19IHBhcmFtcy5hcmNzXG4gKiBAcGFyYW0ge0Jib3g9fSBwYXJhbXMuYmJveFxuICogQHBhcmFtIHtBcmNncm91cFtdPX0gcGFyYW1zLmFyY2dyb3Vwc1xuICovXG52YXIgTWFwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnbGFuZ3VhZ2UnLCAndmVyc2lvbicsICdnbHlwaHMnLCAnYXJjcycsICdiYm94JywgJ2FyY2dyb3VwcyddKTtcblx0dGhpcy5pZCBcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMubGFuZ3VhZ2UgXHQ9IHBhcmFtcy5sYW5ndWFnZTtcblx0dGhpcy52ZXJzaW9uXHQ9IHBhcmFtcy52ZXJzaW9uO1xuXHR0aGlzLmJib3ggXHRcdD0gcGFyYW1zLmJib3g7XG5cdHRoaXMuZ2x5cGhzIFx0PSBwYXJhbXMuZ2x5cGhzIHx8IFtdO1xuXHR0aGlzLmFyY3MgXHRcdD0gcGFyYW1zLmFyY3MgfHwgW107XG5cdHRoaXMuYXJjZ3JvdXBzIFx0PSBwYXJhbXMuYXJjZ3JvdXBzIHx8IFtdO1xufTtcblxuTWFwLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU0JHTkJhc2UucHJvdG90eXBlKTtcbk1hcC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNYXA7XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuTWFwLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuXHR0aGlzLmdseXBocy5wdXNoKGdseXBoKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBcmN9IGFyY1xuICovXG5NYXAucHJvdG90eXBlLmFkZEFyYyA9IGZ1bmN0aW9uIChhcmMpIHtcblx0dGhpcy5hcmNzLnB1c2goYXJjKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYm94fSBiYm94XG4gKi9cbk1hcC5wcm90b3R5cGUuc2V0QmJveCA9IGZ1bmN0aW9uIChiYm94KSB7XG5cdHRoaXMuYmJveCA9IGJib3g7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJjZ3JvdXB9IGFyY1xuICovXG5NYXAucHJvdG90eXBlLmFkZEFyY2dyb3VwID0gZnVuY3Rpb24gKGFyY2dyb3VwKSB7XG5cdHRoaXMuYXJjZ3JvdXBzLnB1c2goYXJjZ3JvdXApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NfXG4gKiBAcmV0dXJuIHtHeXBoW119XG4gKi9cbk1hcC5wcm90b3R5cGUuZ2V0R2x5cGhzQnlDbGFzcyA9IGZ1bmN0aW9uIChjbGFzc18pIHtcblx0dmFyIHJlc3VsdEdseXBocyA9IFtdO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGdseXBoID0gdGhpcy5nbHlwaHNbaV07XG5cdFx0aWYoZ2x5cGguY2xhc3NfID09IGNsYXNzXykge1xuXHRcdFx0cmVzdWx0R2x5cGhzLnB1c2goZ2x5cGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0R2x5cGhzO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTWFwLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbWFwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmlkICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmlkID0gdGhpcy5pZDtcblx0fVxuXHRpZih0aGlzLmxhbmd1YWdlICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcblx0fVxuXHRpZih0aGlzLnZlcnNpb24gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmVyc2lvbiA9IHRoaXMudmVyc2lvbjtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKG1hcE9iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihtYXBPYmopO1xuXHRpZih0aGlzLmJib3ggIT0gbnVsbCkge1xuXHRcdG1hcE9iai5iYm94ID0gIHRoaXMuYmJveC5idWlsZEpzT2JqKCk7XG5cdH1cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLmdseXBocy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRtYXBPYmouZ2x5cGggPSBbXTtcblx0XHR9XG5cdFx0bWFwT2JqLmdseXBoLnB1c2godGhpcy5nbHlwaHNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRtYXBPYmouYXJjID0gW107XG5cdFx0fVxuXHRcdG1hcE9iai5hcmMucHVzaCh0aGlzLmFyY3NbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdG1hcE9iai5hcmNncm91cCA9IFtdO1xuXHRcdH1cblx0XHRtYXBPYmouYXJjZ3JvdXAucHVzaCh0aGlzLmFyY2dyb3Vwc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdHJldHVybiBtYXBPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTWFwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHttYXA6IHRoaXMuYnVpbGRKc09iaigpfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge01hcH1cbiAqL1xuTWFwLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBtYXA7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBtYXAgPSBNYXAuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIG1hcDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge01hcH1cbiAqL1xuTWFwLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5tYXAgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIG1hcCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgbWFwID0gbmV3IG5zLk1hcCgpO1xuXHRqc09iaiA9IGpzT2JqLm1hcDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gbWFwO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRtYXAuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0bWFwLmxhbmd1YWdlID0gYXR0cmlidXRlcy5sYW5ndWFnZSB8fCBudWxsO1xuXHRcdG1hcC52ZXJzaW9uID0gYXR0cmlidXRlcy52ZXJzaW9uIHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5iYm94KSB7XG5cdFx0dmFyIGJib3ggPSBucy5CYm94LmZyb21PYmooe2Jib3g6IGpzT2JqLmJib3hbMF19KTtcblx0XHRtYXAuc2V0QmJveChiYm94KTtcblx0fVxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdG1hcC5hZGRHbHlwaChnbHlwaCk7XG5cdFx0fVxuXHR9XG5cdGlmKGpzT2JqLmFyYykge1xuXHRcdHZhciBhcmNzID0ganNPYmouYXJjO1xuXHRcdGZvciAodmFyIGk9MDsgaSA8IGFyY3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmMgPSBucy5BcmMuZnJvbU9iaih7YXJjOiBhcmNzW2ldfSk7XG5cdFx0XHRtYXAuYWRkQXJjKGFyYyk7XG5cdFx0fVxuXHR9XG5cdGlmKGpzT2JqLmFyY2dyb3VwKSB7XG5cdFx0dmFyIGFyY2dyb3VwcyA9IGpzT2JqLmFyY2dyb3VwO1xuXHRcdGZvciAodmFyIGk9MDsgaSA8IGFyY2dyb3Vwcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyY2dyb3VwID0gbnMuQXJjZ3JvdXAuZnJvbU9iaih7YXJjZ3JvdXA6IGFyY2dyb3Vwc1tpXX0pO1xuXHRcdFx0bWFwLmFkZEFyY2dyb3VwKGFyY2dyb3VwKTtcblx0XHR9XG5cdH1cblxuXHRtYXAuYmFzZUZyb21PYmooanNPYmopO1xuXHRyZXR1cm4gbWFwO1xufTtcblxubnMuTWFwID0gTWFwO1xuLy8gLS0tLS0tLSBFTkQgTUFQIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBFWFRFTlNJT04gLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZXh0ZW5zaW9uJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzc1xuICovXG52YXIgRXh0ZW5zaW9uID0gZnVuY3Rpb24gKCkge1xuXHQvLyBjb25zaWRlciBmaXJzdCBvcmRlciBjaGlsZHJlbiwgYWRkIHRoZW0gd2l0aCB0aGVpciB0YWduYW1lIGFzIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0XG5cdC8vIHN0b3JlIHN0cmluZyBpZiBubyBzdXBwb3J0ZWQgcGFyc2luZyAodW5yZWNvZ25pemVkIGV4dGVuc2lvbnMpXG5cdC8vIGVsc2Ugc3RvcmUgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvblxuXHR0aGlzLmxpc3QgPSB7fTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd8cmVuZGVyLlJlbmRlckluZm9ybWF0aW9ufGFubm90LkFubm90YXRpb259IGV4dGVuc2lvblxuICovXG5FeHRlbnNpb24ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChleHRlbnNpb24pIHtcblx0aWYgKGV4dGVuc2lvbiBpbnN0YW5jZW9mIHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbikge1xuXHRcdHRoaXMubGlzdFsncmVuZGVySW5mb3JtYXRpb24nXSA9IGV4dGVuc2lvbjtcblx0fVxuXHRlbHNlIGlmIChleHRlbnNpb24gaW5zdGFuY2VvZiBhbm5vdEV4dC5Bbm5vdGF0aW9uKSB7XG5cdFx0dGhpcy5saXN0Wydhbm5vdGF0aW9uJ10gPSBleHRlbnNpb247XG5cdH1cblx0ZWxzZSBpZih0eXBlb2YgZXh0ZW5zaW9uID09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgcGFyc2VkQXNPYmo7XG5cdFx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG5cdCAgICAgICAgcGFyc2VkQXNPYmogPSByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgdXRpbHMucGFyc2VTdHJpbmcoZXh0ZW5zaW9uLCBmbik7XG5cdCAgICB2YXIgbmFtZSA9IE9iamVjdC5rZXlzKHBhcnNlZEFzT2JqKVswXTtcblx0ICAgIGlmKG5hbWUgPT0gXCJyZW5kZXJJbmZvcm1hdGlvblwiKSB7XG5cdCAgICBcdHZhciByZW5kZXJJbmZvcm1hdGlvbiA9IHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbi5mcm9tWE1MKGV4dGVuc2lvbik7XG5cdFx0XHR0aGlzLmxpc3RbJ3JlbmRlckluZm9ybWF0aW9uJ10gPSByZW5kZXJJbmZvcm1hdGlvbjtcblx0ICAgIH1cblx0ICAgIGVsc2UgaWYobmFtZSA9PSBcImFubm90YXRpb25cIikge1xuXHQgICAgXHR2YXIgYW5ub3RhdGlvbiA9IGFubm90RXh0LkFubm90YXRpb24uZnJvbVhNTChleHRlbnNpb24pO1xuXHRcdFx0dGhpcy5saXN0Wydhbm5vdGF0aW9uJ10gPSByZW5kZXJJbmZvcm1hdGlvbjtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgXHR0aGlzLmxpc3RbbmFtZV0gPSBleHRlbnNpb247XG5cdCAgICB9XG5cdH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbk5hbWVcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkV4dGVuc2lvbi5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGV4dGVuc2lvbk5hbWUpIHtcblx0cmV0dXJuIHRoaXMubGlzdC5oYXNPd25Qcm9wZXJ0eShleHRlbnNpb25OYW1lKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvbk5hbWVcbiAqIEByZXR1cm4ge1N0cmluZ3xyZW5kZXIuUmVuZGVySW5mb3JtYXRpb258YW5ub3QuQW5ub3RhdGlvbn1cbiAqL1xuRXh0ZW5zaW9uLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoZXh0ZW5zaW9uTmFtZSkge1xuXHRpZiAodGhpcy5oYXMoZXh0ZW5zaW9uTmFtZSkpIHtcblx0XHRyZXR1cm4gdGhpcy5saXN0W2V4dGVuc2lvbk5hbWVdO1xuXHR9XG5cdGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5FeHRlbnNpb24ucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBleHRlbnNpb25PYmogPSB7fTtcblxuXHRmb3IgKHZhciBleHRJbnN0YW5jZSBpbiB0aGlzLmxpc3QpIHtcblx0XHRpZiAoZXh0SW5zdGFuY2UgPT0gXCJyZW5kZXJJbmZvcm1hdGlvblwiKSB7XG5cdFx0XHRleHRlbnNpb25PYmoucmVuZGVySW5mb3JtYXRpb24gPSAgdGhpcy5nZXQoZXh0SW5zdGFuY2UpLmJ1aWxkSnNPYmooKTtcblx0XHR9IFxuXHRcdGVsc2UgaWYgKGV4dEluc3RhbmNlID09IFwiYW5ub3RhdGlvblwiKSB7XG5cdFx0XHRleHRlbnNpb25PYmouYW5ub3RhdGlvbiA9ICB0aGlzLmdldChleHRJbnN0YW5jZSkuYnVpbGRKc09iaigpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIHVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgYXJlIHN0b3JlZCBhcyBpcywgYXMgeG1sIHN0cmluZ1xuXHRcdFx0Ly8gd2UgbmVlZCB0byBwYXJzZSBpdCB0byBidWlsZCB0aGUganMgb2JqZWN0XG5cdFx0XHR2YXIgdW5zdXBwb3J0ZWRFeHRPYmo7XG5cdFx0XHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcblx0XHQgICAgICAgIHVuc3VwcG9ydGVkRXh0T2JqID0gcmVzdWx0O1xuXHRcdCAgICB9O1xuXHRcdCAgICB1dGlscy5wYXJzZVN0cmluZyh0aGlzLmdldChleHRJbnN0YW5jZSksIGZuKTtcblx0XHRcdGV4dGVuc2lvbk9ialtleHRJbnN0YW5jZV0gPSB1bnN1cHBvcnRlZEV4dE9ialtleHRJbnN0YW5jZV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHRlbnNpb25PYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRXh0ZW5zaW9uLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtleHRlbnNpb246IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7RXh0ZW5zaW9ufVxuICovXG5FeHRlbnNpb24uZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGV4dGVuc2lvbjtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGV4dGVuc2lvbiA9IEV4dGVuc2lvbi5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7RXh0ZW5zaW9ufVxuICovXG5FeHRlbnNpb24uZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmV4dGVuc2lvbiA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZXh0ZW5zaW9uLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKCk7XG5cdGpzT2JqID0ganNPYmouZXh0ZW5zaW9uO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBleHRlbnNpb247XG5cdH1cblxuXHQvL3ZhciBjaGlsZHJlbiA9IE9iamVjdC5rZXlzKGpzT2JqKTtcblx0Zm9yICh2YXIgZXh0TmFtZSBpbiBqc09iaikge1xuXHRcdC8vdmFyIGV4dE5hbWUgPSBPYmplY3Qua2V5cyhqc09ialtpXSlbMF07XG5cdFx0dmFyIGV4dEpzT2JqID0ganNPYmpbZXh0TmFtZV07XG5cblx0XHQvL2V4dGVuc2lvbi5hZGQoZXh0SW5zdGFuY2UpO1xuXHRcdGlmIChleHROYW1lID09ICdyZW5kZXJJbmZvcm1hdGlvbicpIHtcblx0XHRcdHZhciByZW5kZXJJbmZvcm1hdGlvbiA9IHJlbmRlckV4dC5SZW5kZXJJbmZvcm1hdGlvbi5mcm9tT2JqKHtyZW5kZXJJbmZvcm1hdGlvbjogZXh0SnNPYmpbMF19KTtcblx0XHRcdGV4dGVuc2lvbi5hZGQocmVuZGVySW5mb3JtYXRpb24pO1xuXHRcdH1cblx0XHRlbHNlIGlmIChleHROYW1lID09ICdhbm5vdGF0aW9uJykge1xuXHRcdFx0dmFyIGFubm90YXRpb24gPSBhbm5vdEV4dC5Bbm5vdGF0aW9uLmZyb21PYmooe2Fubm90YXRpb246IGV4dEpzT2JqWzBdfSk7XG5cdFx0XHRleHRlbnNpb24uYWRkKGFubm90YXRpb24pO1xuXHRcdH1cblx0XHRlbHNlIHsgLy8gdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLCB3ZSBzdGlsbCBzdG9yZSB0aGUgZGF0YSBhcyBpc1xuXHRcdFx0dmFyIHVuc3VwcG9ydGVkRXh0ID0ge307XG5cdFx0XHR1bnN1cHBvcnRlZEV4dFtleHROYW1lXSA9IGV4dEpzT2JqWzBdOyAvLyBtYWtlIGV4dGVuc2lvbiBzZXJpYWxpc2FibGVcblx0XHRcdHZhciBzdHJpbmdFeHQgPSB1dGlscy5idWlsZFN0cmluZyh1bnN1cHBvcnRlZEV4dCk7IC8vIHNlcmlhbGlzZSB0byBzdHJpbmdcblx0XHRcdGV4dGVuc2lvbi5hZGQoc3RyaW5nRXh0KTsgLy8gc2F2ZSBpdFxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBleHRlbnNpb247XG59O1xuXG5ucy5FeHRlbnNpb24gPSBFeHRlbnNpb247XG4vLyAtLS0tLS0tIEVORCBFWFRFTlNJT04gLS0tLS0tLVxuXG4vLyAtLS0tLS0tIE5PVEVTIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O25vdGVzJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEl0cyBzaW5nbGUgY29udGVudCBhdHRyaWJ1dGUgc3RvcmVzIHhodG1sIGVsZW1lbnRzIGFzIHN0cmluZy5cbiAqIEBjbGFzc1xuICovXG52YXIgTm90ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuY29udGVudCA9IFwiXCI7XG59O1xuXG4vKipcbiAqIE92ZXJ3cml0ZSB0aGUgY29udGVudC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqL1xuTm90ZXMucHJvdG90eXBlLnNldENvbnRlbnQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHRoaXMuY29udGVudCA9IHN0cmluZztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICovXG5Ob3Rlcy5wcm90b3R5cGUuYXBwZW5kQ29udGVudCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dGhpcy5jb250ZW50ICs9IHN0cmluZztcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbk5vdGVzLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBwYXJzZWRDb250ZW50O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHRoaXMuY29udGVudCwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHBhcnNlZENvbnRlbnQgPSByZXN1bHQ7XG4gICAgfSk7XG5cblx0cmV0dXJuIHBhcnNlZENvbnRlbnQ7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTm90ZXMucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe25vdGVzOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge05vdGVzfVxuICovXG5Ob3Rlcy5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgbm90ZXM7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBub3RlcyA9IE5vdGVzLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBub3Rlcztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge05vdGVzfVxuICovXG5Ob3Rlcy5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoubm90ZXMgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIG5vdGVzLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBub3RlcyA9IG5ldyBOb3RlcygpO1xuXHRqc09iaiA9IGpzT2JqLm5vdGVzO1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBub3Rlcztcblx0fVxuXG5cdHZhciBzdHJpbmdFeHQgPSB1dGlscy5idWlsZFN0cmluZyh7bm90ZXM6IGpzT2JqfSk7IC8vIHNlcmlhbGlzZSB0byBzdHJpbmdcblx0Ly8geG1sMmpzIGRvZXMgd2VpcmQgdGhpbmdzIHdoZW4geW91IGp1c3Qgd2FudCB0byBzZXJpYWxpemUgdGhlIGNvbnRlbnRcblx0Ly8gbmVlZCB0byBpbmNsdWRlIHRoZSA8bm90ZXM+IHJvb3QgdG8gZ2V0IGl0IHByb3Blcmx5LCBhbmQgdGhlbiByZW1vdmUgaXQgaW4gdGhlIHJlc3VsdCBzdHJpbmcuXG5cdHN0cmluZ0V4dCA9IHN0cmluZ0V4dC5yZXBsYWNlKCc8bm90ZXM+JywgJycpO1xuXHRzdHJpbmdFeHQgPSBzdHJpbmdFeHQucmVwbGFjZSgnPC9ub3Rlcz4nLCAnJyk7XG5cdG5vdGVzLmNvbnRlbnQgPSBzdHJpbmdFeHQ7IC8vIHNhdmUgaXRcblxuXHRyZXR1cm4gbm90ZXM7XG59O1xuXG5ucy5Ob3RlcyA9IE5vdGVzO1xuLy8gLS0tLS0tLSBFTkQgTk9URVMgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEdMWVBIIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2dseXBoJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBHbHlwaFxuICogQGV4dGVuZHMgU0JHTkJhc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5jbGFzc19cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmNvbXBhcnRtZW50UmVmXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMuY29tcGFydG1lbnRPcmRlclxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMubWFwUmVmXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy50YWdSZWZcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLm9yaWVudGF0aW9uXG4gKiBAcGFyYW0ge0xhYmVsPX0gcGFyYW1zLmxhYmVsXG4gKiBAcGFyYW0ge0Jib3g9fSBwYXJhbXMuYmJveFxuICogQHBhcmFtIHtTdGF0ZVR5cGU9fSBwYXJhbXMuc3RhdGVcbiAqIEBwYXJhbSB7Q2xvbmVUeXBlPX0gcGFyYW1zLmNsb25lXG4gKiBAcGFyYW0ge0NhbGxvdXQ9fSBwYXJhbXMuY2FsbG91dFxuICogQHBhcmFtIHtFbnRpdHlUeXBlPX0gcGFyYW1zLmVudGl0eVxuICogQHBhcmFtIHtHbHlwaFtdPX0gcGFyYW1zLmdseXBoTWVtYmVyc1xuICogQHBhcmFtIHtQb3J0W109fSBwYXJhbXMucG9ydHNcbiAqL1xudmFyIEdseXBoID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnY2xhc3NfJywgJ2NvbXBhcnRtZW50UmVmJywgJ2NvbXBhcnRtZW50T3JkZXInLCAnbWFwUmVmJyxcblx0XHQndGFnUmVmJywgJ29yaWVudGF0aW9uJywgJ2xhYmVsJywgJ2Jib3gnLCAnZ2x5cGhNZW1iZXJzJywgJ3BvcnRzJywgJ3N0YXRlJywgJ2Nsb25lJywgJ2VudGl0eScsICdjYWxsb3V0J10pO1xuXHR0aGlzLmlkIFx0XHRcdFx0PSBwYXJhbXMuaWQ7XG5cdHRoaXMuY2xhc3NfXHRcdFx0XHQ9IHBhcmFtcy5jbGFzc187XG5cdHRoaXMuY29tcGFydG1lbnRSZWZcdFx0PSBwYXJhbXMuY29tcGFydG1lbnRSZWY7XG5cdHRoaXMuY29tcGFydG1lbnRPcmRlclx0PSBwYXJzZUZsb2F0KHBhcmFtcy5jb21wYXJ0bWVudE9yZGVyKTtcblx0dGhpcy5tYXBSZWZcdFx0XHRcdD0gcGFyYW1zLm1hcFJlZjtcblx0dGhpcy50YWdSZWZcdFx0XHRcdD0gcGFyYW1zLnRhZ1JlZjtcblx0dGhpcy5vcmllbnRhdGlvblx0XHQ9IHBhcmFtcy5vcmllbnRhdGlvbjtcblxuXHQvLyBjaGlsZHJlblxuXHR0aGlzLmxhYmVsIFx0XHRcdD0gcGFyYW1zLmxhYmVsO1xuXHR0aGlzLnN0YXRlIFx0XHRcdD0gcGFyYW1zLnN0YXRlO1xuXHR0aGlzLmNsb25lIFx0XHRcdD0gcGFyYW1zLmNsb25lO1xuXHR0aGlzLmNhbGxvdXQgXHRcdD0gcGFyYW1zLmNhbGxvdXQ7XG5cdHRoaXMuZW50aXR5IFx0XHQ9IHBhcmFtcy5lbnRpdHk7XG5cdHRoaXMuYmJveCBcdFx0XHQ9IHBhcmFtcy5iYm94O1xuXHR0aGlzLmdseXBoTWVtYmVycyBcdD0gcGFyYW1zLmdseXBoTWVtYmVycyB8fCBbXTsgLy8gY2FzZSBvZiBjb21wbGV4LCBjYW4gaGF2ZSBhcmJpdHJhcnkgbGlzdCBvZiBuZXN0ZWQgZ2x5cGhzXG5cdHRoaXMucG9ydHMgXHRcdFx0PSBwYXJhbXMucG9ydHMgfHwgW107XG59O1xuXG5HbHlwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5HbHlwaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBHbHlwaDtcblxuLyoqXG4gKiBAcGFyYW0ge0xhYmVsfSBsYWJlbFxuICovXG5HbHlwaC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAobGFiZWwpIHtcblx0dGhpcy5sYWJlbCA9IGxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0YXRlVHlwZX0gc3RhdGVcbiAqL1xuR2x5cGgucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG5cdHRoaXMuc3RhdGUgPSBzdGF0ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYm94fSBiYm94XG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRCYm94ID0gZnVuY3Rpb24gKGJib3gpIHtcblx0dGhpcy5iYm94ID0gYmJveDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtDbG9uZVR5cGV9IGNsb25lXG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRDbG9uZSA9IGZ1bmN0aW9uIChjbG9uZSkge1xuXHR0aGlzLmNsb25lID0gY2xvbmU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7Q2FsbG91dH0gY2FsbG91dFxuICovXG5HbHlwaC5wcm90b3R5cGUuc2V0Q2FsbG91dCA9IGZ1bmN0aW9uIChjYWxsb3V0KSB7XG5cdHRoaXMuY2FsbG91dCA9IGNhbGxvdXQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RW50aXR5VHlwZX0gZW50aXR5XG4gKi9cbkdseXBoLnByb3RvdHlwZS5zZXRFbnRpdHkgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG5cdHRoaXMuZW50aXR5ID0gZW50aXR5O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0dseXBofSBnbHlwaE1lbWJlclxuICovXG5HbHlwaC5wcm90b3R5cGUuYWRkR2x5cGhNZW1iZXIgPSBmdW5jdGlvbiAoZ2x5cGhNZW1iZXIpIHtcblx0dGhpcy5nbHlwaE1lbWJlcnMucHVzaChnbHlwaE1lbWJlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UG9ydH0gcG9ydFxuICovXG5HbHlwaC5wcm90b3R5cGUuYWRkUG9ydCA9IGZ1bmN0aW9uIChwb3J0KSB7XG5cdHRoaXMucG9ydHMucHVzaChwb3J0KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkdseXBoLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgZ2x5cGhPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKHRoaXMuY2xhc3NfICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLmNsYXNzID0gdGhpcy5jbGFzc187XG5cdH1cblx0aWYodGhpcy5jb21wYXJ0bWVudFJlZiAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5jb21wYXJ0bWVudFJlZiA9IHRoaXMuY29tcGFydG1lbnRSZWY7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMuY29tcGFydG1lbnRPcmRlcikpIHtcblx0XHRhdHRyaWJ1dGVzLmNvbXBhcnRtZW50T3JkZXIgPSB0aGlzLmNvbXBhcnRtZW50T3JkZXI7XG5cdH1cblx0aWYodGhpcy5tYXBSZWYgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMubWFwUmVmID0gdGhpcy5tYXBSZWY7XG5cdH1cblx0aWYodGhpcy50YWdSZWYgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGFnUmVmID0gdGhpcy50YWdSZWY7XG5cdH1cblx0aWYodGhpcy5vcmllbnRhdGlvbiAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5vcmllbnRhdGlvbiA9IHRoaXMub3JpZW50YXRpb247XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhnbHlwaE9iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihnbHlwaE9iaik7XG5cdGlmKHRoaXMubGFiZWwgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLmxhYmVsID0gIHRoaXMubGFiZWwuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuc3RhdGUgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLnN0YXRlID0gIHRoaXMuc3RhdGUuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuY2xvbmUgIT0gbnVsbCkge1xuXHRcdGdseXBoT2JqLmNsb25lID0gIHRoaXMuY2xvbmUuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuY2FsbG91dCAhPSBudWxsKSB7XG5cdFx0Z2x5cGhPYmouY2FsbG91dCA9ICB0aGlzLmNhbGxvdXQuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuZW50aXR5ICE9IG51bGwpIHtcblx0XHRnbHlwaE9iai5lbnRpdHkgPSAgdGhpcy5lbnRpdHkuYnVpbGRKc09iaigpO1xuXHR9XG5cdGlmKHRoaXMuYmJveCAhPSBudWxsKSB7XG5cdFx0Z2x5cGhPYmouYmJveCA9ICB0aGlzLmJib3guYnVpbGRKc09iaigpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgdGhpcy5nbHlwaE1lbWJlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoaT09MCkge1xuXHRcdFx0Z2x5cGhPYmouZ2x5cGggPSBbXTtcblx0XHR9XG5cdFx0Z2x5cGhPYmouZ2x5cGgucHVzaCh0aGlzLmdseXBoTWVtYmVyc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgdGhpcy5wb3J0cy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRnbHlwaE9iai5wb3J0ID0gW107XG5cdFx0fVxuXHRcdGdseXBoT2JqLnBvcnQucHVzaCh0aGlzLnBvcnRzW2ldLmJ1aWxkSnNPYmooKSk7XG5cdH1cblx0cmV0dXJuIGdseXBoT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkdseXBoLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtnbHlwaDogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtHbHlwaH1cbiAqL1xuR2x5cGguZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGdseXBoO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgZ2x5cGggPSBHbHlwaC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gZ2x5cGg7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtHbHlwaH1cbiAqL1xuR2x5cGguZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmdseXBoID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBnbHlwaCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZ2x5cGggPSBuZXcgbnMuR2x5cGgoKTtcblx0anNPYmogPSBqc09iai5nbHlwaDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gZ2x5cGg7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGdseXBoLmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHRcdGdseXBoLmNsYXNzXyA9IGF0dHJpYnV0ZXMuY2xhc3MgfHwgbnVsbDtcblx0XHRnbHlwaC5jb21wYXJ0bWVudFJlZiA9IGF0dHJpYnV0ZXMuY29tcGFydG1lbnRSZWYgfHwgbnVsbDtcblx0XHRnbHlwaC5jb21wYXJ0bWVudE9yZGVyID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLmNvbXBhcnRtZW50T3JkZXIpO1xuXHRcdGdseXBoLm1hcFJlZiA9IGF0dHJpYnV0ZXMubWFwUmVmIHx8IG51bGw7XG5cdFx0Z2x5cGgudGFnUmVmID0gYXR0cmlidXRlcy50YWdSZWYgfHwgbnVsbDtcblx0XHRnbHlwaC5vcmllbnRhdGlvbiA9IGF0dHJpYnV0ZXMub3JpZW50YXRpb24gfHwgbnVsbDtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqLmxhYmVsKSB7XG5cdFx0dmFyIGxhYmVsID0gbnMuTGFiZWwuZnJvbU9iaih7bGFiZWw6IGpzT2JqLmxhYmVsWzBdfSk7XG5cdFx0Z2x5cGguc2V0TGFiZWwobGFiZWwpO1xuXHR9XG5cdGlmKGpzT2JqLnN0YXRlKSB7XG5cdFx0dmFyIHN0YXRlID0gbnMuU3RhdGVUeXBlLmZyb21PYmooe3N0YXRlOiBqc09iai5zdGF0ZVswXX0pO1xuXHRcdGdseXBoLnNldFN0YXRlKHN0YXRlKTtcblx0fVxuXHRpZihqc09iai5jbG9uZSkge1xuXHRcdHZhciBjbG9uZSA9IG5zLkNsb25lVHlwZS5mcm9tT2JqKHtjbG9uZToganNPYmouY2xvbmVbMF19KTtcblx0XHRnbHlwaC5zZXRDbG9uZShjbG9uZSk7XG5cdH1cblx0aWYoanNPYmouY2FsbG91dCkge1xuXHRcdHZhciBjYWxsb3V0ID0gbnMuQ2FsbG91dC5mcm9tT2JqKHtjYWxsb3V0OiBqc09iai5jYWxsb3V0WzBdfSk7XG5cdFx0Z2x5cGguc2V0Q2FsbG91dChjYWxsb3V0KTtcblx0fVxuXHRpZihqc09iai5lbnRpdHkpIHtcblx0XHR2YXIgZW50aXR5ID0gbnMuRW50aXR5VHlwZS5mcm9tT2JqKHtlbnRpdHk6IGpzT2JqLmVudGl0eVswXX0pO1xuXHRcdGdseXBoLnNldEVudGl0eShlbnRpdHkpO1xuXHR9XG5cdGlmKGpzT2JqLmJib3gpIHtcblx0XHR2YXIgYmJveCA9IG5zLkJib3guZnJvbU9iaih7YmJveDoganNPYmouYmJveFswXX0pO1xuXHRcdGdseXBoLnNldEJib3goYmJveCk7XG5cdH1cblxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaE1lbWJlciA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGdseXBoLmFkZEdseXBoTWVtYmVyKGdseXBoTWVtYmVyKTtcblx0XHR9XG5cdH1cblx0aWYoanNPYmoucG9ydCkge1xuXHRcdHZhciBwb3J0cyA9IGpzT2JqLnBvcnQ7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgcG9ydHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBwb3J0ID0gbnMuUG9ydC5mcm9tT2JqKHtwb3J0OiBwb3J0c1tpXX0pO1xuXHRcdFx0Z2x5cGguYWRkUG9ydChwb3J0KTtcblx0XHR9XG5cdH1cblxuXHRnbHlwaC5iYXNlRnJvbU9iaihqc09iaik7XG5cdHJldHVybiBnbHlwaDtcbn07XG5cbm5zLkdseXBoID0gR2x5cGg7XG4vLyAtLS0tLS0tIEVORCBHTFlQSCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gTEFCRUwgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7bGFiZWwmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIExhYmVsXG4gKiBAZXh0ZW5kcyBTQkdOQmFzZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMudGV4dFxuICogQHBhcmFtIHtCYm94PX0gcGFyYW1zLmJib3hcbiAqL1xudmFyIExhYmVsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsndGV4dCcsICdiYm94J10pO1xuXHR0aGlzLnRleHQgPSBwYXJhbXMudGV4dDtcblx0dGhpcy5iYm94ID0gcGFyYW1zLmJib3g7XG59O1xuXG5MYWJlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5MYWJlbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBucy5MYWJlbDtcblxuLyoqXG4gKiBAcGFyYW0ge0Jib3h9IGJib3hcbiAqL1xuTGFiZWwucHJvdG90eXBlLnNldEJib3ggPSBmdW5jdGlvbiAoYmJveCkge1xuXHR0aGlzLmJib3ggPSBiYm94O1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuTGFiZWwucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBsYWJlbE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy50ZXh0ICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLnRleHQgPSB0aGlzLnRleHQ7XG5cdH1cblx0ZWxzZSB7IC8vIHRleHQgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGVcblx0XHRhdHRyaWJ1dGVzLnRleHQgPSBcIlwiO1xuXHR9XG5cdC8vIGVuc3VyZSBlbmNvZGluZyBvZiBsaW5lIGJyZWFrcyBpcyBhbHdheXMgcmVzcGVjdGVkXG5cdC8vYXR0cmlidXRlcy50ZXh0ID0gYXR0cmlidXRlcy50ZXh0LnJlcGxhY2UoJ1xcbicsICdcXG4nKTsgLy8nJiN4QTsnKTtcblx0dXRpbHMuYWRkQXR0cmlidXRlcyhsYWJlbE9iaiwgYXR0cmlidXRlcyk7XG5cblx0dGhpcy5iYXNlVG9Kc09iaihsYWJlbE9iaik7XG5cdGlmKHRoaXMuYmJveCAhPSBudWxsKSB7XG5cdFx0bGFiZWxPYmouYmJveCA9ICB0aGlzLmJib3guYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiBsYWJlbE9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5MYWJlbC5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7bGFiZWw6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TGFiZWx9XG4gKi9cbkxhYmVsLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBsYWJlbDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGxhYmVsID0gTGFiZWwuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TGFiZWx9XG4gKi9cbkxhYmVsLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5sYWJlbCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgbGFiZWwsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGxhYmVsID0gbmV3IG5zLkxhYmVsKCk7XG5cdGpzT2JqID0ganNPYmoubGFiZWw7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGxhYmVsO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRsYWJlbC50ZXh0ID0gYXR0cmlidXRlcy50ZXh0IHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5iYm94KSB7XG5cdFx0dmFyIGJib3ggPSBucy5CYm94LmZyb21PYmooe2Jib3g6IGpzT2JqLmJib3hbMF19KTtcblx0XHRsYWJlbC5zZXRCYm94KGJib3gpO1xuXHR9XG5cdGxhYmVsLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGxhYmVsO1xufTtcblxubnMuTGFiZWwgPSBMYWJlbDtcbi8vIC0tLS0tLS0gRU5EIExBQkVMIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBCQk9YIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2Jib3gmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIEJib3hcbiAqIEBleHRlbmRzIFNCR05CYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy53XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMuaFxuICovXG52YXIgQmJveCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0bnMuU0JHTkJhc2UuY2FsbCh0aGlzLCBwYXJhbXMpO1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3gnLCAneScsICd3JywgJ2gnXSk7XG5cdHRoaXMueCA9IHBhcnNlRmxvYXQocGFyYW1zLngpO1xuXHR0aGlzLnkgPSBwYXJzZUZsb2F0KHBhcmFtcy55KTtcblx0dGhpcy53ID0gcGFyc2VGbG9hdChwYXJhbXMudyk7XG5cdHRoaXMuaCA9IHBhcnNlRmxvYXQocGFyYW1zLmgpO1xufTtcblxuQmJveC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5CYm94LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG5zLkJib3g7XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkJib3gucHJvdG90eXBlLmJ1aWxkSnNPYmogPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBiYm94T2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZighaXNOYU4odGhpcy54KSkge1xuXHRcdGF0dHJpYnV0ZXMueCA9IHRoaXMueDtcblx0fVxuXHRpZighaXNOYU4odGhpcy55KSkge1xuXHRcdGF0dHJpYnV0ZXMueSA9IHRoaXMueTtcblx0fVxuXHRpZighaXNOYU4odGhpcy53KSkge1xuXHRcdGF0dHJpYnV0ZXMudyA9IHRoaXMudztcblx0fVxuXHRpZighaXNOYU4odGhpcy5oKSkge1xuXHRcdGF0dHJpYnV0ZXMuaCA9IHRoaXMuaDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGJib3hPYmosIGF0dHJpYnV0ZXMpO1xuXHR0aGlzLmJhc2VUb0pzT2JqKGJib3hPYmopO1xuXHRyZXR1cm4gYmJveE9iajtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5CYm94LnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtiYm94OiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0Jib3h9XG4gKi9cbkJib3guZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGJib3g7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBiYm94ID0gQmJveC5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gYmJveDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0Jib3h9XG4gKi9cbkJib3guZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmJib3ggPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGJib3gsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGJib3ggPSBuZXcgbnMuQmJveCgpO1xuXHRqc09iaiA9IGpzT2JqLmJib3g7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGJib3g7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdGJib3gueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRiYm94LnkgPSBwYXJzZUZsb2F0KGF0dHJpYnV0ZXMueSk7XG5cdFx0YmJveC53ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLncpO1xuXHRcdGJib3guaCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy5oKTtcblx0fVxuXHRiYm94LmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGJib3g7XG59O1xuXG5ucy5CYm94ID0gQmJveDtcbi8vIC0tLS0tLS0gRU5EIEJCT1ggLS0tLS0tLVxuXG4vLyAtLS0tLS0tIFNUQVRFIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3N0YXRlJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBTdGF0ZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy52YXJpYWJsZVxuICovXG52YXIgU3RhdGVUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3ZhbHVlJywgJ3ZhcmlhYmxlJ10pO1xuXHR0aGlzLnZhbHVlID0gcGFyYW1zLnZhbHVlO1xuXHR0aGlzLnZhcmlhYmxlID0gcGFyYW1zLnZhcmlhYmxlO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU3RhdGVUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3RhdGVPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMudmFsdWUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmFsdWUgPSB0aGlzLnZhbHVlO1xuXHR9XG5cdGlmKHRoaXMudmFyaWFibGUgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudmFyaWFibGUgPSB0aGlzLnZhcmlhYmxlO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3RhdGVPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gc3RhdGVPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuU3RhdGVUeXBlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdGF0ZTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdGF0ZVR5cGV9XG4gKi9cblN0YXRlVHlwZS5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgc3RhdGU7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBzdGF0ZSA9IFN0YXRlVHlwZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdGF0ZVR5cGV9XG4gKi9cblN0YXRlVHlwZS5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc3RhdGUgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHN0YXRlLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBzdGF0ZSA9IG5ldyBucy5TdGF0ZVR5cGUoKTtcblx0anNPYmogPSBqc09iai5zdGF0ZTtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3RhdGU7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0YXRlLnZhbHVlID0gYXR0cmlidXRlcy52YWx1ZSB8fCBudWxsO1xuXHRcdHN0YXRlLnZhcmlhYmxlID0gYXR0cmlidXRlcy52YXJpYWJsZSB8fCBudWxsO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn07XG5cbm5zLlN0YXRlVHlwZSA9IFN0YXRlVHlwZTtcbi8vIC0tLS0tLS0gRU5EIFNUQVRFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBDTE9ORSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtjbG9uZSZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3MgQ2xvbmVUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5sYWJlbFxuICovXG52YXIgQ2xvbmVUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10pO1xuXHR0aGlzLmxhYmVsID0gcGFyYW1zLmxhYmVsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0xhYmVsfSBsYWJlbFxuICovXG5DbG9uZVR5cGUucHJvdG90eXBlLnNldExhYmVsID0gZnVuY3Rpb24gKGxhYmVsKSB7XG5cdHRoaXMubGFiZWwgPSBsYWJlbDtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkNsb25lVHlwZS5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGNsb25lT2JqID0ge307XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYodGhpcy5sYWJlbCAhPSBudWxsKSB7XG5cdFx0Y2xvbmVPYmoubGFiZWwgPSAgdGhpcy5sYWJlbC5idWlsZEpzT2JqKCk7XG5cdH1cblx0cmV0dXJuIGNsb25lT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkNsb25lVHlwZS5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7Y2xvbmU6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7Q2xvbmVUeXBlfVxuICovXG5DbG9uZVR5cGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGNsb25lO1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgY2xvbmUgPSBDbG9uZVR5cGUuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGNsb25lO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7Q2xvbmVUeXBlfVxuICovXG5DbG9uZVR5cGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmNsb25lID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBjbG9uZSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgY2xvbmUgPSBuZXcgbnMuQ2xvbmVUeXBlKCk7XG5cdGpzT2JqID0ganNPYmouY2xvbmU7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoubGFiZWwpIHtcblx0XHR2YXIgbGFiZWwgPSBucy5MYWJlbC5mcm9tT2JqKHtsYWJlbDoganNPYmoubGFiZWxbMF19KTtcblx0XHRjbG9uZS5zZXRMYWJlbChsYWJlbCk7XG5cdH1cblx0cmV0dXJuIGNsb25lO1xufTtcblxubnMuQ2xvbmVUeXBlID0gQ2xvbmVUeXBlO1xuLy8gLS0tLS0tLSBFTkQgQ0xPTkUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEVOVElUWVRZUEUgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBFbnRpdHlUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5uYW1lXG4gKi9cbnZhciBFbnRpdHlUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ25hbWUnXSk7XG5cdHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuRW50aXR5VHlwZS5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGVudGl0eU9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5uYW1lICE9IG51bGwpIHtcblx0XHRhdHRyaWJ1dGVzLm5hbWUgPSB0aGlzLm5hbWU7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhlbnRpdHlPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gZW50aXR5T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkVudGl0eVR5cGUucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2VudGl0eTogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtFbnRpdHlUeXBlfVxuICovXG5FbnRpdHlUeXBlLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBlbnRpdHk7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBlbnRpdHkgPSBFbnRpdHlUeXBlLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBlbnRpdHk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtFbnRpdHlUeXBlfVxuICovXG5FbnRpdHlUeXBlLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5lbnRpdHkgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGVudGl0eSwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgZW50aXR5ID0gbmV3IG5zLkVudGl0eVR5cGUoKTtcblx0anNPYmogPSBqc09iai5lbnRpdHk7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGVudGl0eTtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0ZW50aXR5Lm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgbnVsbDtcblx0fVxuXHRyZXR1cm4gZW50aXR5O1xufTtcblxubnMuRW50aXR5VHlwZSA9IEVudGl0eVR5cGU7XG4vLyAtLS0tLS0tIEVORCBFTlRJVFlUWVBFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBQT1JUIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3BvcnQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIFBvcnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLmlkXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIFBvcnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdG5zLlNCR05CYXNlLmNhbGwodGhpcywgcGFyYW1zKTtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWydpZCcsICd4JywgJ3knXSk7XG5cdHRoaXMuaWQgPSBwYXJhbXMuaWQ7XG5cdHRoaXMueCBcdD0gcGFyc2VGbG9hdChwYXJhbXMueCk7XG5cdHRoaXMueSBcdD0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuXG5Qb3J0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnMuU0JHTkJhc2UucHJvdG90eXBlKTtcblBvcnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnMuUG9ydDtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuUG9ydC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHBvcnRPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKHRoaXMuaWQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuaWQgPSB0aGlzLmlkO1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLngpKSB7XG5cdFx0YXR0cmlidXRlcy54ID0gdGhpcy54O1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLnkpKSB7XG5cdFx0YXR0cmlidXRlcy55ID0gdGhpcy55O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMocG9ydE9iaiwgYXR0cmlidXRlcyk7XG5cdHRoaXMuYmFzZVRvSnNPYmoocG9ydE9iaik7XG5cdHJldHVybiBwb3J0T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblBvcnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3BvcnQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7UG9ydH1cbiAqL1xuUG9ydC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcG9ydDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHBvcnQgPSBQb3J0LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBwb3J0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7UG9ydH1cbiAqL1xuUG9ydC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoucG9ydCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgcG9ydCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgcG9ydCA9IG5ldyBucy5Qb3J0KCk7XG5cdGpzT2JqID0ganNPYmoucG9ydDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gcG9ydDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0cG9ydC54ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLngpO1xuXHRcdHBvcnQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0XHRwb3J0LmlkID0gYXR0cmlidXRlcy5pZCB8fCBudWxsO1xuXHR9XG5cdHBvcnQuYmFzZUZyb21PYmooanNPYmopO1xuXHRyZXR1cm4gcG9ydDtcbn07XG5cbm5zLlBvcnQgPSBQb3J0O1xuLy8gLS0tLS0tLSBFTkQgUE9SVCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gQVJDIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2FyYyZndDs8L2NvZGU+IGVsZW1lbnQuXG4gKiBAY2xhc3MgQXJjXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5pZFxuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuY2xhc3NfXG4gKiBAcGFyYW0ge3N0cmluZz19IHBhcmFtcy5zb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnRhcmdldFxuICogQHBhcmFtIHtTdGFydFR5cGU9fSBwYXJhbXMuc3RhcnRcbiAqIEBwYXJhbSB7RW5kVHlwZT19IHBhcmFtcy5lbmRcbiAqIEBwYXJhbSB7TmV4dFR5cGU9fSBwYXJhbXMubmV4dHNcbiAqIEBwYXJhbSB7R2x5cGhbXT19IHBhcmFtcy5nbHlwaHMgVGhlIGFyYydzIGNhcmRpbmFsaXR5LiBQb3NzaWJpbGl0eSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggaXMgbGVmdCBvcGVuLlxuICovXG52YXIgQXJjID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnaWQnLCAnY2xhc3NfJywgJ3NvdXJjZScsICd0YXJnZXQnLCAnc3RhcnQnLCAnZW5kJywgJ25leHRzJywgJ2dseXBocyddKTtcblx0dGhpcy5pZCBcdD0gcGFyYW1zLmlkO1xuXHR0aGlzLmNsYXNzXyA9IHBhcmFtcy5jbGFzc187XG5cdHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcblx0dGhpcy50YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuXG5cdHRoaXMuc3RhcnQgXHQ9IHBhcmFtcy5zdGFydDtcblx0dGhpcy5lbmQgXHQ9IHBhcmFtcy5lbmQ7XG5cdHRoaXMubmV4dHMgXHQ9IHBhcmFtcy5uZXh0cyB8fCBbXTtcblx0dGhpcy5nbHlwaHMgPSBwYXJhbXMuZ2x5cGhzIHx8wqBbXTtcbn07XG5cbkFyYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5zLlNCR05CYXNlLnByb3RvdHlwZSk7XG5BcmMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnMuQXJjO1xuXG4vKipcbiAqIEBwYXJhbSB7U3RhcnRUeXBlfSBzdGFydFxuICovXG5BcmMucHJvdG90eXBlLnNldFN0YXJ0ID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdHRoaXMuc3RhcnQgPSBzdGFydDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbmRUeXBlfSBlbmRcbiAqL1xuQXJjLnByb3RvdHlwZS5zZXRFbmQgPSBmdW5jdGlvbiAoZW5kKSB7XG5cdHRoaXMuZW5kID0gZW5kO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge05leHRUeXBlfSBuZXh0XG4gKi9cbkFyYy5wcm90b3R5cGUuYWRkTmV4dCA9IGZ1bmN0aW9uIChuZXh0KSB7XG5cdHRoaXMubmV4dHMucHVzaChuZXh0KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuQXJjLnByb3RvdHlwZS5hZGRHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuXHR0aGlzLmdseXBocy5wdXNoKGdseXBoKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbkFyYy5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFyY09iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy5pZCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5pZCA9IHRoaXMuaWQ7XG5cdH1cblx0aWYodGhpcy5jbGFzc18gIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMuY2xhc3MgPSB0aGlzLmNsYXNzXztcblx0fVxuXHRpZih0aGlzLnNvdXJjZSAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5zb3VyY2UgPSB0aGlzLnNvdXJjZTtcblx0fVxuXHRpZih0aGlzLnRhcmdldCAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy50YXJnZXQgPSB0aGlzLnRhcmdldDtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGFyY09iaiwgYXR0cmlidXRlcyk7XG5cblx0Ly8gY2hpbGRyZW5cblx0dGhpcy5iYXNlVG9Kc09iaihhcmNPYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY09iai5nbHlwaCA9IFtdO1xuXHRcdH1cblx0XHRhcmNPYmouZ2x5cGgucHVzaCh0aGlzLmdseXBoc1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGlmKHRoaXMuc3RhcnQgIT0gbnVsbCkge1xuXHRcdGFyY09iai5zdGFydCA9ICB0aGlzLnN0YXJ0LmJ1aWxkSnNPYmooKTtcblx0fVxuXHRpZih0aGlzLnN0YXRlICE9IG51bGwpIHtcblx0XHRhcmNPYmouc3RhdGUgPSAgdGhpcy5zdGF0ZS5idWlsZEpzT2JqKCk7XG5cdH1cblx0Zm9yKHZhciBpPTA7IGkgPCB0aGlzLm5leHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY09iai5uZXh0ID0gW107XG5cdFx0fVxuXHRcdGFyY09iai5uZXh0LnB1c2godGhpcy5uZXh0c1tpXS5idWlsZEpzT2JqKCkpO1xuXHR9XG5cdGlmKHRoaXMuZW5kICE9IG51bGwpIHtcblx0XHRhcmNPYmouZW5kID0gIHRoaXMuZW5kLmJ1aWxkSnNPYmooKTtcblx0fVxuXHRyZXR1cm4gYXJjT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkFyYy5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7YXJjOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0FyY31cbiAqL1xuQXJjLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhcmM7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBhcmMgPSBBcmMuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGFyYztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0FyY31cbiAqL1xuQXJjLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5hcmMgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIGFyYywgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgYXJjID0gbmV3IG5zLkFyYygpO1xuXHRqc09iaiA9IGpzT2JqLmFyYztcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gYXJjO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRhcmMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8IG51bGw7XG5cdFx0YXJjLmNsYXNzXyA9IGF0dHJpYnV0ZXMuY2xhc3MgfHwgbnVsbDtcblx0XHRhcmMuc291cmNlID0gYXR0cmlidXRlcy5zb3VyY2UgfHwgbnVsbDtcblx0XHRhcmMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgbnVsbDtcblx0fVxuXG5cdC8vIGNoaWxkcmVuXG5cdGlmKGpzT2JqLnN0YXJ0KSB7XG5cdFx0dmFyIHN0YXJ0ID0gbnMuU3RhcnRUeXBlLmZyb21PYmooe3N0YXJ0OiBqc09iai5zdGFydFswXX0pO1xuXHRcdGFyYy5zZXRTdGFydChzdGFydCk7XG5cdH1cblx0aWYoanNPYmoubmV4dCkge1xuXHRcdHZhciBuZXh0cyA9IGpzT2JqLm5leHQ7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgbmV4dHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBuZXh0ID0gbnMuTmV4dFR5cGUuZnJvbU9iaih7bmV4dDogbmV4dHNbaV19KTtcblx0XHRcdGFyYy5hZGROZXh0KG5leHQpO1xuXHRcdH1cblx0fVxuXHRpZihqc09iai5lbmQpIHtcblx0XHR2YXIgZW5kID0gbnMuRW5kVHlwZS5mcm9tT2JqKHtlbmQ6IGpzT2JqLmVuZFswXX0pO1xuXHRcdGFyYy5zZXRFbmQoZW5kKTtcblx0fVxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGFyYy5hZGRHbHlwaChnbHlwaCk7XG5cdFx0fVxuXHR9XG5cblx0YXJjLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGFyYztcbn07XG5cbm5zLkFyYyA9IEFyYztcbi8vIC0tLS0tLS0gRU5EIEFSQyAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gU1RBUlRUWVBFIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O3N0YXJ0Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBTdGFydFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy54XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueVxuICovXG52YXIgU3RhcnRUeXBlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHR2YXIgcGFyYW1zID0gY2hlY2tQYXJhbXMocGFyYW1zLCBbJ3gnLCAneSddKTtcblx0dGhpcy54ID0gcGFyc2VGbG9hdChwYXJhbXMueCk7XG5cdHRoaXMueSA9IHBhcnNlRmxvYXQocGFyYW1zLnkpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqL1xuU3RhcnRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc3RhcnRPYmogPSB7fTtcblxuXHQvLyBhdHRyaWJ1dGVzXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cdGlmKCFpc05hTih0aGlzLngpKSB7XG5cdFx0YXR0cmlidXRlcy54ID0gdGhpcy54O1xuXHR9XG5cdGlmKCFpc05hTih0aGlzLnkpKSB7XG5cdFx0YXR0cmlidXRlcy55ID0gdGhpcy55O1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoc3RhcnRPYmosIGF0dHJpYnV0ZXMpO1xuXHRyZXR1cm4gc3RhcnRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuU3RhcnRUeXBlLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHtzdGFydDogdGhpcy5idWlsZEpzT2JqKCl9KVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtTdGFydFR5cGV9XG4gKi9cblN0YXJ0VHlwZS5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgc3RhcnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBzdGFydCA9IFN0YXJ0VHlwZS5mcm9tT2JqKHJlc3VsdCk7XG4gICAgfTtcbiAgICB1dGlscy5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbiAgICByZXR1cm4gc3RhcnQ7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBqc09iaiAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKiBAcmV0dXJuIHtTdGFydFR5cGV9XG4gKi9cblN0YXJ0VHlwZS5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouc3RhcnQgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHN0YXJ0LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBzdGFydCA9IG5ldyBucy5TdGFydFR5cGUoKTtcblx0anNPYmogPSBqc09iai5zdGFydDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gc3RhcnQ7XG5cdH1cblxuXHRpZihqc09iai4kKSB7IC8vIHdlIGhhdmUgc29tZSBhdHRyaWJ1dGVzXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBqc09iai4kO1xuXHRcdHN0YXJ0LnggPSBwYXJzZUZsb2F0KGF0dHJpYnV0ZXMueCk7XG5cdFx0c3RhcnQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gc3RhcnQ7XG59O1xuXG5ucy5TdGFydFR5cGUgPSBTdGFydFR5cGU7XG4vLyAtLS0tLS0tIEVORCBTVEFSVFRZUEUgLS0tLS0tLVxuXG4vLyAtLS0tLS0tIEVORFRZUEUgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7ZW5kJmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBFbmRUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIEVuZFR5cGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneCcsICd5J10pO1xuXHR0aGlzLnggPSBwYXJzZUZsb2F0KHBhcmFtcy54KTtcblx0dGhpcy55ID0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5FbmRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgZW5kT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZighaXNOYU4odGhpcy54KSkge1xuXHRcdGF0dHJpYnV0ZXMueCA9IHRoaXMueDtcblx0fVxuXHRpZighaXNOYU4odGhpcy55KSkge1xuXHRcdGF0dHJpYnV0ZXMueSA9IHRoaXMueTtcblx0fVxuXHR1dGlscy5hZGRBdHRyaWJ1dGVzKGVuZE9iaiwgYXR0cmlidXRlcyk7XG5cdHJldHVybiBlbmRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuRW5kVHlwZS5wcm90b3R5cGUudG9YTUwgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB1dGlscy5idWlsZFN0cmluZyh7ZW5kOiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge0VuZFR5cGV9XG4gKi9cbkVuZFR5cGUuZnJvbVhNTCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIGVuZDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGVuZCA9IEVuZFR5cGUuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGVuZDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge0VuZFR5cGV9XG4gKi9cbkVuZFR5cGUuZnJvbU9iaiA9IGZ1bmN0aW9uIChqc09iaikge1xuXHRpZiAodHlwZW9mIGpzT2JqLmVuZCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgZW5kLCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBlbmQgPSBuZXcgbnMuRW5kVHlwZSgpO1xuXHRqc09iaiA9IGpzT2JqLmVuZDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gZW5kO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRlbmQueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRlbmQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gZW5kO1xufTtcblxubnMuRW5kVHlwZSA9IEVuZFR5cGU7XG4vLyAtLS0tLS0tIEVORCBFTkRUWVBFIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBORVhUVFlQRSAtLS0tLS0tXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIDxjb2RlPiZsdDtuZXh0Jmd0OzwvY29kZT4gZWxlbWVudC5cbiAqIEBjbGFzcyBOZXh0VHlwZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnhcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcj19IHBhcmFtcy55XG4gKi9cbnZhciBOZXh0VHlwZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWyd4JywgJ3knXSk7XG5cdHRoaXMueCA9IHBhcnNlRmxvYXQocGFyYW1zLngpO1xuXHR0aGlzLnkgPSBwYXJzZUZsb2F0KHBhcmFtcy55KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cbk5leHRUeXBlLnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgbmV4dE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYoIWlzTmFOKHRoaXMueCkpIHtcblx0XHRhdHRyaWJ1dGVzLnggPSB0aGlzLng7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMueSkpIHtcblx0XHRhdHRyaWJ1dGVzLnkgPSB0aGlzLnk7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhuZXh0T2JqLCBhdHRyaWJ1dGVzKTtcblx0cmV0dXJuIG5leHRPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuTmV4dFR5cGUucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe25leHQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7TmV4dFR5cGV9XG4gKi9cbk5leHRUeXBlLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBuZXh0O1xuXHRmdW5jdGlvbiBmbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgbmV4dCA9IE5leHRUeXBlLmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBuZXh0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7TmV4dFR5cGV9XG4gKi9cbk5leHRUeXBlLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5uZXh0ID09ICd1bmRlZmluZWQnKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmFkIFhNTCBwcm92aWRlZCwgZXhwZWN0ZWQgdGFnTmFtZSBuZXh0LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBuZXh0ID0gbmV3IG5zLk5leHRUeXBlKCk7XG5cdGpzT2JqID0ganNPYmoubmV4dDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gbmV4dDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0bmV4dC54ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLngpO1xuXHRcdG5leHQueSA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy55KTtcblx0fVxuXHRyZXR1cm4gbmV4dDtcbn07XG5cbm5zLk5leHRUeXBlID0gTmV4dFR5cGU7XG4vLyAtLS0tLS0tIEVORCBORVhUVFlQRSAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gUE9JTlQgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7cG9pbnQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXI9fSBwYXJhbXMueFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gcGFyYW1zLnlcbiAqL1xudmFyIFBvaW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsneCcsICd5J10pO1xuXHR0aGlzLnggPSBwYXJzZUZsb2F0KHBhcmFtcy54KTtcblx0dGhpcy55ID0gcGFyc2VGbG9hdChwYXJhbXMueSk7XG59O1xuUG9pbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShucy5TQkdOQmFzZS5wcm90b3R5cGUpO1xuUG9pbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnQ7XG5cbi8qKlxuICogQHJldHVybiB7T2JqZWN0fSAtIHhtbDJqcyBmb3JtYXR0ZWQgb2JqZWN0XG4gKi9cblBvaW50LnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgcG9pbnRKc09iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYoIWlzTmFOKHRoaXMueCkpIHtcblx0XHRhdHRyaWJ1dGVzLnggPSB0aGlzLng7XG5cdH1cblx0aWYoIWlzTmFOKHRoaXMueSkpIHtcblx0XHRhdHRyaWJ1dGVzLnkgPSB0aGlzLnk7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhwb2ludEpzT2JqLCBhdHRyaWJ1dGVzKTtcblx0dGhpcy5iYXNlVG9Kc09iaihwb2ludEpzT2JqKTtcblx0cmV0dXJuIHBvaW50SnNPYmo7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuUG9pbnQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe3BvaW50OiB0aGlzLmJ1aWxkSnNPYmooKX0pXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge1BvaW50fVxuICovXG5Qb2ludC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcG9pbnQ7XG5cdGZ1bmN0aW9uIGZuIChlcnIsIHJlc3VsdCkge1xuICAgICAgICBwb2ludCA9IFBvaW50LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBwb2ludDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IGpzT2JqIC0geG1sMmpzIGZvcm1hdHRlZCBvYmplY3RcbiAqIEByZXR1cm4ge1BvaW50fVxuICovXG5Qb2ludC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmoucG9pbnQgPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCYWQgWE1MIHByb3ZpZGVkLCBleHBlY3RlZCB0YWdOYW1lIHBvaW50LCBnb3Q6IFwiICsgT2JqZWN0LmtleXMoanNPYmopWzBdKTtcblx0fVxuXG5cdHZhciBwb2ludCA9IG5ldyBucy5Qb2ludCgpO1xuXHRqc09iaiA9IGpzT2JqLnBvaW50O1xuXHRpZih0eXBlb2YganNPYmogIT0gJ29iamVjdCcpIHsgLy8gbm90aGluZyBpbnNpZGUsIGVtcHR5IHhtbFxuXHRcdHJldHVybiBwb2ludDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0cG9pbnQueCA9IHBhcnNlRmxvYXQoYXR0cmlidXRlcy54KTtcblx0XHRwb2ludC55ID0gcGFyc2VGbG9hdChhdHRyaWJ1dGVzLnkpO1xuXHR9XG5cdHBvaW50LmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIHBvaW50O1xufTtcblxubnMuUG9pbnQgPSBQb2ludDtcbi8vIC0tLS0tLS0gRU5EIFBPSU5UIC0tLS0tLS1cblxuLy8gLS0tLS0tLSBDQUxMT1VUIC0tLS0tLS1cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgPGNvZGU+Jmx0O2NhbGxvdXQmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzIENhbGxvdXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gcGFyYW1zLnRhcmdldFxuICogQHBhcmFtIHtQb2ludD19IHBhcmFtcy5wb2ludFxuICovXG52YXIgQ2FsbG91dCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0dmFyIHBhcmFtcyA9IGNoZWNrUGFyYW1zKHBhcmFtcywgWyd0YXJnZXQnLCAncG9pbnQnXSk7XG5cdHRoaXMudGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcblx0dGhpcy5wb2ludCA9IHBhcmFtcy5wb2ludDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQb2ludH0gcG9pbnRcbiAqL1xuQ2FsbG91dC5wcm90b3R5cGUuc2V0UG9pbnQgPSBmdW5jdGlvbihwb2ludCkge1xuXHR0aGlzLnBvaW50ID0gcG9pbnQ7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5DYWxsb3V0LnByb3RvdHlwZS5idWlsZEpzT2JqID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgY2FsbG91dE9iaiA9IHt9O1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblx0aWYodGhpcy50YXJnZXQgIT0gbnVsbCkge1xuXHRcdGF0dHJpYnV0ZXMudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cdH1cblx0dXRpbHMuYWRkQXR0cmlidXRlcyhjYWxsb3V0T2JqLCBhdHRyaWJ1dGVzKTtcblxuXHQvLyBjaGlsZHJlblxuXHRpZih0aGlzLnBvaW50ICE9IG51bGwpIHtcblx0XHRjYWxsb3V0T2JqLnBvaW50ID0gIHRoaXMucG9pbnQuYnVpbGRKc09iaigpO1xuXHR9XG5cdHJldHVybiBjYWxsb3V0T2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkNhbGxvdXQucHJvdG90eXBlLnRvWE1MID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdXRpbHMuYnVpbGRTdHJpbmcoe2NhbGxvdXQ6IHRoaXMuYnVpbGRKc09iaigpfSlcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7Q2FsbG91dH1cbiAqL1xuQ2FsbG91dC5mcm9tWE1MID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgY2FsbG91dDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGNhbGxvdXQgPSBDYWxsb3V0LmZyb21PYmoocmVzdWx0KTtcbiAgICB9O1xuICAgIHV0aWxzLnBhcnNlU3RyaW5nKHN0cmluZywgZm4pO1xuICAgIHJldHVybiBjYWxsb3V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7Q2FsbG91dH1cbiAqL1xuQ2FsbG91dC5mcm9tT2JqID0gZnVuY3Rpb24gKGpzT2JqKSB7XG5cdGlmICh0eXBlb2YganNPYmouY2FsbG91dCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgY2FsbG91dCwgZ290OiBcIiArIE9iamVjdC5rZXlzKGpzT2JqKVswXSk7XG5cdH1cblxuXHR2YXIgY2FsbG91dCA9IG5ldyBucy5DYWxsb3V0KCk7XG5cdGpzT2JqID0ganNPYmouY2FsbG91dDtcblx0aWYodHlwZW9mIGpzT2JqICE9ICdvYmplY3QnKSB7IC8vIG5vdGhpbmcgaW5zaWRlLCBlbXB0eSB4bWxcblx0XHRyZXR1cm4gY2FsbG91dDtcblx0fVxuXG5cdGlmKGpzT2JqLiQpIHsgLy8gd2UgaGF2ZSBzb21lIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzT2JqLiQ7XG5cdFx0Y2FsbG91dC50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCBudWxsO1xuXHR9XG5cblx0Ly8gY2hpbGRyZW5cblx0aWYoanNPYmoucG9pbnQpIHtcblx0XHR2YXIgcG9pbnQgPSBucy5Qb2ludC5mcm9tT2JqKHtwb2ludDoganNPYmoucG9pbnRbMF19KTtcblx0XHRjYWxsb3V0LnNldFBvaW50KHBvaW50KTtcblx0fVxuXHRyZXR1cm4gY2FsbG91dDtcbn07XG5cbm5zLkNhbGxvdXQgPSBDYWxsb3V0O1xuLy8gLS0tLS0tLSBFTkQgQ0FMTE9VVCAtLS0tLS0tXG5cbi8vIC0tLS0tLS0gQVJDR1JPVVAgLS0tLS0tLVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSA8Y29kZT4mbHQ7YXJjZ3JvdXAmZ3Q7PC9jb2RlPiBlbGVtZW50LlxuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBTQkdOQmFzZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmc9fSBwYXJhbXMuY2xhc3NfXG4gKiBAcGFyYW0ge0dseXBoW109fSBwYXJhbXMuZ2x5cGhzXG4gKiBAcGFyYW0ge0FyY1tdPX0gcGFyYW1zLmFyY3NcbiAqL1xudmFyIEFyY2dyb3VwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHRucy5TQkdOQmFzZS5jYWxsKHRoaXMsIHBhcmFtcyk7XG5cdHZhciBwYXJhbXMgPSBjaGVja1BhcmFtcyhwYXJhbXMsIFsnY2xhc3NfJywgJ2dseXBocycsICdhcmNzJ10pO1xuXHR0aGlzLmNsYXNzXyBcdFx0PSBwYXJhbXMuY2xhc3NfO1xuXHR0aGlzLmdseXBocyBcdD0gcGFyYW1zLmdseXBocyB8fCBbXTtcblx0dGhpcy5hcmNzIFx0XHQ9IHBhcmFtcy5hcmNzIHx8IFtdO1xufTtcblxuQXJjZ3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShucy5TQkdOQmFzZS5wcm90b3R5cGUpO1xuQXJjZ3JvdXAucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjZ3JvdXA7XG5cbi8qKlxuICogQHBhcmFtIHtHbHlwaH0gZ2x5cGhcbiAqL1xuQXJjZ3JvdXAucHJvdG90eXBlLmFkZEdseXBoID0gZnVuY3Rpb24gKGdseXBoKSB7XG5cdHRoaXMuZ2x5cGhzLnB1c2goZ2x5cGgpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FyY30gYXJjXG4gKi9cbkFyY2dyb3VwLnByb3RvdHlwZS5hZGRBcmMgPSBmdW5jdGlvbiAoYXJjKSB7XG5cdHRoaXMuYXJjcy5wdXNoKGFyYyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICovXG5BcmNncm91cC5wcm90b3R5cGUuYnVpbGRKc09iaiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGFyY2dyb3VwT2JqID0ge307XG5cblx0Ly8gYXR0cmlidXRlc1xuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXHRpZih0aGlzLmNsYXNzXyAhPSBudWxsKSB7XG5cdFx0YXR0cmlidXRlcy5jbGFzcyA9IHRoaXMuY2xhc3NfO1xuXHR9XG5cdHV0aWxzLmFkZEF0dHJpYnV0ZXMoYXJjZ3JvdXBPYmosIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIGNoaWxkcmVuXG5cdHRoaXMuYmFzZVRvSnNPYmooYXJjZ3JvdXBPYmopO1xuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGk9PTApIHtcblx0XHRcdGFyY2dyb3VwT2JqLmdseXBoID0gW107XG5cdFx0fVxuXHRcdGFyY2dyb3VwT2JqLmdseXBoLnB1c2godGhpcy5nbHlwaHNbaV0uYnVpbGRKc09iaigpKTtcblx0fVxuXHRmb3IodmFyIGk9MDsgaSA8IHRoaXMuYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChpPT0wKSB7XG5cdFx0XHRhcmNncm91cE9iai5hcmMgPSBbXTtcblx0XHR9XG5cdFx0YXJjZ3JvdXBPYmouYXJjLnB1c2godGhpcy5hcmNzW2ldLmJ1aWxkSnNPYmooKSk7XG5cdH1cblx0cmV0dXJuIGFyY2dyb3VwT2JqO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbkFyY2dyb3VwLnByb3RvdHlwZS50b1hNTCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHV0aWxzLmJ1aWxkU3RyaW5nKHthcmNncm91cDogdGhpcy5idWlsZEpzT2JqKCl9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7QXJjZ3JvdXB9XG4gKi9cbkFyY2dyb3VwLmZyb21YTUwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBhcmNncm91cDtcblx0ZnVuY3Rpb24gZm4gKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIGFyY2dyb3VwID0gQXJjZ3JvdXAuZnJvbU9iaihyZXN1bHQpO1xuICAgIH07XG4gICAgdXRpbHMucGFyc2VTdHJpbmcoc3RyaW5nLCBmbik7XG4gICAgcmV0dXJuIGFyY2dyb3VwO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0ganNPYmogLSB4bWwyanMgZm9ybWF0dGVkIG9iamVjdFxuICogQHJldHVybiB7QXJjZ3JvdXB9XG4gKi9cbkFyY2dyb3VwLmZyb21PYmogPSBmdW5jdGlvbiAoanNPYmopIHtcblx0aWYgKHR5cGVvZiBqc09iai5hcmNncm91cCA9PSAndW5kZWZpbmVkJykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBYTUwgcHJvdmlkZWQsIGV4cGVjdGVkIHRhZ05hbWUgYXJjZ3JvdXAsIGdvdDogXCIgKyBPYmplY3Qua2V5cyhqc09iailbMF0pO1xuXHR9XG5cblx0dmFyIGFyY2dyb3VwID0gbmV3IG5zLkFyY2dyb3VwKCk7XG5cdGpzT2JqID0ganNPYmouYXJjZ3JvdXA7XG5cdGlmKHR5cGVvZiBqc09iaiAhPSAnb2JqZWN0JykgeyAvLyBub3RoaW5nIGluc2lkZSwgZW1wdHkgeG1sXG5cdFx0cmV0dXJuIGFyY2dyb3VwO1xuXHR9XG5cblx0aWYoanNPYmouJCkgeyAvLyB3ZSBoYXZlIHNvbWUgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNPYmouJDtcblx0XHRhcmNncm91cC5jbGFzc18gPSBhdHRyaWJ1dGVzLmNsYXNzIHx8IG51bGw7XG5cdH1cblxuXHRpZihqc09iai5nbHlwaCkge1xuXHRcdHZhciBnbHlwaHMgPSBqc09iai5nbHlwaDtcblx0XHRmb3IgKHZhciBpPTA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBnbHlwaCA9IG5zLkdseXBoLmZyb21PYmooe2dseXBoOiBnbHlwaHNbaV19KTtcblx0XHRcdGFyY2dyb3VwLmFkZEdseXBoKGdseXBoKTtcblx0XHR9XG5cdH1cblx0aWYoanNPYmouYXJjKSB7XG5cdFx0dmFyIGFyY3MgPSBqc09iai5hcmM7XG5cdFx0Zm9yICh2YXIgaT0wOyBpIDwgYXJjcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyYyA9IG5zLkFyYy5mcm9tT2JqKHthcmM6IGFyY3NbaV19KTtcblx0XHRcdGFyY2dyb3VwLmFkZEFyYyhhcmMpO1xuXHRcdH1cblx0fVxuXG5cdGFyY2dyb3VwLmJhc2VGcm9tT2JqKGpzT2JqKTtcblx0cmV0dXJuIGFyY2dyb3VwO1xufTtcblxubnMuQXJjZ3JvdXAgPSBBcmNncm91cDtcbi8vIC0tLS0tLS0gRU5EIEFSQ0dST1VQIC0tLS0tLS1cblxubnMucmVuZGVyID0gcmVuZGVyRXh0O1xubnMuYW5ub3QgPSBhbm5vdEV4dDtcbm1vZHVsZS5leHBvcnRzID0gbnM7IiwidmFyIG5zID0ge307XG52YXIgeG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG5cbi8qXG5cdGd1YXJhbnRlZXMgdG8gcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdpdmVuIGFyZ3MgYmVpbmcgc2V0IHRvIG51bGwgaWYgbm90IHByZXNlbnQsIG90aGVyIGFyZ3MgcmV0dXJuZWQgYXMgaXNcbiovXG5ucy5jaGVja1BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMsIG5hbWVzKSB7XG5cdGlmICh0eXBlb2YgcGFyYW1zID09IFwidW5kZWZpbmVkXCIgfHwgcGFyYW1zID09IG51bGwpIHtcblx0XHRwYXJhbXMgPSB7fTtcblx0fVxuXHRpZiAodHlwZW9mIHBhcmFtcyAhPSAnb2JqZWN0Jykge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIkJhZCBwYXJhbXMuIE9iamVjdCB3aXRoIG5hbWVkIHBhcmFtZXRlcnMgbXVzdCBiZSBwYXNzZWQuXCIpO1xuXHR9XG5cdGZvcih2YXIgaT0wOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgYXJnTmFtZSA9IG5hbWVzW2ldO1xuXHRcdGlmICh0eXBlb2YgcGFyYW1zW2FyZ05hbWVdID09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRwYXJhbXNbYXJnTmFtZV0gPSBudWxsO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGFyYW1zO1xufVxuXG5ucy5nZXRGaXJzdExldmVsQnlOYW1lID0gZnVuY3Rpb24gKHhtbE9iaiwgbG9jYWxOYW1lKSB7XG5cdHZhciByZXN1bHQgPSBbXTtcblx0Zm9yKHZhciBpPTA7IGk8eG1sT2JqLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgY2hpbGQgPSB4bWxPYmouY2hpbGROb2Rlc1tpXTtcblx0XHRpZiAoY2hpbGQubG9jYWxOYW1lICYmIGNoaWxkLmxvY2FsTmFtZSA9PSBsb2NhbE5hbWUpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGNoaWxkKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbm5zLmFkZEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoanNPYmosIGF0dHJpYnV0ZXMpIHtcblx0anNPYmouJCA9IGF0dHJpYnV0ZXM7XG59O1xuXG5ucy5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcsIGZuKSB7XG5cdHZhciBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG5cdFx0dGFnTmFtZVByb2Nlc3NvcnM6IFt4bWwyanMucHJvY2Vzc29ycy5zdHJpcFByZWZpeF0sXG5cdFx0YXR0clZhbHVlUHJvY2Vzc29yczogW3htbDJqcy5wcm9jZXNzb3JzLnBhcnNlTnVtYmVycywgeG1sMmpzLnByb2Nlc3NvcnMucGFyc2VCb29sZWFuc11cblx0fSk7XG5cdHBhcnNlci5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbn07XG5cbm5zLnBhcnNlU3RyaW5nS2VlcFByZWZpeCA9IGZ1bmN0aW9uIChzdHJpbmcsIGZuKSB7XG5cdHZhciBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG5cdFx0YXR0clZhbHVlUHJvY2Vzc29yczogW3htbDJqcy5wcm9jZXNzb3JzLnBhcnNlTnVtYmVycywgeG1sMmpzLnByb2Nlc3NvcnMucGFyc2VCb29sZWFuc11cblx0fSk7XG5cdHBhcnNlci5wYXJzZVN0cmluZyhzdHJpbmcsIGZuKTtcbn07XG5cbm5zLmJ1aWxkU3RyaW5nID0gZnVuY3Rpb24gKG9iaikge1xuXHR2YXIgeG1sU3RyaW5nID0gIG5ldyB4bWwyanMuQnVpbGRlcih7XG5cdFx0aGVhZGxlc3M6IHRydWUsXG5cdFx0cmVuZGVyT3B0czoge3ByZXR0eTogZmFsc2V9XG5cdH0pLmJ1aWxkT2JqZWN0KG9iaik7XG5cblx0LyogXHRkaXJ0eSBoYWNrIG5lZWRlZCB0byBzb2x2ZSB0aGUgbmV3bGluZSBjaGFyIGVuY29kaW5nIHByb2JsZW1cblx0XHR4bWwyanMgZG9lc24ndCBlbmNvZGUgXFxuIGFzICYjeEE7IHdlIG5lZWQgdG8gZG8gaXQgbWFudWFsbHlcblx0Ki9cblx0dmFyIHJlID0gLzxsYWJlbCB0ZXh0PVwiKCgufFxcbispKz8pXCIvZ207XG5cdHZhciB4bWxTdHJpbmdfY29ycmVjdExhYmVsID0geG1sU3RyaW5nLnJlcGxhY2UocmUsIGZ1bmN0aW9uKG1hdGNoLCBwMSwgcDIpIHtcblx0XHRyZXR1cm4gJzxsYWJlbCB0ZXh0PVwiJytwMS5yZXBsYWNlKC9cXG4vZywgXCImI3hBO1wiKSsnXCInO1xuXHR9KTtcblx0cmV0dXJuIHhtbFN0cmluZ19jb3JyZWN0TGFiZWw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5zOyIsIi8vIFJlcGxhY2UgbG9jYWwgcmVxdWlyZSBieSBhIGxhenkgbG9hZGVyXG52YXIgZ2xvYmFsUmVxdWlyZSA9IHJlcXVpcmU7XG5yZXF1aXJlID0gZnVuY3Rpb24gKCkge307XG5cbi8vIEV4cG9zZSBzdWJtb2R1bGVzXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBMZXhlcjogICAgICAgIHJlcXVpcmUoJy4vbGliL04zTGV4ZXInKSxcbiAgUGFyc2VyOiAgICAgICByZXF1aXJlKCcuL2xpYi9OM1BhcnNlcicpLFxuICBXcml0ZXI6ICAgICAgIHJlcXVpcmUoJy4vbGliL04zV3JpdGVyJyksXG4gIFN0b3JlOiAgICAgICAgcmVxdWlyZSgnLi9saWIvTjNTdG9yZScpLFxuICBTdHJlYW1QYXJzZXI6IHJlcXVpcmUoJy4vbGliL04zU3RyZWFtUGFyc2VyJyksXG4gIFN0cmVhbVdyaXRlcjogcmVxdWlyZSgnLi9saWIvTjNTdHJlYW1Xcml0ZXInKSxcbiAgVXRpbDogICAgICAgICByZXF1aXJlKCcuL2xpYi9OM1V0aWwnKSxcbn07XG5cbi8vIExvYWQgc3VibW9kdWxlcyBvbiBmaXJzdCBhY2Nlc3Ncbk9iamVjdC5rZXlzKGV4cG9ydHMpLmZvckVhY2goZnVuY3Rpb24gKHN1Ym1vZHVsZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgc3VibW9kdWxlLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWxldGUgZXhwb3J0c1tzdWJtb2R1bGVdO1xuICAgICAgcmV0dXJuIGV4cG9ydHNbc3VibW9kdWxlXSA9IGdsb2JhbFJlcXVpcmUoJy4vbGliL04zJyArIHN1Ym1vZHVsZSk7XG4gICAgfSxcbiAgfSk7XG59KTtcbiIsIi8vICoqTjNMZXhlcioqIHRva2VuaXplcyBOMyBkb2N1bWVudHMuXG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBpbW1lZGlhdGVseSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgPyBzZXRJbW1lZGlhdGUgOlxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZ1bmMpIHsgc2V0VGltZW91dChmdW5jLCAwKTsgfTtcblxuLy8gUmVndWxhciBleHByZXNzaW9uIGFuZCByZXBsYWNlbWVudCBzdHJpbmcgdG8gZXNjYXBlIE4zIHN0cmluZ3MuXG4vLyBOb3RlIGhvdyB3ZSBjYXRjaCBpbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2VzIHNlcGFyYXRlbHkgKHRoZXkgd2lsbCB0cmlnZ2VyIGFuIGVycm9yKS5cbnZhciBlc2NhcGVTZXF1ZW5jZSA9IC9cXFxcdShbYS1mQS1GMC05XXs0fSl8XFxcXFUoW2EtZkEtRjAtOV17OH0pfFxcXFxbdVVdfFxcXFwoLikvZztcbnZhciBlc2NhcGVSZXBsYWNlbWVudHMgPSB7XG4gICdcXFxcJzogJ1xcXFwnLCBcIidcIjogXCInXCIsICdcIic6ICdcIicsXG4gICduJzogJ1xcbicsICdyJzogJ1xccicsICd0JzogJ1xcdCcsICdmJzogJ1xcZicsICdiJzogJ1xcYicsXG4gICdfJzogJ18nLCAnfic6ICd+JywgJy4nOiAnLicsICctJzogJy0nLCAnISc6ICchJywgJyQnOiAnJCcsICcmJzogJyYnLFxuICAnKCc6ICcoJywgJyknOiAnKScsICcqJzogJyonLCAnKyc6ICcrJywgJywnOiAnLCcsICc7JzogJzsnLCAnPSc6ICc9JyxcbiAgJy8nOiAnLycsICc/JzogJz8nLCAnIyc6ICcjJywgJ0AnOiAnQCcsICclJzogJyUnLFxufTtcbnZhciBpbGxlZ2FsSXJpQ2hhcnMgPSAvW1xceDAwLVxceDIwPD5cXFxcXCJcXHtcXH1cXHxcXF5cXGBdLztcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zTGV4ZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNMZXhlcikpXG4gICAgcmV0dXJuIG5ldyBOM0xleGVyKG9wdGlvbnMpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBJbiBsaW5lIG1vZGUgKE4tVHJpcGxlcyBvciBOLVF1YWRzKSwgb25seSBzaW1wbGUgZmVhdHVyZXMgbWF5IGJlIHBhcnNlZFxuICBpZiAob3B0aW9ucy5saW5lTW9kZSkge1xuICAgIC8vIERvbid0IHRva2VuaXplIHNwZWNpYWwgbGl0ZXJhbHNcbiAgICB0aGlzLl90cmlwbGVRdW90ZWRTdHJpbmcgPSB0aGlzLl9udW1iZXIgPSB0aGlzLl9ib29sZWFuID0gLyQwXi87XG4gICAgLy8gU3dhcCB0aGUgdG9rZW5pemUgbWV0aG9kIGZvciBhIHJlc3RyaWN0ZWQgdmVyc2lvblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl90b2tlbml6ZSA9IHRoaXMudG9rZW5pemU7XG4gICAgdGhpcy50b2tlbml6ZSA9IGZ1bmN0aW9uIChpbnB1dCwgY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3Rva2VuaXplKGlucHV0LCBmdW5jdGlvbiAoZXJyb3IsIHRva2VuKSB7XG4gICAgICAgIGlmICghZXJyb3IgJiYgL14oPzpJUkl8cHJlZml4ZWR8bGl0ZXJhbHxsYW5nY29kZXx0eXBlfFxcLnxlb2YpJC8udGVzdCh0b2tlbi50eXBlKSlcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvciwgdG9rZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3IgfHwgc2VsZi5fc3ludGF4RXJyb3IodG9rZW4udHlwZSwgY2FsbGJhY2sgPSBudWxsKSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIC8vIEVuYWJsZSBOMyBmdW5jdGlvbmFsaXR5IGJ5IGRlZmF1bHRcbiAgdGhpcy5fbjNNb2RlID0gb3B0aW9ucy5uMyAhPT0gZmFsc2U7XG4gIC8vIERpc2FibGUgY29tbWVudCB0b2tlbnMgYnkgZGVmYXVsdFxuICB0aGlzLl9jb21tZW50cyA9ICEhb3B0aW9ucy5jb21tZW50cztcbn1cblxuTjNMZXhlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgLy8gSXQncyBzbGlnaHRseSBmYXN0ZXIgdG8gaGF2ZSB0aGVzZSBhcyBwcm9wZXJ0aWVzIHRoYW4gYXMgaW4tc2NvcGUgdmFyaWFibGVzXG5cbiAgX2lyaTogL148KCg/OlteIDw+e31cXFxcXXxcXFxcW3VVXSkrKT5bIFxcdF0qLywgLy8gSVJJIHdpdGggZXNjYXBlIHNlcXVlbmNlczsgbmVlZHMgc2FuaXR5IGNoZWNrIGFmdGVyIHVuZXNjYXBpbmdcbiAgX3VuZXNjYXBlZElyaTogL148KFteXFx4MDAtXFx4MjA8PlxcXFxcIlxce1xcfVxcfFxcXlxcYF0qKT5bIFxcdF0qLywgLy8gSVJJIHdpdGhvdXQgZXNjYXBlIHNlcXVlbmNlczsgbm8gdW5lc2NhcGluZ1xuICBfdW5lc2NhcGVkU3RyaW5nOiAvXlwiW15cIlxcXFxdK1wiKD89W15cIlxcXFxdKS8sIC8vIG5vbi1lbXB0eSBzdHJpbmcgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzXG4gIF9zaW5nbGVRdW90ZWRTdHJpbmc6IC9eXCJbXlwiXFxcXF0qKD86XFxcXC5bXlwiXFxcXF0qKSpcIig/PVteXCJcXFxcXSl8XidbXidcXFxcXSooPzpcXFxcLlteJ1xcXFxdKikqJyg/PVteJ1xcXFxdKS8sXG4gIF90cmlwbGVRdW90ZWRTdHJpbmc6IC9eXCJcIihcIlteXCJcXFxcXSooPzooPzpcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXSopKlwiKVwiXCJ8XicnKCdbXidcXFxcXSooPzooPzpcXFxcLnwnKD8hJycpKVteJ1xcXFxdKikqJyknJy8sXG4gIF9sYW5nY29kZTogL15AKFthLXpdKyg/Oi1bYS16MC05XSspKikoPz1bXmEtejAtOVxcLV0pL2ksXG4gIF9wcmVmaXg6IC9eKCg/OltBLVphLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopPzooPz1bI1xcczxdKS8sXG4gIF9wcmVmaXhlZDogL14oKD86W0EtWmEtelxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmZmXFx1MDM3MC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl0pKD86XFwuP1tcXC0wLTlBLVpfYS16XFx4YjdcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjAzZlxcdTIwNDBcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl0pKik/OigoPzooPzpbMC06QS1aX2EtelxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmZmXFx1MDM3MC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl18JVswLTlhLWZBLUZdezJ9fFxcXFxbISMtXFwvOz0/XFwtQF9+XSkoPzooPzpbXFwuXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKig/OltcXC0wLTpBLVpfYS16XFx4YjdcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjAzZlxcdTIwNDBcXHUyMDcwLVxcdTIxOGZcXHUyYzAwLVxcdTJmZWZcXHUzMDAxLVxcdWQ3ZmZcXHVmOTAwLVxcdWZkY2ZcXHVmZGYwLVxcdWZmZmRdfFtcXHVkODAwLVxcdWRiN2ZdW1xcdWRjMDAtXFx1ZGZmZl18JVswLTlhLWZBLUZdezJ9fFxcXFxbISMtXFwvOz0/XFwtQF9+XSkpPyk/KSg/OlsgXFx0XSt8KD89XFwuP1ssOyFcXF5cXHMjKClcXFtcXF1cXHtcXH1cIic8XSkpLyxcbiAgX3ZhcmlhYmxlOiAvXlxcPyg/Oig/OltBLVpfYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpbXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopKD89Wy4sOyFcXF5cXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfYmxhbms6IC9eXzooKD86WzAtOUEtWl9hLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopKD86WyBcXHRdK3woPz1cXC4/Wyw7OlxccyMoKVxcW1xcXVxce1xcfVwiJzxdKSkvLFxuICBfbnVtYmVyOiAvXltcXC0rXT8oPzpcXGQrXFwuP1xcZCooW2VFXSg/OltcXC1cXCtdKT9cXGQrKXxcXGQqXFwuP1xcZCspKD89Wy4sOzpcXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfYm9vbGVhbjogL14oPzp0cnVlfGZhbHNlKSg/PVsuLDtcXHMjKClcXFtcXF1cXHtcXH1cIic8XSkvLFxuICBfa2V5d29yZDogL15AW2Etel0rKD89W1xccyM8XSkvaSxcbiAgX3NwYXJxbEtleXdvcmQ6IC9eKD86UFJFRklYfEJBU0V8R1JBUEgpKD89W1xccyM8XSkvaSxcbiAgX3Nob3J0UHJlZGljYXRlczogL15hKD89XFxzK3w8KS8sXG4gIF9uZXdsaW5lOiAvXlsgXFx0XSooPzojW15cXG5cXHJdKik/KD86XFxyXFxufFxcbnxcXHIpWyBcXHRdKi8sXG4gIF9jb21tZW50OiAvIyhbXlxcblxccl0qKS8sXG4gIF93aGl0ZXNwYWNlOiAvXlsgXFx0XSsvLFxuICBfZW5kT2ZGaWxlOiAvXig/OiNbXlxcblxccl0qKT8kLyxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF90b2tlbml6ZVRvRW5kYCB0b2tlbml6ZXMgYXMgZm9yIGFzIHBvc3NpYmxlLCBlbWl0dGluZyB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgX3Rva2VuaXplVG9FbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaywgaW5wdXRGaW5pc2hlZCkge1xuICAgIC8vIENvbnRpbnVlIHBhcnNpbmcgYXMgZmFyIGFzIHBvc3NpYmxlOyB0aGUgbG9vcCB3aWxsIHJldHVybiBldmVudHVhbGx5XG4gICAgdmFyIGlucHV0ID0gdGhpcy5faW5wdXQsIG91dHB1dENvbW1lbnRzID0gdGhpcy5fY29tbWVudHM7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIENvdW50IGFuZCBza2lwIHdoaXRlc3BhY2UgbGluZXNcbiAgICAgIHZhciB3aGl0ZVNwYWNlTWF0Y2gsIGNvbW1lbnQ7XG4gICAgICB3aGlsZSAod2hpdGVTcGFjZU1hdGNoID0gdGhpcy5fbmV3bGluZS5leGVjKGlucHV0KSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGNvbW1lbnRcbiAgICAgICAgaWYgKG91dHB1dENvbW1lbnRzICYmIChjb21tZW50ID0gdGhpcy5fY29tbWVudC5leGVjKHdoaXRlU3BhY2VNYXRjaFswXSkpKVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2NvbW1lbnQnLCB2YWx1ZTogY29tbWVudFsxXSwgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5wdXRcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHIod2hpdGVTcGFjZU1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fbGluZSsrO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlIG9uIGN1cnJlbnQgbGluZVxuICAgICAgaWYgKHdoaXRlU3BhY2VNYXRjaCA9IHRoaXMuX3doaXRlc3BhY2UuZXhlYyhpbnB1dCkpXG4gICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKHdoaXRlU3BhY2VNYXRjaFswXS5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7XG5cbiAgICAgIC8vIFN0b3AgZm9yIG5vdyBpZiB3ZSdyZSBhdCB0aGUgZW5kXG4gICAgICBpZiAodGhpcy5fZW5kT2ZGaWxlLnRlc3QoaW5wdXQpKSB7XG4gICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBmaW5pc2hlZCwgZW1pdCBFT0ZcbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQpIHtcbiAgICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGZpbmFsIGNvbW1lbnRcbiAgICAgICAgICBpZiAob3V0cHV0Q29tbWVudHMgJiYgKGNvbW1lbnQgPSB0aGlzLl9jb21tZW50LmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2NvbW1lbnQnLCB2YWx1ZTogY29tbWVudFsxXSwgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgICBjYWxsYmFjayhpbnB1dCA9IG51bGwsIHsgbGluZTogdGhpcy5fbGluZSwgdHlwZTogJ2VvZicsIHZhbHVlOiAnJywgcHJlZml4OiAnJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWMgdG9rZW4gdHlwZXMgYmFzZWQgb24gdGhlIGZpcnN0IGNoYXJhY3RlclxuICAgICAgdmFyIGxpbmUgPSB0aGlzLl9saW5lLCB0eXBlID0gJycsIHZhbHVlID0gJycsIHByZWZpeCA9ICcnLFxuICAgICAgICAgIGZpcnN0Q2hhciA9IGlucHV0WzBdLCBtYXRjaCA9IG51bGwsIG1hdGNoTGVuZ3RoID0gMCwgdW5lc2NhcGVkLCBpbmNvbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICdeJzpcbiAgICAgICAgLy8gV2UgbmVlZCBhdCBsZWFzdCAzIHRva2VucyBsb29rYWhlYWQgdG8gZGlzdGluZ3Vpc2ggXl48SVJJPiBhbmQgXl5wcmU6Zml4ZWRcbiAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRyeSB0byBtYXRjaCBhIHR5cGVcbiAgICAgICAgZWxzZSBpZiAoaW5wdXRbMV0gPT09ICdeJykge1xuICAgICAgICAgIHRoaXMuX3ByZXZUb2tlblR5cGUgPSAnXl4nO1xuICAgICAgICAgIC8vIE1vdmUgdG8gdHlwZSBJUkkgb3IgcHJlZml4ZWQgbmFtZVxuICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKDIpO1xuICAgICAgICAgIGlmIChpbnB1dFswXSAhPT0gJzwnKSB7XG4gICAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHR5cGUsIGl0IG11c3QgYmUgYSBwYXRoIGV4cHJlc3Npb25cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuX24zTW9kZSkge1xuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSAxO1xuICAgICAgICAgICAgdHlwZSA9ICdeJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGluIGNhc2UgdGhlIHR5cGUgaXMgYW4gSVJJXG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBmdWxsIElSSSB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fdW5lc2NhcGVkSXJpLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBmdWxsIElSSSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9pcmkuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCB8fCBpbGxlZ2FsSXJpQ2hhcnMudGVzdCh1bmVzY2FwZWQpKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSB1bmVzY2FwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBiYWNrd2FyZHMgaW1wbGljYXRpb24gYXJyb3dcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbjNNb2RlICYmIGlucHV0Lmxlbmd0aCA+IDEgJiYgaW5wdXRbMV0gPT09ICc9JylcbiAgICAgICAgICB0eXBlID0gJ2ludmVyc2UnLCBtYXRjaExlbmd0aCA9IDIsIHZhbHVlID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjaW1wbGllcyc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdfJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBibGFuayBub2RlLiBTaW5jZSBpdCBjYW4gY29udGFpbiAoYnV0IG5vdCBlbmQgd2l0aCkgYSBkb3QsXG4gICAgICAgIC8vIHdlIGFsd2F5cyBuZWVkIGEgbm9uLWRvdCBjaGFyYWN0ZXIgYmVmb3JlIGRlY2lkaW5nIGl0IGlzIGEgcHJlZml4ZWQgbmFtZS5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB0cnkgaW5zZXJ0aW5nIGEgc3BhY2UgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuXG4gICAgICAgIGlmICgobWF0Y2ggPSB0aGlzLl9ibGFuay5leGVjKGlucHV0KSkgfHxcbiAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fYmxhbmsuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAnYmxhbmsnLCBwcmVmaXggPSAnXycsIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdcIic6XG4gICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIG5vbi1lbXB0eSBkb3VibGUtcXVvdGVkIGxpdGVyYWwgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3VuZXNjYXBlZFN0cmluZy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhbnkgb3RoZXIgbGl0ZXJhbCB3cmFwcGVkIGluIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlc1xuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHRoaXMuX3NpbmdsZVF1b3RlZFN0cmluZy5leGVjKGlucHV0KSkge1xuICAgICAgICAgIHVuZXNjYXBlZCA9IHRoaXMuX3VuZXNjYXBlKG1hdGNoWzBdKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbGl0ZXJhbCB3cmFwcGVkIGluIHRocmVlIHBhaXJzIG9mIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzXG4gICAgICAgIGVsc2UgaWYgKG1hdGNoID0gdGhpcy5fdHJpcGxlUXVvdGVkU3RyaW5nLmV4ZWMoaW5wdXQpKSB7XG4gICAgICAgICAgdW5lc2NhcGVkID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl07XG4gICAgICAgICAgLy8gQ291bnQgdGhlIG5ld2xpbmVzIGFuZCBhZHZhbmNlIGxpbmUgY291bnRlclxuICAgICAgICAgIHRoaXMuX2xpbmUgKz0gdW5lc2NhcGVkLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdW5lc2NhcGVkID0gdGhpcy5fdW5lc2NhcGUodW5lc2NhcGVkKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICc/JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSB2YXJpYWJsZVxuICAgICAgICBpZiAodGhpcy5fbjNNb2RlICYmIChtYXRjaCA9IHRoaXMuX3ZhcmlhYmxlLmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICB0eXBlID0gJ3ZhcicsIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdAJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBsYW5ndWFnZSBjb2RlXG4gICAgICAgIGlmICh0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnbGl0ZXJhbCcgJiYgKG1hdGNoID0gdGhpcy5fbGFuZ2NvZGUuZXhlYyhpbnB1dCkpKVxuICAgICAgICAgIHR5cGUgPSAnbGFuZ2NvZGUnLCB2YWx1ZSA9IG1hdGNoWzFdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGtleXdvcmRcbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9rZXl3b3JkLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSBtYXRjaFswXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJy4nOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRvdCBhcyBwdW5jdHVhdGlvblxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAxID8gaW5wdXRGaW5pc2hlZCA6IChpbnB1dFsxXSA8ICcwJyB8fCBpbnB1dFsxXSA+ICc5JykpIHtcbiAgICAgICAgICB0eXBlID0gJy4nO1xuICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gbnVtZXJpY2FsIGNhc2UgKGNvdWxkIGJlIGEgZGVjaW1hbCBkb3QpXG5cbiAgICAgIGNhc2UgJzAnOlxuICAgICAgY2FzZSAnMSc6XG4gICAgICBjYXNlICcyJzpcbiAgICAgIGNhc2UgJzMnOlxuICAgICAgY2FzZSAnNCc6XG4gICAgICBjYXNlICc1JzpcbiAgICAgIGNhc2UgJzYnOlxuICAgICAgY2FzZSAnNyc6XG4gICAgICBjYXNlICc4JzpcbiAgICAgIGNhc2UgJzknOlxuICAgICAgY2FzZSAnKyc6XG4gICAgICBjYXNlICctJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBudW1iZXJcbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fbnVtYmVyLmV4ZWMoaW5wdXQpKSB7XG4gICAgICAgICAgdHlwZSA9ICdsaXRlcmFsJztcbiAgICAgICAgICB2YWx1ZSA9ICdcIicgKyBtYXRjaFswXSArICdcIl5eaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjJyArXG4gICAgICAgICAgICAgICAgICAobWF0Y2hbMV0gPyAnZG91YmxlJyA6ICgvXlsrXFwtXT9cXGQrJC8udGVzdChtYXRjaFswXSkgPyAnaW50ZWdlcicgOiAnZGVjaW1hbCcpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQic6XG4gICAgICBjYXNlICdiJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnUCc6XG4gICAgICBjYXNlICdHJzpcbiAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIFNQQVJRTC1zdHlsZSBrZXl3b3JkXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3NwYXJxbEtleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZic6XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgYm9vbGVhblxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl9ib29sZWFuLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gJ1wiJyArIG1hdGNoWzBdICsgJ1wiXl5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYW4gYWJicmV2aWF0ZWQgcHJlZGljYXRlXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3Nob3J0UHJlZGljYXRlcy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2FiYnJldmlhdGlvbicsIHZhbHVlID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYW4gaW1wbGljYXRpb24gYXJyb3cgb3IgZXF1YWxzIHNpZ25cbiAgICAgICAgaWYgKHRoaXMuX24zTW9kZSAmJiBpbnB1dC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHlwZSA9ICdhYmJyZXZpYXRpb24nO1xuICAgICAgICAgIGlmIChpbnB1dFsxXSAhPT0gJz4nKVxuICAgICAgICAgICAgbWF0Y2hMZW5ndGggPSAxLCB2YWx1ZSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNzYW1lQXMnO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMiwgdmFsdWUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL2xvZyNpbXBsaWVzJztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnISc6XG4gICAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLCc6XG4gICAgICBjYXNlICc7JzpcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXSc6XG4gICAgICBjYXNlICcoJzpcbiAgICAgIGNhc2UgJyknOlxuICAgICAgY2FzZSAneyc6XG4gICAgICBjYXNlICd9JzpcbiAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgcHVuY3R1YXRpb25cbiAgICAgICAgbWF0Y2hMZW5ndGggPSAxO1xuICAgICAgICB0eXBlID0gZmlyc3RDaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5jb25jbHVzaXZlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU29tZSBmaXJzdCBjaGFyYWN0ZXJzIGRvIG5vdCBhbGxvdyBhbiBpbW1lZGlhdGUgZGVjaXNpb24sIHNvIGluc3BlY3QgbW9yZVxuICAgICAgaWYgKGluY29uY2x1c2l2ZSkge1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeFxuICAgICAgICBpZiAoKHRoaXMuX3ByZXZUb2tlblR5cGUgPT09ICdAcHJlZml4JyB8fCB0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnUFJFRklYJykgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHRoaXMuX3ByZWZpeC5leGVjKGlucHV0KSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXgnLCB2YWx1ZSA9IG1hdGNoWzFdIHx8ICcnO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeGVkIG5hbWUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAncHJlZml4ZWQnLCBwcmVmaXggPSBtYXRjaFsxXSB8fCAnJywgdmFsdWUgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHlwZSB0b2tlbiBpcyBzcGVjaWFsOiBpdCBjYW4gb25seSBiZSBlbWl0dGVkIGFmdGVyIGFuIElSSSBvciBwcmVmaXhlZCBuYW1lIGlzIHJlYWRcbiAgICAgIGlmICh0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnXl4nKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdwcmVmaXhlZCc6IHR5cGUgPSAndHlwZSc7ICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdJUkknOiAgICAgIHR5cGUgPSAndHlwZUlSSSc7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgIHR5cGUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXaGF0IGlmIG5vdGhpbmcgb2YgdGhlIGFib3ZlIHdhcyBmb3VuZD9cbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyBXZSBjb3VsZCBiZSBpbiBzdHJlYW1pbmcgbW9kZSwgYW5kIHRoZW4gd2UganVzdCB3YWl0IGZvciBtb3JlIGlucHV0IHRvIGFycml2ZS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhIHN5bnRheCBlcnJvciBoYXMgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxuICAgICAgICAvLyBPbmUgZXhjZXB0aW9uOiBlcnJvciBvbiBhbiB1bmFjY291bnRlZCBsaW5lYnJlYWsgKD0gbm90IGluc2lkZSBhIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbCkuXG4gICAgICAgIGlmIChpbnB1dEZpbmlzaGVkIHx8ICghL14nJyd8XlwiXCJcIi8udGVzdChpbnB1dCkgJiYgL1xcbnxcXHIvLnRlc3QoaW5wdXQpKSlcbiAgICAgICAgICByZXR1cm4gcmVwb3J0U3ludGF4RXJyb3IodGhpcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQgPSBpbnB1dDtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCB0aGUgcGFyc2VkIHRva2VuXG4gICAgICBjYWxsYmFjayhudWxsLCB7IGxpbmU6IGxpbmUsIHR5cGU6IHR5cGUsIHZhbHVlOiB2YWx1ZSwgcHJlZml4OiBwcmVmaXggfSk7XG4gICAgICB0aGlzLl9wcmV2VG9rZW5UeXBlID0gdHlwZTtcblxuICAgICAgLy8gQWR2YW5jZSB0byBuZXh0IHBhcnQgdG8gdG9rZW5pemVcbiAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyKG1hdGNoTGVuZ3RoIHx8IG1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBTaWduYWxzIHRoZSBzeW50YXggZXJyb3IgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgICBmdW5jdGlvbiByZXBvcnRTeW50YXhFcnJvcihzZWxmKSB7IGNhbGxiYWNrKHNlbGYuX3N5bnRheEVycm9yKC9eXFxTKi8uZXhlYyhpbnB1dClbMF0pKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3VuZXNjYXBlYCByZXBsYWNlcyBOMyBlc2NhcGUgY29kZXMgYnkgdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzXG4gIF91bmVzY2FwZTogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGl0ZW0ucmVwbGFjZShlc2NhcGVTZXF1ZW5jZSwgZnVuY3Rpb24gKHNlcXVlbmNlLCB1bmljb2RlNCwgdW5pY29kZTgsIGVzY2FwZWRDaGFyKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZTtcbiAgICAgICAgaWYgKHVuaWNvZGU0KSB7XG4gICAgICAgICAgY2hhckNvZGUgPSBwYXJzZUludCh1bmljb2RlNCwgMTYpO1xuICAgICAgICAgIGlmIChpc05hTihjaGFyQ29kZSkpIHRocm93IG5ldyBFcnJvcigpOyAvLyBjYW4gbmV2ZXIgaGFwcGVuIChyZWdleCksIGJ1dCBoZWxwcyBwZXJmb3JtYW5jZVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaWNvZGU4KSB7XG4gICAgICAgICAgY2hhckNvZGUgPSBwYXJzZUludCh1bmljb2RlOCwgMTYpO1xuICAgICAgICAgIGlmIChpc05hTihjaGFyQ29kZSkpIHRocm93IG5ldyBFcnJvcigpOyAvLyBjYW4gbmV2ZXIgaGFwcGVuIChyZWdleCksIGJ1dCBoZWxwcyBwZXJmb3JtYW5jZVxuICAgICAgICAgIGlmIChjaGFyQ29kZSA8PSAweEZGRkYpIHJldHVybiBmcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoMHhEODAwICsgKChjaGFyQ29kZSAtPSAweDEwMDAwKSAvIDB4NDAwKSwgMHhEQzAwICsgKGNoYXJDb2RlICYgMHgzRkYpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlc2NhcGVSZXBsYWNlbWVudHNbZXNjYXBlZENoYXJdO1xuICAgICAgICAgIGlmICghcmVwbGFjZW1lbnQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgcmV0dXJuIG51bGw7IH1cbiAgfSxcblxuICAvLyAjIyMgYF9zeW50YXhFcnJvcmAgY3JlYXRlcyBhIHN5bnRheCBlcnJvciBmb3IgdGhlIGdpdmVuIGlzc3VlXG4gIF9zeW50YXhFcnJvcjogZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgXCInICsgaXNzdWUgKyAnXCIgb24gbGluZSAnICsgdGhpcy5fbGluZSArICcuJyk7XG4gIH0sXG5cblxuICAvLyAjIyBQdWJsaWMgbWV0aG9kc1xuXG4gIC8vICMjIyBgdG9rZW5pemVgIHN0YXJ0cyB0aGUgdHJhbnNmb3JtYXRpb24gb2YgYW4gTjMgZG9jdW1lbnQgaW50byBhbiBhcnJheSBvZiB0b2tlbnMuXG4gIC8vIFRoZSBpbnB1dCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBzdHJlYW0uXG4gIHRva2VuaXplOiBmdW5jdGlvbiAoaW5wdXQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2xpbmUgPSAxO1xuXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgc3RyaW5nLCBjb250aW51b3VzbHkgZW1pdCB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2sgdW50aWwgdGhlIGVuZFxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgLy8gSWYgYSBjYWxsYmFjayB3YXMgcGFzc2VkLCBhc3luY2hyb25vdXNseSBjYWxsIGl0XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBpbW1lZGlhdGVseShmdW5jdGlvbiAoKSB7IHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpOyB9KTtcbiAgICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBwYXNzZWQsIHRva2VuaXplIHN5bmNocm9ub3VzbHkgYW5kIHJldHVyblxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSBbXSwgZXJyb3I7XG4gICAgICAgIHRoaXMuX3Rva2VuaXplVG9FbmQoZnVuY3Rpb24gKGUsIHQpIHsgZSA/IChlcnJvciA9IGUpIDogdG9rZW5zLnB1c2godCk7IH0sIHRydWUpO1xuICAgICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHRoZSBpbnB1dCBtdXN0IGJlIGEgc3RyZWFtXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dCA9ICcnO1xuICAgICAgaWYgKHR5cGVvZiBpbnB1dC5zZXRFbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgaW5wdXQuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcbiAgICAgIC8vIEFkZHMgdGhlIGRhdGEgY2h1bmsgdG8gdGhlIGJ1ZmZlciBhbmQgcGFyc2VzIGFzIGZhciBhcyBwb3NzaWJsZVxuICAgICAgaW5wdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoc2VsZi5faW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLl9pbnB1dCArPSBkYXRhO1xuICAgICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQYXJzZXMgdW50aWwgdGhlIGVuZFxuICAgICAgaW5wdXQub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHNlbGYuX2lucHV0ICE9PSBudWxsKVxuICAgICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM0xleGVyO1xuIiwiLy8gKipOM1BhcnNlcioqIHBhcnNlcyBOMyBkb2N1bWVudHMuXG52YXIgTjNMZXhlciA9IHJlcXVpcmUoJy4vTjNMZXhlcicpO1xuXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfTklMICAgID0gUkRGX1BSRUZJWCArICduaWwnLFxuICAgIFJERl9GSVJTVCAgPSBSREZfUFJFRklYICsgJ2ZpcnN0JyxcbiAgICBSREZfUkVTVCAgID0gUkRGX1BSRUZJWCArICdyZXN0JztcblxudmFyIFFVQU5USUZJRVJTX0dSQVBIID0gJ3VybjpuMzpxdWFudGlmaWVycyc7XG5cbnZhciBhYnNvbHV0ZUlSSSA9IC9eW2Etel1bYS16MC05Ky4tXSo6L2ksXG4gICAgc2NoZW1lQXV0aG9yaXR5ID0gL14oPzooW2Etel1bYS16MC05Ky4tXSo6KSk/KD86XFwvXFwvW15cXC9dKik/L2ksXG4gICAgZG90U2VnbWVudHMgPSAvKD86XnxcXC8pXFwuXFwuPyg/OiR8W1xcLyM/XSkvO1xuXG4vLyBUaGUgbmV4dCBJRCBmb3IgbmV3IGJsYW5rIG5vZGVzXG52YXIgYmxhbmtOb2RlUHJlZml4ID0gMCwgYmxhbmtOb2RlQ291bnQgPSAwO1xuXG4vLyAjIyBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gTjNQYXJzZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNQYXJzZXIpKVxuICAgIHJldHVybiBuZXcgTjNQYXJzZXIob3B0aW9ucyk7XG4gIHRoaXMuX2NvbnRleHRTdGFjayA9IFtdO1xuICB0aGlzLl9ncmFwaCA9IG51bGw7XG5cbiAgLy8gU2V0IHRoZSBkb2N1bWVudCBJUklcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMuX3NldEJhc2Uob3B0aW9ucy5kb2N1bWVudElSSSk7XG5cbiAgLy8gU2V0IHN1cHBvcnRlZCBmZWF0dXJlcyBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdFxuICB2YXIgZm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3N0cmluZycpID9cbiAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0Lm1hdGNoKC9cXHcqJC8pWzBdLnRvTG93ZXJDYXNlKCkgOiAnJyxcbiAgICAgIGlzVHVydGxlID0gZm9ybWF0ID09PSAndHVydGxlJywgaXNUcmlHID0gZm9ybWF0ID09PSAndHJpZycsXG4gICAgICBpc05UcmlwbGVzID0gL3RyaXBsZS8udGVzdChmb3JtYXQpLCBpc05RdWFkcyA9IC9xdWFkLy50ZXN0KGZvcm1hdCksXG4gICAgICBpc04zID0gdGhpcy5fbjNNb2RlID0gL24zLy50ZXN0KGZvcm1hdCksXG4gICAgICBpc0xpbmVNb2RlID0gaXNOVHJpcGxlcyB8fCBpc05RdWFkcztcbiAgaWYgKCEodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocyA9ICEoaXNUdXJ0bGUgfHwgaXNOMykpKVxuICAgIHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGggPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICB0aGlzLl9zdXBwb3J0c1F1YWRzID0gIShpc1R1cnRsZSB8fCBpc1RyaUcgfHwgaXNOVHJpcGxlcyB8fCBpc04zKTtcbiAgLy8gRGlzYWJsZSByZWxhdGl2ZSBJUklzIGluIE4tVHJpcGxlcyBvciBOLVF1YWRzIG1vZGVcbiAgaWYgKGlzTGluZU1vZGUpIHtcbiAgICB0aGlzLl9iYXNlID0gJyc7XG4gICAgdGhpcy5fcmVzb2x2ZUlSSSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgdGhpcy5fZXJyb3IoJ0Rpc2FsbG93ZWQgcmVsYXRpdmUgSVJJJywgdG9rZW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrID0gbm9vcCwgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgfTtcbiAgfVxuICB0aGlzLl9ibGFua05vZGVQcmVmaXggPSB0eXBlb2Ygb3B0aW9ucy5ibGFua05vZGVQcmVmaXggIT09ICdzdHJpbmcnID8gJycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfOicgKyBvcHRpb25zLmJsYW5rTm9kZVByZWZpeC5yZXBsYWNlKC9eXzovLCAnJyk7XG4gIHRoaXMuX2xleGVyID0gb3B0aW9ucy5sZXhlciB8fCBuZXcgTjNMZXhlcih7IGxpbmVNb2RlOiBpc0xpbmVNb2RlLCBuMzogaXNOMyB9KTtcbiAgLy8gRGlzYWJsZSBleHBsaWNpdCBxdWFudGlmaWVycyBieSBkZWZhdWx0XG4gIHRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMgPSAhIW9wdGlvbnMuZXhwbGljaXRRdWFudGlmaWVycztcbn1cblxuLy8gIyMgUHJpdmF0ZSBjbGFzcyBtZXRob2RzXG5cbi8vICMjIyBgX3Jlc2V0QmxhbmtOb2RlSWRzYCByZXN0YXJ0cyBibGFuayBub2RlIGlkZW50aWZpY2F0aW9uXG5OM1BhcnNlci5fcmVzZXRCbGFua05vZGVJZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGJsYW5rTm9kZVByZWZpeCA9IGJsYW5rTm9kZUNvdW50ID0gMDtcbn07XG5cbk4zUGFyc2VyLnByb3RvdHlwZSA9IHtcbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfc2V0QmFzZWAgc2V0cyB0aGUgYmFzZSBJUkkgdG8gcmVzb2x2ZSByZWxhdGl2ZSBJUklzXG4gIF9zZXRCYXNlOiBmdW5jdGlvbiAoYmFzZUlSSSkge1xuICAgIGlmICghYmFzZUlSSSlcbiAgICAgIHRoaXMuX2Jhc2UgPSBudWxsO1xuICAgIGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIGZyYWdtZW50IGlmIHByZXNlbnRcbiAgICAgIHZhciBmcmFnbWVudFBvcyA9IGJhc2VJUkkuaW5kZXhPZignIycpO1xuICAgICAgaWYgKGZyYWdtZW50UG9zID49IDApXG4gICAgICAgIGJhc2VJUkkgPSBiYXNlSVJJLnN1YnN0cigwLCBmcmFnbWVudFBvcyk7XG4gICAgICAvLyBTZXQgYmFzZSBJUkkgYW5kIGl0cyBjb21wb25lbnRzXG4gICAgICB0aGlzLl9iYXNlID0gYmFzZUlSSTtcbiAgICAgIHRoaXMuX2Jhc2VQYXRoICAgPSBiYXNlSVJJLmluZGV4T2YoJy8nKSA8IDAgPyBiYXNlSVJJIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlSVJJLnJlcGxhY2UoL1teXFwvP10qKD86XFw/LiopPyQvLCAnJyk7XG4gICAgICBiYXNlSVJJID0gYmFzZUlSSS5tYXRjaChzY2hlbWVBdXRob3JpdHkpO1xuICAgICAgdGhpcy5fYmFzZVJvb3QgICA9IGJhc2VJUklbMF07XG4gICAgICB0aGlzLl9iYXNlU2NoZW1lID0gYmFzZUlSSVsxXTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfc2F2ZUNvbnRleHRgIHN0b3JlcyB0aGUgY3VycmVudCBwYXJzaW5nIGNvbnRleHRcbiAgLy8gd2hlbiBlbnRlcmluZyBhIG5ldyBzY29wZSAobGlzdCwgYmxhbmsgbm9kZSwgZm9ybXVsYSlcbiAgX3NhdmVDb250ZXh0OiBmdW5jdGlvbiAodHlwZSwgZ3JhcGgsIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIG4zTW9kZSA9IHRoaXMuX24zTW9kZTtcbiAgICB0aGlzLl9jb250ZXh0U3RhY2sucHVzaCh7XG4gICAgICBzdWJqZWN0OiBzdWJqZWN0LCBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QsXG4gICAgICBncmFwaDogZ3JhcGgsIHR5cGU6IHR5cGUsXG4gICAgICBpbnZlcnNlOiBuM01vZGUgPyB0aGlzLl9pbnZlcnNlUHJlZGljYXRlIDogZmFsc2UsXG4gICAgICBibGFua1ByZWZpeDogbjNNb2RlID8gdGhpcy5fcHJlZml4ZXMuXyA6ICcnLFxuICAgICAgcXVhbnRpZmllZDogbjNNb2RlID8gdGhpcy5fcXVhbnRpZmllZCA6IG51bGwsXG4gICAgfSk7XG4gICAgLy8gVGhlIHNldHRpbmdzIGJlbG93IG9ubHkgYXBwbHkgdG8gTjMgc3RyZWFtc1xuICAgIGlmIChuM01vZGUpIHtcbiAgICAgIC8vIEV2ZXJ5IG5ldyBzY29wZSByZXNldHMgdGhlIHByZWRpY2F0ZSBkaXJlY3Rpb25cbiAgICAgIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICAgIC8vIEluIE4zLCBibGFuayBub2RlcyBhcmUgc2NvcGVkIHRvIGEgZm9ybXVsYVxuICAgICAgLy8gKHVzaW5nIGEgZG90IGFzIHNlcGFyYXRvciwgYXMgYSBibGFuayBub2RlIGxhYmVsIGNhbm5vdCBzdGFydCB3aXRoIGl0KVxuICAgICAgdGhpcy5fcHJlZml4ZXMuXyA9IHRoaXMuX2dyYXBoICsgJy4nO1xuICAgICAgLy8gUXVhbnRpZmllcnMgYXJlIHNjb3BlZCB0byBhIGZvcm11bGFcbiAgICAgIHRoaXMuX3F1YW50aWZpZWQgPSBPYmplY3QuY3JlYXRlKHRoaXMuX3F1YW50aWZpZWQpO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZXN0b3JlQ29udGV4dGAgcmVzdG9yZXMgdGhlIHBhcmVudCBjb250ZXh0XG4gIC8vIHdoZW4gbGVhdmluZyBhIHNjb3BlIChsaXN0LCBibGFuayBub2RlLCBmb3JtdWxhKVxuICBfcmVzdG9yZUNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX2NvbnRleHRTdGFjay5wb3AoKSwgbjNNb2RlID0gdGhpcy5fbjNNb2RlO1xuICAgIHRoaXMuX3N1YmplY3QgICA9IGNvbnRleHQuc3ViamVjdDtcbiAgICB0aGlzLl9wcmVkaWNhdGUgPSBjb250ZXh0LnByZWRpY2F0ZTtcbiAgICB0aGlzLl9vYmplY3QgICAgPSBjb250ZXh0Lm9iamVjdDtcbiAgICB0aGlzLl9ncmFwaCAgICAgPSBjb250ZXh0LmdyYXBoO1xuICAgIC8vIFRoZSBzZXR0aW5ncyBiZWxvdyBvbmx5IGFwcGx5IHRvIE4zIHN0cmVhbXNcbiAgICBpZiAobjNNb2RlKSB7XG4gICAgICB0aGlzLl9pbnZlcnNlUHJlZGljYXRlID0gY29udGV4dC5pbnZlcnNlO1xuICAgICAgdGhpcy5fcHJlZml4ZXMuXyA9IGNvbnRleHQuYmxhbmtQcmVmaXg7XG4gICAgICB0aGlzLl9xdWFudGlmaWVkID0gY29udGV4dC5xdWFudGlmaWVkO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkSW5Ub3BDb250ZXh0YCByZWFkcyBhIHRva2VuIHdoZW4gaW4gdGhlIHRvcCBjb250ZXh0XG4gIF9yZWFkSW5Ub3BDb250ZXh0OiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBJZiBhbiBFT0YgdG9rZW4gYXJyaXZlcyBpbiB0aGUgdG9wIGNvbnRleHQsIHNpZ25hbCB0aGF0IHdlJ3JlIGRvbmVcbiAgICBjYXNlICdlb2YnOlxuICAgICAgaWYgKHRoaXMuX2dyYXBoICE9PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuY2xvc2VkIGdyYXBoJywgdG9rZW4pO1xuICAgICAgZGVsZXRlIHRoaXMuX3ByZWZpeGVzLl87XG4gICAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2sobnVsbCwgbnVsbCwgdGhpcy5fcHJlZml4ZXMpO1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgcHJlZml4IGRlY2xhcmF0aW9uXG4gICAgY2FzZSAnUFJFRklYJzpcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gdHJ1ZTtcbiAgICBjYXNlICdAcHJlZml4JzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4O1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgYmFzZSBkZWNsYXJhdGlvblxuICAgIGNhc2UgJ0JBU0UnOlxuICAgICAgdGhpcy5fc3BhcnFsU3R5bGUgPSB0cnVlO1xuICAgIGNhc2UgJ0BiYXNlJzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmFzZUlSSTtcbiAgICAvLyBJdCBjb3VsZCBiZSBhIGdyYXBoXG4gICAgY2FzZSAneyc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocykge1xuICAgICAgICB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgICAgfVxuICAgIGNhc2UgJ0dSQVBIJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c05hbWVkR3JhcGhzKVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhMYWJlbDtcbiAgICAvLyBPdGhlcndpc2UsIHRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBzdWJqZWN0XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdCh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRFbnRpdHlgIHJlYWRzIGFuIElSSSwgcHJlZml4ZWQgbmFtZSwgYmxhbmsgbm9kZSwgb3IgdmFyaWFibGVcbiAgX3JlYWRFbnRpdHk6IGZ1bmN0aW9uICh0b2tlbiwgcXVhbnRpZmllcikge1xuICAgIHZhciB2YWx1ZTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBSZWFkIGEgcmVsYXRpdmUgb3IgYWJzb2x1dGUgSVJJXG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICd0eXBlSVJJJzpcbiAgICAgIHZhbHVlID0gKHRoaXMuX2Jhc2UgPT09IG51bGwgfHwgYWJzb2x1dGVJUkkudGVzdCh0b2tlbi52YWx1ZSkpID9cbiAgICAgICAgICAgICAgdG9rZW4udmFsdWUgOiB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFJlYWQgYSBibGFuayBub2RlIG9yIHByZWZpeGVkIG5hbWVcbiAgICBjYXNlICd0eXBlJzpcbiAgICBjYXNlICdibGFuayc6XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgdmFsdWUgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFJlYWQgYSB2YXJpYWJsZVxuICAgIGNhc2UgJ3Zhcic6XG4gICAgICByZXR1cm4gdG9rZW4udmFsdWU7XG4gICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIG5vdCBhbiBlbnRpdHlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBlbnRpdHkgYnV0IGdvdCAnICsgdG9rZW4udHlwZSwgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBJbiBOMyBtb2RlLCByZXBsYWNlIHRoZSBlbnRpdHkgaWYgaXQgaXMgcXVhbnRpZmllZFxuICAgIGlmICghcXVhbnRpZmllciAmJiB0aGlzLl9uM01vZGUgJiYgKHZhbHVlIGluIHRoaXMuX3F1YW50aWZpZWQpKVxuICAgICAgdmFsdWUgPSB0aGlzLl9xdWFudGlmaWVkW3ZhbHVlXTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFN1YmplY3RgIHJlYWRzIGEgdHJpcGxlJ3Mgc3ViamVjdFxuICBfcmVhZFN1YmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFydCBhIG5ldyB0cmlwbGUgd2l0aCBhIG5ldyBibGFuayBub2RlIGFzIHN1YmplY3RcbiAgICAgIHRoaXMuX3NhdmVDb250ZXh0KCdibGFuaycsIHRoaXMuX2dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKywgbnVsbCwgbnVsbCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgY2FzZSAnKCc6XG4gICAgICAvLyBTdGFydCBhIG5ldyBsaXN0XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnbGlzdCcsIHRoaXMuX2dyYXBoLCBSREZfTklMLCBudWxsLCBudWxsKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICd7JzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGZvcm11bGFcbiAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnZm9ybXVsYScsIHRoaXMuX2dyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JhcGggPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyssIG51bGwsIG51bGwpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgIGNhc2UgJ30nOlxuICAgICAgIC8vIE5vIHN1YmplY3Q7IHRoZSBncmFwaCBpbiB3aGljaCB3ZSBhcmUgcmVhZGluZyBpcyBjbG9zZWQgaW5zdGVhZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnQGZvclNvbWUnOlxuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL3JlaWZ5I2ZvclNvbWUnO1xuICAgICAgdGhpcy5fcXVhbnRpZmllZFByZWZpeCA9ICdfOmInO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICBjYXNlICdAZm9yQWxsJzpcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgdGhpcy5fcHJlZGljYXRlID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9yZWlmeSNmb3JBbGwnO1xuICAgICAgdGhpcy5fcXVhbnRpZmllZFByZWZpeCA9ICc/Yi0nO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUmVhZCB0aGUgc3ViamVjdCBlbnRpdHlcbiAgICAgIGlmICgodGhpcy5fc3ViamVjdCA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgICAvLyBJbiBOMyBtb2RlLCB0aGUgc3ViamVjdCBtaWdodCBiZSBhIHBhdGhcbiAgICAgIGlmICh0aGlzLl9uM01vZGUpXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQYXRoUmVhZGVyKHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBwcmVkaWNhdGUsXG4gICAgLy8gb3IsIGlmIHRoZSBzdWJqZWN0IHdhcyBhY3R1YWxseSBhIGdyYXBoIElSSSwgYSBuYW1lZCBncmFwaFxuICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVkaWNhdGVgIHJlYWRzIGEgdHJpcGxlJ3MgcHJlZGljYXRlXG4gIF9yZWFkUHJlZGljYXRlOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgdHlwZSA9IHRva2VuLnR5cGU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnaW52ZXJzZSc6XG4gICAgICB0aGlzLl9pbnZlcnNlUHJlZGljYXRlID0gdHJ1ZTtcbiAgICBjYXNlICdhYmJyZXZpYXRpb24nOlxuICAgICAgdGhpcy5fcHJlZGljYXRlID0gdG9rZW4udmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcuJzpcbiAgICBjYXNlICddJzpcbiAgICBjYXNlICd9JzpcbiAgICAgIC8vIEV4cGVjdGVkIHByZWRpY2F0ZSBkaWRuJ3QgY29tZSwgbXVzdCBoYXZlIGJlZW4gdHJhaWxpbmcgc2VtaWNvbG9uXG4gICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHR5cGUsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICddJyA/IHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKSA6IHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnOyc6XG4gICAgICAvLyBFeHRyYSBzZW1pY29sb25zIGNhbiBiZSBzYWZlbHkgaWdub3JlZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgaWYgKCF0aGlzLl9uM01vZGUpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRGlzYWxsb3dlZCBibGFuayBub2RlIGFzIHByZWRpY2F0ZScsIHRva2VuKTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKCh0aGlzLl9wcmVkaWNhdGUgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKSkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBtdXN0IGJlIGFuIG9iamVjdFxuICAgIHJldHVybiB0aGlzLl9yZWFkT2JqZWN0O1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRPYmplY3RgIHJlYWRzIGEgdHJpcGxlJ3Mgb2JqZWN0XG4gIF9yZWFkT2JqZWN0OiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdsaXRlcmFsJzpcbiAgICAgIHRoaXMuX29iamVjdCA9IHRva2VuLnZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWREYXRhVHlwZU9yTGFuZztcbiAgICBjYXNlICdbJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IHRyaXBsZSB3aXRoIGEgbmV3IGJsYW5rIG5vZGUgYXMgc3ViamVjdFxuICAgICAgdGhpcy5fc2F2ZUNvbnRleHQoJ2JsYW5rJywgdGhpcy5fZ3JhcGgsIHRoaXMuX3N1YmplY3QsIHRoaXMuX3ByZWRpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyspO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVIZWFkO1xuICAgIGNhc2UgJygnOlxuICAgICAgLy8gU3RhcnQgYSBuZXcgbGlzdFxuICAgICAgdGhpcy5fc2F2ZUNvbnRleHQoJ2xpc3QnLCB0aGlzLl9ncmFwaCwgdGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCBSREZfTklMKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICd7JzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGZvcm11bGFcbiAgICAgIGlmICghdGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnZm9ybXVsYScsIHRoaXMuX2dyYXBoLCB0aGlzLl9zdWJqZWN0LCB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncmFwaCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKyk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3Q7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFJlYWQgdGhlIG9iamVjdCBlbnRpdHlcbiAgICAgIGlmICgodGhpcy5fb2JqZWN0ID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbikpID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIC8vIEluIE4zIG1vZGUsIHRoZSBvYmplY3QgbWlnaHQgYmUgYSBwYXRoXG4gICAgICBpZiAodGhpcy5fbjNNb2RlKVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UGF0aFJlYWRlcih0aGlzLl9nZXRDb250ZXh0RW5kUmVhZGVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGhgIHJlYWRzIGEgdHJpcGxlJ3MgcHJlZGljYXRlLCBvciBhIG5hbWVkIGdyYXBoXG4gIF9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4udHlwZSA9PT0gJ3snID8gdGhpcy5fcmVhZEdyYXBoKHRva2VuKSA6IHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRHcmFwaGAgcmVhZHMgYSBncmFwaFxuICBfcmVhZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3snKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBncmFwaCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgLy8gVGhlIFwic3ViamVjdFwiIHdlIHJlYWQgaXMgYWN0dWFsbHkgdGhlIEdSQVBIJ3MgbGFiZWxcbiAgICB0aGlzLl9ncmFwaCA9IHRoaXMuX3N1YmplY3QsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlSGVhZGAgcmVhZHMgdGhlIGhlYWQgb2YgYSBibGFuayBub2RlXG4gIF9yZWFkQmxhbmtOb2RlSGVhZDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICddJykge1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZVRhaWwodG9rZW4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFByZWRpY2F0ZSh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRCbGFua05vZGVUYWlsYCByZWFkcyB0aGUgZW5kIG9mIGEgYmxhbmsgbm9kZVxuICBfcmVhZEJsYW5rTm9kZVRhaWw6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlICE9PSAnXScpXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uKHRva2VuKTtcblxuICAgIC8vIFN0b3JlIGJsYW5rIG5vZGUgdHJpcGxlXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcblxuICAgIC8vIFJlc3RvcmUgdGhlIHBhcmVudCBjb250ZXh0IGNvbnRhaW5pbmcgdGhpcyBibGFuayBub2RlXG4gICAgdmFyIGVtcHR5ID0gdGhpcy5fcHJlZGljYXRlID09PSBudWxsO1xuICAgIHRoaXMuX3Jlc3RvcmVDb250ZXh0KCk7XG4gICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIHRoZSBzdWJqZWN0LCBjb250aW51ZSByZWFkaW5nIHRoZSBwcmVkaWNhdGVcbiAgICBpZiAodGhpcy5fb2JqZWN0ID09PSBudWxsKVxuICAgICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIGVtcHR5LCBpdCBjb3VsZCBiZSBhIG5hbWVkIGdyYXBoIGxhYmVsXG4gICAgICByZXR1cm4gZW1wdHkgPyB0aGlzLl9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoIDogdGhpcy5fcmVhZFByZWRpY2F0ZUFmdGVyQmxhbms7XG4gICAgLy8gSWYgdGhlIGJsYW5rIG5vZGUgd2FzIHRoZSBvYmplY3QsIHJlc3RvcmUgcHJldmlvdXMgY29udGV4dCBhbmQgcmVhZCBwdW5jdHVhdGlvblxuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDb250ZXh0RW5kUmVhZGVyKCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWRpY2F0ZUFmdGVyQmxhbmtgIHJlYWRzIGEgcHJlZGljYXRlIGFmdGVyIGFuIGFub255bW91cyBibGFuayBub2RlXG4gIF9yZWFkUHJlZGljYXRlQWZ0ZXJCbGFuazogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgLy8gSWYgYSBkb3QgZm9sbG93cyBhIGJsYW5rIG5vZGUgaW4gdG9wIGNvbnRleHQsIHRoZXJlIGlzIG5vIHByZWRpY2F0ZVxuICAgIGlmICh0b2tlbi50eXBlID09PSAnLicgJiYgIXRoaXMuX2NvbnRleHRTdGFjay5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsOyAvLyBjYW5jZWwgdGhlIGN1cnJlbnQgdHJpcGxlXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFB1bmN0dWF0aW9uKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRMaXN0SXRlbWAgcmVhZHMgaXRlbXMgZnJvbSBhIGxpc3RcbiAgX3JlYWRMaXN0SXRlbTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGl0ZW0gPSBudWxsLCAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaXRlbSBvZiB0aGUgbGlzdFxuICAgICAgICBsaXN0ID0gbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3QgaXRzZWxmXG4gICAgICAgIHByZXZMaXN0ID0gdGhpcy5fc3ViamVjdCwgICAgICAgICAvLyBUaGUgcHJldmlvdXMgbGlzdCB0aGF0IGNvbnRhaW5zIHRoaXMgbGlzdFxuICAgICAgICBzdGFjayA9IHRoaXMuX2NvbnRleHRTdGFjaywgICAgICAgLy8gVGhlIHN0YWNrIG9mIHBhcmVudCBjb250ZXh0c1xuICAgICAgICBwYXJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSwgLy8gVGhlIHBhcmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3RcbiAgICAgICAgbmV4dCA9IHRoaXMuX3JlYWRMaXN0SXRlbSwgICAgICAgIC8vIFRoZSBuZXh0IGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICAgICAgaXRlbUNvbXBsZXRlID0gdHJ1ZTsgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIGl0ZW0gaGFzIGJlZW4gcmVhZCBmdWxseVxuXG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFjayB0aGUgY3VycmVudCBsaXN0IHRyaXBsZSBhbmQgc3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBibGFuayBub2RlIGFzIHN1YmplY3RcbiAgICAgIHRoaXMuX3NhdmVDb250ZXh0KCdibGFuaycsIHRoaXMuX2dyYXBoLCBsaXN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgUkRGX0ZJUlNULCB0aGlzLl9zdWJqZWN0ID0gaXRlbSA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKyk7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YWNrIHRoZSBjdXJyZW50IGxpc3QgdHJpcGxlIGFuZCBzdGFydCBhIG5ldyBsaXN0XG4gICAgICB0aGlzLl9zYXZlQ29udGV4dCgnbGlzdCcsIHRoaXMuX2dyYXBoLCBsaXN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgUkRGX0ZJUlNULCBSREZfTklMKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnKSc6XG4gICAgICAvLyBDbG9zaW5nIHRoZSBsaXN0OyByZXN0b3JlIHRoZSBwYXJlbnQgY29udGV4dFxuICAgICAgdGhpcy5fcmVzdG9yZUNvbnRleHQoKTtcbiAgICAgIC8vIElmIHRoaXMgbGlzdCBpcyBjb250YWluZWQgd2l0aGluIGEgcGFyZW50IGxpc3QsIHJldHVybiB0aGUgbWVtYmVyc2hpcCB0cmlwbGUgaGVyZS5cbiAgICAgIC8vIFRoaXMgd2lsbCBiZSBgPHBhcmVudCBsaXN0IGVsZW1lbnQ+IHJkZjpmaXJzdCA8dGhpcyBsaXN0Pi5gLlxuICAgICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gMCAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXS50eXBlID09PSAnbGlzdCcpXG4gICAgICAgIHRoaXMuX3RyaXBsZSh0aGlzLl9zdWJqZWN0LCB0aGlzLl9wcmVkaWNhdGUsIHRoaXMuX29iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgICAgLy8gV2FzIHRoaXMgbGlzdCB0aGUgcGFyZW50J3Mgc3ViamVjdD9cbiAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgdGhlIHByZWRpY2F0ZVxuICAgICAgICBuZXh0ID0gdGhpcy5fcmVhZFByZWRpY2F0ZTtcbiAgICAgICAgLy8gTm8gbGlzdCB0YWlsIGlmIHRoaXMgd2FzIGFuIGVtcHR5IGxpc3RcbiAgICAgICAgaWYgKHRoaXMuX3N1YmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBUaGUgbGlzdCB3YXMgaW4gdGhlIHBhcmVudCBjb250ZXh0J3Mgb2JqZWN0XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV4dCA9IHRoaXMuX2dldENvbnRleHRFbmRSZWFkZXIoKTtcbiAgICAgICAgLy8gTm8gbGlzdCB0YWlsIGlmIHRoaXMgd2FzIGFuIGVtcHR5IGxpc3RcbiAgICAgICAgaWYgKHRoaXMuX29iamVjdCA9PT0gUkRGX05JTClcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgIH1cbiAgICAgIC8vIENsb3NlIHRoZSBsaXN0IGJ5IG1ha2luZyB0aGUgaGVhZCBuaWxcbiAgICAgIGxpc3QgPSBSREZfTklMO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGl0ZXJhbCc6XG4gICAgICBpdGVtID0gdG9rZW4udmFsdWU7XG4gICAgICBpdGVtQ29tcGxldGUgPSBmYWxzZTsgLy8gQ2FuIHN0aWxsIGhhdmUgYSBkYXRhdHlwZSBvciBsYW5ndWFnZVxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRMaXN0SXRlbURhdGFUeXBlT3JMYW5nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICgoaXRlbSA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgIC8vIENyZWF0ZSBhIG5ldyBibGFuayBub2RlIGlmIG5vIGl0ZW0gaGVhZCB3YXMgYXNzaWduZWQgeWV0XG4gICAgaWYgKGxpc3QgPT09IG51bGwpXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbGlzdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcblxuICAgIC8vIElzIHRoaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Q/XG4gICAgaWYgKHByZXZMaXN0ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGxpc3QgaXMgZWl0aGVyIHRoZSBzdWJqZWN0IG9yIHRoZSBvYmplY3Qgb2YgaXRzIHBhcmVudFxuICAgICAgaWYgKHBhcmVudC5wcmVkaWNhdGUgPT09IG51bGwpXG4gICAgICAgIHBhcmVudC5zdWJqZWN0ID0gbGlzdDtcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyZW50Lm9iamVjdCA9IGxpc3Q7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gQ29udGludWUgdGhlIHByZXZpb3VzIGxpc3Qgd2l0aCB0aGUgY3VycmVudCBsaXN0XG4gICAgICB0aGlzLl90cmlwbGUocHJldkxpc3QsIFJERl9SRVNULCBsaXN0LCB0aGlzLl9ncmFwaCk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgaXRlbSdzIHZhbHVlXG4gICAgaWYgKGl0ZW0gIT09IG51bGwpIHtcbiAgICAgIC8vIEluIE4zIG1vZGUsIHRoZSBpdGVtIG1pZ2h0IGJlIGEgcGF0aFxuICAgICAgaWYgKHRoaXMuX24zTW9kZSAmJiAodG9rZW4udHlwZSA9PT0gJ0lSSScgfHwgdG9rZW4udHlwZSA9PT0gJ3ByZWZpeGVkJykpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRleHQgdG8gYWRkIHRoZSBpdGVtJ3MgcGF0aFxuICAgICAgICB0aGlzLl9zYXZlQ29udGV4dCgnaXRlbScsIHRoaXMuX2dyYXBoLCBsaXN0LCBSREZfRklSU1QsIGl0ZW0pO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gaXRlbSwgdGhpcy5fcHJlZGljYXRlID0gbnVsbDtcbiAgICAgICAgLy8gX3JlYWRQYXRoIHdpbGwgcmVzdG9yZSB0aGUgY29udGV4dCBhbmQgb3V0cHV0IHRoZSBpdGVtXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQYXRoUmVhZGVyKHRoaXMuX3JlYWRMaXN0SXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBPdXRwdXQgdGhlIGl0ZW0gaWYgaXQgaXMgY29tcGxldGVcbiAgICAgIGlmIChpdGVtQ29tcGxldGUpXG4gICAgICAgIHRoaXMuX3RyaXBsZShsaXN0LCBSREZfRklSU1QsIGl0ZW0sIHRoaXMuX2dyYXBoKTtcbiAgICAgIC8vIE90aGVyd2lzZSwgc2F2ZSBpdCBmb3IgY29tcGxldGlvblxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl9vYmplY3QgPSBpdGVtO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGF0YVR5cGVPckxhbmdgIHJlYWRzIGFuIF9vcHRpb25hbF8gZGF0YSB0eXBlIG9yIGxhbmd1YWdlXG4gIF9yZWFkRGF0YVR5cGVPckxhbmc6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0aGlzLl9jb21wbGV0ZUxpdGVyYWwodG9rZW4sIGZhbHNlKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTGlzdEl0ZW1EYXRhVHlwZU9yTGFuZ2AgcmVhZHMgYW4gX29wdGlvbmFsXyBkYXRhIHR5cGUgb3IgbGFuZ3VhZ2UgaW4gYSBsaXN0XG4gIF9yZWFkTGlzdEl0ZW1EYXRhVHlwZU9yTGFuZzogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBsZXRlTGl0ZXJhbCh0b2tlbiwgdHJ1ZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfY29tcGxldGVMaXRlcmFsYCBjb21wbGV0ZXMgdGhlIG9iamVjdCB3aXRoIGEgZGF0YSB0eXBlIG9yIGxhbmd1YWdlXG4gIF9jb21wbGV0ZUxpdGVyYWw6IGZ1bmN0aW9uICh0b2tlbiwgbGlzdEl0ZW0pIHtcbiAgICB2YXIgc3VmZml4ID0gZmFsc2U7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gQWRkIGEgXCJeXnR5cGVcIiBzdWZmaXggZm9yIHR5cGVzIChJUklzIGFuZCBibGFuayBub2RlcylcbiAgICBjYXNlICd0eXBlJzpcbiAgICBjYXNlICd0eXBlSVJJJzpcbiAgICAgIHN1ZmZpeCA9IHRydWU7XG4gICAgICB0aGlzLl9vYmplY3QgKz0gJ15eJyArIHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQWRkIGFuIFwiQGxhbmdcIiBzdWZmaXggZm9yIGxhbmd1YWdlIHRhZ3NcbiAgICBjYXNlICdsYW5nY29kZSc6XG4gICAgICBzdWZmaXggPSB0cnVlO1xuICAgICAgdGhpcy5fb2JqZWN0ICs9ICdAJyArIHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBsaXRlcmFsIHdhcyBwYXJ0IG9mIGEgbGlzdCwgd3JpdGUgdGhlIGl0ZW1cbiAgICAvLyAod2UgY291bGQgYWxzbyBjaGVjayB0aGUgY29udGV4dCBzdGFjaywgYnV0IHBhc3NpbmcgaW4gYSBmbGFnIGlzIGZhc3RlcilcbiAgICBpZiAobGlzdEl0ZW0pXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcbiAgICAvLyBDb250aW51ZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBpbnB1dFxuICAgIGlmIChzdWZmaXgpXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRDYWxsYmFjayh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRGb3JtdWxhVGFpbGAgcmVhZHMgdGhlIGVuZCBvZiBhIGZvcm11bGFcbiAgX3JlYWRGb3JtdWxhVGFpbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICd9JylcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHVuY3R1YXRpb24odG9rZW4pO1xuXG4gICAgLy8gU3RvcmUgdGhlIGxhc3QgdHJpcGxlIG9mIHRoZSBmb3JtdWxhXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgdGhpcy5fcHJlZGljYXRlLCB0aGlzLl9vYmplY3QsIHRoaXMuX2dyYXBoKTtcblxuICAgIC8vIFJlc3RvcmUgdGhlIHBhcmVudCBjb250ZXh0IGNvbnRhaW5pbmcgdGhpcyBmb3JtdWxhXG4gICAgdGhpcy5fcmVzdG9yZUNvbnRleHQoKTtcbiAgICAvLyBJZiB0aGUgZm9ybXVsYSB3YXMgdGhlIHN1YmplY3QsIGNvbnRpbnVlIHJlYWRpbmcgdGhlIHByZWRpY2F0ZS5cbiAgICAvLyBJZiB0aGUgZm9ybXVsYSB3YXMgdGhlIG9iamVjdCwgcmVhZCBwdW5jdHVhdGlvbi5cbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0ID09PSBudWxsID8gdGhpcy5fcmVhZFByZWRpY2F0ZSA6IHRoaXMuX2dldENvbnRleHRFbmRSZWFkZXIoKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHVuY3R1YXRpb25gIHJlYWRzIHB1bmN0dWF0aW9uIGJldHdlZW4gdHJpcGxlcyBvciB0cmlwbGUgcGFydHNcbiAgX3JlYWRQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQsIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCBncmFwaCA9IHRoaXMuX2dyYXBoLFxuICAgICAgICBpbnZlcnNlUHJlZGljYXRlID0gdGhpcy5faW52ZXJzZVByZWRpY2F0ZTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBBIGNsb3NpbmcgYnJhY2UgZW5kcyBhIGdyYXBoXG4gICAgY2FzZSAnfSc6XG4gICAgICBpZiAodGhpcy5fZ3JhcGggPT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5leHBlY3RlZCBncmFwaCBjbG9zaW5nJywgdG9rZW4pO1xuICAgICAgaWYgKHRoaXMuX24zTW9kZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRGb3JtdWxhVGFpbCh0b2tlbik7XG4gICAgICB0aGlzLl9ncmFwaCA9IG51bGw7XG4gICAgLy8gQSBkb3QganVzdCBlbmRzIHRoZSBzdGF0ZW1lbnQsIHdpdGhvdXQgc2hhcmluZyBhbnl0aGluZyB3aXRoIHRoZSBuZXh0XG4gICAgY2FzZSAnLic6XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgIG5leHQgPSB0aGlzLl9jb250ZXh0U3RhY2subGVuZ3RoID8gdGhpcy5fcmVhZFN1YmplY3QgOiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICAgICAgaWYgKGludmVyc2VQcmVkaWNhdGUpIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFNlbWljb2xvbiBtZWFucyB0aGUgc3ViamVjdCBpcyBzaGFyZWQ7IHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFyZSBkaWZmZXJlbnRcbiAgICBjYXNlICc7JzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ29tbWEgbWVhbnMgYm90aCB0aGUgc3ViamVjdCBhbmQgcHJlZGljYXRlIGFyZSBzaGFyZWQ7IHRoZSBvYmplY3QgaXMgZGlmZmVyZW50XG4gICAgY2FzZSAnLCc6XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZE9iamVjdDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbiBlbnRpdHkgbWVhbnMgdGhpcyBpcyBhIHF1YWQgKG9ubHkgYWxsb3dlZCBpZiBub3QgYWxyZWFkeSBpbnNpZGUgYSBncmFwaClcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c1F1YWRzICYmIHRoaXMuX2dyYXBoID09PSBudWxsICYmIChncmFwaCA9IHRoaXMuX3JlYWRFbnRpdHkodG9rZW4pKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHVuY3R1YXRpb24gdG8gZm9sbG93IFwiJyArIHRoaXMuX29iamVjdCArICdcIicsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gQSB0cmlwbGUgaGFzIGJlZW4gY29tcGxldGVkIG5vdywgc28gcmV0dXJuIGl0XG4gICAgaWYgKHN1YmplY3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLl9wcmVkaWNhdGUsIG9iamVjdCA9IHRoaXMuX29iamVjdDtcbiAgICAgIGlmICghaW52ZXJzZVByZWRpY2F0ZSlcbiAgICAgICAgdGhpcy5fdHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCAgZ3JhcGgpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl90cmlwbGUob2JqZWN0LCAgcHJlZGljYXRlLCBzdWJqZWN0LCBncmFwaCk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gICAgLy8gIyMjIGBfcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBpbiBhIGJsYW5rIG5vZGVcbiAgX3JlYWRCbGFua05vZGVQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQ7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gU2VtaWNvbG9uIG1lYW5zIHRoZSBzdWJqZWN0IGlzIHNoYXJlZDsgcHJlZGljYXRlIGFuZCBvYmplY3QgYXJlIGRpZmZlcmVudFxuICAgIGNhc2UgJzsnOlxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgICBicmVhaztcbiAgICAvLyBDb21tYSBtZWFucyBib3RoIHRoZSBzdWJqZWN0IGFuZCBwcmVkaWNhdGUgYXJlIHNoYXJlZDsgdGhlIG9iamVjdCBpcyBkaWZmZXJlbnRcbiAgICBjYXNlICcsJzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkT2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHVuY3R1YXRpb24gdG8gZm9sbG93IFwiJyArIHRoaXMuX29iamVjdCArICdcIicsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gQSB0cmlwbGUgaGFzIGJlZW4gY29tcGxldGVkIG5vdywgc28gcmV0dXJuIGl0XG4gICAgdGhpcy5fdHJpcGxlKHRoaXMuX3N1YmplY3QsIHRoaXMuX3ByZWRpY2F0ZSwgdGhpcy5fb2JqZWN0LCB0aGlzLl9ncmFwaCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFF1YWRQdW5jdHVhdGlvbmAgcmVhZHMgcHVuY3R1YXRpb24gYWZ0ZXIgYSBxdWFkXG4gIF9yZWFkUXVhZFB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJy4nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBkb3QgdG8gZm9sbG93IHF1YWQnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeGAgcmVhZHMgdGhlIHByZWZpeCBvZiBhIHByZWZpeCBkZWNsYXJhdGlvblxuICBfcmVhZFByZWZpeDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdwcmVmaXgnKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwcmVmaXggdG8gZm9sbG93IEBwcmVmaXgnLCB0b2tlbik7XG4gICAgdGhpcy5fcHJlZml4ID0gdG9rZW4udmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVmaXhJUkk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeElSSWAgcmVhZHMgdGhlIElSSSBvZiBhIHByZWZpeCBkZWNsYXJhdGlvblxuICBfcmVhZFByZWZpeElSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IHByZWZpeCBcIicgKyB0aGlzLl9wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgIHZhciBwcmVmaXhJUkkgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKTtcbiAgICB0aGlzLl9wcmVmaXhlc1t0aGlzLl9wcmVmaXhdID0gcHJlZml4SVJJO1xuICAgIHRoaXMuX3ByZWZpeENhbGxiYWNrKHRoaXMuX3ByZWZpeCwgcHJlZml4SVJJKTtcbiAgICByZXR1cm4gdGhpcy5fcmVhZERlY2xhcmF0aW9uUHVuY3R1YXRpb247XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEJhc2VJUklgIHJlYWRzIHRoZSBJUkkgb2YgYSBiYXNlIGRlY2xhcmF0aW9uXG4gIF9yZWFkQmFzZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IGJhc2UgZGVjbGFyYXRpb24nLCB0b2tlbik7XG4gICAgdGhpcy5fc2V0QmFzZSh0aGlzLl9iYXNlID09PSBudWxsIHx8IGFic29sdXRlSVJJLnRlc3QodG9rZW4udmFsdWUpID9cbiAgICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlIDogdGhpcy5fcmVzb2x2ZUlSSSh0b2tlbikpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTmFtZWRHcmFwaExhYmVsYCByZWFkcyB0aGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaFxuICBfcmVhZE5hbWVkR3JhcGhMYWJlbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICdibGFuayc6XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0KHRva2VuKSwgdGhpcy5fcmVhZEdyYXBoO1xuICAgIGNhc2UgJ1snOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWROYW1lZEdyYXBoQmxhbmtMYWJlbDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTmFtZWRHcmFwaExhYmVsYCByZWFkcyBhIGJsYW5rIG5vZGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaFxuICBfcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ10nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbmAgcmVhZHMgdGhlIHB1bmN0dWF0aW9uIG9mIGEgZGVjbGFyYXRpb25cbiAgX3JlYWREZWNsYXJhdGlvblB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAvLyBTUEFSUUwtc3R5bGUgZGVjbGFyYXRpb25zIGRvbid0IGhhdmUgcHVuY3R1YXRpb25cbiAgICBpZiAodGhpcy5fc3BhcnFsU3R5bGUpIHtcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZEluVG9wQ29udGV4dCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICcuJylcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgZGVjbGFyYXRpb24gdG8gZW5kIHdpdGggYSBkb3QnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gUmVhZHMgYSBsaXN0IG9mIHF1YW50aWZpZWQgc3ltYm9scyBmcm9tIGEgQGZvclNvbWUgb3IgQGZvckFsbCBzdGF0ZW1lbnRcbiAgX3JlYWRRdWFudGlmaWVyTGlzdDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGVudGl0eTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIGlmICgoZW50aXR5ID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbiwgdHJ1ZSkpICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHRva2VuLnR5cGUsIHRva2VuKTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBleHBsaWNpdCBxdWFudGlmaWVycywgbWFwIGVudGl0aWVzIHRvIGEgcXVhbnRpZmllZCBlbnRpdHlcbiAgICBpZiAoIXRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMpXG4gICAgICB0aGlzLl9xdWFudGlmaWVkW2VudGl0eV0gPSB0aGlzLl9xdWFudGlmaWVkUHJlZml4ICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAvLyBXaXRoIGV4cGxpY2l0IHF1YW50aWZpZXJzLCBvdXRwdXQgdGhlIHJlaWZpZWQgcXVhbnRpZmllclxuICAgIGVsc2Uge1xuICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaXRlbSwgc3RhcnQgYSBuZXcgcXVhbnRpZmllciBsaXN0XG4gICAgICBpZiAodGhpcy5fc3ViamVjdCA9PT0gbnVsbClcbiAgICAgICAgdGhpcy5fdHJpcGxlKHRoaXMuX2dyYXBoIHx8ICcnLCB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gJ186YicgKyBibGFua05vZGVDb3VudCsrLCBRVUFOVElGSUVSU19HUkFQSCk7XG4gICAgICAvLyBPdGhlcndpc2UsIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3RyaXBsZSh0aGlzLl9zdWJqZWN0LCBSREZfUkVTVCxcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50KyssIFFVQU5USUZJRVJTX0dSQVBIKTtcbiAgICAgIC8vIE91dHB1dCB0aGUgbGlzdCBpdGVtXG4gICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCBlbnRpdHksIFFVQU5USUZJRVJTX0dSQVBIKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyUHVuY3R1YXRpb247XG4gIH0sXG5cbiAgLy8gUmVhZHMgcHVuY3R1YXRpb24gZnJvbSBhIEBmb3JTb21lIG9yIEBmb3JBbGwgc3RhdGVtZW50XG4gIF9yZWFkUXVhbnRpZmllclB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAvLyBSZWFkIG1vcmUgcXVhbnRpZmllcnNcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJywnKVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRRdWFudGlmaWVyTGlzdDtcbiAgICAvLyBFbmQgb2YgdGhlIHF1YW50aWZpZXIgbGlzdFxuICAgIGVsc2Uge1xuICAgICAgLy8gV2l0aCBleHBsaWNpdCBxdWFudGlmaWVycywgY2xvc2UgdGhlIHF1YW50aWZpZXIgbGlzdFxuICAgICAgaWYgKHRoaXMuX2V4cGxpY2l0UXVhbnRpZmllcnMpIHtcbiAgICAgICAgdGhpcy5fdHJpcGxlKHRoaXMuX3N1YmplY3QsIFJERl9SRVNULCBSREZfTklMLCBRVUFOVElGSUVSU19HUkFQSCk7XG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gUmVhZCBhIGRvdFxuICAgICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fZ2V0Q29udGV4dEVuZFJlYWRlcigpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRDYWxsYmFjayh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX2dldFBhdGhSZWFkZXJgIHJlYWRzIGEgcG90ZW50aWFsIHBhdGggYW5kIHRoZW4gcmVzdW1lcyB3aXRoIHRoZSBnaXZlbiBmdW5jdGlvblxuICBfZ2V0UGF0aFJlYWRlcjogZnVuY3Rpb24gKGFmdGVyUGF0aCkge1xuICAgIHRoaXMuX2FmdGVyUGF0aCA9IGFmdGVyUGF0aDtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFBhdGg7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFBhdGhgIHJlYWRzIGEgcG90ZW50aWFsIHBhdGhcbiAgX3JlYWRQYXRoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAvLyBGb3J3YXJkIHBhdGhcbiAgICBjYXNlICchJzogcmV0dXJuIHRoaXMuX3JlYWRGb3J3YXJkUGF0aDtcbiAgICAvLyBCYWNrd2FyZCBwYXRoXG4gICAgY2FzZSAnXic6IHJldHVybiB0aGlzLl9yZWFkQmFja3dhcmRQYXRoO1xuICAgIC8vIE5vdCBhIHBhdGg7IHJlc3VtZSByZWFkaW5nIHdoZXJlIHdlIGxlZnQgb2ZmXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBzdGFjayA9IHRoaXMuX2NvbnRleHRTdGFjaywgcGFyZW50ID0gc3RhY2subGVuZ3RoICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGEgbGlzdCBpdGVtLCB3ZSBzdGlsbCBuZWVkIHRvIG91dHB1dCBpdFxuICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gJ2l0ZW0nKSB7XG4gICAgICAgIC8vIFRoZSBsaXN0IGl0ZW0gaXMgdGhlIHJlbWFpbmluZyBzdWJlamN0IGFmdGVyIHJlYWRpbmcgdGhlIHBhdGhcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl9zdWJqZWN0O1xuICAgICAgICAvLyBTd2l0Y2ggYmFjayB0byB0aGUgY29udGV4dCBvZiB0aGUgbGlzdFxuICAgICAgICB0aGlzLl9yZXN0b3JlQ29udGV4dCgpO1xuICAgICAgICAvLyBPdXRwdXQgdGhlIGxpc3QgaXRlbVxuICAgICAgICB0aGlzLl90cmlwbGUodGhpcy5fc3ViamVjdCwgUkRGX0ZJUlNULCBpdGVtLCB0aGlzLl9ncmFwaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJQYXRoKHRva2VuKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEZvcndhcmRQYXRoYCByZWFkcyBhICchJyBwYXRoXG4gIF9yZWFkRm9yd2FyZFBhdGg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBpcyB0aGUgcHJlZGljYXRlXG4gICAgaWYgKChwcmVkaWNhdGUgPSB0aGlzLl9yZWFkRW50aXR5KHRva2VuKSkgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybjtcbiAgICAvLyBJZiB3ZSB3ZXJlIHJlYWRpbmcgYSBzdWJqZWN0LCByZXBsYWNlIHRoZSBzdWJqZWN0IGJ5IHRoZSBwYXRoJ3Mgb2JqZWN0XG4gICAgaWYgKHRoaXMuX3ByZWRpY2F0ZSA9PT0gbnVsbClcbiAgICAgIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCB0aGlzLl9zdWJqZWN0ID0gb2JqZWN0O1xuICAgIC8vIElmIHdlIHdlcmUgcmVhZGluZyBhbiBvYmplY3QsIHJlcGxhY2UgdGhlIHN1YmplY3QgYnkgdGhlIHBhdGgncyBvYmplY3RcbiAgICBlbHNlXG4gICAgICBzdWJqZWN0ID0gdGhpcy5fb2JqZWN0LCAgdGhpcy5fb2JqZWN0ICA9IG9iamVjdDtcbiAgICAvLyBFbWl0IHRoZSBwYXRoJ3MgY3VycmVudCB0cmlwbGUgYW5kIHJlYWQgaXRzIG5leHQgc2VjdGlvblxuICAgIHRoaXMuX3RyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUGF0aDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmFja3dhcmRQYXRoYCByZWFkcyBhICdeJyBwYXRoXG4gIF9yZWFkQmFja3dhcmRQYXRoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKywgcHJlZGljYXRlLCBvYmplY3Q7XG4gICAgLy8gVGhlIG5leHQgdG9rZW4gaXMgdGhlIHByZWRpY2F0ZVxuICAgIGlmICgocHJlZGljYXRlID0gdGhpcy5fcmVhZEVudGl0eSh0b2tlbikpID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm47XG4gICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGEgc3ViamVjdCwgcmVwbGFjZSB0aGUgc3ViamVjdCBieSB0aGUgcGF0aCdzIHN1YmplY3RcbiAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgb2JqZWN0ID0gdGhpcy5fc3ViamVjdCwgdGhpcy5fc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgLy8gSWYgd2Ugd2VyZSByZWFkaW5nIGFuIG9iamVjdCwgcmVwbGFjZSB0aGUgc3ViamVjdCBieSB0aGUgcGF0aCdzIHN1YmplY3RcbiAgICBlbHNlXG4gICAgICBvYmplY3QgPSB0aGlzLl9vYmplY3QsICB0aGlzLl9vYmplY3QgID0gc3ViamVjdDtcbiAgICAvLyBFbWl0IHRoZSBwYXRoJ3MgY3VycmVudCB0cmlwbGUgYW5kIHJlYWQgaXRzIG5leHQgc2VjdGlvblxuICAgIHRoaXMuX3RyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgdGhpcy5fZ3JhcGgpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUGF0aDtcbiAgfSxcblxuICAvLyAjIyMgYF9nZXRDb250ZXh0RW5kUmVhZGVyYCBnZXRzIHRoZSBuZXh0IHJlYWRlciBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIGEgY29udGV4dFxuICBfZ2V0Q29udGV4dEVuZFJlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250ZXh0U3RhY2sgPSB0aGlzLl9jb250ZXh0U3RhY2s7XG4gICAgaWYgKCFjb250ZXh0U3RhY2subGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbjtcblxuICAgIHN3aXRjaCAoY29udGV4dFN0YWNrW2NvbnRleHRTdGFjay5sZW5ndGggLSAxXS50eXBlKSB7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsO1xuICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICBjYXNlICdmb3JtdWxhJzpcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkRm9ybXVsYVRhaWw7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3RyaXBsZWAgZW1pdHMgYSB0cmlwbGUgdGhyb3VnaCB0aGUgY2FsbGJhY2tcbiAgX3RyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsXG4gICAgICB7IHN1YmplY3Q6IHN1YmplY3QsIHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCwgZ3JhcGg6IGdyYXBoIHx8ICcnIH0pO1xuICB9LFxuXG4gIC8vICMjIyBgX2Vycm9yYCBlbWl0cyBhbiBlcnJvciBtZXNzYWdlIHRocm91Z2ggdGhlIGNhbGxiYWNrXG4gIF9lcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sobmV3IEVycm9yKG1lc3NhZ2UgKyAnIG9uIGxpbmUgJyArIHRva2VuLmxpbmUgKyAnLicpKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZXNvbHZlSVJJYCByZXNvbHZlcyBhIHJlbGF0aXZlIElSSSB0b2tlbiBhZ2FpbnN0IHRoZSBiYXNlIHBhdGgsXG4gIC8vIGFzc3VtaW5nIHRoYXQgYSBiYXNlIHBhdGggaGFzIGJlZW4gc2V0IGFuZCB0aGF0IHRoZSBJUkkgaXMgaW5kZWVkIHJlbGF0aXZlXG4gIF9yZXNvbHZlSVJJOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgaXJpID0gdG9rZW4udmFsdWU7XG4gICAgc3dpdGNoIChpcmlbMF0pIHtcbiAgICAvLyBBbiBlbXB0eSByZWxhdGl2ZSBJUkkgaW5kaWNhdGVzIHRoZSBiYXNlIElSSVxuICAgIGNhc2UgdW5kZWZpbmVkOiByZXR1cm4gdGhpcy5fYmFzZTtcbiAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIGZyYWdtZW50IElSSXMgYWdhaW5zdCB0aGUgYmFzZSBJUklcbiAgICBjYXNlICcjJzogcmV0dXJuIHRoaXMuX2Jhc2UgKyBpcmk7XG4gICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBxdWVyeSBzdHJpbmcgSVJJcyBieSByZXBsYWNpbmcgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIGNhc2UgJz8nOiByZXR1cm4gdGhpcy5fYmFzZS5yZXBsYWNlKC8oPzpcXD8uKik/JC8sIGlyaSk7XG4gICAgLy8gUmVzb2x2ZSByb290LXJlbGF0aXZlIElSSXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGJhc2UgSVJJXG4gICAgY2FzZSAnLyc6XG4gICAgICAvLyBSZXNvbHZlIHNjaGVtZS1yZWxhdGl2ZSBJUklzIHRvIHRoZSBzY2hlbWVcbiAgICAgIHJldHVybiAoaXJpWzFdID09PSAnLycgPyB0aGlzLl9iYXNlU2NoZW1lIDogdGhpcy5fYmFzZVJvb3QpICsgdGhpcy5fcmVtb3ZlRG90U2VnbWVudHMoaXJpKTtcbiAgICAvLyBSZXNvbHZlIGFsbCBvdGhlciBJUklzIGF0IHRoZSBiYXNlIElSSSdzIHBhdGhcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX3JlbW92ZURvdFNlZ21lbnRzKHRoaXMuX2Jhc2VQYXRoICsgaXJpKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRG90U2VnbWVudHNgIHJlc29sdmVzICcuLycgYW5kICcuLi8nIHBhdGggc2VnbWVudHMgaW4gYW4gSVJJIGFzIHBlciBSRkMzOTg2XG4gIF9yZW1vdmVEb3RTZWdtZW50czogZnVuY3Rpb24gKGlyaSkge1xuICAgIC8vIERvbid0IG1vZGlmeSB0aGUgSVJJIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGRvdCBzZWdtZW50c1xuICAgIGlmICghZG90U2VnbWVudHMudGVzdChpcmkpKVxuICAgICAgcmV0dXJuIGlyaTtcblxuICAgIC8vIFN0YXJ0IHdpdGggYW4gaW1hZ2luYXJ5IHNsYXNoIGJlZm9yZSB0aGUgSVJJIGluIG9yZGVyIHRvIHJlc29sdmUgdHJhaWxpbmcgJy4vJyBhbmQgJy4uLydcbiAgICB2YXIgcmVzdWx0ID0gJycsIGxlbmd0aCA9IGlyaS5sZW5ndGgsIGkgPSAtMSwgcGF0aFN0YXJ0ID0gLTEsIHNlZ21lbnRTdGFydCA9IDAsIG5leHQgPSAnLyc7XG5cbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAvLyBUaGUgcGF0aCBzdGFydHMgd2l0aCB0aGUgZmlyc3Qgc2xhc2ggYWZ0ZXIgdGhlIGF1dGhvcml0eVxuICAgICAgY2FzZSAnOic6XG4gICAgICAgIGlmIChwYXRoU3RhcnQgPCAwKSB7XG4gICAgICAgICAgLy8gU2tpcCB0d28gc2xhc2hlcyBiZWZvcmUgdGhlIGF1dGhvcml0eVxuICAgICAgICAgIGlmIChpcmlbKytpXSA9PT0gJy8nICYmIGlyaVsrK2ldID09PSAnLycpXG4gICAgICAgICAgICAvLyBTa2lwIHRvIHNsYXNoIGFmdGVyIHRoZSBhdXRob3JpdHlcbiAgICAgICAgICAgIHdoaWxlICgocGF0aFN0YXJ0ID0gaSArIDEpIDwgbGVuZ3RoICYmIGlyaVtwYXRoU3RhcnRdICE9PSAnLycpXG4gICAgICAgICAgICAgIGkgPSBwYXRoU3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBEb24ndCBtb2RpZnkgYSBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnRcbiAgICAgIGNhc2UgJz8nOlxuICAgICAgY2FzZSAnIyc6XG4gICAgICAgIGkgPSBsZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gSGFuZGxlICcvLicgb3IgJy8uLicgcGF0aCBzZWdtZW50c1xuICAgICAgY2FzZSAnLyc6XG4gICAgICAgIGlmIChpcmlbaSArIDFdID09PSAnLicpIHtcbiAgICAgICAgICBuZXh0ID0gaXJpWysraSArIDFdO1xuICAgICAgICAgIHN3aXRjaCAobmV4dCkge1xuICAgICAgICAgIC8vIFJlbW92ZSBhICcvLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgcmVzdWx0ICs9IGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpIC0gMSk7XG4gICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFJlbW92ZSBhIHRyYWlsaW5nICcvLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpKSArIGlyaS5zdWJzdHIoaSArIDEpO1xuICAgICAgICAgIC8vIFJlbW92ZSBhICcvLi4nIHNlZ21lbnRcbiAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgIG5leHQgPSBpcmlbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkIHx8IG5leHQgPT09ICcvJyB8fCBuZXh0ID09PSAnPycgfHwgbmV4dCA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCArPSBpcmkuc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSAtIDIpO1xuICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVtb3ZlIHRoZSBwYXJlbnQgcGF0aCBmcm9tIHJlc3VsdFxuICAgICAgICAgICAgICBpZiAoKHNlZ21lbnRTdGFydCA9IHJlc3VsdC5sYXN0SW5kZXhPZignLycpKSA+PSBwYXRoU3RhcnQpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cigwLCBzZWdtZW50U3RhcnQpO1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgYSB0cmFpbGluZyAnLy4uJyBzZWdtZW50XG4gICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnLycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICcvJyArIGlyaS5zdWJzdHIoaSArIDEpO1xuICAgICAgICAgICAgICBzZWdtZW50U3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQgPSBpcmlbKytpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdCArIGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0KTtcbiAgfSxcblxuICAvLyAjIyBQdWJsaWMgbWV0aG9kc1xuXG4gIC8vICMjIyBgcGFyc2VgIHBhcnNlcyB0aGUgTjMgaW5wdXQgYW5kIGVtaXRzIGVhY2ggcGFyc2VkIHRyaXBsZSB0aHJvdWdoIHRoZSBjYWxsYmFja1xuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCB0cmlwbGVDYWxsYmFjaywgcHJlZml4Q2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgLy8gVGhlIHJlYWQgY2FsbGJhY2sgaXMgdGhlIG5leHQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIHRva2VuIGFycml2ZXMuXG4gICAgLy8gV2Ugc3RhcnQgcmVhZGluZyBpbiB0aGUgdG9wIGNvbnRleHQuXG4gICAgdGhpcy5fcmVhZENhbGxiYWNrID0gdGhpcy5fcmVhZEluVG9wQ29udGV4dDtcbiAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgIHRoaXMuX3ByZWZpeGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9wcmVmaXhlcy5fID0gdGhpcy5fYmxhbmtOb2RlUHJlZml4IHx8ICdfOmInICsgYmxhbmtOb2RlUHJlZml4KysgKyAnXyc7XG4gICAgdGhpcy5fcHJlZml4Q2FsbGJhY2sgPSBwcmVmaXhDYWxsYmFjayB8fCBub29wO1xuICAgIHRoaXMuX2ludmVyc2VQcmVkaWNhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWFudGlmaWVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIC8vIFBhcnNlIHN5bmNocm9ub3VzbHkgaWYgbm8gdHJpcGxlIGNhbGxiYWNrIGlzIGdpdmVuXG4gICAgaWYgKCF0cmlwbGVDYWxsYmFjaykge1xuICAgICAgdmFyIHRyaXBsZXMgPSBbXSwgZXJyb3I7XG4gICAgICB0aGlzLl9jYWxsYmFjayA9IGZ1bmN0aW9uIChlLCB0KSB7IGUgPyAoZXJyb3IgPSBlKSA6IHQgJiYgdHJpcGxlcy5wdXNoKHQpOyB9O1xuICAgICAgdGhpcy5fbGV4ZXIudG9rZW5pemUoaW5wdXQpLmV2ZXJ5KGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICByZXR1cm4gc2VsZi5fcmVhZENhbGxiYWNrID0gc2VsZi5fcmVhZENhbGxiYWNrKHRva2VuKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICAgIHJldHVybiB0cmlwbGVzO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGFzeW5jaHJvbm91c2x5IG90aGVyd2lzZSwgZXhlY3V0aW5nIHRoZSByZWFkIGNhbGxiYWNrIHdoZW4gYSB0b2tlbiBhcnJpdmVzXG4gICAgdGhpcy5fY2FsbGJhY2sgPSB0cmlwbGVDYWxsYmFjaztcbiAgICB0aGlzLl9sZXhlci50b2tlbml6ZShpbnB1dCwgZnVuY3Rpb24gKGVycm9yLCB0b2tlbikge1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxuICAgICAgICBzZWxmLl9jYWxsYmFjayhlcnJvciksIHNlbGYuX2NhbGxiYWNrID0gbm9vcDtcbiAgICAgIGVsc2UgaWYgKHNlbGYuX3JlYWRDYWxsYmFjaylcbiAgICAgICAgc2VsZi5fcmVhZENhbGxiYWNrID0gc2VsZi5fcmVhZENhbGxiYWNrKHRva2VuKTtcbiAgICB9KTtcbiAgfSxcbn07XG5cbi8vIFRoZSBlbXB0eSBmdW5jdGlvblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNQYXJzZXI7XG4iLCIvLyAqKk4zU3RvcmUqKiBvYmplY3RzIHN0b3JlIE4zIHRyaXBsZXMgYnkgZ3JhcGggaW4gbWVtb3J5LlxuXG52YXIgZXhwYW5kUHJlZml4ZWROYW1lID0gcmVxdWlyZSgnLi9OM1V0aWwnKS5leHBhbmRQcmVmaXhlZE5hbWU7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0b3JlKHRyaXBsZXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RvcmUpKVxuICAgIHJldHVybiBuZXcgTjNTdG9yZSh0cmlwbGVzLCBvcHRpb25zKTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHRyaXBsZXMgaXMgaW5pdGlhbGx5IHplcm9cbiAgdGhpcy5fc2l6ZSA9IDA7XG4gIC8vIGBfZ3JhcGhzYCBjb250YWlucyBzdWJqZWN0LCBwcmVkaWNhdGUsIGFuZCBvYmplY3QgaW5kZXhlcyBwZXIgZ3JhcGhcbiAgdGhpcy5fZ3JhcGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gYF9pZHNgIG1hcHMgZW50aXRpZXMgc3VjaCBhcyBgaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS9uYW1lYCB0byBudW1iZXJzLFxuICAvLyBzYXZpbmcgbWVtb3J5IGJ5IHVzaW5nIG9ubHkgbnVtYmVycyBhcyBrZXlzIGluIGBfZ3JhcGhzYFxuICB0aGlzLl9pZCA9IDA7XG4gIHRoaXMuX2lkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2lkc1snPjwnXSA9IDA7IC8vIGR1bW15IGVudHJ5LCBzbyB0aGUgZmlyc3QgYWN0dWFsIGtleSBpcyBub24temVyb1xuICB0aGlzLl9lbnRpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7IC8vIGludmVyc2Ugb2YgYF9pZHNgXG4gIC8vIGBfYmxhbmtOb2RlSW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBhdXRvbWF0aWNhbGx5IG5hbWVkIGJsYW5rIG5vZGVcbiAgdGhpcy5fYmxhbmtOb2RlSW5kZXggPSAwO1xuXG4gIC8vIFNoaWZ0IHBhcmFtZXRlcnMgaWYgYHRyaXBsZXNgIGlzIG5vdCBnaXZlblxuICBpZiAoIW9wdGlvbnMgJiYgdHJpcGxlcyAmJiAhdHJpcGxlc1swXSlcbiAgICBvcHRpb25zID0gdHJpcGxlcywgdHJpcGxlcyA9IG51bGw7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIEFkZCB0cmlwbGVzIGFuZCBwcmVmaXhlcyBpZiBwYXNzZWRcbiAgdGhpcy5fcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAob3B0aW9ucy5wcmVmaXhlcylcbiAgICB0aGlzLmFkZFByZWZpeGVzKG9wdGlvbnMucHJlZml4ZXMpO1xuICBpZiAodHJpcGxlcylcbiAgICB0aGlzLmFkZFRyaXBsZXModHJpcGxlcyk7XG59XG5cbk4zU3RvcmUucHJvdG90eXBlID0ge1xuICAvLyAjIyBQdWJsaWMgcHJvcGVydGllc1xuXG4gIC8vICMjIyBgc2l6ZWAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyaXBsZXMgaW4gdGhlIHN0b3JlXG4gIGdldCBzaXplKCkge1xuICAgIC8vIFJldHVybiB0aGUgdHJpcGxlIGNvdW50IGlmIGlmIHdhcyBjYWNoZWRcbiAgICB2YXIgc2l6ZSA9IHRoaXMuX3NpemU7XG4gICAgaWYgKHNpemUgIT09IG51bGwpXG4gICAgICByZXR1cm4gc2l6ZTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRyaXBsZXMgYnkgY291bnRpbmcgdG8gdGhlIGRlZXBlc3QgbGV2ZWxcbiAgICBzaXplID0gMDtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5fZ3JhcGhzLCBzdWJqZWN0cywgc3ViamVjdDtcbiAgICBmb3IgKHZhciBncmFwaEtleSBpbiBncmFwaHMpXG4gICAgICBmb3IgKHZhciBzdWJqZWN0S2V5IGluIChzdWJqZWN0cyA9IGdyYXBoc1tncmFwaEtleV0uc3ViamVjdHMpKVxuICAgICAgICBmb3IgKHZhciBwcmVkaWNhdGVLZXkgaW4gKHN1YmplY3QgPSBzdWJqZWN0c1tzdWJqZWN0S2V5XSkpXG4gICAgICAgICAgc2l6ZSArPSBPYmplY3Qua2V5cyhzdWJqZWN0W3ByZWRpY2F0ZUtleV0pLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZSA9IHNpemU7XG4gIH0sXG5cbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfYWRkVG9JbmRleGAgYWRkcyBhIHRyaXBsZSB0byBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFJldHVybnMgaWYgdGhlIGluZGV4IGhhcyBjaGFuZ2VkLCBpZiB0aGUgZW50cnkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LlxuICBfYWRkVG9JbmRleDogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwga2V5Mikge1xuICAgIC8vIENyZWF0ZSBsYXllcnMgYXMgbmVjZXNzYXJ5XG4gICAgdmFyIGluZGV4MSA9IGluZGV4MFtrZXkwXSB8fCAoaW5kZXgwW2tleTBdID0ge30pO1xuICAgIHZhciBpbmRleDIgPSBpbmRleDFba2V5MV0gfHwgKGluZGV4MVtrZXkxXSA9IHt9KTtcbiAgICAvLyBTZXR0aW5nIHRoZSBrZXkgdG8gX2FueV8gdmFsdWUgc2lnbmFscyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRyaXBsZVxuICAgIHZhciBleGlzdGVkID0ga2V5MiBpbiBpbmRleDI7XG4gICAgaWYgKCFleGlzdGVkKVxuICAgICAgaW5kZXgyW2tleTJdID0gbnVsbDtcbiAgICByZXR1cm4gIWV4aXN0ZWQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRnJvbUluZGV4YCByZW1vdmVzIGEgdHJpcGxlIGZyb20gYSB0aHJlZS1sYXllcmVkIGluZGV4XG4gIF9yZW1vdmVGcm9tSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHRyaXBsZSBmcm9tIHRoZSBpbmRleFxuICAgIHZhciBpbmRleDEgPSBpbmRleDBba2V5MF0sIGluZGV4MiA9IGluZGV4MVtrZXkxXSwga2V5O1xuICAgIGRlbGV0ZSBpbmRleDJba2V5Ml07XG5cbiAgICAvLyBSZW1vdmUgaW50ZXJtZWRpYXJ5IGluZGV4IGxheWVycyBpZiB0aGV5IGFyZSBlbXB0eVxuICAgIGZvciAoa2V5IGluIGluZGV4MikgcmV0dXJuO1xuICAgIGRlbGV0ZSBpbmRleDFba2V5MV07XG4gICAgZm9yIChrZXkgaW4gaW5kZXgxKSByZXR1cm47XG4gICAgZGVsZXRlIGluZGV4MFtrZXkwXTtcbiAgfSxcblxuICAvLyAjIyMgYF9maW5kSW5JbmRleGAgZmluZHMgYSBzZXQgb2YgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIHVuZGVmaW5lZCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgLy8gYG5hbWUwYCwgYG5hbWUxYCwgYW5kIGBuYW1lMmAgYXJlIHRoZSBuYW1lcyBvZiB0aGUga2V5cyBhdCBlYWNoIGxldmVsLFxuICAvLyB1c2VkIHdoZW4gcmVjb25zdHJ1Y3RpbmcgdGhlIHJlc3VsdGluZyB0cmlwbGVcbiAgLy8gKGZvciBpbnN0YW5jZTogX3N1YmplY3RfLCBfcHJlZGljYXRlXywgYW5kIF9vYmplY3RfKS5cbiAgLy8gRmluYWxseSwgYGdyYXBoYCB3aWxsIGJlIHRoZSBncmFwaCBvZiB0aGUgY3JlYXRlZCB0cmlwbGVzLlxuICAvLyBJZiBgY2FsbGJhY2tgIGlzIGdpdmVuLCBlYWNoIHJlc3VsdCBpcyBwYXNzZWQgdGhyb3VnaCBpdFxuICAvLyBhbmQgaXRlcmF0aW9uIGhhbHRzIHdoZW4gaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFueSB0cmlwbGUuXG4gIC8vIElmIGluc3RlYWQgYGFycmF5YCBpcyBnaXZlbiwgZWFjaCByZXN1bHQgaXMgYWRkZWQgdG8gdGhlIGFycmF5LlxuICBfZmluZEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIsIG5hbWUwLCBuYW1lMSwgbmFtZTIsIGdyYXBoLCBjYWxsYmFjaywgYXJyYXkpIHtcbiAgICB2YXIgdG1wLCBpbmRleDEsIGluZGV4MiwgdmFyQ291bnQgPSAha2V5MCArICFrZXkxICsgIWtleTIsXG4gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcywga2V5cyBvciByZXZlcnNlIGluZGV4IGFyZSBmYXN0ZXJcbiAgICAgICAgZW50aXR5S2V5cyA9IHZhckNvdW50ID4gMSA/IE9iamVjdC5rZXlzKHRoaXMuX2lkcykgOiB0aGlzLl9lbnRpdGllcztcblxuICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDAuXG4gICAgaWYgKGtleTApICh0bXAgPSBpbmRleDAsIGluZGV4MCA9IHt9KVtrZXkwXSA9IHRtcFtrZXkwXTtcbiAgICBmb3IgKHZhciB2YWx1ZTAgaW4gaW5kZXgwKSB7XG4gICAgICB2YXIgZW50aXR5MCA9IGVudGl0eUtleXNbdmFsdWUwXTtcblxuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDEuXG4gICAgICAgIGlmIChrZXkxKSAodG1wID0gaW5kZXgxLCBpbmRleDEgPSB7fSlba2V5MV0gPSB0bXBba2V5MV07XG4gICAgICAgIGZvciAodmFyIHZhbHVlMSBpbiBpbmRleDEpIHtcbiAgICAgICAgICB2YXIgZW50aXR5MSA9IGVudGl0eUtleXNbdmFsdWUxXTtcblxuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCB1c2Ugb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMiwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGtleTIgPyAoa2V5MiBpbiBpbmRleDIgPyBba2V5Ml0gOiBbXSkgOiBPYmplY3Qua2V5cyhpbmRleDIpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRyaXBsZXMgZm9yIGFsbCBpdGVtcyBmb3VuZCBpbiBpbmRleCAyLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IHZhbHVlcy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0geyBzdWJqZWN0OiAnJywgcHJlZGljYXRlOiAnJywgb2JqZWN0OiAnJywgZ3JhcGg6IGdyYXBoIH07XG4gICAgICAgICAgICAgIHJlc3VsdFtuYW1lMF0gPSBlbnRpdHkwO1xuICAgICAgICAgICAgICByZXN1bHRbbmFtZTFdID0gZW50aXR5MTtcbiAgICAgICAgICAgICAgcmVzdWx0W25hbWUyXSA9IGVudGl0eUtleXNbdmFsdWVzW2xdXTtcbiAgICAgICAgICAgICAgaWYgKGFycmF5KVxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2socmVzdWx0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuXG4gIC8vICMjIyBgX2xvb3BgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwga2V5cyBvZiBpbmRleCAwXG4gIF9sb29wOiBmdW5jdGlvbiAoaW5kZXgwLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGtleTAgaW4gaW5kZXgwKVxuICAgICAgY2FsbGJhY2soa2V5MCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfbG9vcEJ5S2V5MGAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBrZXlzIG9mIGEgY2VydGFpbiBlbnRyeSBpbiBpbmRleCAwXG4gIF9sb29wQnlLZXkwOiBmdW5jdGlvbiAoaW5kZXgwLCBrZXkwLCBjYWxsYmFjaykge1xuICAgIHZhciBpbmRleDEsIGtleTE7XG4gICAgaWYgKGluZGV4MSA9IGluZGV4MFtrZXkwXSkge1xuICAgICAgZm9yIChrZXkxIGluIGluZGV4MSlcbiAgICAgICAgY2FsbGJhY2soa2V5MSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX2xvb3BCeUtleTFgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBnaXZlbiBrZXlzIG9mIGFsbCBlbnRyaWVzIGluIGluZGV4IDBcbiAgX2xvb3BCeUtleTE6IGZ1bmN0aW9uIChpbmRleDAsIGtleTEsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGtleTAsIGluZGV4MTtcbiAgICBmb3IgKGtleTAgaW4gaW5kZXgwKSB7XG4gICAgICBpbmRleDEgPSBpbmRleDBba2V5MF07XG4gICAgICBpZiAoaW5kZXgxW2tleTFdKVxuICAgICAgICBjYWxsYmFjayhrZXkwKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfbG9vcEJ5MktleXNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBnaXZlbiBrZXlzIG9mIGNlcnRhaW4gZW50cmllcyBpbiBpbmRleCAyXG4gIF9sb29wQnkyS2V5czogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW5kZXgxLCBpbmRleDIsIGtleTI7XG4gICAgaWYgKChpbmRleDEgPSBpbmRleDBba2V5MF0pICYmIChpbmRleDIgPSBpbmRleDFba2V5MV0pKSB7XG4gICAgICBmb3IgKGtleTIgaW4gaW5kZXgyKVxuICAgICAgICBjYWxsYmFjayhrZXkyKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfY291bnRJbkluZGV4YCBjb3VudHMgbWF0Y2hpbmcgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIHVuZGVmaW5lZCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgX2NvdW50SW5JbmRleDogZnVuY3Rpb24gKGluZGV4MCwga2V5MCwga2V5MSwga2V5Mikge1xuICAgIHZhciBjb3VudCA9IDAsIHRtcCwgaW5kZXgxLCBpbmRleDI7XG5cbiAgICAvLyBJZiBhIGtleSBpcyBzcGVjaWZpZWQsIGNvdW50IG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDBcbiAgICBpZiAoa2V5MCkgKHRtcCA9IGluZGV4MCwgaW5kZXgwID0ge30pW2tleTBdID0gdG1wW2tleTBdO1xuICAgIGZvciAodmFyIHZhbHVlMCBpbiBpbmRleDApIHtcbiAgICAgIGlmIChpbmRleDEgPSBpbmRleDBbdmFsdWUwXSkge1xuICAgICAgICAvLyBJZiBhIGtleSBpcyBzcGVjaWZpZWQsIGNvdW50IG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDFcbiAgICAgICAgaWYgKGtleTEpICh0bXAgPSBpbmRleDEsIGluZGV4MSA9IHt9KVtrZXkxXSA9IHRtcFtrZXkxXTtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUxIGluIGluZGV4MSkge1xuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCB0aGUgdHJpcGxlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgaWYgKGtleTIpIChrZXkyIGluIGluZGV4MikgJiYgY291bnQrKztcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY291bnQgYWxsIHRyaXBsZXNcbiAgICAgICAgICAgIGVsc2UgY291bnQgKz0gT2JqZWN0LmtleXMoaW5kZXgyKS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfSxcblxuICAvLyAjIyMgYF9nZXRHcmFwaHNgIHJldHVybnMgYW4gYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gZ3JhcGgsXG4gIC8vIG9yIGFsbCBncmFwaHMgaWYgdGhlIGFyZ3VtZW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLlxuICBfZ2V0R3JhcGhzOiBmdW5jdGlvbiAoZ3JhcGgpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGdyYXBoKSlcbiAgICAgIHJldHVybiB0aGlzLl9ncmFwaHM7XG4gICAgdmFyIGdyYXBocyA9IHt9O1xuICAgIGdyYXBoc1tncmFwaF0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdO1xuICAgIHJldHVybiBncmFwaHM7XG4gIH0sXG5cbiAgLy8gIyMjIGBfdW5pcXVlRW50aXRpZXNgIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gZW50aXR5IElEXG4gIC8vIGFuZCBwYXNzZXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXR5IHRvIGNhbGxiYWNrIGlmIGl0IGhhc24ndCBvY2N1cnJlZCBiZWZvcmUuXG4gIF91bmlxdWVFbnRpdGllczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgdmFyIHVuaXF1ZUlkcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpZCkge1xuICAgICAgaWYgKCEoaWQgaW4gdW5pcXVlSWRzKSkge1xuICAgICAgICB1bmlxdWVJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgY2FsbGJhY2soZW50aXRpZXNbaWRdKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgYSBuZXcgTjMgdHJpcGxlIHRvIHRoZSBzdG9yZS5cbiAgLy8gUmV0dXJucyBpZiB0aGUgdHJpcGxlIGluZGV4IGhhcyBjaGFuZ2VkLCBpZiB0aGUgdHJpcGxlIGRpZCBub3QgYWxyZWFkeSBleGlzdC5cbiAgYWRkVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuXG4gICAgLy8gRmluZCB0aGUgZ3JhcGggdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyaXBsZVxuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG4gICAgdmFyIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF07XG4gICAgLy8gQ3JlYXRlIHRoZSBncmFwaCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGlmICghZ3JhcGhJdGVtKSB7XG4gICAgICBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdID0geyBzdWJqZWN0czoge30sIHByZWRpY2F0ZXM6IHt9LCBvYmplY3RzOiB7fSB9O1xuICAgICAgLy8gRnJlZXppbmcgYSBncmFwaCBoZWxwcyBzdWJzZXF1ZW50IGBhZGRgIHBlcmZvcm1hbmNlLFxuICAgICAgLy8gYW5kIHByb3BlcnRpZXMgd2lsbCBuZXZlciBiZSBtb2RpZmllZCBhbnl3YXlcbiAgICAgIE9iamVjdC5mcmVlemUoZ3JhcGhJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBlbnRpdGllcyBjYW4gb2Z0ZW4gYmUgbG9uZyBJUklzLCB3ZSBhdm9pZCBzdG9yaW5nIHRoZW0gaW4gZXZlcnkgaW5kZXguXG4gICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSBhIHNlcGFyYXRlIGluZGV4IHRoYXQgbWFwcyBlbnRpdGllcyB0byBudW1iZXJzLFxuICAgIC8vIHdoaWNoIGFyZSB0aGVuIHVzZWQgYXMga2V5cyBpbiB0aGUgb3RoZXIgaW5kZXhlcy5cbiAgICB2YXIgaWRzID0gdGhpcy5faWRzO1xuICAgIHZhciBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzO1xuICAgIHN1YmplY3QgICA9IGlkc1tzdWJqZWN0XSAgIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBzdWJqZWN0XSAgID0gdGhpcy5faWQpO1xuICAgIHByZWRpY2F0ZSA9IGlkc1twcmVkaWNhdGVdIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBwcmVkaWNhdGVdID0gdGhpcy5faWQpO1xuICAgIG9iamVjdCAgICA9IGlkc1tvYmplY3RdICAgIHx8IChpZHNbZW50aXRpZXNbKyt0aGlzLl9pZF0gPSBvYmplY3RdICAgID0gdGhpcy5faWQpO1xuXG4gICAgdmFyIGNoYW5nZWQgPSB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5zdWJqZWN0cywgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5wcmVkaWNhdGVzLCBwcmVkaWNhdGUsIG9iamVjdCwgICAgc3ViamVjdCk7XG4gICAgdGhpcy5fYWRkVG9JbmRleChncmFwaEl0ZW0ub2JqZWN0cywgICAgb2JqZWN0LCAgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSk7XG5cbiAgICAvLyBUaGUgY2FjaGVkIHRyaXBsZSBjb3VudCBpcyBub3cgaW52YWxpZFxuICAgIHRoaXMuX3NpemUgPSBudWxsO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkVHJpcGxlc2AgYWRkcyBtdWx0aXBsZSBOMyB0cmlwbGVzIHRvIHRoZSBzdG9yZVxuICBhZGRUcmlwbGVzOiBmdW5jdGlvbiAodHJpcGxlcykge1xuICAgIGZvciAodmFyIGkgPSB0cmlwbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgdGhpcy5hZGRUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhgIGFkZHMgc3VwcG9ydCBmb3IgcXVlcnlpbmcgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4XG4gIGFkZFByZWZpeDogZnVuY3Rpb24gKHByZWZpeCwgaXJpKSB7XG4gICAgdGhpcy5fcHJlZml4ZXNbcHJlZml4XSA9IGlyaTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGVzYCBhZGRzIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIHdpdGggdGhlIGdpdmVuIHByZWZpeGVzXG4gIGFkZFByZWZpeGVzOiBmdW5jdGlvbiAocHJlZml4ZXMpIHtcbiAgICBmb3IgKHZhciBwcmVmaXggaW4gcHJlZml4ZXMpXG4gICAgICB0aGlzLmFkZFByZWZpeChwcmVmaXgsIHByZWZpeGVzW3ByZWZpeF0pO1xuICB9LFxuXG4gIC8vICMjIyBgcmVtb3ZlVHJpcGxlYCByZW1vdmVzIGFuIE4zIHRyaXBsZSBmcm9tIHRoZSBzdG9yZSBpZiBpdCBleGlzdHNcbiAgcmVtb3ZlVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG5cbiAgICAvLyBGaW5kIGludGVybmFsIGlkZW50aWZpZXJzIGZvciBhbGwgY29tcG9uZW50c1xuICAgIC8vIGFuZCB2ZXJpZnkgdGhlIHRyaXBsZSBleGlzdHMuXG4gICAgdmFyIGdyYXBoSXRlbSwgaWRzID0gdGhpcy5faWRzLCBncmFwaHMgPSB0aGlzLl9ncmFwaHMsIHN1YmplY3RzLCBwcmVkaWNhdGVzO1xuICAgIGlmICghKHN1YmplY3QgICAgPSBpZHNbc3ViamVjdF0pIHx8ICEocHJlZGljYXRlID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgICEob2JqZWN0ICAgICA9IGlkc1tvYmplY3RdKSAgfHwgIShncmFwaEl0ZW0gPSBncmFwaHNbZ3JhcGhdKSAgfHxcbiAgICAgICAgIShzdWJqZWN0cyAgID0gZ3JhcGhJdGVtLnN1YmplY3RzW3N1YmplY3RdKSB8fFxuICAgICAgICAhKHByZWRpY2F0ZXMgPSBzdWJqZWN0c1twcmVkaWNhdGVdKSB8fFxuICAgICAgICAhKG9iamVjdCBpbiBwcmVkaWNhdGVzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBpdCBmcm9tIGFsbCBpbmRleGVzXG4gICAgdGhpcy5fcmVtb3ZlRnJvbUluZGV4KGdyYXBoSXRlbS5zdWJqZWN0cywgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLnByZWRpY2F0ZXMsIHByZWRpY2F0ZSwgb2JqZWN0LCAgICBzdWJqZWN0KTtcbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsICAgIG9iamVjdCwgICAgc3ViamVjdCwgICBwcmVkaWNhdGUpO1xuICAgIGlmICh0aGlzLl9zaXplICE9PSBudWxsKSB0aGlzLl9zaXplLS07XG5cbiAgICAvLyBSZW1vdmUgdGhlIGdyYXBoIGlmIGl0IGlzIGVtcHR5XG4gICAgZm9yIChzdWJqZWN0IGluIGdyYXBoSXRlbS5zdWJqZWN0cykgcmV0dXJuIHRydWU7XG4gICAgZGVsZXRlIGdyYXBoc1tncmFwaF07XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG5cbiAgLy8gIyMjIGByZW1vdmVUcmlwbGVzYCByZW1vdmVzIG11bHRpcGxlIE4zIHRyaXBsZXMgZnJvbSB0aGUgc3RvcmVcbiAgcmVtb3ZlVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gdHJpcGxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHRoaXMucmVtb3ZlVHJpcGxlKHRyaXBsZXNbaV0pO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0VHJpcGxlc2AgcmV0dXJucyBhbiBhcnJheSBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybiwgZXhwYW5kaW5nIHByZWZpeGVzIGFzIG5lY2Vzc2FyeS5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRUcmlwbGVzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJpcGxlc0J5SVJJKFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHN1YmplY3QsICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKGdyYXBoLCAgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGdldFRyaXBsZXNCeUlSSWAgcmV0dXJucyBhbiBhcnJheSBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRUcmlwbGVzQnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcXVhZHMgPSBbXSwgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCxcbiAgICAgICAgaWRzID0gdGhpcy5faWRzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBvYmplY3RJZDtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgaWYgKGlzU3RyaW5nKHN1YmplY3QpICAgJiYgIShzdWJqZWN0SWQgICA9IGlkc1tzdWJqZWN0XSkgICB8fFxuICAgICAgICBpc1N0cmluZyhwcmVkaWNhdGUpICYmICEocHJlZGljYXRlSWQgPSBpZHNbcHJlZGljYXRlXSkgfHxcbiAgICAgICAgaXNTdHJpbmcob2JqZWN0KSAgICAmJiAhKG9iamVjdElkICAgID0gaWRzW29iamVjdF0pKVxuICAgICAgcmV0dXJuIHF1YWRzO1xuXG4gICAgZm9yICh2YXIgZ3JhcGhJZCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhJZF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIHRoZSBvcHRpbWFsIGluZGV4LCBiYXNlZCBvbiB3aGF0IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgICBpZiAoc3ViamVjdElkKSB7XG4gICAgICAgICAgaWYgKG9iamVjdElkKVxuICAgICAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgICB0aGlzLl9maW5kSW5JbmRleChjb250ZW50Lm9iamVjdHMsIG9iamVjdElkLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoSWQsIG51bGwsIHF1YWRzKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHN1YmplY3QgYW5kIHBvc3NpYmx5IHByZWRpY2F0ZSBhcmUgZ2l2ZW4sIHRoZSBzdWJqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByZWRpY2F0ZUlkKVxuICAgICAgICAgIC8vIElmIG9ubHkgcHJlZGljYXRlIGFuZCBwb3NzaWJseSBvYmplY3QgYXJlIGdpdmVuLCB0aGUgcHJlZGljYXRlIGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICB0aGlzLl9maW5kSW5JbmRleChjb250ZW50LnByZWRpY2F0ZXMsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgdGhpcy5fZmluZEluSW5kZXgoY29udGVudC5vYmplY3RzLCBvYmplY3RJZCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JywgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgZ3JhcGhJZCwgbnVsbCwgcXVhZHMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm90aGluZyBpcyBnaXZlbiwgaXRlcmF0ZSBzdWJqZWN0cyBhbmQgcHJlZGljYXRlcyBmaXJzdFxuICAgICAgICAgIHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoSWQsIG51bGwsIHF1YWRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1YWRzO1xuICB9LFxuXG4gIC8vICMjIyBgY291bnRUcmlwbGVzYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4sIGV4cGFuZGluZyBwcmVmaXhlcyBhcyBuZWNlc3NhcnkuXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgY291bnRUcmlwbGVzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuY291bnRUcmlwbGVzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgY291bnRUcmlwbGVzQnlJUklgIHJldHVybnMgdGhlIG51bWJlciBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBjb3VudFRyaXBsZXNCeUlSSTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBjb3VudCA9IDAsIGdyYXBocyA9IHRoaXMuX2dldEdyYXBocyhncmFwaCksIGNvbnRlbnQsXG4gICAgICAgIGlkcyA9IHRoaXMuX2lkcywgc3ViamVjdElkLCBwcmVkaWNhdGVJZCwgb2JqZWN0SWQ7XG5cbiAgICAvLyBUcmFuc2xhdGUgSVJJcyB0byBpbnRlcm5hbCBpbmRleCBrZXlzLlxuICAgIGlmIChpc1N0cmluZyhzdWJqZWN0KSAgICYmICEoc3ViamVjdElkICAgPSBpZHNbc3ViamVjdF0pICAgfHxcbiAgICAgICAgaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgIGlzU3RyaW5nKG9iamVjdCkgICAgJiYgIShvYmplY3RJZCAgICA9IGlkc1tvYmplY3RdKSlcbiAgICAgIHJldHVybiAwO1xuXG4gICAgZm9yICh2YXIgZ3JhcGhJZCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhJZF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIHRoZSBvcHRpbWFsIGluZGV4LCBiYXNlZCBvbiB3aGF0IGZpZWxkcyBhcmUgcHJlc2VudFxuICAgICAgICBpZiAoc3ViamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QpXG4gICAgICAgICAgICAvLyBJZiBzdWJqZWN0IGFuZCBvYmplY3QgYXJlIGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50Lm9iamVjdHMsIG9iamVjdElkLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAvLyBJZiBvbmx5IHN1YmplY3QgYW5kIHBvc3NpYmx5IHByZWRpY2F0ZSBhcmUgZ2l2ZW4sIHRoZSBzdWJqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3RcbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgYW5kIHBvc3NpYmx5IG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBwcmVkaWNhdGUgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgIGNvdW50ICs9IHRoaXMuX2NvdW50SW5JbmRleChjb250ZW50LnByZWRpY2F0ZXMsIHByZWRpY2F0ZUlkLCBvYmplY3RJZCwgc3ViamVjdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBwb3NzaWJseSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgY291bnQgKz0gdGhpcy5fY291bnRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfSxcblxuICAvLyAjIyMgYGZvckVhY2hgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgdHJpcGxlcy5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBmb3JFYWNoOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHRoaXMuZm9yRWFjaEJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yRWFjaEJ5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHRyaXBsZXMuXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yRWFjaEJ5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHRoaXMuc29tZUJ5SVJJKGZ1bmN0aW9uIChxdWFkKSB7XG4gICAgICBjYWxsYmFjayhxdWFkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xuICB9LFxuXG4gIC8vICMjIyBgZXZlcnlgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgdHJpcGxlcyxcbiAgLy8gYW5kIHJldHVybnMgYHRydWVgIGlmIGl0IHJldHVybnMgdHJ1dGh5IGZvciBhbGwgdGhlbS5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBldmVyeTogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5ldmVyeUJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZXZlcnlCeUlSSWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCB0cmlwbGVzLFxuICAvLyBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFsbCB0aGVtLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGV2ZXJ5QnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHNvbWUgPSBmYWxzZTtcbiAgICB2YXIgZXZlcnkgPSAhdGhpcy5zb21lQnlJUkkoZnVuY3Rpb24gKHF1YWQpIHtcbiAgICAgIHNvbWUgPSB0cnVlO1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhxdWFkKTtcbiAgICB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xuICAgIHJldHVybiBzb21lICYmIGV2ZXJ5O1xuICB9LFxuXG4gIC8vICMjIyBgc29tZWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCB0cmlwbGVzLFxuICAvLyBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgaXQgcmV0dXJucyB0cnV0aHkgZm9yIGFueSBvZiB0aGVtLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIHNvbWU6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuc29tZUJ5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgc29tZUJ5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHRyaXBsZXMsXG4gIC8vIGFuZCByZXR1cm5zIGB0cnVlYCBpZiBpdCByZXR1cm5zIHRydXRoeSBmb3IgYW55IG9mIHRoZW0uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgc29tZUJ5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBncmFwaHMgPSB0aGlzLl9nZXRHcmFwaHMoZ3JhcGgpLCBjb250ZW50LFxuICAgICAgICBpZHMgPSB0aGlzLl9pZHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG9iamVjdElkO1xuXG4gICAgLy8gVHJhbnNsYXRlIElSSXMgdG8gaW50ZXJuYWwgaW5kZXgga2V5cy5cbiAgICBpZiAoaXNTdHJpbmcoc3ViamVjdCkgICAmJiAhKHN1YmplY3RJZCAgID0gaWRzW3N1YmplY3RdKSAgIHx8XG4gICAgICAgIGlzU3RyaW5nKHByZWRpY2F0ZSkgJiYgIShwcmVkaWNhdGVJZCA9IGlkc1twcmVkaWNhdGVdKSB8fFxuICAgICAgICBpc1N0cmluZyhvYmplY3QpICAgICYmICEob2JqZWN0SWQgICAgPSBpZHNbb2JqZWN0XSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBncmFwaElkIGluIGdyYXBocykge1xuICAgICAgLy8gT25seSBpZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW5zIHRyaXBsZXMsIHRoZXJlIGNhbiBiZSByZXN1bHRcbiAgICAgIGlmIChjb250ZW50ID0gZ3JhcGhzW2dyYXBoSWRdKSB7XG4gICAgICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICAgICAgaWYgKHN1YmplY3RJZCkge1xuICAgICAgICAgIGlmIChvYmplY3RJZCkge1xuICAgICAgICAgIC8vIElmIHN1YmplY3QgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBvYmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoSWQsIGNhbGxiYWNrLCBudWxsKSlcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBhbmQgcG9zc2libHkgcHJlZGljYXRlIGFyZSBnaXZlbiwgdGhlIHN1YmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdFxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIHN1YmplY3RJZCwgcHJlZGljYXRlSWQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoSWQsIGNhbGxiYWNrLCBudWxsKSlcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlSWQpIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIG9iamVjdElkLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGhJZCwgY2FsbGJhY2ssIG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0SWQpIHtcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnLCAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCBncmFwaElkLCBjYWxsYmFjaywgbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIC8vIElmIG5vdGhpbmcgaXMgZ2l2ZW4sIGl0ZXJhdGUgc3ViamVjdHMgYW5kIHByZWRpY2F0ZXMgZmlyc3RcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRJbkluZGV4KGNvbnRlbnQuc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGhJZCwgY2FsbGJhY2ssIG51bGwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0U3ViamVjdHNgIHJldHVybnMgYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0U3ViamVjdHM6IGZ1bmN0aW9uIChwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5nZXRTdWJqZWN0c0J5SVJJKFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKGdyYXBoLCAgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGdldFN1YmplY3RzQnlJUklgIHJldHVybnMgYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0U3ViamVjdHNCeUlSSTogZnVuY3Rpb24gKHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdGhpcy5mb3JTdWJqZWN0c0J5SVJJKGZ1bmN0aW9uIChzKSB7IHJlc3VsdHMucHVzaChzKTsgfSwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSxcblxuICAvLyAjIyMgYGZvclN1YmplY3RzYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHN1YmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yU3ViamVjdHM6IGZ1bmN0aW9uIChjYWxsYmFjaywgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JTdWJqZWN0c0J5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoZ3JhcGgsICAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yU3ViamVjdHNCeUlSSWAgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBzdWJqZWN0cyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvclN1YmplY3RzQnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIGlkcyA9IHRoaXMuX2lkcywgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCwgcHJlZGljYXRlSWQsIG9iamVjdElkO1xuICAgIGNhbGxiYWNrID0gdGhpcy5fdW5pcXVlRW50aXRpZXMoY2FsbGJhY2spO1xuXG4gICAgLy8gVHJhbnNsYXRlIElSSXMgdG8gaW50ZXJuYWwgaW5kZXgga2V5cy5cbiAgICBpZiAoaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pIHx8XG4gICAgICAgIGlzU3RyaW5nKG9iamVjdCkgICAgJiYgIShvYmplY3RJZCAgICA9IGlkc1tvYmplY3RdKSlcbiAgICAgIHJldHVybjtcblxuICAgIGZvciAoZ3JhcGggaW4gZ3JhcGhzKSB7XG4gICAgICAvLyBPbmx5IGlmIHRoZSBzcGVjaWZpZWQgZ3JhcGggY29udGFpbnMgdHJpcGxlcywgdGhlcmUgY2FuIGJlIHJlc3VsdHNcbiAgICAgIGlmIChjb250ZW50ID0gZ3JhcGhzW2dyYXBoXSkge1xuICAgICAgICAvLyBDaG9vc2Ugb3B0aW1hbCBpbmRleCBiYXNlZCBvbiB3aGljaCBmaWVsZHMgYXJlIHdpbGRjYXJkc1xuICAgICAgICBpZiAocHJlZGljYXRlSWQpIHtcbiAgICAgICAgICBpZiAob2JqZWN0SWQpXG4gICAgICAgICAgICAvLyBJZiBwcmVkaWNhdGUgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBQT1MgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeTJLZXlzKGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIG9iamVjdElkLCBjYWxsYmFjayk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgaXMgZ2l2ZW4sIHRoZSBTUE8gaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTEoY29udGVudC5zdWJqZWN0cywgcHJlZGljYXRlSWQsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIE9TUCBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTAoY29udGVudC5vYmplY3RzLCBvYmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm8gcGFyYW1zIGdpdmVuLCBpdGVyYXRlIGFsbCB0aGUgc3ViamVjdHNcbiAgICAgICAgICB0aGlzLl9sb29wKGNvbnRlbnQuc3ViamVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRQcmVkaWNhdGVzYCByZXR1cm5zIGFsbCBwcmVkaWNhdGVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0UHJlZGljYXRlczogZnVuY3Rpb24gKHN1YmplY3QsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSB0aGlzLl9wcmVmaXhlcztcbiAgICByZXR1cm4gdGhpcy5nZXRQcmVkaWNhdGVzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0UHJlZGljYXRlc0J5SVJJYCByZXR1cm5zIGFsbCBwcmVkaWNhdGVzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZ2V0UHJlZGljYXRlc0J5SVJJOiBmdW5jdGlvbiAoc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdGhpcy5mb3JQcmVkaWNhdGVzQnlJUkkoZnVuY3Rpb24gKHApIHsgcmVzdWx0cy5wdXNoKHApOyB9LCBzdWJqZWN0LCBvYmplY3QsIGdyYXBoKTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSxcblxuICAvLyAjIyMgYGZvclByZWRpY2F0ZXNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgcHJlZGljYXRlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvclByZWRpY2F0ZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHRoaXMuZm9yUHJlZGljYXRlc0J5SVJJKFxuICAgICAgY2FsbGJhY2ssXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yUHJlZGljYXRlc0J5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIHByZWRpY2F0ZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBmb3JQcmVkaWNhdGVzQnlJUkk6IGZ1bmN0aW9uIChjYWxsYmFjaywgc3ViamVjdCwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBpZHMgPSB0aGlzLl9pZHMsIGdyYXBocyA9IHRoaXMuX2dldEdyYXBocyhncmFwaCksIGNvbnRlbnQsIHN1YmplY3RJZCwgb2JqZWN0SWQ7XG4gICAgY2FsbGJhY2sgPSB0aGlzLl91bmlxdWVFbnRpdGllcyhjYWxsYmFjayk7XG5cbiAgICAvLyBUcmFuc2xhdGUgSVJJcyB0byBpbnRlcm5hbCBpbmRleCBrZXlzLlxuICAgIGlmIChpc1N0cmluZyhzdWJqZWN0KSAmJiAhKHN1YmplY3RJZCA9IGlkc1tzdWJqZWN0XSkgfHxcbiAgICAgICAgaXNTdHJpbmcob2JqZWN0KSAgJiYgIShvYmplY3RJZCAgPSBpZHNbb2JqZWN0XSkpXG4gICAgICByZXR1cm47XG5cbiAgICBmb3IgKGdyYXBoIGluIGdyYXBocykge1xuICAgICAgLy8gT25seSBpZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW5zIHRyaXBsZXMsIHRoZXJlIGNhbiBiZSByZXN1bHRzXG4gICAgICBpZiAoY29udGVudCA9IGdyYXBoc1tncmFwaF0pIHtcbiAgICAgICAgLy8gQ2hvb3NlIG9wdGltYWwgaW5kZXggYmFzZWQgb24gd2hpY2ggZmllbGRzIGFyZSB3aWxkY2FyZHNcbiAgICAgICAgaWYgKHN1YmplY3RJZCkge1xuICAgICAgICAgIGlmIChvYmplY3RJZClcbiAgICAgICAgICAgIC8vIElmIHN1YmplY3QgYW5kIG9iamVjdCBhcmUgZ2l2ZW4sIHRoZSBPU1AgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICAgIHRoaXMuX2xvb3BCeTJLZXlzKGNvbnRlbnQub2JqZWN0cywgb2JqZWN0SWQsIHN1YmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBpcyBnaXZlbiwgdGhlIFNQTyBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgICAgdGhpcy5fbG9vcEJ5S2V5MChjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmplY3RJZClcbiAgICAgICAgICAvLyBJZiBvbmx5IG9iamVjdCBpcyBnaXZlbiwgdGhlIFBPUyBpbmRleCBpcyBiZXN0LlxuICAgICAgICAgIHRoaXMuX2xvb3BCeUtleTEoY29udGVudC5wcmVkaWNhdGVzLCBvYmplY3RJZCwgY2FsbGJhY2spO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgLy8gSWYgbm8gcGFyYW1zIGdpdmVuLCBpdGVyYXRlIGFsbCB0aGUgcHJlZGljYXRlcy5cbiAgICAgICAgICB0aGlzLl9sb29wKGNvbnRlbnQucHJlZGljYXRlcywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYGdldE9iamVjdHNgIHJldHVybnMgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRPYmplY3RzOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHJldHVybiB0aGlzLmdldE9iamVjdHNCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRPYmplY3RzQnlJUklgIHJldHVybnMgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi5cbiAgLy8gU2V0dGluZyBhbnkgZmllbGQgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluZGljYXRlcyBhIHdpbGRjYXJkLlxuICBnZXRPYmplY3RzQnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB0aGlzLmZvck9iamVjdHNCeUlSSShmdW5jdGlvbiAobykgeyByZXN1bHRzLnB1c2gobyk7IH0sIHN1YmplY3QsIHByZWRpY2F0ZSwgZ3JhcGgpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9LFxuXG4gIC8vICMjIyBgZm9yT2JqZWN0c2AgZXhlY3V0ZXMgdGhlIGNhbGxiYWNrIG9uIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yT2JqZWN0czogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JPYmplY3RzQnlJUkkoXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmb3JPYmplY3RzQnlJUklgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvck9iamVjdHNCeUlSSTogZnVuY3Rpb24gKGNhbGxiYWNrLCBzdWJqZWN0LCBwcmVkaWNhdGUsIGdyYXBoKSB7XG4gICAgdmFyIGlkcyA9IHRoaXMuX2lkcywgZ3JhcGhzID0gdGhpcy5fZ2V0R3JhcGhzKGdyYXBoKSwgY29udGVudCwgc3ViamVjdElkLCBwcmVkaWNhdGVJZDtcbiAgICBjYWxsYmFjayA9IHRoaXMuX3VuaXF1ZUVudGl0aWVzKGNhbGxiYWNrKTtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgaWYgKGlzU3RyaW5nKHN1YmplY3QpICAgJiYgIShzdWJqZWN0SWQgICA9IGlkc1tzdWJqZWN0XSkgfHxcbiAgICAgICAgaXNTdHJpbmcocHJlZGljYXRlKSAmJiAhKHByZWRpY2F0ZUlkID0gaWRzW3ByZWRpY2F0ZV0pKVxuICAgICAgcmV0dXJuO1xuXG4gICAgZm9yIChncmFwaCBpbiBncmFwaHMpIHtcbiAgICAgIC8vIE9ubHkgaWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWlucyB0cmlwbGVzLCB0aGVyZSBjYW4gYmUgcmVzdWx0c1xuICAgICAgaWYgKGNvbnRlbnQgPSBncmFwaHNbZ3JhcGhdKSB7XG4gICAgICAgIC8vIENob29zZSBvcHRpbWFsIGluZGV4IGJhc2VkIG9uIHdoaWNoIGZpZWxkcyBhcmUgd2lsZGNhcmRzXG4gICAgICAgIGlmIChzdWJqZWN0SWQpIHtcbiAgICAgICAgICBpZiAocHJlZGljYXRlSWQpXG4gICAgICAgICAgICAvLyBJZiBzdWJqZWN0IGFuZCBwcmVkaWNhdGUgYXJlIGdpdmVuLCB0aGUgU1BPIGluZGV4IGlzIGJlc3QuXG4gICAgICAgICAgICB0aGlzLl9sb29wQnkyS2V5cyhjb250ZW50LnN1YmplY3RzLCBzdWJqZWN0SWQsIHByZWRpY2F0ZUlkLCBjYWxsYmFjayk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgLy8gSWYgb25seSBzdWJqZWN0IGlzIGdpdmVuLCB0aGUgT1NQIGluZGV4IGlzIGJlc3QuXG4gICAgICAgICAgICB0aGlzLl9sb29wQnlLZXkxKGNvbnRlbnQub2JqZWN0cywgc3ViamVjdElkLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlZGljYXRlSWQpXG4gICAgICAgICAgLy8gSWYgb25seSBwcmVkaWNhdGUgaXMgZ2l2ZW4sIHRoZSBQT1MgaW5kZXggaXMgYmVzdC5cbiAgICAgICAgICB0aGlzLl9sb29wQnlLZXkwKGNvbnRlbnQucHJlZGljYXRlcywgcHJlZGljYXRlSWQsIGNhbGxiYWNrKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIC8vIElmIG5vIHBhcmFtcyBnaXZlbiwgaXRlcmF0ZSBhbGwgdGhlIG9iamVjdHMuXG4gICAgICAgICAgdGhpcy5fbG9vcChjb250ZW50Lm9iamVjdHMsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBnZXRHcmFwaHNgIHJldHVybnMgYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGdldEdyYXBoczogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R3JhcGhzQnlJUkkoXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUoc3ViamVjdCwgICBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUocHJlZGljYXRlLCBwcmVmaXhlcyksXG4gICAgICBleHBhbmRQcmVmaXhlZE5hbWUob2JqZWN0LCAgICBwcmVmaXhlcylcbiAgICApO1xuICB9LFxuXG4gIC8vICMjIyBgZ2V0R3JhcGhzQnlJUklgIHJldHVybnMgYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGdldEdyYXBoc0J5SVJJOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QpIHtcbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHRoaXMuZm9yR3JhcGhzQnlJUkkoZnVuY3Rpb24gKGcpIHsgcmVzdWx0cy5wdXNoKGcpOyB9LCBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0sXG5cbiAgLy8gIyMjIGBmb3JHcmFwaHNgIGV4ZWN1dGVzIHRoZSBjYWxsYmFjayBvbiBhbGwgZ3JhcGhzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYW55IGZpZWxkIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbmRpY2F0ZXMgYSB3aWxkY2FyZC5cbiAgZm9yR3JhcGhzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgdGhpcy5mb3JHcmFwaHNCeUlSSShcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHN1YmplY3QsICAgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKHByZWRpY2F0ZSwgcHJlZml4ZXMpLFxuICAgICAgZXhwYW5kUHJlZml4ZWROYW1lKG9iamVjdCwgICAgcHJlZml4ZXMpXG4gICAgKTtcbiAgfSxcblxuICAvLyAjIyMgYGZvckdyYXBoc0J5SVJJYCBleGVjdXRlcyB0aGUgY2FsbGJhY2sgb24gYWxsIGdyYXBocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGFueSBmaWVsZCB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW5kaWNhdGVzIGEgd2lsZGNhcmQuXG4gIGZvckdyYXBoc0J5SVJJOiBmdW5jdGlvbiAoY2FsbGJhY2ssIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgZm9yICh2YXIgZ3JhcGggaW4gdGhpcy5fZ3JhcGhzKSB7XG4gICAgICB0aGlzLnNvbWVCeUlSSShmdW5jdGlvbiAocXVhZCkge1xuICAgICAgICBjYWxsYmFjayhxdWFkLmdyYXBoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIEhhbHQgaXRlcmF0aW9uIG9mIHNvbWUoKVxuICAgICAgfSwgc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBjcmVhdGVCbGFua05vZGVgIGNyZWF0ZXMgYSBuZXcgYmxhbmsgbm9kZSwgcmV0dXJuaW5nIGl0cyBuYW1lXG4gIGNyZWF0ZUJsYW5rTm9kZTogZnVuY3Rpb24gKHN1Z2dlc3RlZE5hbWUpIHtcbiAgICB2YXIgbmFtZSwgaW5kZXg7XG4gICAgLy8gR2VuZXJhdGUgYSBuYW1lIGJhc2VkIG9uIHRoZSBzdWdnZXN0ZWQgbmFtZVxuICAgIGlmIChzdWdnZXN0ZWROYW1lKSB7XG4gICAgICBuYW1lID0gc3VnZ2VzdGVkTmFtZSA9ICdfOicgKyBzdWdnZXN0ZWROYW1lLCBpbmRleCA9IDE7XG4gICAgICB3aGlsZSAodGhpcy5faWRzW25hbWVdKVxuICAgICAgICBuYW1lID0gc3VnZ2VzdGVkTmFtZSArIGluZGV4Kys7XG4gICAgfVxuICAgIC8vIEdlbmVyYXRlIGEgZ2VuZXJpYyBibGFuayBub2RlIG5hbWVcbiAgICBlbHNlIHtcbiAgICAgIGRvIHsgbmFtZSA9ICdfOmInICsgdGhpcy5fYmxhbmtOb2RlSW5kZXgrKzsgfVxuICAgICAgd2hpbGUgKHRoaXMuX2lkc1tuYW1lXSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgYmxhbmsgbm9kZSB0byB0aGUgZW50aXRpZXMsIGF2b2lkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9pZHNbbmFtZV0gPSArK3RoaXMuX2lkO1xuICAgIHRoaXMuX2VudGl0aWVzW3RoaXMuX2lkXSA9IG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0sXG59O1xuXG4vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nXG5mdW5jdGlvbiBpc1N0cmluZyhzKSB7XG4gIHJldHVybiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgfHwgcyBpbnN0YW5jZW9mIFN0cmluZztcbn1cblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0b3JlO1xuIiwiLy8gKipOM1N0cmVhbVBhcnNlcioqIHBhcnNlcyBhbiBOMyBzdHJlYW0gaW50byBhIHRyaXBsZSBzdHJlYW0uXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtLFxuICAgIHV0aWwgPSByZXF1aXJlKCd1dGlsJyksXG4gICAgTjNQYXJzZXIgPSByZXF1aXJlKCcuL04zUGFyc2VyLmpzJyk7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0cmVhbVBhcnNlcihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOM1N0cmVhbVBhcnNlcikpXG4gICAgcmV0dXJuIG5ldyBOM1N0cmVhbVBhcnNlcihvcHRpb25zKTtcblxuICAvLyBJbml0aWFsaXplIFRyYW5zZm9ybSBiYXNlIGNsYXNzXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIHsgZGVjb2RlU3RyaW5nczogdHJ1ZSB9KTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlID0gdHJ1ZTtcblxuICAvLyBTZXQgdXAgcGFyc2VyXG4gIHZhciBzZWxmID0gdGhpcywgcGFyc2VyID0gbmV3IE4zUGFyc2VyKG9wdGlvbnMpLCBvbkRhdGEsIG9uRW5kO1xuICBwYXJzZXIucGFyc2UoXG4gICAgLy8gUGFzcyBkdW1teSBzdHJlYW0gdG8gb2J0YWluIGBkYXRhYCBhbmQgYGVuZGAgY2FsbGJhY2tzXG4gICAgeyBvbjogZnVuY3Rpb24gKGV2ZW50LCBjYikgeyBldmVudCA9PT0gJ2RhdGEnID8gKG9uRGF0YSA9IGNiKSA6IChvbkVuZCA9IGNiKTsgfSB9LFxuICAgIC8vIEhhbmRsZSB0cmlwbGVzIGJ5IHB1c2hpbmcgdGhlbSBkb3duIHRoZSBwaXBlbGluZVxuICAgIGZ1bmN0aW9uIChlcnJvciwgdCkgeyBlcnJvciAmJiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpIHx8IHQgJiYgc2VsZi5wdXNoKHQpOyB9LFxuICAgIC8vIEVtaXQgcHJlZml4ZXMgdGhyb3VnaCB0aGUgYHByZWZpeGAgZXZlbnRcbiAgICBmdW5jdGlvbiAocHJlZml4LCB1cmkpIHsgc2VsZi5lbWl0KCdwcmVmaXgnLCBwcmVmaXgsIHVyaSk7IH0pO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyB0aHJvdWdoIHBhcnNlciBjYWxsYmFja3NcbiAgdGhpcy5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkgeyBvbkRhdGEoY2h1bmspOyBkb25lKCk7IH07XG4gIHRoaXMuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHsgb25FbmQoKTsgZG9uZSgpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVBhcnNlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0cmVhbVBhcnNlcjtcbiIsIi8vICoqTjNTdHJlYW1Xcml0ZXIqKiBzZXJpYWxpemVzIGEgdHJpcGxlIHN0cmVhbSBpbnRvIGFuIE4zIHN0cmVhbS5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm0sXG4gICAgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSxcbiAgICBOM1dyaXRlciA9IHJlcXVpcmUoJy4vTjNXcml0ZXIuanMnKTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RyZWFtV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpO1xuXG4gIC8vIEluaXRpYWxpemUgVHJhbnNmb3JtIGJhc2UgY2xhc3NcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLm9iamVjdE1vZGUgPSB0cnVlO1xuXG4gIC8vIFNldCB1cCB3cml0ZXIgd2l0aCBhIGR1bW15IHN0cmVhbSBvYmplY3RcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd3JpdGVyID0gbmV3IE4zV3JpdGVyKHtcbiAgICB3cml0ZTogZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHsgc2VsZi5wdXNoKGNodW5rKTsgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTsgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaykgeyBzZWxmLnB1c2gobnVsbCk7IGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7IH0sXG4gIH0sIG9wdGlvbnMpO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyBvbiB0b3Agb2Ygd3JpdGVyXG4gIHRoaXMuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uICh0cmlwbGUsIGVuY29kaW5nLCBkb25lKSB7IHdyaXRlci5hZGRUcmlwbGUodHJpcGxlLCBkb25lKTsgfTtcbiAgdGhpcy5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkgeyB3cml0ZXIuZW5kKGRvbmUpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVdyaXRlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBOM1N0cmVhbVdyaXRlcjtcbiIsIi8vICoqTjNVdGlsKiogcHJvdmlkZXMgTjMgdXRpbGl0eSBmdW5jdGlvbnMuXG5cbnZhciBYc2QgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjJztcbnZhciBYc2RTdHJpbmcgID0gWHNkICsgJ3N0cmluZyc7XG52YXIgWHNkSW50ZWdlciA9IFhzZCArICdpbnRlZ2VyJztcbnZhciBYc2REb3VibGUgPSBYc2QgKyAnZG91YmxlJztcbnZhciBYc2RCb29sZWFuID0gWHNkICsgJ2Jvb2xlYW4nO1xudmFyIFJkZkxhbmdTdHJpbmcgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnO1xuXG52YXIgTjNVdGlsID0ge1xuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYW4gSVJJIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzSVJJOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgaWYgKHR5cGVvZiBlbnRpdHkgIT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2UgaWYgKGVudGl0eS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBlbHNlIHtcbiAgICAgIHZhciBmaXJzdENoYXIgPSBlbnRpdHlbMF07XG4gICAgICByZXR1cm4gZmlyc3RDaGFyICE9PSAnXCInICYmIGZpcnN0Q2hhciAhPT0gJ18nO1xuICAgIH1cbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzTGl0ZXJhbDogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50aXR5ID09PSAnc3RyaW5nJyAmJiBlbnRpdHlbMF0gPT09ICdcIic7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgYmxhbmsgbm9kZSBpbiB0aGUgTjMgbGlicmFyeVxuICBpc0JsYW5rOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRpdHkgPT09ICdzdHJpbmcnICYmIGVudGl0eS5zdWJzdHIoMCwgMikgPT09ICdfOic7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5IHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgZ3JhcGhcbiAgaXNEZWZhdWx0R3JhcGg6IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICByZXR1cm4gIWVudGl0eTtcbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiB0cmlwbGUgaXMgaW4gdGhlIGRlZmF1bHQgZ3JhcGhcbiAgaW5EZWZhdWx0R3JhcGg6IGZ1bmN0aW9uICh0cmlwbGUpIHtcbiAgICByZXR1cm4gIXRyaXBsZS5ncmFwaDtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxWYWx1ZTogZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICB2YXIgbWF0Y2ggPSAvXlwiKFteXSopXCIvLmV4ZWMobGl0ZXJhbCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgIHRocm93IG5ldyBFcnJvcihsaXRlcmFsICsgJyBpcyBub3QgYSBsaXRlcmFsJyk7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9LFxuXG4gIC8vIEdldHMgdGhlIHR5cGUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxUeXBlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpcXF5cXF4oW15cIl0rKXwoQClbXkBcIl0rKT8kLy5leGVjKGxpdGVyYWwpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobGl0ZXJhbCArICcgaXMgbm90IGEgbGl0ZXJhbCcpO1xuICAgIHJldHVybiBtYXRjaFsxXSB8fCAobWF0Y2hbMl0gPyBSZGZMYW5nU3RyaW5nIDogWHNkU3RyaW5nKTtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBsYW5ndWFnZSBvZiBhIGxpdGVyYWwgaW4gdGhlIE4zIGxpYnJhcnlcbiAgZ2V0TGl0ZXJhbExhbmd1YWdlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpAKFteQFwiXSspfFxcXlxcXlteXCJdKyk/JC8uZXhlYyhsaXRlcmFsKTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxpdGVyYWwgKyAnIGlzIG5vdCBhIGxpdGVyYWwnKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgcHJlZml4ZWQgbmFtZVxuICBpc1ByZWZpeGVkTmFtZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiB0eXBlb2YgZW50aXR5ID09PSAnc3RyaW5nJyAmJiAvXlteOlxcL1wiJ10qOlteOlxcL1wiJ10rJC8udGVzdChlbnRpdHkpO1xuICB9LFxuXG4gIC8vIEV4cGFuZHMgdGhlIHByZWZpeGVkIG5hbWUgdG8gYSBmdWxsIElSSSAoYWxzbyB3aGVuIGl0IG9jY3VycyBhcyBhIGxpdGVyYWwncyB0eXBlKVxuICBleHBhbmRQcmVmaXhlZE5hbWU6IGZ1bmN0aW9uIChwcmVmaXhlZE5hbWUsIHByZWZpeGVzKSB7XG4gICAgdmFyIG1hdGNoID0gLyg/Ol58XCJcXF5cXF4pKFteOlxcLyNcIidcXF5fXSopOlteXFwvXSokLy5leGVjKHByZWZpeGVkTmFtZSksIHByZWZpeCwgYmFzZSwgaW5kZXg7XG4gICAgaWYgKG1hdGNoKVxuICAgICAgcHJlZml4ID0gbWF0Y2hbMV0sIGJhc2UgPSBwcmVmaXhlc1twcmVmaXhdLCBpbmRleCA9IG1hdGNoLmluZGV4O1xuICAgIGlmIChiYXNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gcHJlZml4ZWROYW1lO1xuXG4gICAgLy8gVGhlIG1hdGNoIGluZGV4IGlzIG5vbi16ZXJvIHdoZW4gZXhwYW5kaW5nIGEgbGl0ZXJhbCdzIHR5cGVcbiAgICByZXR1cm4gaW5kZXggPT09IDAgPyBiYXNlICsgcHJlZml4ZWROYW1lLnN1YnN0cihwcmVmaXgubGVuZ3RoICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgOiBwcmVmaXhlZE5hbWUuc3Vic3RyKDAsIGluZGV4ICsgMykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBwcmVmaXhlZE5hbWUuc3Vic3RyKGluZGV4ICsgcHJlZml4Lmxlbmd0aCArIDQpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYW4gSVJJIGluIE4zLmpzIHJlcHJlc2VudGF0aW9uXG4gIGNyZWF0ZUlSSTogZnVuY3Rpb24gKGlyaSkge1xuICAgIHJldHVybiBpcmkgJiYgaXJpWzBdID09PSAnXCInID8gTjNVdGlsLmdldExpdGVyYWxWYWx1ZShpcmkpIDogaXJpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYSBsaXRlcmFsIGluIE4zLmpzIHJlcHJlc2VudGF0aW9uXG4gIGNyZWF0ZUxpdGVyYWw6IGZ1bmN0aW9uICh2YWx1ZSwgbW9kaWZpZXIpIHtcbiAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIG1vZGlmaWVyID0gWHNkQm9vbGVhbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNGaW5pdGUodmFsdWUpKVxuICAgICAgICAgIG1vZGlmaWVyID0gdmFsdWUgJSAxID09PSAwID8gWHNkSW50ZWdlciA6IFhzZERvdWJsZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbW9kaWZpZXIgPSBYc2REb3VibGU7XG4gICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4gMCA/ICdJTkYnIDogJy1JTkYnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnXCInICsgdmFsdWUgK1xuICAgICAgICAgICAoL15bYS16XSsoLVthLXowLTldKykqJC9pLnRlc3QobW9kaWZpZXIpID8gJ1wiQCcgICsgbW9kaWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1wiXl4nICsgbW9kaWZpZXIpO1xuICB9LFxuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByZXBlbmRzIHRoZSBnaXZlbiBJUkkgdG8gYSBsb2NhbCBuYW1lXG4gIHByZWZpeDogZnVuY3Rpb24gKGlyaSkge1xuICAgIHJldHVybiBOM1V0aWwucHJlZml4ZXMoeyAnJzogaXJpIH0pKCcnKTtcbiAgfSxcblxuICAvLyBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgcmVnaXN0ZXJpbmcgYW5kIGV4cGFuZGluZyBwcmVmaXhlc1xuICBwcmVmaXhlczogZnVuY3Rpb24gKGRlZmF1bHRQcmVmaXhlcykge1xuICAgIC8vIEFkZCBhbGwgb2YgdGhlIGRlZmF1bHQgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAodmFyIHByZWZpeCBpbiBkZWZhdWx0UHJlZml4ZXMpXG4gICAgICBwcm9jZXNzUHJlZml4KHByZWZpeCwgZGVmYXVsdFByZWZpeGVzW3ByZWZpeF0pO1xuXG4gICAgLy8gUmVnaXN0ZXJzIGEgbmV3IHByZWZpeCAoaWYgYW4gSVJJIHdhcyBzcGVjaWZpZWQpXG4gICAgLy8gb3IgcmV0cmlldmVzIGEgZnVuY3Rpb24gdGhhdCBleHBhbmRzIGFuIGV4aXN0aW5nIHByZWZpeCAoaWYgbm8gSVJJIHdhcyBzcGVjaWZpZWQpXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1ByZWZpeChwcmVmaXgsIGlyaSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHByZWZpeCBpZiBhbiBJUkkgaXMgc3BlY2lmaWVkIG9yIHRoZSBwcmVmaXggZG9lc24ndCBleGlzdFxuICAgICAgaWYgKGlyaSB8fCAhKHByZWZpeCBpbiBwcmVmaXhlcykpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaXJpID0gaXJpIHx8ICcnO1xuICAgICAgICAvLyBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGV4cGFuZHMgdGhlIHByZWZpeFxuICAgICAgICBwcmVmaXhlc1twcmVmaXhdID0gZnVuY3Rpb24gKGxvY2FsTmFtZSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZVtsb2NhbE5hbWVdIHx8IChjYWNoZVtsb2NhbE5hbWVdID0gaXJpICsgbG9jYWxOYW1lKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmVmaXhlc1twcmVmaXhdO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc1ByZWZpeDtcbiAgfSxcbn07XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNVdGlsO1xuIiwiLy8gKipOM1dyaXRlcioqIHdyaXRlcyBOMyBkb2N1bWVudHMuXG5cbi8vIE1hdGNoZXMgYSBsaXRlcmFsIGFzIHJlcHJlc2VudGVkIGluIG1lbW9yeSBieSB0aGUgTjMgbGlicmFyeVxudmFyIE4zTGl0ZXJhbE1hdGNoZXIgPSAvXlwiKFteXSopXCIoPzpcXF5cXF4oLispfEAoW1xcLWEtel0rKSk/JC9pO1xuXG4vLyByZGY6dHlwZSBwcmVkaWNhdGUgKGZvciAnYScgYWJicmV2aWF0aW9uKVxudmFyIFJERl9QUkVGSVggPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycsXG4gICAgUkRGX1RZUEUgICA9IFJERl9QUkVGSVggKyAndHlwZSc7XG5cbi8vIENoYXJhY3RlcnMgaW4gbGl0ZXJhbHMgdGhhdCByZXF1aXJlIGVzY2FwaW5nXG52YXIgZXNjYXBlICAgID0gL1tcIlxcXFxcXHRcXG5cXHJcXGJcXGZcXHUwMDAwLVxcdTAwMTlcXHVkODAwLVxcdWRiZmZdLyxcbiAgICBlc2NhcGVBbGwgPSAvW1wiXFxcXFxcdFxcblxcclxcYlxcZlxcdTAwMDAtXFx1MDAxOV18W1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXS9nLFxuICAgIGVzY2FwZVJlcGxhY2VtZW50cyA9IHtcbiAgICAgICdcXFxcJzogJ1xcXFxcXFxcJywgJ1wiJzogJ1xcXFxcIicsICdcXHQnOiAnXFxcXHQnLFxuICAgICAgJ1xcbic6ICdcXFxcbicsICdcXHInOiAnXFxcXHInLCAnXFxiJzogJ1xcXFxiJywgJ1xcZic6ICdcXFxcZicsXG4gICAgfTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zV3JpdGVyKG91dHB1dFN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNXcml0ZXIpKVxuICAgIHJldHVybiBuZXcgTjNXcml0ZXIob3V0cHV0U3RyZWFtLCBvcHRpb25zKTtcblxuICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhIHN0cmVhbVxuICBpZiAob3V0cHV0U3RyZWFtICYmIHR5cGVvZiBvdXRwdXRTdHJlYW0ud3JpdGUgIT09ICdmdW5jdGlvbicpXG4gICAgb3B0aW9ucyA9IG91dHB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtID0gbnVsbDtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gSWYgbm8gb3V0cHV0IHN0cmVhbSBnaXZlbiwgc2VuZCB0aGUgb3V0cHV0IGFzIHN0cmluZyB0aHJvdWdoIHRoZSBlbmQgY2FsbGJhY2tcbiAgaWYgKCFvdXRwdXRTdHJlYW0pIHtcbiAgICB2YXIgb3V0cHV0ID0gJyc7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtID0ge1xuICAgICAgd3JpdGU6IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHsgb3V0cHV0ICs9IGNodW5rOyBkb25lICYmIGRvbmUoKTsgfSxcbiAgICAgIGVuZDogICBmdW5jdGlvbiAoZG9uZSkgeyBkb25lICYmIGRvbmUobnVsbCwgb3V0cHV0KTsgfSxcbiAgICB9O1xuICAgIHRoaXMuX2VuZFN0cmVhbSA9IHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtO1xuICAgIHRoaXMuX2VuZFN0cmVhbSA9IG9wdGlvbnMuZW5kID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFvcHRpb25zLmVuZDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgd3JpdGVyLCBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdFxuICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgaWYgKCEoL3RyaXBsZXxxdWFkL2kpLnRlc3Qob3B0aW9ucy5mb3JtYXQpKSB7XG4gICAgdGhpcy5fZ3JhcGggPSAnJztcbiAgICB0aGlzLl9wcmVmaXhJUklzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBvcHRpb25zLnByZWZpeGVzICYmIHRoaXMuYWRkUHJlZml4ZXMob3B0aW9ucy5wcmVmaXhlcyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5fd3JpdGVUcmlwbGUgPSB0aGlzLl93cml0ZVRyaXBsZUxpbmU7XG4gIH1cbn1cblxuTjNXcml0ZXIucHJvdG90eXBlID0ge1xuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF93cml0ZWAgd3JpdGVzIHRoZSBhcmd1bWVudCB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBfd3JpdGU6IGZ1bmN0aW9uIChzdHJpbmcsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb3V0cHV0U3RyZWFtLndyaXRlKHN0cmluZywgJ3V0ZjgnLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgICAvLyAjIyMgYF93cml0ZVRyaXBsZWAgd3JpdGVzIHRoZSB0cmlwbGUgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgX3dyaXRlVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoLCBkb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdyaXRlIHRoZSBncmFwaCdzIGxhYmVsIGlmIGl0IGhhcyBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy5fZ3JhcGggIT09IGdyYXBoKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwcmV2aW91cyBncmFwaCBhbmQgc3RhcnQgdGhlIG5ldyBvbmVcbiAgICAgICAgdGhpcy5fd3JpdGUoKHRoaXMuX3N1YmplY3QgPT09IG51bGwgPyAnJyA6ICh0aGlzLl9ncmFwaCA/ICdcXG59XFxuJyA6ICcuXFxuJykpICtcbiAgICAgICAgICAgICAgICAgICAgKGdyYXBoID8gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoZ3JhcGgpICsgJyB7XFxuJyA6ICcnKSk7XG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgICAvLyBEb24ndCB0cmVhdCBpZGVudGljYWwgYmxhbmsgbm9kZXMgYXMgcmVwZWF0aW5nIGdyYXBoc1xuICAgICAgICB0aGlzLl9ncmFwaCA9IGdyYXBoWzBdICE9PSAnWycgPyBncmFwaCA6ICddJztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHJlcGVhdCB0aGUgc3ViamVjdCBpZiBpdCdzIHRoZSBzYW1lXG4gICAgICBpZiAodGhpcy5fc3ViamVjdCA9PT0gc3ViamVjdCkge1xuICAgICAgICAvLyBEb24ndCByZXBlYXQgdGhlIHByZWRpY2F0ZSBpZiBpdCdzIHRoZSBzYW1lXG4gICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGUgPT09IHByZWRpY2F0ZSlcbiAgICAgICAgICB0aGlzLl93cml0ZSgnLCAnICsgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgICAgICAvLyBTYW1lIHN1YmplY3QsIGRpZmZlcmVudCBwcmVkaWNhdGVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXMuX3dyaXRlKCc7XFxuICAgICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVByZWRpY2F0ZSh0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVPYmplY3Qob2JqZWN0KSwgZG9uZSk7XG4gICAgICB9XG4gICAgICAvLyBEaWZmZXJlbnQgc3ViamVjdDsgd3JpdGUgdGhlIHdob2xlIHRyaXBsZVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLl93cml0ZSgodGhpcy5fc3ViamVjdCA9PT0gbnVsbCA/ICcnIDogJy5cXG4nKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVN1YmplY3QodGhpcy5fc3ViamVjdCA9IHN1YmplY3QpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlUHJlZGljYXRlKHRoaXMuX3ByZWRpY2F0ZSA9IHByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVPYmplY3Qob2JqZWN0KSwgZG9uZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBkb25lICYmIGRvbmUoZXJyb3IpOyB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfd3JpdGVUcmlwbGVMaW5lYCB3cml0ZXMgdGhlIHRyaXBsZSBvciBxdWFkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFzIGEgc2luZ2xlIGxpbmVcbiAgX3dyaXRlVHJpcGxlTGluZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIC8vIERvbid0IHVzZSBwcmVmaXhlc1xuICAgIGRlbGV0ZSB0aGlzLl9wcmVmaXhNYXRjaDtcbiAgICAvLyBXcml0ZSB0aGUgdHJpcGxlXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3dyaXRlKHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHN1YmplY3QpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCkgK1xuICAgICAgICAgICAgICAgICAgKGdyYXBoID8gJyAnICsgdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoZ3JhcGgpICsgJy5cXG4nIDogJy5cXG4nKSwgZG9uZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBkb25lICYmIGRvbmUoZXJyb3IpOyB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlSXJpT3JCbGFua05vZGVgIHJlcHJlc2VudHMgYW4gSVJJIG9yIGJsYW5rIG5vZGVcbiAgX2VuY29kZUlyaU9yQmxhbmtOb2RlOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgLy8gQSBibGFuayBub2RlIG9yIGxpc3QgaXMgcmVwcmVzZW50ZWQgYXMtaXNcbiAgICB2YXIgZmlyc3RDaGFyID0gZW50aXR5WzBdO1xuICAgIGlmIChmaXJzdENoYXIgPT09ICdbJyB8fCBmaXJzdENoYXIgPT09ICcoJyB8fCBmaXJzdENoYXIgPT09ICdfJyAmJiBlbnRpdHlbMV0gPT09ICc6JylcbiAgICAgIHJldHVybiBlbnRpdHk7XG4gICAgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgIGlmIChlc2NhcGUudGVzdChlbnRpdHkpKVxuICAgICAgZW50aXR5ID0gZW50aXR5LnJlcGxhY2UoZXNjYXBlQWxsLCBjaGFyYWN0ZXJSZXBsYWNlcik7XG4gICAgLy8gVHJ5IHRvIHJlcHJlc2VudCB0aGUgSVJJIGFzIHByZWZpeGVkIG5hbWVcbiAgICB2YXIgcHJlZml4TWF0Y2ggPSB0aGlzLl9wcmVmaXhSZWdleC5leGVjKGVudGl0eSk7XG4gICAgcmV0dXJuICFwcmVmaXhNYXRjaCA/ICc8JyArIGVudGl0eSArICc+JyA6XG4gICAgICAgICAgICghcHJlZml4TWF0Y2hbMV0gPyBlbnRpdHkgOiB0aGlzLl9wcmVmaXhJUklzW3ByZWZpeE1hdGNoWzFdXSArIHByZWZpeE1hdGNoWzJdKTtcbiAgfSxcblxuICAvLyAjIyMgYF9lbmNvZGVMaXRlcmFsYCByZXByZXNlbnRzIGEgbGl0ZXJhbFxuICBfZW5jb2RlTGl0ZXJhbDogZnVuY3Rpb24gKHZhbHVlLCB0eXBlLCBsYW5ndWFnZSkge1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZXNjYXBlLnRlc3QodmFsdWUpKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKGVzY2FwZUFsbCwgY2hhcmFjdGVyUmVwbGFjZXIpO1xuICAgIC8vIFdyaXRlIHRoZSBsaXRlcmFsLCBwb3NzaWJseSB3aXRoIHR5cGUgb3IgbGFuZ3VhZ2VcbiAgICBpZiAobGFuZ3VhZ2UpXG4gICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiQCcgKyBsYW5ndWFnZTtcbiAgICBlbHNlIGlmICh0eXBlKVxuICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIl5eJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHR5cGUpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZVN1YmplY3RgIHJlcHJlc2VudHMgYSBzdWJqZWN0XG4gIF9lbmNvZGVTdWJqZWN0OiBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgIGlmIChzdWJqZWN0WzBdID09PSAnXCInKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGxpdGVyYWwgYXMgc3ViamVjdCBpcyBub3QgYWxsb3dlZDogJyArIHN1YmplY3QpO1xuICAgIC8vIERvbid0IHRyZWF0IGlkZW50aWNhbCBibGFuayBub2RlcyBhcyByZXBlYXRpbmcgc3ViamVjdHNcbiAgICBpZiAoc3ViamVjdFswXSA9PT0gJ1snKVxuICAgICAgdGhpcy5fc3ViamVjdCA9ICddJztcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUoc3ViamVjdCk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlUHJlZGljYXRlYCByZXByZXNlbnRzIGEgcHJlZGljYXRlXG4gIF9lbmNvZGVQcmVkaWNhdGU6IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcbiAgICBpZiAocHJlZGljYXRlWzBdID09PSAnXCInKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGxpdGVyYWwgYXMgcHJlZGljYXRlIGlzIG5vdCBhbGxvd2VkOiAnICsgcHJlZGljYXRlKTtcbiAgICByZXR1cm4gcHJlZGljYXRlID09PSBSREZfVFlQRSA/ICdhJyA6IHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHByZWRpY2F0ZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlT2JqZWN0YCByZXByZXNlbnRzIGFuIG9iamVjdFxuICBfZW5jb2RlT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgLy8gUmVwcmVzZW50IGFuIElSSSBvciBibGFuayBub2RlXG4gICAgaWYgKG9iamVjdFswXSAhPT0gJ1wiJylcbiAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShvYmplY3QpO1xuICAgIC8vIFJlcHJlc2VudCBhIGxpdGVyYWxcbiAgICB2YXIgbWF0Y2ggPSBOM0xpdGVyYWxNYXRjaGVyLmV4ZWMob2JqZWN0KTtcbiAgICBpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGl0ZXJhbDogJyArIG9iamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUxpdGVyYWwobWF0Y2hbMV0sIG1hdGNoWzJdLCBtYXRjaFszXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfYmxvY2tlZFdyaXRlYCByZXBsYWNlcyBgX3dyaXRlYCBhZnRlciB0aGUgd3JpdGVyIGhhcyBiZWVuIGNsb3NlZFxuICBfYmxvY2tlZFdyaXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgd3JpdGUgYmVjYXVzZSB0aGUgd3JpdGVyIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFRyaXBsZWAgYWRkcyB0aGUgdHJpcGxlIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFRyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIC8vIFRoZSB0cmlwbGUgd2FzIGdpdmVuIGFzIGEgdHJpcGxlIG9iamVjdCwgc28gc2hpZnQgcGFyYW1ldGVyc1xuICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuX3dyaXRlVHJpcGxlKHN1YmplY3Quc3ViamVjdCwgc3ViamVjdC5wcmVkaWNhdGUsIHN1YmplY3Qub2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5ncmFwaCB8fCAnJywgcHJlZGljYXRlKTtcbiAgICAvLyBUaGUgb3B0aW9uYWwgYGdyYXBoYCBwYXJhbWV0ZXIgd2FzIG5vdCBwcm92aWRlZFxuICAgIGVsc2UgaWYgKHR5cGVvZiBncmFwaCAhPT0gJ3N0cmluZycpXG4gICAgICB0aGlzLl93cml0ZVRyaXBsZShzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgJycsIGdyYXBoKTtcbiAgICAvLyBUaGUgYGdyYXBoYCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkXG4gICAgZWxzZVxuICAgICAgdGhpcy5fd3JpdGVUcmlwbGUoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoLCBkb25lKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFRyaXBsZXNgIGFkZHMgdGhlIHRyaXBsZXMgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgYWRkVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaXBsZXMubGVuZ3RoOyBpKyspXG4gICAgICB0aGlzLmFkZFRyaXBsZSh0cmlwbGVzW2ldKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGAgYWRkcyB0aGUgcHJlZml4IHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFByZWZpeDogZnVuY3Rpb24gKHByZWZpeCwgaXJpLCBkb25lKSB7XG4gICAgdmFyIHByZWZpeGVzID0ge307XG4gICAgcHJlZml4ZXNbcHJlZml4XSA9IGlyaTtcbiAgICB0aGlzLmFkZFByZWZpeGVzKHByZWZpeGVzLCBkb25lKTtcbiAgfSxcblxuICAvLyAjIyMgYGFkZFByZWZpeGVzYCBhZGRzIHRoZSBwcmVmaXhlcyB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRQcmVmaXhlczogZnVuY3Rpb24gKHByZWZpeGVzLCBkb25lKSB7XG4gICAgLy8gQWRkIGFsbCB1c2VmdWwgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4SVJJcyA9IHRoaXMuX3ByZWZpeElSSXMsIGhhc1ByZWZpeGVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcHJlZml4IGluIHByZWZpeGVzKSB7XG4gICAgICAvLyBWZXJpZnkgd2hldGhlciB0aGUgcHJlZml4IGNhbiBiZSB1c2VkIGFuZCBkb2VzIG5vdCBleGlzdCB5ZXRcbiAgICAgIHZhciBpcmkgPSBwcmVmaXhlc1twcmVmaXhdO1xuICAgICAgaWYgKC9bI1xcL10kLy50ZXN0KGlyaSkgJiYgcHJlZml4SVJJc1tpcmldICE9PSAocHJlZml4ICs9ICc6JykpIHtcbiAgICAgICAgaGFzUHJlZml4ZXMgPSB0cnVlO1xuICAgICAgICBwcmVmaXhJUklzW2lyaV0gPSBwcmVmaXg7XG4gICAgICAgIC8vIEZpbmlzaCBhIHBvc3NpYmxlIHBlbmRpbmcgdHJpcGxlXG4gICAgICAgIGlmICh0aGlzLl9zdWJqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fd3JpdGUodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpO1xuICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsLCB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIHByZWZpeFxuICAgICAgICB0aGlzLl93cml0ZSgnQHByZWZpeCAnICsgcHJlZml4ICsgJyA8JyArIGlyaSArICc+LlxcbicpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZWNyZWF0ZSB0aGUgcHJlZml4IG1hdGNoZXJcbiAgICBpZiAoaGFzUHJlZml4ZXMpIHtcbiAgICAgIHZhciBJUklsaXN0ID0gJycsIHByZWZpeExpc3QgPSAnJztcbiAgICAgIGZvciAodmFyIHByZWZpeElSSSBpbiBwcmVmaXhJUklzKSB7XG4gICAgICAgIElSSWxpc3QgKz0gSVJJbGlzdCA/ICd8JyArIHByZWZpeElSSSA6IHByZWZpeElSSTtcbiAgICAgICAgcHJlZml4TGlzdCArPSAocHJlZml4TGlzdCA/ICd8JyA6ICcnKSArIHByZWZpeElSSXNbcHJlZml4SVJJXTtcbiAgICAgIH1cbiAgICAgIElSSWxpc3QgPSBJUklsaXN0LnJlcGxhY2UoL1tcXF1cXC9cXChcXClcXCpcXCtcXD9cXC5cXFxcXFwkXS9nLCAnXFxcXCQmJyk7XG4gICAgICB0aGlzLl9wcmVmaXhSZWdleCA9IG5ldyBSZWdFeHAoJ14oPzonICsgcHJlZml4TGlzdCArICcpW15cXC9dKiR8JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ14oJyArIElSSWxpc3QgKyAnKShbYS16QS1aXVtcXFxcLV9hLXpBLVowLTldKikkJyk7XG4gICAgfVxuICAgIC8vIEVuZCBhIHByZWZpeCBibG9jayB3aXRoIGEgbmV3bGluZVxuICAgIHRoaXMuX3dyaXRlKGhhc1ByZWZpeGVzID8gJ1xcbicgOiAnJywgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBibGFua2AgY3JlYXRlcyBhIGJsYW5rIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudFxuICBibGFuazogZnVuY3Rpb24gKHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJlZGljYXRlLCBjaGlsZCwgbGVuZ3RoO1xuICAgIC8vIEVtcHR5IGJsYW5rIG5vZGVcbiAgICBpZiAocHJlZGljYXRlID09PSB1bmRlZmluZWQpXG4gICAgICBjaGlsZHJlbiA9IFtdO1xuICAgIC8vIEJsYW5rIG5vZGUgcGFzc2VkIGFzIGJsYW5rKFwicHJlZGljYXRlXCIsIFwib2JqZWN0XCIpXG4gICAgZWxzZSBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICBjaGlsZHJlbiA9IFt7IHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCB9XTtcbiAgICAvLyBCbGFuayBub2RlIHBhc3NlZCBhcyBibGFuayh7IHByZWRpY2F0ZTogcHJlZGljYXRlLCBvYmplY3Q6IG9iamVjdCB9KVxuICAgIGVsc2UgaWYgKCEoJ2xlbmd0aCcgaW4gcHJlZGljYXRlKSlcbiAgICAgIGNoaWxkcmVuID0gW3ByZWRpY2F0ZV07XG5cbiAgICBzd2l0Y2ggKGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIEdlbmVyYXRlIGFuIGVtcHR5IGJsYW5rIG5vZGVcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJ1tdJztcbiAgICAvLyBHZW5lcmF0ZSBhIG5vbi1uZXN0ZWQgb25lLXRyaXBsZSBibGFuayBub2RlXG4gICAgY2FzZSAxOlxuICAgICAgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZC5vYmplY3RbMF0gIT09ICdbJylcbiAgICAgICAgcmV0dXJuICdbICcgKyB0aGlzLl9lbmNvZGVQcmVkaWNhdGUoY2hpbGQucHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KGNoaWxkLm9iamVjdCkgKyAnIF0nO1xuICAgIC8vIEdlbmVyYXRlIGEgbXVsdGktdHJpcGxlIG9yIG5lc3RlZCBibGFuayBub2RlXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBjb250ZW50cyA9ICdbJztcbiAgICAgIC8vIFdyaXRlIGFsbCB0cmlwbGVzIGluIG9yZGVyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIC8vIFdyaXRlIG9ubHkgdGhlIG9iamVjdCBpcyB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91c1xuICAgICAgICBpZiAoY2hpbGQucHJlZGljYXRlID09PSBwcmVkaWNhdGUpXG4gICAgICAgICAgY29udGVudHMgKz0gJywgJyArIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpO1xuICAgICAgICAvLyBPdGhlcndpc2UsIHdyaXRlIHRoZSBwcmVkaWNhdGUgYW5kIHRoZSBvYmplY3RcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGVudHMgKz0gKGkgPyAnO1xcbiAgJyA6ICdcXG4gICcpICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVQcmVkaWNhdGUoY2hpbGQucHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KGNoaWxkLm9iamVjdCk7XG4gICAgICAgICAgcHJlZGljYXRlID0gY2hpbGQucHJlZGljYXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudHMgKyAnXFxuXSc7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgbGlzdGAgY3JlYXRlcyBhIGxpc3Qgbm9kZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50XG4gIGxpc3Q6IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgIHZhciBsZW5ndGggPSBlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggfHwgMCwgY29udGVudHMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgICAgY29udGVudHNbaV0gPSB0aGlzLl9lbmNvZGVPYmplY3QoZWxlbWVudHNbaV0pO1xuICAgIHJldHVybiAnKCcgKyBjb250ZW50cy5qb2luKCcgJykgKyAnKSc7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcHJlZml4UmVnZXhgIG1hdGNoZXMgYSBwcmVmaXhlZCBuYW1lIG9yIElSSSB0aGF0IGJlZ2lucyB3aXRoIG9uZSBvZiB0aGUgYWRkZWQgcHJlZml4ZXNcbiAgX3ByZWZpeFJlZ2V4OiAvJDBeLyxcblxuICAvLyAjIyMgYGVuZGAgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGVuZDogZnVuY3Rpb24gKGRvbmUpIHtcbiAgICAvLyBGaW5pc2ggYSBwb3NzaWJsZSBwZW5kaW5nIHRyaXBsZVxuICAgIGlmICh0aGlzLl9zdWJqZWN0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl93cml0ZSh0aGlzLl9ncmFwaCA/ICdcXG59XFxuJyA6ICcuXFxuJyk7XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gRGlzYWxsb3cgZnVydGhlciB3cml0aW5nXG4gICAgdGhpcy5fd3JpdGUgPSB0aGlzLl9ibG9ja2VkV3JpdGU7XG5cbiAgICAvLyBUcnkgdG8gZW5kIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgZW5zdXJpbmcgZG9uZSBpcyBjYWxsZWQgZXhhY3RseSBvbmUgdGltZVxuICAgIHZhciBzaW5nbGVEb25lID0gZG9uZSAmJiBmdW5jdGlvbiAoZXJyb3IsIHJlc3VsdCkgeyBzaW5nbGVEb25lID0gbnVsbCwgZG9uZShlcnJvciwgcmVzdWx0KTsgfTtcbiAgICBpZiAodGhpcy5fZW5kU3RyZWFtKSB7XG4gICAgICB0cnkgeyByZXR1cm4gdGhpcy5fb3V0cHV0U3RyZWFtLmVuZChzaW5nbGVEb25lKTsgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7IC8qIGVycm9yIGNsb3Npbmcgc3RyZWFtICovIH1cbiAgICB9XG4gICAgc2luZ2xlRG9uZSAmJiBzaW5nbGVEb25lKCk7XG4gIH0sXG59O1xuXG4vLyBSZXBsYWNlcyBhIGNoYXJhY3RlciBieSBpdHMgZXNjYXBlZCB2ZXJzaW9uXG5mdW5jdGlvbiBjaGFyYWN0ZXJSZXBsYWNlcihjaGFyYWN0ZXIpIHtcbiAgLy8gUmVwbGFjZSBhIHNpbmdsZSBjaGFyYWN0ZXIgYnkgaXRzIGVzY2FwZWQgdmVyc2lvblxuICB2YXIgcmVzdWx0ID0gZXNjYXBlUmVwbGFjZW1lbnRzW2NoYXJhY3Rlcl07XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFJlcGxhY2UgYSBzaW5nbGUgY2hhcmFjdGVyIHdpdGggaXRzIDQtYml0IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlXG4gICAgaWYgKGNoYXJhY3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJlc3VsdCA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgIHJlc3VsdCA9ICdcXFxcdTAwMDAnLnN1YnN0cigwLCA2IC0gcmVzdWx0Lmxlbmd0aCkgKyByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFJlcGxhY2UgYSBzdXJyb2dhdGUgcGFpciB3aXRoIGl0cyA4LWJpdCB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZVxuICAgIGVsc2Uge1xuICAgICAgcmVzdWx0ID0gKChjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMCArXG4gICAgICAgICAgICAgICAgIGNoYXJhY3Rlci5jaGFyQ29kZUF0KDEpICsgMHgyNDAwKS50b1N0cmluZygxNik7XG4gICAgICByZXN1bHQgPSAnXFxcXFUwMDAwMDAwMCcuc3Vic3RyKDAsIDEwIC0gcmVzdWx0Lmxlbmd0aCkgKyByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vICMjIEV4cG9ydHNcbm1vZHVsZS5leHBvcnRzID0gTjNXcml0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtZXJhYmxlLmNhbGwoeyB0b1N0cmluZzogbnVsbCB9LCAndG9TdHJpbmcnKTtcbnZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xudmFyIGRvbnRFbnVtcyA9IFtcblx0J3RvU3RyaW5nJyxcblx0J3RvTG9jYWxlU3RyaW5nJyxcblx0J3ZhbHVlT2YnLFxuXHQnaGFzT3duUHJvcGVydHknLFxuXHQnaXNQcm90b3R5cGVPZicsXG5cdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG5cdCdjb25zdHJ1Y3Rvcidcbl07XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuXHR2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG5cdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xufTtcbnZhciBleGNsdWRlZEtleXMgPSB7XG5cdCRjb25zb2xlOiB0cnVlLFxuXHQkZXh0ZXJuYWw6IHRydWUsXG5cdCRmcmFtZTogdHJ1ZSxcblx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0JGZyYW1lczogdHJ1ZSxcblx0JGlubmVySGVpZ2h0OiB0cnVlLFxuXHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0JG91dGVySGVpZ2h0OiB0cnVlLFxuXHQkb3V0ZXJXaWR0aDogdHJ1ZSxcblx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHQkcGFnZVlPZmZzZXQ6IHRydWUsXG5cdCRwYXJlbnQ6IHRydWUsXG5cdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHQkc2Nyb2xsVG9wOiB0cnVlLFxuXHQkc2Nyb2xsWDogdHJ1ZSxcblx0JHNjcm9sbFk6IHRydWUsXG5cdCRzZWxmOiB0cnVlLFxuXHQkd2Via2l0SW5kZXhlZERCOiB0cnVlLFxuXHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdCR3aW5kb3c6IHRydWVcbn07XG52YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIGhhcy5jYWxsKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcblx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmYWxzZTtcbn0oKSk7XG52YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0LyogZ2xvYmFsIHdpbmRvdyAqL1xuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1Zykge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fVxuXHR0cnkge1xuXHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxudmFyIGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0dmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuXHR2YXIgaXNGdW5jdGlvbiA9IHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cdHZhciB0aGVLZXlzID0gW107XG5cblx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuXHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhqKSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG5cdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKGhhc0RvbnRFbnVtQnVnKSB7XG5cdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0Zm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcblx0XHRcdGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bXNba10gPT09ICdjb25zdHJ1Y3RvcicpICYmIGhhcy5jYWxsKG9iamVjdCwgZG9udEVudW1zW2tdKSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoZUtleXM7XG59O1xuXG5rZXlzU2hpbS5zaGltID0gZnVuY3Rpb24gc2hpbU9iamVjdEtleXMoKSB7XG5cdGlmIChPYmplY3Qua2V5cykge1xuXHRcdHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIFNhZmFyaSA1LjAgYnVnXG5cdFx0XHRyZXR1cm4gKE9iamVjdC5rZXlzKGFyZ3VtZW50cykgfHwgJycpLmxlbmd0aCA9PT0gMjtcblx0XHR9KDEsIDIpKTtcblx0XHRpZiAoIWtleXNXb3Jrc1dpdGhBcmd1bWVudHMpIHtcblx0XHRcdHZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblx0XHRcdE9iamVjdC5rZXlzID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHRcdFx0aWYgKGlzQXJncyhvYmplY3QpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCIvKipcbiogcHJldHR5LWRhdGEgLSBub2RlanMgcGx1Z2luIHRvIHByZXR0eS1wcmludCBvciBtaW5pZnkgZGF0YSBpbiBYTUwsIEpTT04gYW5kIENTUyBmb3JtYXRzLlxuKiAgXG4qIFZlcnNpb24gLSAwLjQwLjBcbiogQ29weXJpZ2h0IChjKSAyMDEyIFZhZGltIEtpcnl1a2hpblxuKiB2a2lyeXVraGluIEAgZ21haWwuY29tXG4qIGh0dHA6Ly93d3cuZXNsaW5zdHJ1Y3Rvci5uZXQvcHJldHR5LWRhdGEvXG4qIFxuKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczpcbiogICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbFxuKlxuKlx0cGQueG1sKGRhdGEgKSAtIHByZXR0eSBwcmludCBYTUw7XG4qXHRwZC5qc29uKGRhdGEpIC0gcHJldHR5IHByaW50IEpTT047XG4qXHRwZC5jc3MoZGF0YSApIC0gcHJldHR5IHByaW50IENTUztcbipcdHBkLnNxbChkYXRhKSAgLSBwcmV0dHkgcHJpbnQgU1FMO1xuKlxuKlx0cGQueG1sbWluKGRhdGEgWywgcHJlc2VydmVDb21tZW50c10gKSAtIG1pbmlmeSBYTUw7IFxuKlx0cGQuanNvbm1pbihkYXRhKSAgICAgICAgICAgICAgICAgICAgICAtIG1pbmlmeSBKU09OOyBcbipcdHBkLmNzc21pbihkYXRhIFssIHByZXNlcnZlQ29tbWVudHNdICkgLSBtaW5pZnkgQ1NTOyBcbipcdHBkLnNxbG1pbihkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgLSBtaW5pZnkgU1FMOyBcbipcbiogUEFSQU1FVEVSUzpcbipcbipcdEBkYXRhICBcdFx0XHQtIFN0cmluZzsgWE1MLCBKU09OLCBDU1Mgb3IgU1FMIHRleHQgdG8gYmVhdXRpZnk7XG4qIFx0QHByZXNlcnZlQ29tbWVudHNcdC0gQm9vbCAob3B0aW9uYWwsIHVzZWQgaW4gbWlueG1sIGFuZCBtaW5jc3Mgb25seSk7IFxuKlx0XHRcdFx0ICBTZXQgdGhpcyBmbGFnIHRvIHRydWUgdG8gcHJldmVudCByZW1vdmluZyBjb21tZW50cyBmcm9tIEB0ZXh0OyBcbipcdEBSZXR1cm4gXHRcdC0gU3RyaW5nO1xuKlx0XG4qIFVTQUdFOlxuKlx0XG4qXHR2YXIgcGQgID0gcmVxdWlyZSgncHJldHR5LWRhdGEnKS5wZDtcbipcbipcdHZhciB4bWxfcHAgICA9IHBkLnhtbCh4bWxfdGV4dCk7XG4qXHR2YXIgeG1sX21pbiAgPSBwZC54bWxtaW4oeG1sX3RleHQgWyx0cnVlXSk7XG4qXHR2YXIganNvbl9wcCAgPSBwZC5qc29uKGpzb25fdGV4dCk7XG4qXHR2YXIganNvbl9taW4gPSBwZC5qc29ubWluKGpzb25fdGV4dCk7XG4qXHR2YXIgY3NzX3BwICAgPSBwZC5jc3MoY3NzX3RleHQpO1xuKlx0dmFyIGNzc19taW4gID0gcGQuY3NzbWluKGNzc190ZXh0IFssIHRydWVdKTtcbipcdHZhciBzcWxfcHAgICA9IHBkLnNxbChzcWxfdGV4dCk7XG4qXHR2YXIgc3FsX21pbiAgPSBwZC5zcWxtaW4oc3FsX3RleHQpO1xuKlxuKiBURVNUOlxuKlx0Y29tcC1uYW1lOnByZXR0eS1kYXRhJCBub2RlIC4vdGVzdC90ZXN0X3htbFxuKlx0Y29tcC1uYW1lOnByZXR0eS1kYXRhJCBub2RlIC4vdGVzdC90ZXN0X2pzb25cbipcdGNvbXAtbmFtZTpwcmV0dHktZGF0YSQgbm9kZSAuL3Rlc3QvdGVzdF9jc3NcbipcdGNvbXAtbmFtZTpwcmV0dHktZGF0YSQgbm9kZSAuL3Rlc3QvdGVzdF9zcWxcbiovXG5cblxuZnVuY3Rpb24gcHAoKSB7XG5cdHRoaXMuc2hpZnQgPSBbJ1xcbiddOyAvLyBhcnJheSBvZiBzaGlmdHNcblx0dGhpcy5zdGVwID0gJyAgJywgLy8gMiBzcGFjZXNcblx0XHRtYXhkZWVwID0gMTAwLCAvLyBuZXN0aW5nIGxldmVsXG5cdFx0aXggPSAwO1xuXG5cdC8vIGluaXRpYWxpemUgYXJyYXkgd2l0aCBzaGlmdHMgLy9cblx0Zm9yKGl4PTA7aXg8bWF4ZGVlcDtpeCsrKXtcblx0XHR0aGlzLnNoaWZ0LnB1c2godGhpcy5zaGlmdFtpeF0rdGhpcy5zdGVwKTsgXG5cdH1cblxufTtcdFxuXHRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFhNTCBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLnhtbCA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIilcblx0XHRcdFx0IC5yZXBsYWNlKC88L2csXCJ+Ojp+PFwiKVxuXHRcdFx0XHQgLnJlcGxhY2UoL3htbG5zXFw6L2csXCJ+Ojp+eG1sbnM6XCIpXG5cdFx0XHRcdCAucmVwbGFjZSgveG1sbnNcXD0vZyxcIn46On54bWxucz1cIilcblx0XHRcdFx0IC5zcGxpdCgnfjo6ficpLFxuXHRcdGxlbiA9IGFyLmxlbmd0aCxcblx0XHRpbkNvbW1lbnQgPSBmYWxzZSxcblx0XHRkZWVwID0gMCxcblx0XHRzdHIgPSAnJyxcblx0XHRpeCA9IDA7XG5cblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXHRcdFx0Ly8gc3RhcnQgY29tbWVudCBvciA8IVtDREFUQVsuLi5dXT4gb3IgPCFET0NUWVBFIC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88IS8pID4gLTEpIHsgXG5cdFx0XHRcdHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XTtcblx0XHRcdFx0aW5Db21tZW50ID0gdHJ1ZTsgXG5cdFx0XHRcdC8vIGVuZCBjb21tZW50ICBvciA8IVtDREFUQVsuLi5dXT4gLy9cblx0XHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC8hRE9DVFlQRS8pID4gLTEgKSB7IFxuXHRcdFx0XHRcdGluQ29tbWVudCA9IGZhbHNlOyBcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8gZW5kIGNvbW1lbnQgIG9yIDwhW0NEQVRBWy4uLl1dPiAvL1xuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvLS0+LykgPiAtMSB8fCBhcltpeF0uc2VhcmNoKC9cXF0+LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IGFyW2l4XTtcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7IFxuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8gPGVsbT48L2VsbT4gLy9cblx0XHRcdGlmKCAvXjxcXHcvLmV4ZWMoYXJbaXgtMV0pICYmIC9ePFxcL1xcdy8uZXhlYyhhcltpeF0pICYmXG5cdFx0XHRcdC9ePFtcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXgtMV0pID09IC9ePFxcL1tcXHc6XFwtXFwuXFwsXSsvLmV4ZWMoYXJbaXhdKVswXS5yZXBsYWNlKCcvJywnJykpIHsgXG5cdFx0XHRcdHN0ciArPSBhcltpeF07XG5cdFx0XHRcdGlmKCFpbkNvbW1lbnQpIGRlZXAtLTtcblx0XHRcdH0gZWxzZVxuXHRcdFx0IC8vIDxlbG0+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPT0gLTEgJiYgYXJbaXhdLnNlYXJjaCgvXFwvPi8pID09IC0xICkge1xuXHRcdFx0XHRzdHIgPSAhaW5Db21tZW50ID8gc3RyICs9IHRoaXMuc2hpZnRbZGVlcCsrXSthcltpeF0gOiBzdHIgKz0gYXJbaXhdO1xuXHRcdFx0fSBlbHNlIFxuXHRcdFx0IC8vIDxlbG0+Li4uPC9lbG0+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFx3LykgPiAtMSAmJiBhcltpeF0uc2VhcmNoKC88XFwvLykgPiAtMSkge1xuXHRcdFx0XHRzdHIgPSAhaW5Db21tZW50ID8gc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdIDogc3RyICs9IGFyW2l4XTtcblx0XHRcdH0gZWxzZSBcblx0XHRcdC8vIDwvZWxtPiAvL1xuXHRcdFx0aWYoYXJbaXhdLnNlYXJjaCgvPFxcLy8pID4gLTEpIHsgXG5cdFx0XHRcdHN0ciA9ICFpbkNvbW1lbnQgPyBzdHIgKz0gdGhpcy5zaGlmdFstLWRlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHQvLyA8ZWxtLz4gLy9cblx0XHRcdGlmKGFyW2l4XS5zZWFyY2goL1xcLz4vKSA+IC0xICkgeyBcblx0XHRcdFx0c3RyID0gIWluQ29tbWVudCA/IHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XSA6IHN0ciArPSBhcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHQvLyA8PyB4bWwgLi4uID8+IC8vXG5cdFx0XHRpZihhcltpeF0uc2VhcmNoKC88XFw/LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fSBlbHNlIFxuXHRcdFx0Ly8geG1sbnMgLy9cblx0XHRcdGlmKCBhcltpeF0uc2VhcmNoKC94bWxuc1xcOi8pID4gLTEgIHx8IGFyW2l4XS5zZWFyY2goL3htbG5zXFw9LykgPiAtMSkgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fSBcblx0XHRcdFxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHN0ciArPSBhcltpeF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRyZXR1cm4gIChzdHJbMF0gPT0gJ1xcbicpID8gc3RyLnNsaWNlKDEpIDogc3RyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBKU09OIHNlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5wcC5wcm90b3R5cGUuanNvbiA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHRpZiAoIHR5cGVvZiB0ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKHRleHQpLCBudWxsLCB0aGlzLnN0ZXApO1xuXHR9XG5cdGlmICggdHlwZW9mIHRleHQgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRleHQsIG51bGwsIHRoaXMuc3RlcCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTUyBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLmNzcyA9IGZ1bmN0aW9uKHRleHQpIHtcblxuXHR2YXIgYXIgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXHsvZyxcInt+Ojp+XCIpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXH0vZyxcIn46On59fjo6flwiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFw7L2csXCI7fjo6flwiKVxuXHRcdFx0XHQucmVwbGFjZSgvXFwvXFwqL2csXCJ+Ojp+LypcIilcblx0XHRcdFx0LnJlcGxhY2UoL1xcKlxcLy9nLFwiKi9+Ojp+XCIpXG5cdFx0XHRcdC5yZXBsYWNlKC9+Ojp+XFxzezAsfX46On4vZyxcIn46On5cIilcblx0XHRcdFx0LnNwbGl0KCd+Ojp+JyksXG5cdFx0bGVuID0gYXIubGVuZ3RoLFxuXHRcdGRlZXAgPSAwLFxuXHRcdHN0ciA9ICcnLFxuXHRcdGl4ID0gMDtcblx0XHRcblx0XHRmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXG5cdFx0XHRpZiggL1xcey8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcCsrXSthcltpeF07XG5cdFx0XHR9IGVsc2UgXG5cdFx0XHRpZiggL1xcfS8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbLS1kZWVwXSthcltpeF07XG5cdFx0XHR9IGVsc2Vcblx0XHRcdGlmKCAvXFwqXFxcXC8uZXhlYyhhcltpeF0pKSAgeyBcblx0XHRcdFx0c3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHN0ciArPSB0aGlzLnNoaWZ0W2RlZXBdK2FyW2l4XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxuezEsfS8sJycpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUUwgc2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGlzU3VicXVlcnkoc3RyLCBwYXJlbnRoZXNpc0xldmVsKSB7XG4gIHJldHVybiAgcGFyZW50aGVzaXNMZXZlbCAtIChzdHIucmVwbGFjZSgvXFwoL2csJycpLmxlbmd0aCAtIHN0ci5yZXBsYWNlKC9cXCkvZywnJykubGVuZ3RoIClcbn1cblxuZnVuY3Rpb24gc3BsaXRfc3FsKHN0ciwgdGFiKSB7XG5cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIilcblxuICAgICAgICAucmVwbGFjZSgvIEFORCAvaWcsXCJ+Ojp+XCIrdGFiK3RhYitcIkFORCBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBCRVRXRUVOIC9pZyxcIn46On5cIit0YWIrXCJCRVRXRUVOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIENBU0UgL2lnLFwifjo6flwiK3RhYitcIkNBU0UgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gRUxTRSAvaWcsXCJ+Ojp+XCIrdGFiK1wiRUxTRSBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBFTkQgL2lnLFwifjo6flwiK3RhYitcIkVORCBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBGUk9NIC9pZyxcIn46On5GUk9NIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEdST1VQXFxzezEsfUJZL2lnLFwifjo6fkdST1VQIEJZIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEhBVklORyAvaWcsXCJ+Ojp+SEFWSU5HIFwiKVxuICAgICAgICAvLy5yZXBsYWNlKC8gSU4gL2lnLFwifjo6flwiK3RhYitcIklOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIElOIC9pZyxcIiBJTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBKT0lOIC9pZyxcIn46On5KT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIENST1NTfjo6fnsxLH1KT0lOIC9pZyxcIn46On5DUk9TUyBKT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIElOTkVSfjo6fnsxLH1KT0lOIC9pZyxcIn46On5JTk5FUiBKT0lOIFwiKVxuICAgICAgICAucmVwbGFjZSgvIExFRlR+Ojp+ezEsfUpPSU4gL2lnLFwifjo6fkxFRlQgSk9JTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBSSUdIVH46On57MSx9Sk9JTiAvaWcsXCJ+Ojp+UklHSFQgSk9JTiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPTiAvaWcsXCJ+Ojp+XCIrdGFiK1wiT04gXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gT1IgL2lnLFwifjo6flwiK3RhYit0YWIrXCJPUiBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPUkRFUlxcc3sxLH1CWS9pZyxcIn46On5PUkRFUiBCWSBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBPVkVSIC9pZyxcIn46On5cIit0YWIrXCJPVkVSIFwiKVxuICAgICAgICAucmVwbGFjZSgvXFwoXFxzezAsfVNFTEVDVCAvaWcsXCJ+Ojp+KFNFTEVDVCBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcKVxcc3swLH1TRUxFQ1QgL2lnLFwiKX46On5TRUxFQ1QgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gVEhFTiAvaWcsXCIgVEhFTn46On5cIit0YWIrXCJcIilcbiAgICAgICAgLnJlcGxhY2UoLyBVTklPTiAvaWcsXCJ+Ojp+VU5JT05+Ojp+XCIpXG4gICAgICAgIC5yZXBsYWNlKC8gVVNJTkcgL2lnLFwifjo6flVTSU5HIFwiKVxuICAgICAgICAucmVwbGFjZSgvIFdIRU4gL2lnLFwifjo6flwiK3RhYitcIldIRU4gXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gV0hFUkUgL2lnLFwifjo6fldIRVJFIFwiKVxuICAgICAgICAucmVwbGFjZSgvIFdJVEggL2lnLFwifjo6fldJVEggXCIpXG4gICAgICAgIC8vLnJlcGxhY2UoL1xcLFxcc3swLH1cXCgvaWcsXCIsfjo6figgXCIpXG4gICAgICAgIC8vLnJlcGxhY2UoL1xcLC9pZyxcIix+Ojp+XCIrdGFiK3RhYitcIlwiKVxuICAgICAgICAucmVwbGFjZSgvIEFMTCAvaWcsXCIgQUxMIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEFTIC9pZyxcIiBBUyBcIilcbiAgICAgICAgLnJlcGxhY2UoLyBBU0MgL2lnLFwiIEFTQyBcIikgXG4gICAgICAgIC5yZXBsYWNlKC8gREVTQyAvaWcsXCIgREVTQyBcIikgXG4gICAgICAgIC5yZXBsYWNlKC8gRElTVElOQ1QgL2lnLFwiIERJU1RJTkNUIFwiKVxuICAgICAgICAucmVwbGFjZSgvIEVYSVNUUyAvaWcsXCIgRVhJU1RTIFwiKVxuICAgICAgICAucmVwbGFjZSgvIE5PVCAvaWcsXCIgTk9UIFwiKVxuICAgICAgICAucmVwbGFjZSgvIE5VTEwgL2lnLFwiIE5VTEwgXCIpXG4gICAgICAgIC5yZXBsYWNlKC8gTElLRSAvaWcsXCIgTElLRSBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcc3swLH1TRUxFQ1QgL2lnLFwiU0VMRUNUIFwiKVxuICAgICAgICAucmVwbGFjZSgvfjo6fnsxLH0vZyxcIn46On5cIilcbiAgICAgICAgLnNwbGl0KCd+Ojp+Jyk7XG59XG5cbnBwLnByb3RvdHlwZS5zcWwgPSBmdW5jdGlvbih0ZXh0KSB7XG5cbiAgICB2YXIgYXJfYnlfcXVvdGUgPSB0ZXh0LnJlcGxhY2UoL1xcc3sxLH0vZyxcIiBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCcvaWcsXCJ+Ojp+XFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ346On4nKSxcbiAgICAgICAgbGVuID0gYXJfYnlfcXVvdGUubGVuZ3RoLFxuICAgICAgICBhciA9IFtdLFxuICAgICAgICBkZWVwID0gMCxcbiAgICAgICAgdGFiID0gdGhpcy5zdGVwLC8vK3RoaXMuc3RlcCxcbiAgICAgICAgaW5Db21tZW50ID0gdHJ1ZSxcbiAgICAgICAgaW5RdW90ZSA9IGZhbHNlLFxuICAgICAgICBwYXJlbnRoZXNpc0xldmVsID0gMCxcbiAgICAgICAgc3RyID0gJycsXG4gICAgICAgIGl4ID0gMDtcblxuICAgIGZvcihpeD0wO2l4PGxlbjtpeCsrKSB7XG5cbiAgICAgICAgaWYoaXglMikge1xuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoYXJfYnlfcXVvdGVbaXhdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyID0gYXIuY29uY2F0KHNwbGl0X3NxbChhcl9ieV9xdW90ZVtpeF0sIHRhYikgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxlbiA9IGFyLmxlbmd0aDtcbiAgICBmb3IoaXg9MDtpeDxsZW47aXgrKykge1xuXG4gICAgICAgIHBhcmVudGhlc2lzTGV2ZWwgPSBpc1N1YnF1ZXJ5KGFyW2l4XSwgcGFyZW50aGVzaXNMZXZlbCk7XG5cbiAgICAgICAgaWYoIC9cXHN7MCx9XFxzezAsfVNFTEVDVFxcc3swLH0vLmV4ZWMoYXJbaXhdKSkgIHsgXG4gICAgICAgICAgICBhcltpeF0gPSBhcltpeF0ucmVwbGFjZSgvXFwsL2csXCIsXFxuXCIrdGFiK3RhYitcIlwiKVxuICAgICAgICB9IFxuXG4gICAgICAgIGlmKCAvXFxzezAsfVxcKFxcc3swLH1TRUxFQ1RcXHN7MCx9Ly5leGVjKGFyW2l4XSkpICB7IFxuICAgICAgICAgICAgZGVlcCsrO1xuICAgICAgICAgICAgc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuICAgICAgICB9IGVsc2UgXG4gICAgICAgIGlmKCAvXFwnLy5leGVjKGFyW2l4XSkgKSAgeyBcbiAgICAgICAgICAgIGlmKHBhcmVudGhlc2lzTGV2ZWw8MSAmJiBkZWVwKSB7XG4gICAgICAgICAgICAgICAgZGVlcC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyICs9IGFyW2l4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlICB7IFxuICAgICAgICAgICAgc3RyICs9IHRoaXMuc2hpZnRbZGVlcF0rYXJbaXhdO1xuICAgICAgICAgICAgaWYocGFyZW50aGVzaXNMZXZlbDwxICYmIGRlZXApIHtcbiAgICAgICAgICAgICAgICBkZWVwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL15cXG57MSx9LywnJykucmVwbGFjZSgvXFxuezEsfS9nLFwiXFxuXCIpO1xuICAgIHJldHVybiBzdHI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pbiBzZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxucHAucHJvdG90eXBlLnhtbG1pbiA9IGZ1bmN0aW9uKHRleHQsIHByZXNlcnZlQ29tbWVudHMpIHtcblxuXHR2YXIgc3RyID0gcHJlc2VydmVDb21tZW50cyA/IHRleHRcblx0XHRcdFx0ICAgOiB0ZXh0LnJlcGxhY2UoL1xcPCFbIFxcclxcblxcdF0qKC0tKFteXFwtXXxbXFxyXFxuXXwtW15cXC1dKSotLVsgXFxyXFxuXFx0XSopXFw+L2csXCJcIik7XG5cdHJldHVybiAgc3RyLnJlcGxhY2UoLz5cXHN7MCx9PC9nLFwiPjxcIik7IFxufVxuXG5wcC5wcm90b3R5cGUuanNvbm1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdFx0XHRcdFx0XHQgIFxuICAgIHJldHVybiAgdGV4dC5yZXBsYWNlKC9cXHN7MCx9XFx7XFxzezAsfS9nLFwie1wiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHN7MCx9XFxbJC9nLFwiW1wiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFtcXHN7MCx9L2csXCJbXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLzpcXHN7MCx9XFxbL2csJzpbJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezAsfVxcfVxcc3swLH0vZyxcIn1cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezAsfVxcXVxcc3swLH0vZyxcIl1cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcIlxcc3swLH1cXCwvZywnXCIsJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwsXFxzezAsfVxcXCIvZywnLFwiJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcIlxcc3swLH06L2csJ1wiOicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLzpcXHN7MCx9XFxcIi9nLCc6XCInKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC86XFxzezAsfVxcWy9nLCc6WycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLFxcc3swLH1cXFsvZywnLFsnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCxcXHN7Mix9L2csJywgJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxdXFxzezAsfSxcXHN7MCx9XFxbL2csJ10sWycpOyAgIFxufVxuXG5wcC5wcm90b3R5cGUuY3NzbWluID0gZnVuY3Rpb24odGV4dCwgcHJlc2VydmVDb21tZW50cykge1xuXHRcblx0dmFyIHN0ciA9IHByZXNlcnZlQ29tbWVudHMgPyB0ZXh0XG5cdFx0XHRcdCAgIDogdGV4dC5yZXBsYWNlKC9cXC9cXCooW14qXXxbXFxyXFxuXXwoXFwqKyhbXiovXXxbXFxyXFxuXSkpKSpcXCorXFwvL2csXCJcIikgO1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UoL1xcc3sxLH0vZywnICcpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXHtcXHN7MSx9L2csXCJ7XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXH1cXHN7MSx9L2csXCJ9XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXDtcXHN7MSx9L2csXCI7XCIpXG5cdFx0XHQgIC5yZXBsYWNlKC9cXC9cXCpcXHN7MSx9L2csXCIvKlwiKVxuXHRcdFx0ICAucmVwbGFjZSgvXFwqXFwvXFxzezEsfS9nLFwiKi9cIik7XG59XHRcblxucHAucHJvdG90eXBlLnNxbG1pbiA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHN7MSx9L2csXCIgXCIpLnJlcGxhY2UoL1xcc3sxLH1cXCgvLFwiKFwiKS5yZXBsYWNlKC9cXHN7MSx9XFwpLyxcIilcIik7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydHMucGQ9IG5ldyBwcDtcdFxuXG5cblxuXG5cblxuXG5cblxuXG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbmV4dFRpY2s7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3MubmV4dFRpY2s7XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgQmxhbmtOb2RlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhCbGFua05vZGUsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBCbGFua05vZGUoaWQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmxhbmtOb2RlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChCbGFua05vZGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihCbGFua05vZGUpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gQmxhbmtOb2RlLnRlcm1UeXBlO1xuICAgIF90aGlzLmlkID0gQmxhbmtOb2RlLm5leHRJZCsrO1xuICAgIF90aGlzLnZhbHVlID0gaWQgfHwgX3RoaXMuaWQudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQmxhbmtOb2RlLCBbe1xuICAgIGtleTogJ2NvbXBhcmVUZXJtJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGFyZVRlcm0ob3RoZXIpIHtcbiAgICAgIGlmICh0aGlzLmNsYXNzT3JkZXIgPCBvdGhlci5jbGFzc09yZGVyKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsYXNzT3JkZXIgPiBvdGhlci5jbGFzc09yZGVyKSB7XG4gICAgICAgIHJldHVybiArMTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlkIDwgb3RoZXIuaWQpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaWQgPiBvdGhlci5pZCkge1xuICAgICAgICByZXR1cm4gKzE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb3B5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weShmb3JtdWxhKSB7XG4gICAgICAvLyBkZXBlbmRzIG9uIHRoZSBmb3JtdWxhXG4gICAgICB2YXIgYm5vZGVOZXcgPSBuZXcgQmxhbmtOb2RlKCk7XG4gICAgICBmb3JtdWxhLmNvcHlUbyh0aGlzLCBibm9kZU5ldyk7XG4gICAgICByZXR1cm4gYm5vZGVOZXc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHJldHVybiAnXzonICsgdGhpcy52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIEJsYW5rTm9kZS5OVEFub255bW91c05vZGVQcmVmaXggKyB0aGlzLmlkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCbGFua05vZGU7XG59KE5vZGUpO1xuXG5CbGFua05vZGUubmV4dElkID0gMDtcbkJsYW5rTm9kZS50ZXJtVHlwZSA9ICdCbGFua05vZGUnO1xuQmxhbmtOb2RlLk5UQW5vbnltb3VzTm9kZVByZWZpeCA9ICdfOm4nO1xuQmxhbmtOb2RlLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnQmxhbmtOb2RlJ107XG5CbGFua05vZGUucHJvdG90eXBlLmlzQmxhbmsgPSAxO1xuQmxhbmtOb2RlLnByb3RvdHlwZS5pc1ZhciA9IDE7XG5cbm1vZHVsZS5leHBvcnRzID0gQmxhbmtOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzT3JkZXIgPSB7XG4gICdMaXRlcmFsJzogMSxcbiAgJ0NvbGxlY3Rpb24nOiAzLFxuICAnR3JhcGgnOiA0LFxuICAnTmFtZWROb2RlJzogNSxcbiAgJ0JsYW5rTm9kZSc6IDYsXG4gICdWYXJpYWJsZSc6IDdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ2xhc3NPcmRlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEJsYW5rTm9kZSA9IHJlcXVpcmUoJy4vYmxhbmstbm9kZScpO1xudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoQ29sbGVjdGlvbiwgX05vZGUpO1xuXG4gIGZ1bmN0aW9uIENvbGxlY3Rpb24oaW5pdGlhbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsZWN0aW9uKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDb2xsZWN0aW9uLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ29sbGVjdGlvbikpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBDb2xsZWN0aW9uLnRlcm1UeXBlO1xuICAgIF90aGlzLmlkID0gQmxhbmtOb2RlLm5leHRJZCsrO1xuICAgIF90aGlzLmVsZW1lbnRzID0gW107XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgaWYgKGluaXRpYWwgJiYgaW5pdGlhbC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuZWxlbWVudHMucHVzaChOb2RlLmZyb21WYWx1ZShlbGVtZW50KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbGxlY3Rpb24sIFt7XG4gICAga2V5OiAnYXBwZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY2xvc2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzaGlmdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoaWZ0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuc2hpZnQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIGVsZW1lbnRzQ29weSA9IHRoaXMuZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlYSkge1xuICAgICAgICBlYS5zdWJzdGl0dXRlKGJpbmRpbmdzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGVsZW1lbnRzQ29weSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9OVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvTlQoKSB7XG4gICAgICByZXR1cm4gQmxhbmtOb2RlLk5UQW5vbnltb3VzTm9kZVByZWZpeCArIHRoaXMuaWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiAnKCcgKyB0aGlzLmVsZW1lbnRzLmpvaW4oJyAnKSArICcpJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bnNoaWZ0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy51bnNoaWZ0KGVsZW1lbnQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb2xsZWN0aW9uO1xufShOb2RlKTtcblxuQ29sbGVjdGlvbi50ZXJtVHlwZSA9ICdDb2xsZWN0aW9uJztcbkNvbGxlY3Rpb24ucHJvdG90eXBlLmNsYXNzT3JkZXIgPSBDbGFzc09yZGVyWydDb2xsZWN0aW9uJ107XG5Db2xsZWN0aW9uLnByb3RvdHlwZS5jb21wYXJlVGVybSA9IEJsYW5rTm9kZS5wcm90b3R5cGUuY29tcGFyZVRlcm07XG5Db2xsZWN0aW9uLnByb3RvdHlwZS5pc1ZhciA9IDA7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGVjdGlvbjsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzLmNvbnZlcnRUb0pzb24gPSBjb252ZXJ0VG9Kc29uO1xubW9kdWxlLmV4cG9ydHMuY29udmVydFRvTlF1YWRzID0gY29udmVydFRvTlF1YWRzO1xuXG52YXIgYXN5bmNMaWIgPSByZXF1aXJlKCdhc3luYycpOyAvLyBAQCBHb2FsOiByZW1vdmUgdGhpcyBkZXBlbmRlbmN5XG52YXIganNvbmxkID0gcmVxdWlyZSgnanNvbmxkJyk7XG52YXIgTjMgPSByZXF1aXJlKCduMycpOyAvLyBAQCBHb2FsOiByZW1vdmUgdGhpcyBkZXBlbmRlbmN5XG5cbmZ1bmN0aW9uIGNvbnZlcnRUb0pzb24objNTdHJpbmcsIGpzb25DYWxsYmFjaykge1xuICB2YXIganNvblN0cmluZztcbiAgdmFyIG4zUGFyc2VyID0gTjMuUGFyc2VyKCk7XG4gIHZhciBuM1dyaXRlciA9IE4zLldyaXRlcih7XG4gICAgZm9ybWF0OiAnTi1RdWFkcydcbiAgfSk7XG4gIGFzeW5jTGliLndhdGVyZmFsbChbZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgbjNQYXJzZXIucGFyc2UobjNTdHJpbmcsIGNhbGxiYWNrKTtcbiAgfSwgZnVuY3Rpb24gKHRyaXBsZSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgIGlmICh0cmlwbGUgIT09IG51bGwpIHtcbiAgICAgIG4zV3JpdGVyLmFkZFRyaXBsZSh0cmlwbGUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuM1dyaXRlci5lbmQoY2FsbGJhY2spO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJlc3VsdCwgY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAganNvbmxkLmZyb21SREYocmVzdWx0LCB7XG4gICAgICAgIGZvcm1hdDogJ2FwcGxpY2F0aW9uL25xdWFkcydcbiAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAoanNvbiwgY2FsbGJhY2spIHtcbiAgICBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoanNvbik7XG4gICAganNvbkNhbGxiYWNrKG51bGwsIGpzb25TdHJpbmcpO1xuICB9XSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAganNvbkNhbGxiYWNrKGVyciwganNvblN0cmluZyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VG9OUXVhZHMobjNTdHJpbmcsIG5xdWFkQ2FsbGJhY2spIHtcbiAgdmFyIG5xdWFkU3RyaW5nO1xuICB2YXIgbjNQYXJzZXIgPSBOMy5QYXJzZXIoKTtcbiAgdmFyIG4zV3JpdGVyID0gTjMuV3JpdGVyKHtcbiAgICBmb3JtYXQ6ICdOLVF1YWRzJ1xuICB9KTtcbiAgYXN5bmNMaWIud2F0ZXJmYWxsKFtmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBuM1BhcnNlci5wYXJzZShuM1N0cmluZywgY2FsbGJhY2spO1xuICB9LCBmdW5jdGlvbiAodHJpcGxlLCBwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRyaXBsZSAhPT0gbnVsbCkge1xuICAgICAgbjNXcml0ZXIuYWRkVHJpcGxlKHRyaXBsZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG4zV3JpdGVyLmVuZChjYWxsYmFjayk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAocmVzdWx0LCBjYWxsYmFjaykge1xuICAgIG5xdWFkU3RyaW5nID0gcmVzdWx0O1xuICAgIG5xdWFkQ2FsbGJhY2sobnVsbCwgbnF1YWRTdHJpbmcpO1xuICB9XSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgbnF1YWRDYWxsYmFjayhlcnIsIG5xdWFkU3RyaW5nKTtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2luZGV4ZWRGb3JtdWxhID0gcmVxdWlyZSgnLi9pbmRleGVkLWZvcm11bGEnKTtcblxudmFyIF9pbmRleGVkRm9ybXVsYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmRleGVkRm9ybXVsYSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBCbGFua05vZGUgPSByZXF1aXJlKCcuL2JsYW5rLW5vZGUnKTtcbnZhciBDb2xsZWN0aW9uID0gcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyk7XG52YXIgRGVmYXVsdEdyYXBoID0gcmVxdWlyZSgnLi9kZWZhdWx0LWdyYXBoJyk7XG52YXIgRmV0Y2hlciA9IHJlcXVpcmUoJy4vZmV0Y2hlcicpO1xuXG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgVmFyaWFibGUgPSByZXF1aXJlKCcuL3ZhcmlhYmxlJyk7XG5cbmZ1bmN0aW9uIGJsYW5rTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IEJsYW5rTm9kZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBjb2xsZWN0aW9uKGVsZW1lbnRzKSB7XG4gIHJldHVybiBuZXcgQ29sbGVjdGlvbihlbGVtZW50cyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0R3JhcGgoKSB7XG4gIHJldHVybiBuZXcgRGVmYXVsdEdyYXBoKCk7XG59XG5mdW5jdGlvbiBmZXRjaGVyKHN0b3JlLCB0aW1lb3V0LCBhc3luYykge1xuICByZXR1cm4gbmV3IEZldGNoZXIoc3RvcmUsIHRpbWVvdXQsIGFzeW5jKTtcbn1cbmZ1bmN0aW9uIGdyYXBoKCkge1xuICByZXR1cm4gbmV3IF9pbmRleGVkRm9ybXVsYTIuZGVmYXVsdCgpO1xufVxuZnVuY3Rpb24gbGl0KHZhbCwgbGFuZywgZHQpIHtcbiAgcmV0dXJuIG5ldyBMaXRlcmFsKCcnICsgdmFsLCBsYW5nLCBkdCk7XG59XG5mdW5jdGlvbiBsaXRlcmFsKHZhbHVlLCBsYW5ndWFnZU9yRGF0YXR5cGUpIHtcbiAgaWYgKHR5cGVvZiBsYW5ndWFnZU9yRGF0YXR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGxhbmd1YWdlT3JEYXRhdHlwZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwodmFsdWUsIGxhbmd1YWdlT3JEYXRhdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSwgbnVsbCwgbmFtZWROb2RlKGxhbmd1YWdlT3JEYXRhdHlwZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IExpdGVyYWwodmFsdWUsIG51bGwsIGxhbmd1YWdlT3JEYXRhdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5hbWVkTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWVkTm9kZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBxdWFkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICBncmFwaCA9IGdyYXBoIHx8IG5ldyBEZWZhdWx0R3JhcGgoKTtcbiAgcmV0dXJuIG5ldyBTdGF0ZW1lbnQoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKTtcbn1cbmZ1bmN0aW9uIHN0KHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICByZXR1cm4gbmV3IFN0YXRlbWVudChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpO1xufVxuZnVuY3Rpb24gdHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gIHJldHVybiBxdWFkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KTtcbn1cbmZ1bmN0aW9uIHZhcmlhYmxlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBWYXJpYWJsZShuYW1lKTtcbn1cblxuLy8gcmRmanMgc3BlYyBmYWN0b3J5IG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzLmJsYW5rTm9kZSA9IGJsYW5rTm9kZTtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHRHcmFwaCA9IGRlZmF1bHRHcmFwaDtcbm1vZHVsZS5leHBvcnRzLmdyYXBoID0gZ3JhcGg7XG5tb2R1bGUuZXhwb3J0cy5saXRlcmFsID0gbGl0ZXJhbDtcbm1vZHVsZS5leHBvcnRzLm5hbWVkTm9kZSA9IG5hbWVkTm9kZTtcbm1vZHVsZS5leHBvcnRzLnF1YWQgPSBxdWFkO1xubW9kdWxlLmV4cG9ydHMudHJpcGxlID0gdHJpcGxlO1xubW9kdWxlLmV4cG9ydHMudmFyaWFibGUgPSB2YXJpYWJsZTtcblxuLy8gcmRmbGliIG9ubHlcbm1vZHVsZS5leHBvcnRzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xubW9kdWxlLmV4cG9ydHMuZmV0Y2hlciA9IGZldGNoZXI7XG5tb2R1bGUuZXhwb3J0cy5saXQgPSBsaXQ7XG5tb2R1bGUuZXhwb3J0cy5zdCA9IHN0OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgRGVmYXVsdEdyYXBoID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhEZWZhdWx0R3JhcGgsIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBEZWZhdWx0R3JhcGgoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmF1bHRHcmFwaCk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRGVmYXVsdEdyYXBoLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRGVmYXVsdEdyYXBoKSkuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy50ZXJtVHlwZSA9ICdEZWZhdWx0R3JhcGgnO1xuICAgIF90aGlzLnZhbHVlID0gJyc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERlZmF1bHRHcmFwaCwgW3tcbiAgICBrZXk6ICd0b0Nhbm9uaWNhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvQ2Fub25pY2FsKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERlZmF1bHRHcmFwaDtcbn0oTm9kZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGVmYXVsdEdyYXBoOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG4vKipcbiAqIFNpbmdsZXRvbiBzdWJjbGFzcyBvZiBhbiBlbXB0eSBDb2xsZWN0aW9uLlxuICovXG5cbnZhciBFbXB0eSA9IGZ1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoRW1wdHksIF9Ob2RlKTtcblxuICBmdW5jdGlvbiBFbXB0eSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1wdHkpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEVtcHR5Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRW1wdHkpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gRW1wdHkudGVybVR5cGU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEVtcHR5LCBbe1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJygpJztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1wdHk7XG59KE5vZGUpO1xuXG5FbXB0eS50ZXJtVHlwZSA9ICdlbXB0eSc7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1wdHk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbi8qIGdsb2JhbCAkU29saWRUZXN0RW52aXJvbm1lbnQgKi9cbi8qKlxuICpcbiAqIFByb2plY3Q6IHJkZmxpYi5qc1xuICpcbiAqIEZpbGU6IGZldGNoZXIuanNcbiAqXG4gKiBEZXNjcmlwdGlvbjogY29udGFpbnMgZnVuY3Rpb25zIGZvciByZXF1ZXN0aW5nL2ZldGNoaW5nL3JldHJhY3RpbmdcbiAqICBUaGlzIGltcGxlbWVudHMgcXVpdGUgYSBsb3Qgb2YgdGhlIHdlYiBhcmNoaXRlY3R1cmUuXG4gKiBBIGZldGNoZXIgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBrbm93bGVkZ2UgYmFzZSBncmFwaCwgaW50byB3aGljaFxuICogaXQgbG9hZHMgc3R1ZmYgYW5kIGludG8gd2hpY2ggaXQgd3JpdGVzIGl0cyBtZXRhZGF0YVxuICogQEAgVGhlIG1ldGFkYXRhIHNob3VsZCBiZSBvcHRpb25hbGx5IGEgc2VwYXJhdGUgZ3JhcGhcbiAqXG4gKiAtIGltcGxlbWVudHMgc2VtYW50aWNzIG9mIEhUVFAgaGVhZGVycywgSW50ZXJuZXQgQ29udGVudCBUeXBlc1xuICogLSBzZWxlY3RzIHBhcnNlcnMgZm9yIHJkZi94bWwsIG4zLCByZGZhLCBncmRkbFxuICpcbiAqIERlcGVuZGVuY2llczpcbiAqXG4gKiBuZWVkczogdXRpbC5qcyB1cmkuanMgdGVybS5qcyByZGZwYXJzZXIuanMgcmRmYS5qcyBuM3BhcnNlci5qc1xuICogICAgICBpZGVudGl0eS5qcyBzcGFycWwuanMganNvbnBhcnNlci5qc1xuICpcbiAqIEluZGVwZW5kZW50IG9mIGpRdWVyeVxuICovXG5cbi8qKlxuICogVGhpbmdzIHRvIHRlc3Q6IGNhbGxiYWNrcyBvbiByZXF1ZXN0LCByZWZyZXNoLCByZXRyYWN0XG4gKiAgIGxvYWRpbmcgZnJvbSBIVFRQLCBIVFRQUywgRlRQLCBGSUxFLCBvdGhlcnM/XG4gKiBUbyBkbzpcbiAqIEZpcmluZyB1cCBhIG1haWwgY2xpZW50IGZvciBtaWQ6ICAobWVzc2FnZTopIFVSTHNcbiAqL1xudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG52YXIgTjNQYXJzZXIgPSByZXF1aXJlKCcuL24zcGFyc2VyJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTmFtZXNwYWNlID0gcmVxdWlyZSgnLi9uYW1lc3BhY2UnKTtcbnZhciByZGZQYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBwYXJzZVJERmFET00gPSByZXF1aXJlKCcuL3JkZmFwYXJzZXInKS5wYXJzZVJERmFET007XG52YXIgUkRGUGFyc2VyID0gcmVxdWlyZSgnLi9yZGZ4bWxwYXJzZXInKTtcbnZhciBVcmkgPSByZXF1aXJlKCcuL3VyaScpO1xudmFyIFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBzZXJpYWxpemUgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZScpO1xuXG52YXIgUGFyc2FibGUgPSB7XG4gICd0ZXh0L24zJzogdHJ1ZSxcbiAgJ3RleHQvdHVydGxlJzogdHJ1ZSxcbiAgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOiB0cnVlLFxuICAnYXBwbGljYXRpb24veGh0bWwreG1sJzogdHJ1ZSxcbiAgJ3RleHQvaHRtbCc6IHRydWUsXG4gICdhcHBsaWNhdGlvbi9sZCtqc29uJzogdHJ1ZVxufTtcblxudmFyIEZldGNoZXIgPSBmdW5jdGlvbiBGZXRjaGVyKHN0b3JlLCB0aW1lb3V0LCBhc3luYykge1xuICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gIHRoaXMudGhpc1VSSSA9ICdodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvMjAwNS9hamFyL2FqYXcvcmRmL3NvdXJjZXMuanMnICsgJyNTb3VyY2VGZXRjaGVyJzsgLy8gLS0gS2VubnlcbiAgdGhpcy50aW1lb3V0ID0gdGltZW91dCB8fCAzMDAwMDtcbiAgdGhpcy5hc3luYyA9IGFzeW5jICE9IG51bGwgPyBhc3luYyA6IHRydWU7XG4gIHRoaXMuYXBwTm9kZSA9IHRoaXMuc3RvcmUuYm5vZGUoKTsgLy8gRGVub3RpbmcgdGhpcyBzZXNzaW9uXG4gIHRoaXMuc3RvcmUuZmV0Y2hlciA9IHRoaXM7IC8vIEJpLWxpbmtlZFxuICB0aGlzLnJlcXVlc3RlZCA9IHt9O1xuICAvLyB0aGlzLnJlcXVlc3RlZFt1cmldIHN0YXRlczpcbiAgLy8gICB1bmRlZmluZWQgICAgIG5vIHJlY29yZCBvZiB3ZWIgYWNjZXNzIG9yIHJlY29yZHMgcmVzZXRcbiAgLy8gICB0cnVlICAgICAgICAgIGhhcyBiZWVuIHJlcXVlc3RlZCwgWEhSIGluIHByb2dyZXNzXG4gIC8vICAgJ2RvbmUnICAgICAgICByZWNlaXZlZCwgT2tcbiAgLy8gICA0MDMgICAgICAgICAgIEhUVFAgc3RhdHVzIHVuYXV0aG9yaXplZFxuICAvLyAgIDQwNCAgICAgICAgICAgUmVzc291cmNlIGRvZXMgbm90IGV4aXN0LiBDYW4gYmUgY3JlYXRlZCBldGMuXG4gIC8vICAgJ3JlZGlyZWN0ZWQnICBJbiBhdHRlbXB0IHRvIGNvdW50ZXIgQ09SUyBwcm9ibGVtcyByZXRyaWVkLlxuICAvLyAgIG90aGVyIHN0cmluZ3MgbWVhbiB2YXJpb3VzIG90aGVyIGVycm9zLCBzdWNoIGFzIHBhcnNlIGVycnJvcy5cbiAgLy9cbiAgdGhpcy5yZWRpcmVjdGVkVG8gPSB7fTsgLy8gV2VobiAncmVkaXJlY2VkJ1xuICB0aGlzLmZldGNoQ2FsbGJhY2tzID0ge307IC8vIGZldGNoQ2FsbGJhY2tzW3VyaV0ucHVzaChjYWxsYmFjaylcblxuICB0aGlzLm5vbmV4aXN0YW50ID0ge307IC8vIGtlZXAgdHJhY2sgb2YgZXhwbGljdCA0MDRzIC0+IHdlIGNhbiBvdmVyd3JpdGUgZXRjXG4gIHRoaXMubG9va2VkVXAgPSB7fTtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB0aGlzLm1lZGlhdHlwZXMgPSB7fTtcbiAgdmFyIHNmID0gdGhpcztcbiAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgdmFyIG5zID0ge307IC8vIENvbnZlbmllbmNlIG5hbWVzcGFjZXMgbmVlZGVkIGluIHRoaXMgbW9kdWxlOlxuICAvLyBUaGVzZSBhcmUgZGVsaWJlcnRlbHkgbm90IGV4cG9ydGVkIGFzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZFxuICAvLyBtYWtlIGl0cyBvd24gbGlzdCBhbmQgbm90IHJlbHkgb24gdGhlIHByZWZpeGVzIHVzZWQgaGVyZSxcbiAgLy8gYW5kIG5vdCBiZSB0ZW1wdGVkIHRvIGFkZCB0byB0aGVtLCBhbmQgdGhlbSBjbGFzaCB3aXRoIHRob3NlIG9mIGFub3RoZXJcbiAgLy8gYXBwbGljYXRpb24uXG4gIG5zLmxpbmsgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjJyk7XG4gIG5zLmh0dHAgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2h0dHAjJyk7XG4gIG5zLmh0dHBoID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9odHRwaCMnKTtcbiAgbnMucmRmID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyk7XG4gIG5zLnJkZnMgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSMnKTtcbiAgbnMuZGMgPSBOYW1lc3BhY2UoJ2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJyk7XG5cbiAgc2YubWVkaWF0eXBlc1snaW1hZ2UvKiddID0ge1xuICAgICdxJzogMC45XG4gIH07XG5cbiAgc2YubWVkaWF0eXBlc1snKi8qJ10gPSB7IC8vIE11c3QgYWxsb3cgYWNjZXNzIHRvIHJhbmRvbSBjb250ZW50XG4gICAgJ3EnOiAwLjFcbiAgfTtcblxuICBGZXRjaGVyLmNyb3NzU2l0ZVByb3h5ID0gZnVuY3Rpb24gKHVyaSkge1xuICAgIGlmIChGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiBGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUucmVwbGFjZSgne3VyaX0nLCBlbmNvZGVVUklDb21wb25lbnQodXJpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIEZldGNoZXIuUkRGWE1MSGFuZGxlciA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIHRoaXMuZG9tID0gYXJnc1swXTtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgLy8gc2YuYWRkU3RhdHVzKHhoci5yZXEsICdwYXJzaW5nIHNvb24gYXMgUkRGL1hNTC4uLicpXG4gICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB0aGlzLmRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIHZhciByb290ID0gdGhpcy5kb20uZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBpZiAocm9vdC5ub2RlTmFtZSA9PT0gJ3BhcnNlcmVycm9yJykge1xuICAgICAgICAgIC8vIEBAIE1vemlsbGEgb25seSBTZWUgaXNzdWUvaXNzdWUxMTBcbiAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCAnQmFkbHkgZm9ybWVkIFhNTCBpbiAnICsgeGhyLnJlc291cmNlLnVyaSk7IC8vIGhhdmUgdG8gZmFpbCB0aGUgcmVxdWVzdFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkbHkgZm9ybWVkIFhNTCBpbiAnICsgeGhyLnJlc291cmNlLnVyaSk7IC8vIEBAIEFkZCBkZXRhaWxzXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBSREZQYXJzZXIoa2IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlci5wYXJzZSh0aGlzLmRvbSwgeGhyLm9yaWdpbmFsLnVyaSwgeGhyLm9yaWdpbmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnU3ludGF4IGVycm9yIHBhcnNpbmcgUkRGL1hNTCEgJyArIGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdTeW50YXggZXJyb3IgcGFyc2luZyBSREYvWE1MISAnICsgZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF4aHIub3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICBrYi5hZGQoeGhyLm9yaWdpbmFsLCBucy5yZGYoJ3R5cGUnKSwgbnMubGluaygnUkRGRG9jdW1lbnQnKSwgc2YuYXBwTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2IoKTtcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgRmV0Y2hlci5SREZYTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnUkRGWE1MSGFuZGxlcic7XG4gIH07XG4gIEZldGNoZXIuUkRGWE1MSGFuZGxlci5yZWdpc3RlciA9IGZ1bmN0aW9uIChzZikge1xuICAgIHNmLm1lZGlhdHlwZXNbJ2FwcGxpY2F0aW9uL3JkZit4bWwnXSA9IHtcbiAgICAgICdxJzogMC45XG4gICAgfTtcbiAgfTtcbiAgRmV0Y2hlci5SREZYTUxIYW5kbGVyLnBhdHRlcm4gPSBuZXcgUmVnRXhwKCdhcHBsaWNhdGlvbi9yZGZcXFxcK3htbCcpO1xuXG4gIC8vIFRoaXMgd291bGQgbXVjaCBiZXR0ZXIgdXNlIG9uLWJvYXJkIFhTTFQgZW5naW5lLiBAQFxuICAvKiAgZGVwcm9jYXRlZCAyMDE2LTAyLTE3ICB0aW1ibFxuICBGZXRjaGVyLmRvR1JEREwgPSBmdW5jdGlvbihrYiwgZG9jLCB4c2x0dXJpLCB4bWx1cmkpIHtcbiAgICAgIHNmLnJlcXVlc3RVUkkoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvJyArICdvbmxpbmVfeHNsdC94c2x0PycgKyAneHNsZmlsZT0nICsgZXNjYXBlKHhzbHR1cmkpICsgJyZ4bWxmaWxlPScgKyBlc2NhcGUoeG1sdXJpKSwgZG9jKVxuICB9XG4gICovXG4gIEZldGNoZXIuWEhUTUxIYW5kbGVyID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICBpZiAoYXJncykge1xuICAgICAgdGhpcy5kb20gPSBhcmdzWzBdO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICB2YXIgcmVsYXRpb24sIHJldmVyc2U7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICB0aGlzLmRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtiID0gc2Yuc3RvcmU7XG5cbiAgICAgICAgLy8gZGM6dGl0bGVcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RpdGxlJyk7XG4gICAgICAgIGlmICh0aXRsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwgbnMuZGMoJ3RpdGxlJyksIGtiLmxpdGVyYWwodGl0bGVbMF0udGV4dENvbnRlbnQpLCB4aHIucmVzb3VyY2UpO1xuICAgICAgICAgIC8vIGxvZy5pbmZvKFwiSW5mZXJyaW5nIHRpdGxlIG9mIFwiICsgeGhyLnJlc291cmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGluayByZWxcbiAgICAgICAgdmFyIGxpbmtzID0gdGhpcy5kb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcbiAgICAgICAgZm9yICh2YXIgeCA9IGxpbmtzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICAgICAgLy8gQEAgcmV2XG4gICAgICAgICAgcmVsYXRpb24gPSBsaW5rc1t4XS5nZXRBdHRyaWJ1dGUoJ3JlbCcpO1xuICAgICAgICAgIHJldmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICByZWxhdGlvbiA9IGxpbmtzW3hdLmdldEF0dHJpYnV0ZSgncmV2Jyk7XG4gICAgICAgICAgICByZXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICBzZi5saW5rRGF0YSh4aHIsIHJlbGF0aW9uLCBsaW5rc1t4XS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSwgeGhyLnJlc291cmNlLCByZXZlcnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEYXRhIElzbGFuZHNcblxuICAgICAgICB2YXIgc2NyaXB0cyA9IHRoaXMuZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gc2NyaXB0c1tpXS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICAgICAgICBpZiAoUGFyc2FibGVbY29udGVudFR5cGVdKSB7XG4gICAgICAgICAgICByZGZQYXJzZShzY3JpcHRzW2ldLnRleHRDb250ZW50LCBrYiwgeGhyLm9yaWdpbmFsLnVyaSwgY29udGVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwgbnMucmRmKCd0eXBlJyksIG5zLmxpbmsoJ1dlYlBhZ2UnKSwgc2YuYXBwTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXhoci5vcHRpb25zLm5vUkRGYSAmJiBwYXJzZVJERmFET00pIHtcbiAgICAgICAgICAvLyBlbmFibGUgYnkgZGVmYXVsdFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZVJERmFET00odGhpcy5kb20sIGtiLCB4aHIub3JpZ2luYWwudXJpKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gJ0Vycm9yIHRyeWluZyB0byBwYXJzZSAnICsgeGhyLnJlc291cmNlICsgJyBhcyBSREZhOlxcbicgKyBlICsgJzpcXG4nICsgZS5zdGFjaztcbiAgICAgICAgICAgIC8vIGR1bXAobXNnK1wiXFxuXCIpXG4gICAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCBtc2cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYigpOyAvLyBGaXJlIGRvbmUgY2FsbGJhY2tzXG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gIEZldGNoZXIuWEhUTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnWEhUTUxIYW5kbGVyJztcbiAgfTtcbiAgRmV0Y2hlci5YSFRNTEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSA9IHt9O1xuICB9O1xuICBGZXRjaGVyLlhIVE1MSGFuZGxlci5wYXR0ZXJuID0gbmV3IFJlZ0V4cCgnYXBwbGljYXRpb24veGh0bWwnKTtcblxuICBGZXRjaGVyLlhNTEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGRvbSA9IFV0aWwucGFyc2VYTUwoeGhyLnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgLy8gWE1MIFNlbWFudGljcyBkZWZpbmVkIGJ5IHJvb3QgZWxlbWVudCBuYW1lc3BhY2VcbiAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgcm9vdCBlbGVtZW50XG4gICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAvLyBpcyB0aGlzIG5vZGUgYW4gZWxlbWVudD9cbiAgICAgICAgICBpZiAoZG9tLmNoaWxkTm9kZXNbY10ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBmaXJzdCBlbGVtZW50LCBpdCdzIHRoZSByb290XG4gICAgICAgICAgICB2YXIgbnMgPSBkb20uY2hpbGROb2Rlc1tjXS5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgICAgIC8vIElzIGl0IFJERi9YTUw/XG4gICAgICAgICAgICBpZiAobnMgJiYgbnMgPT09IG5zWydyZGYnXSkge1xuICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYTUwgcm9vdCBlbGVtZW50IGluIHRoZSBSREYgbmFtZXNwYWNlLCBzbyBhc3N1bWUgUkRGL1hNTC4nKTtcbiAgICAgICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignUkRGWE1MSGFuZGxlcicsIHhociwgY2IsIFtkb21dKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaXQgaXNuJ3QgUkRGL1hNTCBvciB3ZSBjYW4ndCB0ZWxsXG4gICAgICAgICAgICAvLyBBcmUgdGhlcmUgYW55IEdSRERMIHRyYW5zZm9ybXMgZm9yIHRoaXMgbmFtZXNwYWNlP1xuICAgICAgICAgICAgLy8gQEAgYXNzdW1lcyBucyBkb2N1bWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgdmFyIHhmb3JtcyA9IGtiLmVhY2goa2Iuc3ltKG5zKSwga2Iuc3ltKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMy9nL2RhdGEtdmlldyNuYW1lc3BhY2VUcmFuc2Zvcm1hdGlvblwiKSlcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeGZvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHhmb3JtID0geGZvcm1zW2ldXG4gICAgICAgICAgICAgICAgLy8gbG9nLmluZm8oeGhyLnJlc291cmNlLnVyaSArIFwiIG5hbWVzcGFjZSBcIiArIG5zICsgXCIgaGFzIEdSRERMIG5zIHRyYW5zZm9ybVwiICsgeGZvcm0udXJpKVxuICAgICAgICAgICAgICAgICBGZXRjaGVyLmRvR1JEREwoa2IsIHhoci5yZXNvdXJjZSwgeGZvcm0udXJpLCB4aHIucmVzb3VyY2UudXJpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9yIGl0IGNvdWxkIGJlIFhIVE1MP1xuICAgICAgICAvLyBNYXliZSBpdCBoYXMgYW4gWEhUTUwgRE9DVFlQRT9cbiAgICAgICAgaWYgKGRvbS5kb2N0eXBlKSB7XG4gICAgICAgICAgLy8gbG9nLmluZm8oXCJXZSBmb3VuZCBhIERPQ1RZUEUgaW4gXCIgKyB4aHIucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKGRvbS5kb2N0eXBlLm5hbWUgPT09ICdodG1sJyAmJiBkb20uZG9jdHlwZS5wdWJsaWNJZC5tYXRjaCgvXi1cXC9cXC9XM0NcXC9cXC9EVEQgWEhUTUwvKSAmJiBkb20uZG9jdHlwZS5zeXN0ZW1JZC5tYXRjaCgvaHR0cDpcXC9cXC93d3cudzMub3JnXFwvVFJcXC94aHRtbC8pKSB7XG4gICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYSFRNTCBET0NUWVBFLiBTd2l0Y2hpbmcgdG8gWEhUTUwgSGFuZGxlci5cXG4nKTtcbiAgICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hIVE1MSGFuZGxlcicsIHhociwgY2IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9yIHdoYXQgYWJvdXQgYW4gWEhUTUwgbmFtZXNwYWNlP1xuICAgICAgICB2YXIgaHRtbCA9IGRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdO1xuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgIHZhciB4bWxucyA9IGh0bWwuZ2V0QXR0cmlidXRlKCd4bWxucycpO1xuICAgICAgICAgIGlmICh4bWxucyAmJiB4bWxucy5tYXRjaCgvXmh0dHA6XFwvXFwvd3d3LnczLm9yZ1xcLzE5OTlcXC94aHRtbC8pKSB7XG4gICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBhIGRlZmF1bHQgbmFtZXNwYWNlIGZvciAnICsgJ1hIVE1MLiBTd2l0Y2hpbmcgdG8gWEhUTUxIYW5kbGVyLlxcbicpO1xuICAgICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignWEhUTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgY2hlY2sgdGhlIG5hbWVzcGFjZSBkb2N1bWVudCAoY2FjaGUgaXQhKSBhbmRcbiAgICAgICAgLy8gbG9vayBmb3IgYSBHUkRETCB0cmFuc2Zvcm1cbiAgICAgICAgLy8gQEAgIEdldCBuYW1lc3BhY2UgZG9jdW1lbnQgPG4+LCBwYXJzZSBpdCwgbG9vayBmb3IgIDxuPiBncmRkbDpuYW1lc3BhY2VUcmFuc2Zvcm0gP3lcbiAgICAgICAgLy8gQXBwbHkgP3kgdG8gICBkb21cbiAgICAgICAgLy8gV2UgZ2l2ZSB1cC4gV2hhdCBkaWFsZWN0IGlzIHRoaXM/XG4gICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdVbnN1cHBvcnRlZCBkaWFsZWN0IG9mIFhNTDogbm90IFJERiBvciBYSFRNTCBuYW1lc3BhY2UsIGV0Yy5cXG4nICsgeGhyLnJlc3BvbnNlVGV4dC5zbGljZSgwLCA4MCkpO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIEZldGNoZXIuWE1MSGFuZGxlci50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ1hNTEhhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLlhNTEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3htbCddID0ge1xuICAgICAgJ3EnOiAwLjVcbiAgICB9O1xuICAgIHNmLm1lZGlhdHlwZXNbJ2FwcGxpY2F0aW9uL3htbCddID0ge1xuICAgICAgJ3EnOiAwLjVcbiAgICB9O1xuICB9O1xuICBGZXRjaGVyLlhNTEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJyh0ZXh0fGFwcGxpY2F0aW9uKS8oLiopeG1sJyk7XG5cbiAgRmV0Y2hlci5IVE1MSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICB2YXIgcnQgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICAvLyBXZSBvbmx5IGhhbmRsZSBYSFRNTCBzbyB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBYTUxcbiAgICAgICAgLy8gbG9nLmluZm8oXCJTbmlmZmluZyBIVE1MIFwiICsgeGhyLnJlc291cmNlICsgXCIgZm9yIFhIVE1MLlwiKVxuXG4gICAgICAgIGlmIChydC5tYXRjaCgvXFxzKjxcXD94bWxcXHMrdmVyc2lvblxccyo9W148Pl0rXFw/Pi8pKSB7XG4gICAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsIFwiSGFzIGFuIFhNTCBkZWNsYXJhdGlvbi4gV2UnbGwgYXNzdW1lIFwiICsgXCJpdCdzIFhIVE1MIGFzIHRoZSBjb250ZW50LXR5cGUgd2FzIHRleHQvaHRtbC5cXG5cIik7XG4gICAgICAgICAgc2Yuc3dpdGNoSGFuZGxlcignWEhUTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRE9DVFlQRVxuICAgICAgICAvLyBUaGVyZSBpcyBwcm9iYWJseSBhIHNtYXJ0ZXIgd2F5IHRvIGRvIHRoaXNcbiAgICAgICAgaWYgKHJ0Lm1hdGNoKC8uKjwhRE9DVFlQRVxccytodG1sW148XSstXFwvXFwvVzNDXFwvXFwvRFREIFhIVE1MW148XStodHRwOlxcL1xcL3d3dy53My5vcmdcXC9UUlxcL3hodG1sW148XSs+LykpIHtcbiAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hhcyBYSFRNTCBET0NUWVBFLiBTd2l0Y2hpbmcgdG8gWEhUTUxIYW5kbGVyLlxcbicpO1xuICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hIVE1MSGFuZGxlcicsIHhociwgY2IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHhtbG5zXG4gICAgICAgIGlmIChydC5tYXRjaCgvW14oPGh0bWwpXSo8aHRtbFxccytbXjxdKnhtbG5zPVsnXCJdaHR0cDpcXC9cXC93d3cudzMub3JnXFwvMTk5OVxcL3hodG1sW1wiJ11bXjxdKj4vKSkge1xuICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnSGFzIGRlZmF1bHQgbmFtZXNwYWNlIGZvciBYSFRNTCwgc28gc3dpdGNoaW5nIHRvIFhIVE1MSGFuZGxlci5cXG4nKTtcbiAgICAgICAgICBzZi5zd2l0Y2hIYW5kbGVyKCdYSFRNTEhhbmRsZXInLCB4aHIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkYzp0aXRsZVx0ICAgICAgICAgICAgICAgICAgICAgICAvL25vIG5lZWQgdG8gZXNjYXBlICcvJyBoZXJlXG4gICAgICAgIHZhciB0aXRsZU1hdGNoID0gbmV3IFJlZ0V4cCgnPHRpdGxlPihbXFxcXHNcXFxcU10rPyk8L3RpdGxlPicsICdpbScpLmV4ZWMocnQpO1xuICAgICAgICBpZiAodGl0bGVNYXRjaCkge1xuICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLmRjKCd0aXRsZScpLCBrYi5saXRlcmFsKHRpdGxlTWF0Y2hbMV0pLCB4aHIucmVzb3VyY2UpOyAvLyB0aGluayBhYm91dCB4bWw6bGFuZyBsYXRlclxuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLnJkZigndHlwZScpLCBucy5saW5rKCdXZWJQYWdlJyksIHNmLmFwcE5vZGUpO1xuICAgICAgICAgIGNiKCk7IC8vIGRvbmVGZXRjaCwgbm90IGZhaWxlZFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ25vbi1YTUwgSFRNTCBkb2N1bWVudCwgbm90IHBhcnNlZCBmb3IgZGF0YS4nKTtcbiAgICAgICAgc2YuZG9uZUZldGNoKHhocik7XG4gICAgICAgIC8vIHNmLmZhaWxGZXRjaCh4aHIsIFwiU29ycnksIGNhbid0IHlldCBwYXJzZSBub24tWE1MIEhUTUxcIilcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICBGZXRjaGVyLkhUTUxIYW5kbGVyLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnSFRNTEhhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLkhUTUxIYW5kbGVyLnJlZ2lzdGVyID0gZnVuY3Rpb24gKHNmKSB7XG4gICAgc2YubWVkaWF0eXBlc1sndGV4dC9odG1sJ10gPSB7XG4gICAgICAncSc6IDAuOVxuICAgIH07XG4gIH07XG4gIEZldGNoZXIuSFRNTEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJ3RleHQvaHRtbCcpO1xuXG4gIEZldGNoZXIuVGV4dEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgIHhoci5oYW5kbGUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgLy8gV2Ugb25seSBzcGVhayBkaWFsZWN0cyBvZiBYTUwgcmlnaHQgbm93LiBJcyB0aGlzIFhNTD9cbiAgICAgICAgdmFyIHJ0ID0geGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICAvLyBMb29rIGZvciBhbiBYTUwgZGVjbGFyYXRpb25cbiAgICAgICAgaWYgKHJ0Lm1hdGNoKC9cXHMqPFxcP3htbFxccyt2ZXJzaW9uXFxzKj1bXjw+XStcXD8+LykpIHtcbiAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyBcIiBoYXMgYW4gWE1MIGRlY2xhcmF0aW9uLiBXZSdsbCBhc3N1bWUgXCIgKyBcIml0J3MgWE1MIGJ1dCBpdHMgY29udGVudC10eXBlIHdhc24ndCBYTUwuXFxuXCIpO1xuICAgICAgICAgIHNmLnN3aXRjaEhhbmRsZXIoJ1hNTEhhbmRsZXInLCB4aHIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29rIGZvciBhbiBYTUwgZGVjbGFyYXRpb25cbiAgICAgICAgaWYgKHJ0LnNsaWNlKDAsIDUwMCkubWF0Y2goL3htbG5zOi8pKSB7XG4gICAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsIFwiTWF5IGhhdmUgYW4gWE1MIG5hbWVzcGFjZS4gV2UnbGwgYXNzdW1lIFwiICsgXCJpdCdzIFhNTCBidXQgaXRzIGNvbnRlbnQtdHlwZSB3YXNuJ3QgWE1MLlxcblwiKTtcbiAgICAgICAgICBzZi5zd2l0Y2hIYW5kbGVyKCdYTUxIYW5kbGVyJywgeGhyLCBjYik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZ2l2ZSB1cCBmaW5kaW5nIHNlbWFudGljcyAtIHRoaXMgaXMgbm90IGFuIGVycm9yLCBqdXN0IG5vIGRhdGFcbiAgICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsICdQbGFpbiB0ZXh0IGRvY3VtZW50LCBubyBrbm93biBSREYgc2VtYW50aWNzLicpO1xuICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgc2YuZmFpbEZldGNoKHhociwgXCJ1bnBhcnNlYWJsZSAtIHRleHQvcGxhaW4gbm90IHZpc2libHkgWE1MXCIpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIGR1bXAoeGhyLnJlc291cmNlICsgXCIgdW5wYXJzZWFibGUgLSB0ZXh0L3BsYWluIG5vdCB2aXNpYmx5IFhNTCwgc3RhcnRzOlxcblwiICsgcnQuc2xpY2UoMCwgNTAwKStcIlxcblwiKVxuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIEZldGNoZXIuVGV4dEhhbmRsZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdUZXh0SGFuZGxlcic7XG4gIH07XG4gIEZldGNoZXIuVGV4dEhhbmRsZXIucmVnaXN0ZXIgPSBmdW5jdGlvbiAoc2YpIHtcbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3BsYWluJ10gPSB7XG4gICAgICAncSc6IDAuNVxuICAgIH07XG4gIH07XG4gIEZldGNoZXIuVGV4dEhhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJ3RleHQvcGxhaW4nKTtcblxuICBGZXRjaGVyLk4zSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gZnVuY3Rpb24gKHhocikge1xuICAgICAgeGhyLmhhbmRsZSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAvLyBQYXJzZSB0aGUgdGV4dCBvZiB0aGlzIG5vbi1YTUwgZmlsZVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCd3ZWIuanM6IFBhcnNpbmcgYXMgTjMgJyArIHhoci5yZXNvdXJjZS51cmkgKyAnIGJhc2U6ICcgKyB4aHIub3JpZ2luYWwudXJpKSAvLyBAQEBAIGNvbW1lbnQgbWUgb3V0XG4gICAgICAgIC8vIHNmLmFkZFN0YXR1cyh4aHIucmVxLCBcIk4zIG5vdCBwYXJzZWQgeWV0Li4uXCIpXG4gICAgICAgIHZhciBwID0gTjNQYXJzZXIoa2IsIGtiLCB4aHIub3JpZ2luYWwudXJpLCB4aHIub3JpZ2luYWwudXJpLCBudWxsLCBudWxsLCAnJywgbnVsbCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgIHAubG9hZEJ1Zih4aHIucmVzcG9uc2VUZXh0KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHAubG9hZEJ1Zih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhciBtc2cgPSAnRXJyb3IgdHJ5aW5nIHRvIHBhcnNlICcgKyB4aHIucmVzb3VyY2UgKyAnIGFzIE5vdGF0aW9uMzpcXG4nICsgZSArICc6XFxuJyArIGUuc3RhY2s7XG4gICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnTjMgcGFyc2VkOiAnICsgcC5zdGF0ZW1lbnRDb3VudCArICcgdHJpcGxlcyBpbiAnICsgcC5saW5lcyArICcgbGluZXMuJyk7XG4gICAgICAgIHNmLnN0b3JlLmFkZCh4aHIub3JpZ2luYWwsIG5zLnJkZigndHlwZScpLCBucy5saW5rKCdSREZEb2N1bWVudCcpLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgLy8gdmFyIGFyZ3MgPSBbeGhyLm9yaWdpbmFsLnVyaV0gLy8gT3RoZXIgYXJncyBuZWVkZWQgZXZlcj9cbiAgICAgICAgc2YuZG9uZUZldGNoKHhocik7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG5cbiAgRmV0Y2hlci5OM0hhbmRsZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdOM0hhbmRsZXInO1xuICB9O1xuICBGZXRjaGVyLk4zSGFuZGxlci5yZWdpc3RlciA9IGZ1bmN0aW9uIChzZikge1xuICAgIHNmLm1lZGlhdHlwZXNbJ3RleHQvbjMnXSA9IHtcbiAgICAgICdxJzogJzEuMCdcbiAgICB9OyAvLyBhcyBwZXIgMjAwOCBzcGVjXG4gICAgLypcbiAgICBzZi5tZWRpYXR5cGVzWydhcHBsaWNhdGlvbi94LXR1cnRsZSddID0ge1xuICAgICAgJ3EnOiAxLjBcbiAgICB9IC8vIHByZSAyMDA4XG4gICAgKi9cbiAgICBzZi5tZWRpYXR5cGVzWyd0ZXh0L3R1cnRsZSddID0ge1xuICAgICAgJ3EnOiAxLjBcbiAgICB9OyAvLyBwb3N0IDIwMDhcbiAgfTtcbiAgRmV0Y2hlci5OM0hhbmRsZXIucGF0dGVybiA9IG5ldyBSZWdFeHAoJyhhcHBsaWNhdGlvbnx0ZXh0KS8oeC0pPyhyZGZcXFxcKyk/KG4zfHR1cnRsZSknKTtcblxuICBVdGlsLmNhbGxiYWNraWZ5KHRoaXMsIFsncmVxdWVzdCcsICdyZWN2JywgJ2hlYWRlcnMnLCAnbG9hZCcsICdmYWlsJywgJ3JlZnJlc2gnLCAncmV0cmFjdCcsICdkb25lJ10pO1xuXG4gIHRoaXMuYWRkSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgc2YuaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICBoYW5kbGVyLnJlZ2lzdGVyKHNmKTtcbiAgfTtcblxuICB0aGlzLnN3aXRjaEhhbmRsZXIgPSBmdW5jdGlvbiAobmFtZSwgeGhyLCBjYiwgYXJncykge1xuICAgIHZhciBIYW5kbGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgnJyArIHRoaXMuaGFuZGxlcnNbaV0gPT09IG5hbWUpIHtcbiAgICAgICAgSGFuZGxlciA9IHRoaXMuaGFuZGxlcnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghSGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWIuanM6IHN3aXRjaEhhbmRsZXI6IG5hbWU9JyArIG5hbWUgKyAnICwgdGhpcy5oYW5kbGVycyA9JyArIHRoaXMuaGFuZGxlcnMgKyAnXFxuJyArICdzd2l0Y2hIYW5kbGVyOiBzd2l0Y2hpbmcgdG8gJyArIEhhbmRsZXIgKyAnOyBzZj0nICsgc2YgKyAnOyB0eXBlb2YgRmV0Y2hlcj0nICsgKHR5cGVvZiBGZXRjaGVyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihGZXRjaGVyKSkgKyAnO1xcblxcdCBGZXRjaGVyLkhUTUxIYW5kbGVyPScgKyBGZXRjaGVyLkhUTUxIYW5kbGVyICsgJ1xcbicgKyAnXFxuXFx0c2YuaGFuZGxlcnM9JyArIHNmLmhhbmRsZXJzICsgJ1xcbicpO1xuICAgIH1cbiAgICBuZXcgSGFuZGxlcihhcmdzKS5oYW5kbGVyRmFjdG9yeSh4aHIpO1xuICAgIHhoci5oYW5kbGUoY2IpO1xuICB9O1xuXG4gIHRoaXMuYWRkU3RhdHVzID0gZnVuY3Rpb24gKHJlcSwgc3RhdHVzKSB7XG4gICAgLy8gPERlYnVnIGFib3V0PVwicGFyc2VQZXJmb3JtYW5jZVwiPlxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHN0YXR1cyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnLicgKyBub3cuZ2V0TWlsbGlzZWNvbmRzKCkgKyAnXSAnICsgc3RhdHVzO1xuICAgIC8vIDwvRGVidWc+XG4gICAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgICB2YXIgcyA9IGtiLnRoZShyZXEsIG5zLmxpbmsoJ3N0YXR1cycpKTtcbiAgICBpZiAocyAmJiBzLmFwcGVuZCkge1xuICAgICAgcy5hcHBlbmQoa2IubGl0ZXJhbChzdGF0dXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oJ3dlYi5qczogTm8gbGlzdCB0byBhZGQgdG86ICcgKyBzICsgJywnICsgc3RhdHVzKTsgLy8gQEBAXG4gICAgfVxuICB9O1xuXG4gIC8vIFJlY29yZCBlcnJvcnMgaW4gdGhlIHN5c3RlbSBvbiBmYWlsdXJlXG4gIC8vIFJldHVybnMgeGhyIHNvIGNhbiBqdXN0IGRvIHJldHVybiB0aGlzLmZhaWxmZXRjaCguLi4pXG4gIHRoaXMuZmFpbEZldGNoID0gZnVuY3Rpb24gKHhociwgc3RhdHVzKSB7XG4gICAgdGhpcy5hZGRTdGF0dXMoeGhyLnJlcSwgc3RhdHVzKTtcbiAgICBpZiAoIXhoci5vcHRpb25zLm5vTWV0YSkge1xuICAgICAga2IuYWRkKHhoci5vcmlnaW5hbCwgbnMubGluaygnZXJyb3InKSwgc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKCF4aHIucmVzb3VyY2Uuc2FtZVRlcm0oeGhyLm9yaWdpbmFsKSkge1xuICAgICAgY29uc29sZS5sb2coJ0BAIFJlY29yZGluZyBmYWlsdXJlIG9yaWdpbmFsICcgKyB4aHIub3JpZ2luYWwgKyAnKCBhcyAnICsgeGhyLnJlc291cmNlICsgJykgOiAnICsgeGhyLnN0YXR1cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdAQCBSZWNvcmRpbmcgZmFpbHVyZSBmb3IgJyArIHhoci5vcmlnaW5hbCArICc6ICcgKyB4aHIuc3RhdHVzKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0ZWRbVXJpLmRvY3BhcnQoeGhyLm9yaWdpbmFsLnVyaSldID0geGhyLnN0YXR1czsgLy8gY2hhbmdlZCAyMDE1IHdhcyBmYWxzZVxuICAgIHdoaWxlICh0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldICYmIHRoaXMuZmV0Y2hDYWxsYmFja3NbeGhyLm9yaWdpbmFsLnVyaV0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldLnNoaWZ0KCkoZmFsc2UsICdGZXRjaCBvZiA8JyArIHhoci5vcmlnaW5hbC51cmkgKyAnPiBmYWlsZWQ6ICcgKyBzdGF0dXMsIHhocik7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrcygnZmFpbCcsIFt4aHIub3JpZ2luYWwudXJpLCBzdGF0dXNdKTtcbiAgICB4aHIuYWJvcnQoKTtcbiAgICByZXR1cm4geGhyO1xuICB9O1xuXG4gIC8vIGluIHRoZSB3aHkgcGFydCBvZiB0aGUgcXVhZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEhUTUwgYW5kIEhUVFAgaGVhZGVyXG4gIC8vIFJldmVyc2UgaXMgc2V0IGlpZiB0aGUgbGluayB3YXMgcmV2PSBhcyBvcHBvc2VkIHRvIHJlbD1cbiAgdGhpcy5saW5rRGF0YSA9IGZ1bmN0aW9uICh4aHIsIHJlbCwgdXJpLCB3aHksIHJldmVyc2UpIHtcbiAgICBpZiAoIXVyaSkgcmV0dXJuO1xuICAgIHZhciBwcmVkaWNhdGU7XG4gICAgLy8gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3Bvd2Rlci1kci8jaHR0cGxpbmsgZm9yIGRlc2NyaWJlZGJ5IDIwMDgtMTItMTBcbiAgICB2YXIgb2JqID0ga2Iuc3ltKFVyaS5qb2luKHVyaSwgeGhyLm9yaWdpbmFsLnVyaSkpO1xuICAgIGlmIChyZWwgPT09ICdhbHRlcm5hdGUnIHx8IHJlbCA9PT0gJ3NlZUFsc28nIHx8IHJlbCA9PT0gJ21ldGEnIHx8IHJlbCA9PT0gJ2Rlc2NyaWJlZGJ5Jykge1xuICAgICAgaWYgKG9iai51cmkgPT09IHhoci5vcmlnaW5hbC51cmkpIHJldHVybjtcbiAgICAgIHByZWRpY2F0ZSA9IG5zLnJkZnMoJ3NlZUFsc28nKTtcbiAgICB9IGVsc2UgaWYgKHJlbCA9PT0gJ3R5cGUnKSB7XG4gICAgICBwcmVkaWNhdGUgPSBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlZSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9saW5rLXJlbGF0aW9ucy9saW5rLXJlbGF0aW9ucy54bWxcbiAgICAgIC8vIEFsYXMgbm90IHlldCBpbiBSREYgeWV0IGZvciBlYWNoIHByZWRpY2F0ZVxuICAgICAgLy8vIGVuY29kZSBzcGFjZSBpbiBlLmcuIHJlbD1cInNob3J0Y3V0IGljb25cIlxuICAgICAgcHJlZGljYXRlID0ga2Iuc3ltKFVyaS5qb2luKGVuY29kZVVSSUNvbXBvbmVudChyZWwpLCAnaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9saW5rLXJlbGF0aW9ucy8nKSk7XG4gICAgfVxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICBrYi5hZGQob2JqLCBwcmVkaWNhdGUsIHhoci5vcmlnaW5hbCwgd2h5KTtcbiAgICB9IGVsc2Uge1xuICAgICAga2IuYWRkKHhoci5vcmlnaW5hbCwgcHJlZGljYXRlLCBvYmosIHdoeSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucGFyc2VMaW5rSGVhZGVyID0gZnVuY3Rpb24gKHhociwgdGhpc1JlcSkge1xuICAgIHZhciBsaW5rO1xuICAgIHRyeSB7XG4gICAgICBsaW5rID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdsaW5rJyk7IC8vIE1heSBjcmFzaCBmcm9tIENPUlMgZXJyb3JcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGlmIChsaW5rKSB7XG4gICAgICB2YXIgbGlua2V4cCA9IC88W14+XSo+XFxzKihcXHMqO1xccypbXlxcKFxcKTw+QCw7OlwiXFwvXFxbXFxdXFw/PXt9IFxcdF0rPSgoW15cXChcXCk8PkAsOzpcIlxcL1xcW1xcXVxcPz17fSBcXHRdKyl8KFwiW15cIl0qXCIpKSkqKCx8JCkvZztcbiAgICAgIHZhciBwYXJhbWV4cCA9IC9bXlxcKFxcKTw+QCw7OlwiXFwvXFxbXFxdXFw/PXt9IFxcdF0rPSgoW15cXChcXCk8PkAsOzpcIlxcL1xcW1xcXVxcPz17fSBcXHRdKyl8KFwiW15cIl0qXCIpKS9nO1xuXG4gICAgICB2YXIgbWF0Y2hlcyA9IGxpbmsubWF0Y2gobGlua2V4cCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gbWF0Y2hlc1tpXS5zcGxpdCgnPicpO1xuICAgICAgICB2YXIgaHJlZiA9IHNwbGl0WzBdLnN1YnN0cmluZygxKTtcbiAgICAgICAgdmFyIHBzID0gc3BsaXRbMV07XG4gICAgICAgIHZhciBzID0gcHMubWF0Y2gocGFyYW1leHApO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgcCA9IHNbal07XG4gICAgICAgICAgdmFyIHBhcmFtc3BsaXQgPSBwLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgLy8gdmFyIG5hbWUgPSBwYXJhbXNwbGl0WzBdXG4gICAgICAgICAgdmFyIHJlbCA9IHBhcmFtc3BsaXRbMV0ucmVwbGFjZSgvW1wiJ10vZywgJycpOyAvLyAnXCJcbiAgICAgICAgICB0aGlzLmxpbmtEYXRhKHhociwgcmVsLCBocmVmLCB0aGlzUmVxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmRvbmVGZXRjaCA9IGZ1bmN0aW9uICh4aHIpIHtcbiAgICB0aGlzLmFkZFN0YXR1cyh4aHIucmVxLCAnRG9uZS4nKTtcbiAgICB0aGlzLnJlcXVlc3RlZFt4aHIub3JpZ2luYWwudXJpXSA9ICdkb25lJzsgLy8gS2VubnlcbiAgICB3aGlsZSAodGhpcy5mZXRjaENhbGxiYWNrc1t4aHIub3JpZ2luYWwudXJpXSAmJiB0aGlzLmZldGNoQ2FsbGJhY2tzW3hoci5vcmlnaW5hbC51cmldLmxlbmd0aCkge1xuICAgICAgdGhpcy5mZXRjaENhbGxiYWNrc1t4aHIub3JpZ2luYWwudXJpXS5zaGlmdCgpKHRydWUsIHVuZGVmaW5lZCwgeGhyKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hDYWxsYmFja3NbeGhyLm9yaWdpbmFsLnVyaV07XG4gICAgdGhpcy5maXJlQ2FsbGJhY2tzKCdkb25lJywgW3hoci5vcmlnaW5hbC51cmldKTtcbiAgfTtcbiAgdmFyIGhhbmRsZXJMaXN0ID0gW0ZldGNoZXIuUkRGWE1MSGFuZGxlciwgRmV0Y2hlci5YSFRNTEhhbmRsZXIsIEZldGNoZXIuWE1MSGFuZGxlciwgRmV0Y2hlci5IVE1MSGFuZGxlciwgRmV0Y2hlci5UZXh0SGFuZGxlciwgRmV0Y2hlci5OM0hhbmRsZXJdO1xuICBoYW5kbGVyTGlzdC5tYXAodGhpcy5hZGRIYW5kbGVyKTtcblxuICAvKiogTm90ZSB0d28gbm9kZXMgYXJlIG5vdyBzbXVzaGVkXG4gICAqKlxuICAgKiogSWYgb25seSBvbmUgd2FzIGZsYWdnZWQgYXMgbG9va2VkIHVwLCB0aGVuXG4gICAqKiB0aGUgbmV3IG5vZGUgaXMgbG9va2VkIHVwIGFnYWluLCB3aGljaFxuICAgKiogd2lsbCBtYWtlIHN1cmUgYWxsIHRoZSBVUklzIGFyZSBkZXJlZmVyZW5jZWRcbiAgICovXG4gIHRoaXMubm93S25vd25BcyA9IGZ1bmN0aW9uICh3YXMsIG5vdykge1xuICAgIGlmICh0aGlzLmxvb2tlZFVwW3dhcy51cmldKSB7XG4gICAgICBpZiAoIXRoaXMubG9va2VkVXBbbm93LnVyaV0pIHRoaXMubG9va1VwVGhpbmcobm93LCB3YXMpOyAvLyAgQEBAQCAgVHJhbnNmZXIgdXNlckNhbGxiYWNrXG4gICAgfSBlbHNlIGlmICh0aGlzLmxvb2tlZFVwW25vdy51cmldKSB7XG4gICAgICBpZiAoIXRoaXMubG9va2VkVXBbd2FzLnVyaV0pIHRoaXMubG9va1VwVGhpbmcod2FzLCBub3cpO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm5zIHByb21pc2Ugb2YgWEhSXG4gIC8vXG4gIC8vICBXcml0ZXMgYmFjayB0byB0aGUgd2ViIHdoYXQgd2UgaGF2ZSBpbiB0aGUgc3RvcmUgZm9yIHRoaXMgdXJpXG4gIHRoaXMucHV0QmFjayA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTsgLy8gQWNjZXB0IG9iamVjdCBvciBzdHJpbmdcbiAgICB2YXIgZG9jID0gbmV3IE5hbWVkTm9kZSh1cmkpLmRvYygpOyAvLyBzdHJpcCBvZmYgI1xuICAgIG9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZShkb2MsIHRoaXMuc3RvcmUsIGRvYy51cmksIG9wdGlvbnMuY29udGVudFR5cGUgfHwgJ3RleHQvdHVydGxlJyk7XG4gICAgcmV0dXJuIHRoaXMud2ViT3BlcmF0aW9uKCdQVVQnLCB1cmksIG9wdGlvbnMpO1xuICB9O1xuXG4gIC8vIFJldHVybnMgcHJvbWlzZSBvZiBYSFJcbiAgLy9cbiAgdGhpcy53ZWJPcGVyYXRpb24gPSBmdW5jdGlvbiAobWV0aG9kLCB1cmkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTtcbiAgICB1cmkgPSB0aGlzLnByb3h5SWZOZWNlc3NhcnkodXJpKTtcbiAgICB2YXIgZmV0Y2hlciA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgICB4aHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB4aHIub3JpZ2luYWwgPSBmZXRjaGVyLnN0b3JlLnN5bSh1cmkpO1xuICAgICAgaWYgKCFvcHRpb25zLm5vTWV0YSAmJiB0eXBlb2YgdGFidWxhdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmZXRjaGVyLnNhdmVSZXF1ZXN0TWV0YWRhdGEoeGhyLCBmZXRjaGVyLnN0b3JlLCB1cmkpO1xuICAgICAgfVxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgLy8gTk90ZSBhIDQwNCBjYW4gYmUgbm90IGFmYWlsdXJlXG4gICAgICAgICAgdmFyIG9rID0gIXhoci5zdGF0dXMgfHwgeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMDtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMubm9NZXRhICYmIHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmZXRjaGVyLnNhdmVSZXNwb25zZU1ldGFkYXRhKHhociwgZmV0Y2hlci5zdG9yZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgdHJ1ZSk7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC10eXBlJywgb3B0aW9ucy5jb250ZW50VHlwZSB8fCAndGV4dC90dXJ0bGUnKTtcbiAgICAgIHhoci5zZW5kKG9wdGlvbnMuZGF0YSA/IG9wdGlvbnMuZGF0YSA6IHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy53ZWJDb3B5ID0gZnVuY3Rpb24gKGhlcmUsIHRoZXJlLCBjb250ZW50X3R5cGUpIHtcbiAgICB2YXIgZmV0Y2hlciA9IHRoaXM7XG4gICAgaGVyZSA9IGhlcmUudXJpIHx8IGhlcmU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZldGNoZXIud2ViT3BlcmF0aW9uKCdHRVQnLCBoZXJlKS50aGVuKGZ1bmN0aW9uICh4aHIpIHtcbiAgICAgICAgZmV0Y2hlci53ZWJPcGVyYXRpb24oJ1BVVCcsIC8vIEBAQCBjaGFuZ2UgdG8gYmluYXJ5IGZyb20gdGV4dFxuICAgICAgICB0aGVyZSwgeyBkYXRhOiB4aHIucmVzcG9uc2VUZXh0LCBjb250ZW50VHlwZTogY29udGVudF90eXBlIH0pLnRoZW4oZnVuY3Rpb24gKHhocikge1xuICAgICAgICAgIHJlc29sdmUoeGhyKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTG9va3MgdXAgc29tZXRoaW5nLlxuICAvL1xuICAvLyBMb29rcyB1cCBhbGwgdGhlIFVSSXMgYSB0aGluZ3MgaGFzLlxuICAvL1xuICAvLyBQYXJhbWV0ZXJzOlxuICAvL1xuICAvLyAgdGVybTogICAgICAgY2Fub25pY2FsIHRlcm0gZm9yIHRoZSB0aGluZyB3aG9zZSBVUkkgaXMgdG8gYmUgZGVyZWZlcmVuY2VkXG4gIC8vICBydGVybTogICAgICB0aGUgcmVzb3VyY2Ugd2hpY2ggcmVmZXJlZCB0byB0aGlzIChmb3IgdHJhY2tpbmcgYmFkIGxpbmtzKVxuICAvLyAgb3B0aW9uczogICAgKG9sZDogZm9yY2UgcGFyYWVtdGVyKSBvciBkaWN0aW9uYXJ5IG9mIG9wdGlvbnM6XG4gIC8vICAgICAgZm9yY2U6ICAgICAgTG9hZCB0aGUgZGF0YSBldmVuIGlmIGxvYWRlZCBiZWZvcmVcbiAgLy8gIG9uZURvbmU6ICAgaXMgY2FsbGVkIGFzIGNhbGxiYWNrKG9rLCBlcnJvcmJvZHksIHhocikgZm9yIGVhY2ggb25lXG4gIC8vICBhbGxEb25lOiAgIGlzIGNhbGxlZCBhcyBjYWxsYmFjayhvaywgZXJyb3Jib2R5KSBmb3IgYWxsIG9mIHRoZW1cbiAgLy8gUmV0dXJucyAgICAgIHRoZSBudW1iZXIgb2YgVVJJcyBmZXRjaGVkXG4gIC8vXG4gIHRoaXMubG9va1VwVGhpbmcgPSBmdW5jdGlvbiAodGVybSwgcnRlcm0sIG9wdGlvbnMsIG9uZURvbmUsIGFsbERvbmUpIHtcbiAgICB2YXIgdXJpcyA9IGtiLnVyaXModGVybSk7IC8vIEdldCBhbGwgVVJJc1xuICAgIHZhciBzdWNjZXNzID0gdHJ1ZTtcbiAgICB2YXIgZXJyb3JzID0gJyc7XG4gICAgdmFyIG91dHN0YW5kaW5nID0ge307XG4gICAgdmFyIGZvcmNlO1xuICAgIGlmIChvcHRpb25zID09PSBmYWxzZSB8fCBvcHRpb25zID09PSB0cnVlKSB7XG4gICAgICAvLyBPbGQgc2lnbmF0dXJlXG4gICAgICBmb3JjZSA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0geyBmb3JjZTogZm9yY2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgb3B0aW9ucyA9IHt9O1xuICAgICAgZm9yY2UgPSAhIW9wdGlvbnMuZm9yY2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB1cmlzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1ID0gdXJpc1tpXTtcbiAgICAgICAgb3V0c3RhbmRpbmdbdV0gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvb2tlZFVwW3VdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNmID0gdGhpcztcblxuICAgICAgICB2YXIgcmVxdWVzdE9uZSA9IGZ1bmN0aW9uIHJlcXVlc3RPbmUodTEpIHtcbiAgICAgICAgICBzZi5yZXF1ZXN0VVJJKFVyaS5kb2NwYXJ0KHUxKSwgcnRlcm0sIG9wdGlvbnMsIGZ1bmN0aW9uIChvaywgYm9keSwgeGhyKSB7XG4gICAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICAgaWYgKG9uZURvbmUpIG9uZURvbmUodHJ1ZSwgdTEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9uZURvbmUpIG9uZURvbmUoZmFsc2UsIGJvZHkpO1xuICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGVycm9ycyArPSBib2R5ICsgJ1xcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgb3V0c3RhbmRpbmdbdV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3V0c3RhbmRpbmcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbERvbmUpIHtcbiAgICAgICAgICAgICAgYWxsRG9uZShzdWNjZXNzLCBlcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0T25lKHUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJpcy5sZW5ndGg7XG4gIH07XG5cbiAgLyogUHJvbWlzZS1iYXNlZCBsb2FkIGZ1bmN0aW9uXG4gICoqXG4gICoqIE5hbWVkTm9kZSAtPiBQcm9taXNlIG9mIHhoclxuICAqKiB1cmkgc3RyaW5nIC0+IFByb21pc2Ugb2YgeGhyXG4gICoqIEFycmF5IG9mIHRoZSBhYm92ZSAtPiBQcm9taXNlIG9mIGFycmF5IG9mIHhoclxuICAqKlxuICAqKiBAQCB0b2RvOiBJZiBwMSBpcyBhcnJheSB0aGVuIHNlcXVlbmNlIG9yIHBhcmFsbGVsIGZldGNoIG9mIGFsbFxuICAqL1xuICB0aGlzLmxvYWQgPSBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgdmFyIGZldGNoZXIgPSB0aGlzO1xuICAgIGlmICh1cmkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdmFyIHBzID0gdXJpLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gZmV0Y2hlci5sb2FkKHgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHMpO1xuICAgIH1cbiAgICB1cmkgPSB1cmkudXJpIHx8IHVyaTsgLy8gTmFtZWROb2RlIG9yIFVSSSBzdHJpbmdcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZmV0Y2hlci5ub3dPcldoZW5GZXRjaGVkKHVyaSwgb3B0aW9ucywgZnVuY3Rpb24gKG9rLCBtZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyogIEFzayBmb3IgYSBkb2MgdG8gYmUgbG9hZGVkIGlmIG5lY2Vzc2FyeSB0aGVuIGNhbGwgYmFja1xuICAqKlxuICAqKiBDaGFuZ2VkIDIwMTMtMDgtMjA6ICBBZGRlZCAob2ssIGVycm9ybWVzc2FnZSkgcGFyYW1zIHRvIGNhbGxiYWNrXG4gICoqXG4gICoqIENhbGxpbmcgbWV0aG9kczpcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHVzZXJDYWxsYmFjaylcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIG9wdGlvbnMsIHVzZXJDYWxsYmFjaylcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHJlZmVycmluZ1Rlcm0sIHVzZXJDYWxsYmFjaywgb3B0aW9ucykgIDwtLSBvbGRcbiAgKiogICBub3dPcldoZW5GZXRjaGVkICh1cmksIHJlZmVycmluZ1Rlcm0sIHVzZXJDYWxsYmFjaykgPC0tIG9sZFxuICAqKlxuICAqKiAgT3B0aW9ucyBpbmNsdWRlOlxuICAqKiAgIHJlZmVycmluZ1Rlcm0gICAgVGhlIGRvY3VlbW50IGluIHdoaWNoIHRoaXMgbGluayB3YXMgZm91bmQuXG4gICoqICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHZhbHVhYmxlIHdoZW4gZmluZGluZyB0aGUgc291cmNlIG9mIGJhZCBVUklzXG4gICoqICAgZm9yY2UgICAgICAgICAgICBib29sZWFuLiAgTmV2ZXIgbWluZCB3aGV0aGVyIHlvdSBoYXZlIHRyaWVkIGJlZm9yZSxcbiAgKiogICAgICAgICAgICAgICAgICAgIGxvYWQgdGhpcyBmcm9tIHNjcmF0Y2guXG4gICoqICAgZm9yY2VDb250ZW50VHlwZSBPdmVycmlkZSB0aGUgaW5jb21pbmcgaGVhZGVyIHRvIGZvcmNlIHRoZSBkYXRhIHRvIGJlXG4gICoqICAgICAgICAgICAgICAgICAgICB0cmVhZWQgYXMgdGhpcyBjb250ZW50LXR5cGUuXG4gICoqL1xuICB0aGlzLm5vd09yV2hlbkZldGNoZWQgPSBmdW5jdGlvbiAodXJpLCBwMiwgdXNlckNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgdXJpID0gdXJpLnVyaSB8fCB1cmk7IC8vIGFsbG93IHN5bWJvbCBvYmplY3Qgb3Igc3RyaW5nIHRvIGJlIHBhc3NlZFxuICAgIGlmICh0eXBlb2YgcDIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIHVzZXJDYWxsYmFjayA9IHAyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHAyID09PSAndW5kZWZpbmVkJykgey8vIG9yaWdpbmFsIGNhbGxpbmcgc2lnbmF0dXJlXG4gICAgICAvLyByZWZlcmluZ1Rlcm0gPSB1bmRlZmluZWRcbiAgICB9IGVsc2UgaWYgKHAyIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7XG4gICAgICAvLyByZWZlcmluZ1Rlcm0gPSBwMlxuICAgICAgb3B0aW9ucyA9IHsgcmVmZXJpbmdUZXJtOiBwMiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gcDI7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VVJJKHVyaSwgcDIsIG9wdGlvbnMgfHwge30sIHVzZXJDYWxsYmFjayk7XG4gIH07XG5cbiAgdGhpcy5nZXQgPSB0aGlzLm5vd09yV2hlbkZldGNoZWQ7XG5cbiAgLy8gTG9vayB1cCByZXNwb25zZSBoZWFkZXJcbiAgLy9cbiAgLy8gUmV0dXJuczogYSBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm91bmQgaW4gYSBzdG9yZWQgSFRUUCByZXNwb25zZVxuICAvLyAgICAgIG9yIFtdIGlmIHJlc3BvbnNlIHdhcyBmb3VuZCBidXQgbm8gaGVhZGVyIGZvdW5kXG4gIC8vICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vIHJlc3BvbnNlIGlzIGF2YWlsYWJsZS5cbiAgLy9cbiAgdGhpcy5nZXRIZWFkZXIgPSBmdW5jdGlvbiAoZG9jLCBoZWFkZXIpIHtcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIHZhciByZXF1ZXN0cyA9IGtiLmVhY2godW5kZWZpbmVkLCBucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwgZG9jLnVyaSk7XG4gICAgZm9yICh2YXIgciA9IDA7IHIgPCByZXF1ZXN0cy5sZW5ndGg7IHIrKykge1xuICAgICAgdmFyIHJlcXVlc3QgPSByZXF1ZXN0c1tyXTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0ga2IuYW55KHJlcXVlc3QsIG5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdHMgPSBrYi5lYWNoKHJlc3BvbnNlLCBucy5odHRwaChoZWFkZXIudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiB2LnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIHRoaXMucHJveHlJZk5lY2Vzc2FyeSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICBpZiAodHlwZW9mIHRhYnVsYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFidWxhdG9yLmlzRXh0ZW5zaW9uKSByZXR1cm4gdXJpOyAvLyBFeHRlbnN0aW9uIGRvZXMgbm90IG5lZWQgcHJveHlcblxuICAgIGlmICh0eXBlb2YgJFNvbGlkVGVzdEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAkU29saWRUZXN0RW52aXJvbm1lbnQubG9jYWxTaXRlTWFwKSB7XG4gICAgICAvLyBuZXN0ZWQgZGljdGlvbmFyaWVzIG9mIFVSSSBwYXJ0cyBmcm9tIG9yaWdpbiBkb3duXG4gICAgICB2YXIgaG9zdHBhdGggPSB1cmkuc3BsaXQoJy8nKS5zbGljZSgyKTsgLy8gdGhlIGJpdCBhZnRlciB0aGUgLy9cbiAgICAgIHZhciBsb29rdXAgPSBmdW5jdGlvbiBsb29rdXAocGFydHMsIGluZGV4KSB7XG4gICAgICAgIHZhciB6ID0gaW5kZXhbcGFydHMuc2hpZnQoKV07XG4gICAgICAgIGlmICgheikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgeiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4geiArIHBhcnRzLmpvaW4oJy8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxvb2t1cChwYXJ0cywgeik7XG4gICAgICB9O1xuICAgICAgdmFyIHkgPSBsb29rdXAoaG9zdHBhdGgsICRTb2xpZFRlc3RFbnZpcm9ubWVudC5sb2NhbFNpdGVNYXApO1xuICAgICAgaWYgKHkpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGJyb3dzZXIgZG9lcyAyMDE0IG9uIGFzIGh0dHBzIGJyb3dzZXIgc2NyaXB0IG5vdCB0cnVzdGVkXG4gICAgLy8gSWYgdGhlIHdlYiBhcHAgb3JpZ2luIGlzIGh0dHBzOiB0aGVuIHRoZSBtaXhlZCBjb250ZW50IHJ1bGVzXG4gICAgLy8gcHJldmVudCBpdCBsb2FkaW5nIGluc2VjdXJlIGh0dHA6IHN0dWZmIHNvIHdlIG5lZWQgcHJveHkuXG4gICAgaWYgKEZldGNoZXIuY3Jvc3NTaXRlUHJveHlUZW1wbGF0ZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmxvY2F0aW9uICYmICgnJyArIGRvY3VtZW50LmxvY2F0aW9uKS5zbGljZSgwLCA2KSA9PT0gJ2h0dHBzOicgJiYgLy8gb3JpZ2luIGlzIHNlY3VyZVxuICAgIHVyaS5zbGljZSgwLCA1KSA9PT0gJ2h0dHA6Jykge1xuICAgICAgLy8gcmVxdWVzdGVkIGRhdGEgaXMgbm90XG4gICAgICByZXR1cm4gRmV0Y2hlci5jcm9zc1NpdGVQcm94eVRlbXBsYXRlLnJlcGxhY2UoJ3t1cml9JywgZW5jb2RlVVJJQ29tcG9uZW50KHVyaSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXJpO1xuICB9O1xuXG4gIHRoaXMuc2F2ZVJlcXVlc3RNZXRhZGF0YSA9IGZ1bmN0aW9uICh4aHIsIGtiLCBkb2N1cmkpIHtcbiAgICB2YXIgcmVxdWVzdCA9IGtiLmJub2RlKCk7XG4gICAgeGhyLnJlc291cmNlID0ga2Iuc3ltKGRvY3VyaSk7XG5cbiAgICB4aHIucmVxID0gcmVxdWVzdDtcbiAgICBpZiAoIXhoci5vcHRpb25zLm5vTWV0YSkge1xuICAgICAgLy8gU3RvcmUgbm8gdHJpcGxlcyBidXQgZG8gbWluZCB0aGUgYm5vZGUgZm9yIHJlcVxuICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB2YXIgdGltZU5vdyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnXSAnO1xuICAgICAga2IuYWRkKHJlcXVlc3QsIG5zLnJkZnMoJ2xhYmVsJyksIGtiLmxpdGVyYWwodGltZU5vdyArICcgUmVxdWVzdCBmb3IgJyArIGRvY3VyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICBrYi5hZGQocmVxdWVzdCwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwoZG9jdXJpKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgIGlmICh4aHIub3JpZ2luYWwgJiYgeGhyLm9yaWdpbmFsLnVyaSAhPT0gZG9jdXJpKSB7XG4gICAgICAgIGtiLmFkZChyZXF1ZXN0LCBucy5saW5rKCdvcmdpbmFsVVJJJyksIGtiLmxpdGVyYWwoeGhyLm9yaWdpbmFsLnVyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICB9XG4gICAgICBrYi5hZGQocmVxdWVzdCwgbnMubGluaygnc3RhdHVzJyksIGtiLmNvbGxlY3Rpb24oKSwgdGhpcy5hcHBOb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH07XG5cbiAgdGhpcy5zYXZlUmVzcG9uc2VNZXRhZGF0YSA9IGZ1bmN0aW9uICh4aHIsIGtiKSB7XG4gICAgdmFyIHJlc3BvbnNlID0ga2IuYm5vZGUoKTtcblxuICAgIGlmICh4aHIucmVxKSBrYi5hZGQoeGhyLnJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cCgnc3RhdHVzJyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1cyksIHJlc3BvbnNlKTtcbiAgICBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlKTtcblxuICAgIHhoci5oZWFkZXJzID0ge307XG4gICAgaWYgKFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2h0dHAnIHx8IFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2h0dHBzJykge1xuICAgICAgeGhyLmhlYWRlcnMgPSBVdGlsLmdldEhUVFBIZWFkZXJzKHhocik7XG4gICAgICBmb3IgKHZhciBoIGluIHhoci5oZWFkZXJzKSB7XG4gICAgICAgIC8vIHRyaW0gYmVsb3cgZm9yIFNhZmFyaSAtIGFkZHMgYSBDUiFcbiAgICAgICAgdmFyIHZhbHVlID0geGhyLmhlYWRlcnNbaF0udHJpbSgpO1xuICAgICAgICB2YXIgaDIgPSBoLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cGgoaDIpLCB2YWx1ZSwgcmVzcG9uc2UpO1xuICAgICAgICBpZiAoaDIgPT09ICdjb250ZW50LXR5cGUnKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBSREYgdHlwZVxuICAgICAgICAgIGtiLmFkZCh4aHIucmVzb3VyY2UsIG5zLnJkZigndHlwZScpLCBVdGlsLm1lZGlhVHlwZUNsYXNzKHZhbHVlKSwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfTtcblxuICAvKiogUmVxdWVzdHMgYSBkb2N1bWVudCBVUkkgYW5kIGFycmFuZ2VzIHRvIGxvYWQgdGhlIGRvY3VtZW50LlxuICAgKiogUGFyYW1ldGVyczpcbiAgICoqXHQgICAgdGVybTogIHRlcm0gZm9yIHRoZSB0aGluZyB3aG9zZSBVUkkgaXMgdG8gYmUgZGVyZWZlcmVuY2VkXG4gICAqKiAgICAgIHJ0ZXJtOiAgdGhlIHJlc291cmNlIHdoaWNoIHJlZmVyZWQgdG8gdGhpcyAoZm9yIHRyYWNraW5nIGJhZCBsaW5rcylcbiAgICoqICAgICAgb3B0aW9uczpcbiAgICoqICAgICAgICAgICAgICBmb3JjZTogIExvYWQgdGhlIGRhdGEgZXZlbiBpZiBsb2FkZWQgYmVmb3JlXG4gICAqKiAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAgIGZsYWcgZm9yIFhIUi9DT1JTIGV0Y1xuICAgKiogICAgICB1c2VyQ2FsbGJhY2s6ICBDYWxsZWQgd2l0aCAodHJ1ZSkgb3IgKGZhbHNlLCBlcnJvcmJvZHksIHtzdGF0dXM6IDQwMH0pIGFmdGVyIGxvYWQgaXMgZG9uZSBvciBmYWlsZWRcbiAgICoqIFJldHVybiB2YWx1ZTpcbiAgICoqXHQgICAgVGhlIHhociBvYmplY3QgZm9yIHRoZSBIVFRQIGFjY2Vzc1xuICAgKiogICAgICBudWxsIGlmIHRoZSBwcm90b2NvbCBpcyBub3QgYSBsb29rLXVwIHByb3RvY29sLFxuICAgKiogICAgICAgICAgICAgIG9yIFVSSSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgKi9cbiAgdGhpcy5yZXF1ZXN0VVJJID0gZnVuY3Rpb24gKGRvY3VyaSwgcnRlcm0sIG9wdGlvbnMsIHVzZXJDYWxsYmFjaykge1xuICAgIC8vIHNvdXJjZXNfcmVxdWVzdF9uZXdcbiAgICAvLyBWYXJpb3VzIGNhbGxpbmcgY29udmVudGlvbnNcbiAgICBkb2N1cmkgPSBkb2N1cmkudXJpIHx8IGRvY3VyaTsgLy8gTmFtZWROb2RlIG9yIHN0cmluZ1xuICAgIGRvY3VyaSA9IGRvY3VyaS5zcGxpdCgnIycpWzBdO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBvcHRpb25zID0geyAnZm9yY2UnOiBvcHRpb25zIH07IC8vIE9scyBkaWduYXR1cmVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGZvcmNlID0gISFvcHRpb25zLmZvcmNlO1xuICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGJhc2VVUkkgPSBvcHRpb25zLmJhc2VVUkkgfHwgZG9jdXJpOyAvLyBQcmVzZXZlIHRob3VnaCBwcm94eWluZyBldGNcbiAgICBvcHRpb25zLnVzZXJDYWxsYmFjayA9IHVzZXJDYWxsYmFjaztcblxuICAgIHZhciBwY29sID0gVXJpLnByb3RvY29sKGRvY3VyaSk7XG4gICAgaWYgKHBjb2wgPT09ICd0ZWwnIHx8IHBjb2wgPT09ICdtYWlsdG8nIHx8IHBjb2wgPT09ICd1cm4nKSB7XG4gICAgICAvLyBcIk5vIGxvb2stdXAgb3BlcmF0aW9uIG9uIHRoZXNlLCBidXQgdGhleSBhcmUgbm90IGVycm9ycz9cIlxuICAgICAgY29uc29sZS5sb2coJ1Vuc3VwcG9ydGVkIHByb3RvY29sIGluOiAnICsgZG9jdXJpKTtcbiAgICAgIHJldHVybiB1c2VyQ2FsbGJhY2soZmFsc2UsICdVbnN1cHBvcnRlZCBwcm90b2NvbCcsIHsgJ3N0YXR1cyc6IDkwMCB9KSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBkb2N0ZXJtID0ga2Iuc3ltKGRvY3VyaSk7XG5cbiAgICB2YXIgc3RhID0gdGhpcy5nZXRTdGF0ZShkb2N1cmkpO1xuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGlmIChzdGEgPT09ICdmZXRjaGVkJykge1xuICAgICAgICByZXR1cm4gdXNlckNhbGxiYWNrID8gdXNlckNhbGxiYWNrKHRydWUpIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YSA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuIHVzZXJDYWxsYmFjayA/IHVzZXJDYWxsYmFjayhmYWxzZSwgJ1ByZXZpb3VzbHkgZmFpbGVkLiAnICsgdGhpcy5yZXF1ZXN0ZWRbZG9jdXJpXSwgeyAnc3RhdHVzJzogdGhpcy5yZXF1ZXN0ZWRbZG9jdXJpXSB9KSA6IHVuZGVmaW5lZDsgLy8gQW4geGhyIHN0YW5kaW5cbiAgICAgIH1cbiAgICAgIC8vIGlmIChzdGEgPT09ICdyZXF1ZXN0ZWQnKSByZXR1cm4gdXNlckNhbGxiYWNrPyB1c2VyQ2FsbGJhY2soZmFsc2UsIFwiU29ycnkgYWxyZWFkeSByZXF1ZXN0ZWQgLSBwZW5kaW5nIGFscmVhZHkuXCIsIHsnc3RhdHVzJzogOTk5IH0pIDogdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm5vbmV4aXN0YW50W2RvY3VyaV07XG4gICAgfVxuICAgIC8vIEBAIFNob3VsZCBhbGxvdyBjb25jdXJyZW50IHJlcXVlc3RzXG5cbiAgICAvLyBJZiBpdCBpcyAnZmFpbGVkJywgdGhlbiBzaG91bGtkIHdlIHRyeSBhZ2Fpbj8gIEkgdGhpbmsgc28gc28gYW4gb2xkIGVycm9yIGRvZW5zJ3QgZ2V0IHN0dWNrXG4gICAgLy8gaWYgKHN0YSA9PT0gJ3VucmVxdWVzdGVkJylcblxuICAgIHRoaXMuZmlyZUNhbGxiYWNrcygncmVxdWVzdCcsIGFyZ3MpOyAvLyBLZW5ueTogZmlyZSAncmVxdWVzdCcgY2FsbGJhY2tzIGhlcmVcbiAgICAvLyBkdW1wKCBcIndlYi5qczogUmVxdWVzdGluZyB1cmk6IFwiICsgZG9jdXJpICsgXCJcXG5cIiApXG5cbiAgICBpZiAodXNlckNhbGxiYWNrKSB7XG4gICAgICBpZiAoIXRoaXMuZmV0Y2hDYWxsYmFja3NbZG9jdXJpXSkge1xuICAgICAgICB0aGlzLmZldGNoQ2FsbGJhY2tzW2RvY3VyaV0gPSBbdXNlckNhbGxiYWNrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmV0Y2hDYWxsYmFja3NbZG9jdXJpXS5wdXNoKHVzZXJDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkW2RvY3VyaV0gPT09IHRydWUpIHtcbiAgICAgIHJldHVybjsgLy8gRG9uJ3QgYXNrIGFnYWluIC0gd2FpdCBmb3IgZXhpc3RpbmcgY2FsbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcXVlc3RlZFtkb2N1cmldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMubm9NZXRhICYmIHJ0ZXJtICYmIHJ0ZXJtLnVyaSkge1xuICAgICAga2IuYWRkKGRvY3Rlcm0udXJpLCBucy5saW5rKCdyZXF1ZXN0ZWRCeScpLCBydGVybS51cmksIHRoaXMuYXBwTm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIHhociA9IFV0aWwuWE1MSFRUUEZhY3RvcnkoKTtcbiAgICB2YXIgcmVxID0geGhyLnJlcSA9IGtiLmJub2RlKCk7XG4gICAgeGhyLm9yaWdpbmFsID0ga2Iuc3ltKGJhc2VVUkkpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdYSFIgb3JpZ2luYWw6ICcgKyB4aHIub3JpZ2luYWwpXG4gICAgeGhyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm07IC8vIFRoaXMgbWlnaHQgYmUgcHJveGlmaWVkXG4gICAgdmFyIHNmID0gdGhpcztcblxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciB0aW1lTm93ID0gJ1snICsgbm93LmdldEhvdXJzKCkgKyAnOicgKyBub3cuZ2V0TWludXRlcygpICsgJzonICsgbm93LmdldFNlY29uZHMoKSArICddICc7XG4gICAgaWYgKCFvcHRpb25zLm5vTWV0YSkge1xuICAgICAga2IuYWRkKHJlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgZG9jdXJpKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgIGtiLmFkZChyZXEsIG5zLmxpbmsoJ3JlcXVlc3RlZFVSSScpLCBrYi5saXRlcmFsKGRvY3VyaSksIHRoaXMuYXBwTm9kZSk7XG4gICAgICBrYi5hZGQocmVxLCBucy5saW5rKCdzdGF0dXMnKSwga2IuY29sbGVjdGlvbigpLCB0aGlzLmFwcE5vZGUpO1xuICAgIH1cblxuICAgIHZhciBjaGVja0NyZWRlbnRpYWxzUmV0cnkgPSBmdW5jdGlvbiBjaGVja0NyZWRlbnRpYWxzUmV0cnkoKSB7XG4gICAgICBpZiAoIXhoci53aXRoQ3JlZGVudGlhbHMpIHJldHVybiBmYWxzZTsgLy8gbm90IGRlYWx0IHdpdGhcblxuICAgICAgaWYgKHhoci5yZXRyaWVkV2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgeGhyLnJldHJpZWRXaXRoQ3JlZGVudGlhbHMgPSB0cnVlOyAvLyBwcm90ZWN0IGFnYWluc3QgY2FsbGVkIHR3aWNlXG4gICAgICBjb25zb2xlLmxvZygnd2ViOiBSZXRyeWluZyB3aXRoIG5vIGNyZWRlbnRpYWxzIGZvciAnICsgeGhyLnJlc291cmNlKTtcbiAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgZGVsZXRlIHNmLnJlcXVlc3RlZFtkb2N1cmldOyAvLyBmb3JnZXQgdGhlIG9yaWdpbmFsIHJlcXVlc3QgaGFwcGVuZWRcbiAgICAgIHZhciBuZXdvcHQgPSB7fTtcbiAgICAgIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSB7XG4gICAgICAgIC8vIHRyYW5zZmVyIGJhc2VVUkkgZXRjXG4gICAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgICAgICBuZXdvcHRbb3B0XSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV3b3B0LndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuICAgICAgc2YuYWRkU3RhdHVzKHhoci5yZXEsICdBYm9ydDogV2lsbCByZXRyeSB3aXRoIGNyZWRlbnRpYWxzIFNVUFBSRVNTRUQgdG8gc2VlIGlmIHRoYXQgaGVscHMnKTtcbiAgICAgIHNmLnJlcXVlc3RVUkkoZG9jdXJpLCBydGVybSwgbmV3b3B0LCB4aHIudXNlckNhbGxiYWNrKTsgLy8gdXNlckNhbGxiYWNrIGFscmVhZHkgcmVnaXN0ZXJlZCAod2l0aCB3aGVyZT8pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIG9uZXJyb3JGYWN0b3J5ID0gZnVuY3Rpb24gb25lcnJvckZhY3RvcnkoeGhyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHhoci5vbkVycm9yV2FzQ2FsbGVkID0gdHJ1ZTsgLy8gZGVidWdnaW5nIGFuZCBtYXkgbmVlZCBpdFxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE1hc2h1cCBzaXR1YXRpb24sIG5vdCBub2RlIGV0Y1xuICAgICAgICAgIGlmIChGZXRjaGVyLmNyb3NzU2l0ZVByb3h5VGVtcGxhdGUgJiYgZG9jdW1lbnQubG9jYXRpb24gJiYgIXhoci5wcm94eVVzZWQpIHtcbiAgICAgICAgICAgIHZhciBob3N0cGFydCA9IFVyaS5ob3N0cGFydDtcbiAgICAgICAgICAgIHZhciBoZXJlID0gJycgKyBkb2N1bWVudC5sb2NhdGlvbjtcbiAgICAgICAgICAgIHZhciB1cmkgPSB4aHIucmVzb3VyY2UudXJpO1xuICAgICAgICAgICAgaWYgKGhvc3RwYXJ0KGhlcmUpICYmIGhvc3RwYXJ0KHVyaSkgJiYgaG9zdHBhcnQoaGVyZSkgIT09IGhvc3RwYXJ0KHVyaSkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY3Jvc3Mtc2l0ZVxuICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gNDAxIHx8IHhoci5zdGF0dXMgPT09IDQwMyB8fCB4aHIuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2VGYWN0b3J5KHhocikoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJVCBJUyBBIFBBSU4gVEhBVCBOTyBQUk9QRVIgRVJST1IgUkVQT1JUSU5HXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3JlZGVudGlhbHNSZXRyeSh4aHIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBjcmVkZW50aWFscyBmbGFnIHNldCwgcmV0cnkgd2l0aG91dCxcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQgd2Fzbid0LCBvciB3ZSBhbHJlYWR5IHRyaWVkIHRoYXRcbiAgICAgICAgICAgICAgICB2YXIgbmV3VVJJID0gRmV0Y2hlci5jcm9zc1NpdGVQcm94eSh1cmkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3ZWI6IERpcmVjdCBmYWlsZWQgc28gdHJ5aW5nIHByb3h5ICcgKyBuZXdVUkkpO1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQkxPQ0tFRCAtPiBDcm9zcy1zaXRlIFByb3h5IHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgIHZhciBvbGRyZXEgPSB4aHIucmVxO1xuICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkVG8nKSwga2Iuc3ltKG5ld1VSSSksIG9sZHJlcSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIHhoci5hYm9ydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyhvbGRyZXEsICdyZWRpcmVjdGVkIHRvIG5ldyByZXF1ZXN0Jyk7IC8vIHdoeVxuICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gY2FsbGVkIGZyb20geGhyLm9uZXJyb3IgKHNvIHJlbW92ZWQpXG4gICAgICAgICAgICAgICAgLy8gc2YuZmlyZUNhbGxiYWNrcygnZG9uZScsIGFyZ3MpIC8vIEFyZSB0aGVzZSBhcmdzIHJpZ2h0PyBAQEAgICBOb3QgZG9uZSB5ZXQhIGRvbmUgbWVhbnMgc3VjY2Vzc1xuICAgICAgICAgICAgICAgIHNmLnJlcXVlc3RlZFt4aHIucmVzb3VyY2UudXJpXSA9ICdyZWRpcmVjdGVkJztcbiAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmICghc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSkge1xuICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID09PSBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldLmNvbmNhdChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSk7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucywgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKHhocjIpIHtcbiAgICAgICAgICAgICAgICAgIHhocjIucHJveHlVc2VkID0gdHJ1ZTsgLy8gb25seSB0cnkgdGhlIHByb3h5IG9uY2VcbiAgICAgICAgICAgICAgICAgIHhocjIub3JpZ2luYWwgPSB4aHIub3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUHJveHlpbmcgYnV0IG9yaWdpbmFsIHN0aWxsICcgKyB4aHIyLm9yaWdpbmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHhocjIgJiYgeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGtiLmFkZCh4aHIucmVxLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgeGhyMi5yZXEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeGhyLkNPUlNfc3RhdHVzID0gOTk5O1xuICAgICAgICAgICAgLy8geGhyLnN0YXR1cyA9IDk5OSAgICAgZm9yYmlkZGVuIC0gcmVhZC1vbmx5XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIG1hc2h1XG4gICAgICB9OyAvLyBmdW5jdGlvbiBvZiBldmVudFxuICAgIH07IC8vIG9uZXJyb3JGYWN0b3J5XG5cbiAgICAvLyBTZXQgdXAgY2FsbGJhY2tzXG4gICAgdmFyIG9ucmVhZHlzdGF0ZWNoYW5nZUZhY3RvcnkgPSBmdW5jdGlvbiBvbnJlYWR5c3RhdGVjaGFuZ2VGYWN0b3J5KHhocikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhhbmRsZVJlc3BvbnNlID0gZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UoKSB7XG4gICAgICAgICAgaWYgKHhoci5oYW5kbGVSZXNwb25zZURvbmUpIHJldHVybjtcbiAgICAgICAgICB4aHIuaGFuZGxlUmVzcG9uc2VEb25lID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgaGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgdmFyIHRoaXNSZXEgPSB4aHIucmVxOyAvLyBNaWdodCBoYXZlIGNoYW5nZXMgYnkgcmVkaXJlY3RcbiAgICAgICAgICBzZi5maXJlQ2FsbGJhY2tzKCdyZWN2JywgYXJncyk7XG4gICAgICAgICAgdmFyIGtiID0gc2Yuc3RvcmU7XG4gICAgICAgICAgc2Yuc2F2ZVJlc3BvbnNlTWV0YWRhdGEoeGhyLCBrYik7XG4gICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygnaGVhZGVycycsIFt7IHVyaTogZG9jdXJpLCBoZWFkZXJzOiB4aHIuaGVhZGVycyB9XSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmb3IgbWFza2VkIGVycm9ycy5cbiAgICAgICAgICAvLyBGb3IgXCJzZWN1cml0eSByZWFzb25zXCIgdGhlYm9yYXNlciBoaWRlcyBlcnJvcnMgc3VjaCBhcyBDT1JTIGVycm9ycyBmcm9tXG4gICAgICAgICAgLy8gdGhlIGNhbGxpbmcgY29kZSAoMjAxNSkuIG9uZXJvcigpIHVzZWQgdG8gYmUgY2FsbGVkIGJ1dCBpcyBub3Qgbm93LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNYXNrZWQgZXJyb3IgLSBzdGF0dXMgMCBmb3IgJyArIHhoci5yZXNvdXJjZS51cmkpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQ3JlZGVudGlhbHNSZXRyeSh4aHIpKSB7XG4gICAgICAgICAgICAgIC8vIHJldHJ5IGlzIGNvdWxkIGJlIGNyZWRlbnRpYWxzIGZsYWcgQ09SUyBpc3N1ZVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHIuQ09SU19zdGF0dXMgPSA5MDA7IC8vIHVua25vd24gbWFza2VkIGVycm9yXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgICAgLy8gRm9yIGV4dHJhIGRpZ25vc3RpY3MsIGtlZXAgdGhlIHJlcGx5XG4gICAgICAgICAgICAvLyAgQEBAIDQwMSBzaG91bGQgY2F1c2UgIGEgcmV0cnkgd2l0aCBjcmVkZW50aWFsIHNvblxuICAgICAgICAgICAgLy8gQEBAIGNhY2hlIHRoZSBjcmVkZW50aWFscyBmbGFnIGJ5IGhvc3QgPz8/P1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgICBrYi5mZXRjaGVyLm5vbmV4aXN0YW50W3hoci5yZXNvdXJjZS51cmldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgIHZhciByZXNwb25zZTIgPSBrYi5ibm9kZSgpO1xuICAgICAgICAgICAgICBrYi5hZGQocmVzcG9uc2UyLCBucy5odHRwKCdjb250ZW50JyksIGtiLmxpdGVyYWwoeGhyLnJlc3BvbnNlVGV4dCksIHJlc3BvbnNlMik7XG4gICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCkge1xuICAgICAgICAgICAgICAgIGtiLmFkZChyZXNwb25zZTIsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlMik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZHVtcChcIkhUVFAgPj0gNDAwIHJlc3BvbnNlVGV4dDpcXG5cIit4aHIucmVzcG9uc2VUZXh0K1wiXFxuXCIpOyAvLyBAQEBAXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZi5mYWlsRmV0Y2goeGhyLCAnSFRUUCBlcnJvciBmb3IgJyArIHhoci5yZXNvdXJjZSArICc6ICcgKyB4aHIuc3RhdHVzICsgJyAnICsgeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsb2MgPSB4aHIuaGVhZGVyc1snY29udGVudC1sb2NhdGlvbiddO1xuXG4gICAgICAgICAgLy8gZGVkdWNlIHNvbWUgdGhpbmdzIGZyb20gdGhlIEhUVFAgdHJhbnNhY3Rpb25cbiAgICAgICAgICB2YXIgYWRkVHlwZSA9IGZ1bmN0aW9uIGFkZFR5cGUoY2xhKSB7XG4gICAgICAgICAgICAvLyBhZGQgdHlwZSB0byBhbGwgcmVkaXJlY3RlZCByZXNvdXJjZXMgdG9vXG4gICAgICAgICAgICB2YXIgcHJldiA9IHRoaXNSZXE7XG4gICAgICAgICAgICBpZiAobG9jKSB7XG4gICAgICAgICAgICAgIHZhciBkb2NVUkkgPSBrYi5hbnkocHJldiwgbnMubGluaygncmVxdWVzdGVkVVJJJykpO1xuICAgICAgICAgICAgICBpZiAoZG9jVVJJICE9PSBsb2MpIHtcbiAgICAgICAgICAgICAgICBrYi5hZGQoa2Iuc3ltKGxvYyksIG5zLnJkZigndHlwZScpLCBjbGEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgIHZhciBkb2MgPSBrYi5hbnkocHJldiwgbnMubGluaygncmVxdWVzdGVkVVJJJykpO1xuICAgICAgICAgICAgICBpZiAoZG9jICYmIGRvYy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGtiLmFkZChrYi5zeW0oZG9jLnZhbHVlKSwgbnMucmRmKCd0eXBlJyksIGNsYSwgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgIH0gLy8gY29udmVydCBMaXRlcmFsXG4gICAgICAgICAgICAgIHByZXYgPSBrYi5hbnkodW5kZWZpbmVkLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgcHJldik7XG4gICAgICAgICAgICAgIGlmICghcHJldikgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShwcmV2LCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVzcG9uc2UnKSk7XG4gICAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGJyZWFrO1xuICAgICAgICAgICAgICB2YXIgcmVkaXJlY3Rpb24gPSBrYi5hbnkocmVzcG9uc2UsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvaHR0cCNzdGF0dXMnKSk7XG4gICAgICAgICAgICAgIGlmICghcmVkaXJlY3Rpb24pIGJyZWFrO1xuICAgICAgICAgICAgICBpZiAocmVkaXJlY3Rpb24gIT09ICczMDEnICYmIHJlZGlyZWN0aW9uICE9PSAnMzAyJykgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbWluaW1hbCBzZXQgdG8gYWxsb3cgdGhlIHVzZSBvZiBkYW1hZ2VkIHNlcnZlcnMgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgdmFyIGV4dGVuc2lvblRvQ29udGVudFR5cGUgPSB7XG4gICAgICAgICAgICAncmRmJzogJ2FwcGxpY2F0aW9uL3JkZit4bWwnLCAnb3dsJzogJ2FwcGxpY2F0aW9uL3JkZit4bWwnLFxuICAgICAgICAgICAgJ24zJzogJ3RleHQvbjMnLCAndHRsJzogJ3RleHQvdHVydGxlJywgJ250JzogJ3RleHQvbjMnLCAnYWNsJzogJ3RleHQvbjMnLFxuICAgICAgICAgICAgJ2h0bWwnOiAndGV4dC9odG1sJyxcbiAgICAgICAgICAgICd4bWwnOiAndGV4dC94bWwnXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgZ3Vlc3M7XG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgYWRkVHlwZShucy5saW5rKCdEb2N1bWVudCcpKTtcbiAgICAgICAgICAgIHZhciBjdCA9IHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlQ29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgeGhyLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gb3B0aW9ucy5mb3JjZUNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjdCB8fCBjdC5pbmRleE9mKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSA+PSAwKSB7XG4gICAgICAgICAgICAgIGd1ZXNzID0gZXh0ZW5zaW9uVG9Db250ZW50VHlwZVt4aHIucmVzb3VyY2UudXJpLnNwbGl0KCcuJykucG9wKCldO1xuICAgICAgICAgICAgICBpZiAoZ3Vlc3MpIHtcbiAgICAgICAgICAgICAgICB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBndWVzcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0KSB7XG4gICAgICAgICAgICAgIGlmIChjdC5pbmRleE9mKCdpbWFnZS8nKSA9PT0gMCB8fCBjdC5pbmRleE9mKCdhcHBsaWNhdGlvbi9wZGYnKSA9PT0gMCkgYWRkVHlwZShrYi5zeW0oJ2h0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy9JbWFnZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNsZWFyUHJldmlvdXNEYXRhKSB7XG4gICAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSBwYXJzZSBuZXcgZGF0YSBjbGVhciBvbGQgYnV0IG9ubHkgb24gMjAwXG4gICAgICAgICAgICAgIGtiLnJlbW92ZURvY3VtZW50KHhoci5yZXNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTsgY2hhcnNldD11dGYtOFxuXG4gICAgICAgICAgaWYgKFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2ZpbGUnIHx8IFVyaS5wcm90b2NvbCh4aHIucmVzb3VyY2UudXJpKSA9PT0gJ2Nocm9tZScpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlQ29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgeGhyLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gb3B0aW9ucy5mb3JjZUNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZ3Vlc3MgPSBleHRlbnNpb25Ub0NvbnRlbnRUeXBlW3hoci5yZXNvdXJjZS51cmkuc3BsaXQoJy4nKS5wb3AoKV07XG4gICAgICAgICAgICAgIGlmIChndWVzcykge1xuICAgICAgICAgICAgICAgIHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGd1ZXNzO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICd0ZXh0L3htbCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFscmVhZCBnb3QgdGhlIHRoaW5nIGF0IHRoaXMgbG9jYXRpb24sIGFib3J0XG4gICAgICAgICAgaWYgKGxvYykge1xuICAgICAgICAgICAgdmFyIHVkb2MgPSBVcmkuam9pbih4aHIucmVzb3VyY2UudXJpLCBsb2MpO1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiB1ZG9jICE9PSB4aHIucmVzb3VyY2UudXJpICYmIHNmLnJlcXVlc3RlZFt1ZG9jXSAmJiBzZi5yZXF1ZXN0ZWRbdWRvY10gPT09ICdkb25lJykge1xuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgZmV0Y2hlZCB0aGlzIGluIGZhY3QuXG4gICAgICAgICAgICAgIC8vIHNob3VsZCB3ZSBzbXVzaCB0b28/XG4gICAgICAgICAgICAgIC8vIGxvZy5pbmZvKFwiSFRUUCBoZWFkZXJzIGluZGljYXRlIHdlIGhhdmUgYWxyZWFkeVwiICsgXCIgcmV0cmlldmVkIFwiICsgeGhyLnJlc291cmNlICsgXCIgYXMgXCIgKyB1ZG9jICsgXCIuIEFib3J0aW5nLlwiKVxuICAgICAgICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTtcbiAgICAgICAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNmLnJlcXVlc3RlZFt1ZG9jXSA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZi5oYW5kbGVycy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgaWYgKHhoci5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAmJiB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10ubWF0Y2goc2YuaGFuZGxlcnNbeF0ucGF0dGVybikpIHtcbiAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBzZi5oYW5kbGVyc1t4XSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZi5wYXJzZUxpbmtIZWFkZXIoeGhyLCB0aGlzUmVxKTtcblxuICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBoYW5kbGVyLmhhbmRsZXJGYWN0b3J5KHhocik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBhdm9pZCBzaWxlbnQgZXJyb3JzXG4gICAgICAgICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdFeGNlcHRpb24gaGFuZGxpbmcgY29udGVudC10eXBlICcgKyB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10gKyAnIHdhczogJyArIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZi5kb25lRmV0Y2goeGhyKTsgLy8gIE5vdCBhIHByb2JsZW0sIHdlIGp1c3QgZG9uJ3QgZXh0cmFjdCBkYXRhLlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIC8vIHNmLmZhaWxGZXRjaCh4aHIsIFwiVW5oYW5kbGVkIGNvbnRlbnQgdHlwZTogXCIgKyB4aHIuaGVhZGVyc1snY29udGVudC10eXBlJ10rXG4gICAgICAgICAgICAvLyAgICAgICAgXCIsIHJlYWR5U3RhdGUgPSBcIit4aHIucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERPTkU6IDRcbiAgICAgICAgLy8gSEVBREVSU19SRUNFSVZFRDogMlxuICAgICAgICAvLyBMT0FESU5HOiAzXG4gICAgICAgIC8vIE9QRU5FRDogMVxuICAgICAgICAvLyBVTlNFTlQ6IDBcblxuICAgICAgICAvLyBsb2cuZGVidWcoXCJ3ZWIuanM6IFhIUiBcIiArIHhoci5yZXNvdXJjZS51cmkgKyAnIHJlYWR5U3RhdGU9Jyt4aHIucmVhZHlTdGF0ZSk7IC8vIEBAQEAgY29tbWVudCBtZSBvdXRcblxuICAgICAgICBzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgdmFyIHVyaSA9IHhoci5yZXNvdXJjZS51cmk7XG4gICAgICAgICAgICB2YXIgbmV3VVJJO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3Jvc3NTaXRlUHJveHlUZW1wbGF0ZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgIC8vIEluIG1hc2h1cCBzaXR1YXRpb25cbiAgICAgICAgICAgICAgdmFyIGhvc3RwYXJ0ID0gVXJpLmhvc3RwYXJ0O1xuICAgICAgICAgICAgICB2YXIgaGVyZSA9ICcnICsgZG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgIGlmIChob3N0cGFydChoZXJlKSAmJiBob3N0cGFydCh1cmkpICYmIGhvc3RwYXJ0KGhlcmUpICE9PSBob3N0cGFydCh1cmkpKSB7XG4gICAgICAgICAgICAgICAgbmV3VVJJID0gdGhpcy5jcm9zc1NpdGVQcm94eVRlbXBsYXRlLnJlcGxhY2UoJ3t1cml9JywgZW5jb2RlVVJJQ29tcG9uZW50KHVyaSkpO1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQkxPQ0tFRCAtPiBDcm9zcy1zaXRlIFByb3h5IHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgIHZhciBvbGRyZXEgPSB4aHIucmVxO1xuICAgICAgICAgICAgICAgIGtiLmFkZChvbGRyZXEsIG5zLmh0dHAoJ3JlZGlyZWN0ZWRUbycpLCBrYi5zeW0obmV3VVJJKSwgb2xkcmVxKTtcblxuICAgICAgICAgICAgICAgIC8vIC8vLy8vLy8vLy8vLyBDaGFuZ2UgdGhlIHJlcXVlc3Qgbm9kZSB0byBhIG5ldyBvbmU6ICBAQEBAQEBAQEBAQEAgRHVwbGljYXRlP1xuICAgICAgICAgICAgICAgIHZhciBuZXdyZXEgPSB4aHIucmVxID0ga2IuYm5vZGUoKTsgLy8gTWFrZSBORVcgcmVxZXN0IGZvciBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkUmVxdWVzdCcpLCBuZXdyZXEsIHhoci5yZXEpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWVOb3cgPSAnWycgKyBub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkgKyAnOicgKyBub3cuZ2V0U2Vjb25kcygpICsgJ10gJztcbiAgICAgICAgICAgICAgICBrYi5hZGQobmV3cmVxLCBucy5yZGZzKCdsYWJlbCcpLCBrYi5saXRlcmFsKHRpbWVOb3cgKyAnIFJlcXVlc3QgZm9yICcgKyBuZXdVUkkpLCB0aGlzLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgIGtiLmFkZChuZXdyZXEsIG5zLmxpbmsoJ3N0YXR1cycpLCBrYi5jb2xsZWN0aW9uKCksIHRoaXMuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwobmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcblxuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmJub2RlKCk7XG4gICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIC8vIGtiLmFkZChyZXNwb25zZSwgbnMuaHR0cCgnc3RhdHVzJyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1cyksIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgIC8vIGlmICh4aHIuc3RhdHVzVGV4dCkga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXNUZXh0JyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1c1RleHQpLCByZXNwb25zZSlcblxuICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIHhoci5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB4aHIucmVkaXJlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMob2xkcmVxLCAncmVkaXJlY3RlZCBYSFInKTsgLy8gd2h5XG5cbiAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgIGlmICghc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSkge1xuICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID09PSBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldLmNvbmNhdChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSk7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygncmVkaXJlY3RlZCcsIGFyZ3MpOyAvLyBBcmUgdGhlc2UgYXJncyByaWdodD8gQEBAXG4gICAgICAgICAgICAgICAgc2YucmVxdWVzdGVkW3hoci5yZXNvdXJjZS51cmldID0gJ3JlZGlyZWN0ZWQnO1xuXG4gICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucyB8fCB7fSwgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKHhocjIgJiYgeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgIGtiLmFkZCh4aHIucmVxLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjcmVkaXJlY3RlZFJlcXVlc3QnKSwgeGhyMi5yZXEsIHNmLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2YuZmFpbEZldGNoKHhociwgJ0hUVFAgQmxvY2tlZC4gKFJlYWR5U3RhdGUgMCkgQ3Jvc3Mtc2l0ZSB2aW9sYXRpb24gZm9yIDwnICsgZG9jdXJpICsgJz4nKTtcblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgc3RhdGUgLS0gMyBtYXkgT1IgTUFZIE5PVCBiZSBjYWxsZWQsIHNlbG9uIGJyb3dzZXIuXG4gICAgICAgICAgICAvLyBoYW5kbGVSZXNwb25zZSgpOyAgIC8vIEluIGdlbmVyYWwgaXQgeW91IGNhbid0IGRvIGl0IHlldCBhcyB0aGUgaGVhZGVycyBhcmUgaW4gYnV0IG5vdCB0aGUgZGF0YVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgLy8gRmluYWwgc3RhdGUgZm9yIHRoaXMgWEhSIGJ1dCBtYXkgYmUgcmVkaXJlY3RlZFxuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgIC8vIE5vdyBoYW5kbGVcbiAgICAgICAgICAgIGlmICh4aHIuaGFuZGxlICYmIHhoci5yZXNwb25zZVRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBjYW4gYmUgdmFsaWRseSB6ZXJvIGxlbmd0aFxuICAgICAgICAgICAgICBpZiAoc2YucmVxdWVzdGVkW3hoci5yZXNvdXJjZS51cmldID09PSAncmVkaXJlY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZi5maXJlQ2FsbGJhY2tzKCdsb2FkJywgYXJncyk7XG4gICAgICAgICAgICAgIHhoci5oYW5kbGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNmLmRvbmVGZXRjaCh4aHIpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh4aHIucmVkaXJlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnQWJvcnRlZCBhbmQgcmVkaXJlY3RlZCB0byBuZXcgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ0ZldGNoIG92ZXIuIE5vIGRhdGEgaGFuZGxlZC4gQWJvcnRlZCA9ICcgKyB4aHIuYWJvcnRlZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gc2YuZmFpbEZldGNoKHhociwgXCJIVFRQIGZhaWxlZCB1bnVzdWFsbHkuIChubyBoYW5kbGVyIHNldCkgKHgtc2l0ZSB2aW9sYXRpb24/IG5vIG5ldD8pIGZvciA8XCIrXG4gICAgICAgICAgICAgIC8vICAgIGRvY3VyaStcIj5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIHN3aXRjaFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgLy8gTWFwIHRoZSBVUkkgdG8gYSBsb2NhbGhvc3QgcHJveHkgaWYgd2UgYXJlIHJ1bm5pbmcgb24gbG9jYWxob3N0XG4gICAgLy8gVGhpcyBpcyB1c2VkIGZvciB3b3JraW5nIG9mZmxpbmUsIGUuZy4gb24gcGxhbmVzLlxuICAgIC8vIElzIHRoZSBzY3JpcHQgaXN0ZWxmIGlzIHJ1bm5pbmcgaW4gbG9jYWxob3N0LCB0aGVuIGFjY2VzcyBhbGwgZGF0YSBpbiBhIGxvY2FsaG9zdCBtaXJyb3IuXG4gICAgLy8gRG8gbm90IHJlbW92ZSB3aXRob3V0IGNoZWNraW5nIHdpdGggVGltQkxcbiAgICB2YXIgdXJpMiA9IGRvY3VyaTtcbiAgICBpZiAodHlwZW9mIHRhYnVsYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFidWxhdG9yLnByZWZlcmVuY2VzLmdldCgnb2ZmbGluZU1vZGVVc2luZ0xvY2FsaG9zdCcpKSB7XG4gICAgICBpZiAodXJpMi5zbGljZSgwLCA3KSA9PT0gJ2h0dHA6Ly8nICYmIHVyaTIuc2xpY2UoNywgMTcpICE9PSAnbG9jYWxob3N0LycpIHtcbiAgICAgICAgdXJpMiA9ICdodHRwOi8vbG9jYWxob3N0LycgKyB1cmkyLnNsaWNlKDcpO1xuICAgICAgICBsb2cud2FybignTG9jYWxob3N0IGtsdWRnZSBmb3Igb2ZmbGluZSB1c2U6IGFjdHVhbGx5IGdldHRpbmcgPCcgKyB1cmkyICsgJz4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxvZy53YXJuKFwiTG9jYWxob3N0IGtsdWRnZSBOT1QgVVNFRCA8XCIgKyB1cmkyICsgXCI+XCIpXG4gICAgICB9XG4gICAgfSBlbHNlIHt9XG4gICAgICAvLyBsb2cud2FybihcIkxvY2FsaG9zdCBrbHVkZ2UgT0ZGIG9mZmxpbmUgdXNlOiBhY3R1YWxseSBnZXR0aW5nIDxcIiArIHVyaTIgKyBcIj5cIilcblxuICAgICAgLy8gMjAxNCBwcm9iZWxtOlxuICAgICAgLy8gWE1MSHR0cFJlcXVlc3QgY2Fubm90IGxvYWQgaHR0cDovL3d3dy53My5vcmcvUGVvcGxlL0Jlcm5lcnMtTGVlL2NhcmQuXG4gICAgICAvLyBBIHdpbGRjYXJkICcqJyBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicgaGVhZGVyIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGZsYWcgaXMgdHJ1ZS5cbiAgICAgIC8vIEAgTWFueSBvbnRvbG9neSBmaWxlcyB1bmRlciBodHRwOiBhbmQgbmVlZCBDT1JTIHdpbGRjYXJkIC0+IGNhbid0IGhhdmUgd2l0aENyZWRlbnRpYWxzXG5cbiAgICB2YXIgd2l0aENyZWRlbnRpYWxzID0gdXJpMi5zbGljZSgwLCA2KSA9PT0gJ2h0dHBzOic7IC8vIEBAIEtsdWRnZSAtLSBuZWVkIGZvciB3ZWJpZCB3aGljaCB0eXBpY2FsbHkgaXMgc2VydmVkIGZyb20gaHR0cHNcbiAgICBpZiAob3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuICAgIHZhciBhY3R1YWxQcm94eVVSSSA9IHRoaXMucHJveHlJZk5lY2Vzc2FyeSh1cmkyKTtcblxuICAgIC8vIFNldHVwIHRoZSByZXF1ZXN0XG4gICAgLy8gdmFyIHhoclxuICAgIC8vIHhociA9IFV0aWwuWE1MSFRUUEZhY3RvcnkoKVxuICAgIHhoci5vbmVycm9yID0gb25lcnJvckZhY3RvcnkoeGhyKTtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gb25yZWFkeXN0YXRlY2hhbmdlRmFjdG9yeSh4aHIpO1xuICAgIHhoci50aW1lb3V0ID0gc2YudGltZW91dDtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzO1xuICAgIHhoci5hY3R1YWxQcm94eVVSSSA9IGFjdHVhbFByb3h5VVJJO1xuXG4gICAgeGhyLnJlcSA9IHJlcTtcbiAgICB4aHIub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgeGhyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm07XG4gICAgeGhyLnJlcXVlc3RlZFVSSSA9IHVyaTI7XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2YuZmFpbEZldGNoKHhociwgJ3JlcXVlc3RUaW1lb3V0Jyk7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIGFjdHVhbFByb3h5VVJJLCB0aGlzLmFzeW5jKTtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgcmV0dXJuIHRoaXMuZmFpbEZldGNoKHhociwgJ1hIUiBvcGVuIGZvciBHRVQgZmFpbGVkIGZvciA8JyArIHVyaTIgKyAnPjpcXG5cXHQnICsgZXIpO1xuICAgIH1cbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIC8vIG11c3QgaGFwcGVuIGFmdGVyIG9wZW5cbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHJlZGlyZWN0IGNhbGxiYWNrIGFuZCByZXF1ZXN0IGhlYWRlcnMgLS0gYWxhcyBGaXJlZm94IEV4dGVuc2lvbiBPbmx5XG4gICAgaWYgKHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbiAmJiB4aHIuY2hhbm5lbCAmJiAoVXJpLnByb3RvY29sKHhoci5yZXNvdXJjZS51cmkpID09PSAnaHR0cCcgfHwgVXJpLnByb3RvY29sKHhoci5yZXNvdXJjZS51cmkpID09PSAnaHR0cHMnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLmNoYW5uZWwubm90aWZpY2F0aW9uQ2FsbGJhY2tzID0ge1xuICAgICAgICAgIGdldEludGVyZmFjZTogZnVuY3Rpb24gZ2V0SW50ZXJmYWNlKGlpZCkge1xuICAgICAgICAgICAgaWYgKGlpZC5lcXVhbHMoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUNoYW5uZWxFdmVudFNpbmspKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb25DaGFubmVsUmVkaXJlY3Q6IGZ1bmN0aW9uIG9uQ2hhbm5lbFJlZGlyZWN0KG9sZEMsIG5ld0MsIGZsYWdzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIHZhciBrYiA9IHNmLnN0b3JlO1xuICAgICAgICAgICAgICAgICAgdmFyIG5ld1VSSSA9IG5ld0MuVVJJLnNwZWM7XG4gICAgICAgICAgICAgICAgICB2YXIgb2xkcmVxID0geGhyLnJlcTtcbiAgICAgICAgICAgICAgICAgIGlmICgheGhyLm9wdGlvbnMubm9NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyh4aHIucmVxLCAnUmVkaXJlY3RlZDogJyArIHhoci5zdGF0dXMgKyAnIHRvIDwnICsgbmV3VVJJICsgJz4nKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMuaHR0cCgncmVkaXJlY3RlZFRvJyksIGtiLnN5bShuZXdVUkkpLCB4aHIucmVxKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyAvLy8vLy8vLy8vLy8gQ2hhbmdlIHRoZSByZXF1ZXN0IG5vZGUgdG8gYSBuZXcgb25lOiAgQEBAQEBAQEBAQEBAIER1cGxpY2F0ZSBjb2RlP1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3cmVxID0geGhyLnJlcSA9IGtiLmJub2RlKCk7IC8vIE1ha2UgTkVXIHJlcWVzdCBmb3IgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtiLmFkZChvbGRyZXEsIG5zLmh0dHAoJ3JlZGlyZWN0ZWRSZXF1ZXN0JyksIG5ld3JlcSwgdGhpcy5hcHBOb2RlKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVOb3cgPSAnWycgKyBub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkgKyAnOicgKyBub3cuZ2V0U2Vjb25kcygpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgbmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygnc3RhdHVzJyksIGtiLmNvbGxlY3Rpb24oKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMubGluaygncmVxdWVzdGVkVVJJJyksIGtiLmxpdGVyYWwobmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIC8vIGxvZy5pbmZvKCdAQCBzb3VyY2VzIG9uQ2hhbm5lbFJlZGlyZWN0JytcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBcIlJlZGlyZWN0ZWQ6IFwiK1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHhoci5zdGF0dXMgKyBcIiB0byA8XCIgKyBuZXdVUkkgKyBcIj5cIik7IC8vQEBcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0ga2IuYm5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8ga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdsb2NhdGlvbicpLCBuZXdVUkksIHJlc3BvbnNlKTsgTm90IG9uIHRoaXMgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1cycpLCBrYi5saXRlcmFsKHhoci5zdGF0dXMpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCkga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXNUZXh0JyksIGtiLmxpdGVyYWwoeGhyLnN0YXR1c1RleHQpLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAtIDAgIT09IDMwMykga2IuSFRUUFJlZGlyZWN0c1t4aHIucmVzb3VyY2UudXJpXSA9IG5ld1VSSTsgLy8gc2FtZSBkb2N1bWVudCBhc1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgLSAwID09PSAzMDEgJiYgcnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMzAxIE1vdmVkXG4gICAgICAgICAgICAgICAgICAgIHZhciBiYWREb2MgPSBVcmkuZG9jcGFydChydGVybS51cmkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyAnIGhhcyBtb3ZlZCB0byA8JyArIG5ld1VSSSArICc+Lic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydGVybSkge1xuICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAnIExpbmsgaW4gPCcgKyBiYWREb2MgKyAnID5zaG91bGQgYmUgY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgICAga2IuYWRkKGJhZERvYywga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3dhcm5pbmcnKSwgbXNnLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBkdW1wKG1zZytcIlxcblwiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICB4aHIuYWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChzZi5mZXRjaENhbGxiYWNrc1t4aHIucmVzb3VyY2UudXJpXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNmLmZldGNoQ2FsbGJhY2tzW25ld1VSSV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9PT0gc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXS5jb25jYXQoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV07XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNmLmFkZFN0YXR1cyhvbGRyZXEsICdyZWRpcmVjdGVkJyk7IC8vIHdoeVxuICAgICAgICAgICAgICAgICAgc2YuZmlyZUNhbGxiYWNrcygncmVkaXJlY3RlZCcsIGFyZ3MpOyAvLyBBcmUgdGhlc2UgYXJncyByaWdodD8gQEBAXG4gICAgICAgICAgICAgICAgICBzZi5yZXF1ZXN0ZWRbeGhyLnJlc291cmNlLnVyaV0gPSAncmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICAgIHZhciBoYXNoID0gbmV3VVJJLmluZGV4T2YoJyMnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNoID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF4aHIub3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBrYi5hZGQoeGhyLnJlc291cmNlLCBrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDcvb250L2xpbmsjd2FybmluZycpLCAnV2FybmluZzogJyArIHhoci5yZXNvdXJjZSArICcgSFRUUCByZWRpcmVjdHMgdG8nICsgbmV3VVJJICsgJyB3aGljaCBzaG91bGQgbm90IGNvbnRhaW4gYSBcIiNcIiBzaWduJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3VVJJID0gbmV3VVJJLnNsaWNlKDAsIGhhc2gpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIHhocjIgPSBzZi5yZXF1ZXN0VVJJKG5ld1VSSSwgeGhyLnJlc291cmNlLCB4aHIub3B0aW9ucywgeGhyLnVzZXJDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICBpZiAoeGhyMiAmJiB4aHIyLnJlcSAmJiAhb3B0aW9ucy5ub01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKHhoci5yZXEsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNyZWRpcmVjdGVkUmVxdWVzdCcpLCB4aHIyLnJlcSwgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBlbHNlIGR1bXAoXCJObyB4aHIucmVxIGF2YWlsYWJsZSBmb3IgcmVkaXJlY3QgZnJvbSBcIit4aHIucmVzb3VyY2UrXCIgdG8gXCIrbmV3VVJJK1wiXFxuXCIpXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9YUENPTV9JbnRlcmZhY2VfUmVmZXJlbmNlL25zSUNoYW5uZWxFdmVudFNpbmtcbiAgICAgICAgICAgICAgICBhc3luY09uQ2hhbm5lbFJlZGlyZWN0OiBmdW5jdGlvbiBhc3luY09uQ2hhbm5lbFJlZGlyZWN0KG9sZEMsIG5ld0MsIGZsYWdzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICB2YXIga2IgPSBzZi5zdG9yZTtcbiAgICAgICAgICAgICAgICAgIHZhciBuZXdVUkkgPSBuZXdDLlVSSS5zcGVjO1xuICAgICAgICAgICAgICAgICAgdmFyIG9sZHJlcSA9IHhoci5yZXE7XG4gICAgICAgICAgICAgICAgICBzZi5hZGRTdGF0dXMoeGhyLnJlcSwgJ1JlZGlyZWN0ZWQ6ICcgKyB4aHIuc3RhdHVzICsgJyB0byA8JyArIG5ld1VSSSArICc+Jyk7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQob2xkcmVxLCBucy5odHRwKCdyZWRpcmVjdGVkVG8nKSwga2Iuc3ltKG5ld1VSSSksIHhoci5yZXEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyAvLy8vLy8vLy8vLy8gQ2hhbmdlIHRoZSByZXF1ZXN0IG5vZGUgdG8gYSBuZXcgb25lOiAgQEBAQEBAQEBAQEBAIER1cGxpY2F0ZT9cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdyZXEgPSB4aHIucmVxID0ga2IuYm5vZGUoKTsgLy8gTWFrZSBORVcgcmVxZXN0IGZvciBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgIC8vIHhoci5yZXNvdXJjZSA9IGRvY3Rlcm1cbiAgICAgICAgICAgICAgICAgIC8vIHhoci5yZXF1ZXN0ZWRVUkkgPSBhcmdzWzBdXG5cbiAgICAgICAgICAgICAgICAgIC8vIGtiLmFkZChrYi5zeW0obmV3VVJJKSwgbnMubGluayhcInJlcXVlc3RcIiksIHJlcSwgdGhpcy5hcHBOb2RlKVxuICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMuaHR0cCgncmVkaXJlY3RlZFJlcXVlc3QnKSwgbmV3cmVxLCB4aHIucmVxKTtcblxuICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdGltZU5vdyA9ICdbJyArIG5vdy5nZXRIb3VycygpICsgJzonICsgbm93LmdldE1pbnV0ZXMoKSArICc6JyArIG5vdy5nZXRTZWNvbmRzKCkgKyAnXSAnO1xuICAgICAgICAgICAgICAgICAga2IuYWRkKG5ld3JlcSwgbnMucmRmcygnbGFiZWwnKSwga2IubGl0ZXJhbCh0aW1lTm93ICsgJyBSZXF1ZXN0IGZvciAnICsgbmV3VVJJKSwgdGhpcy5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgIGtiLmFkZChuZXdyZXEsIG5zLmxpbmsoJ3N0YXR1cycpLCBrYi5jb2xsZWN0aW9uKCksIHRoaXMuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICBrYi5hZGQobmV3cmVxLCBucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwga2IubGl0ZXJhbChuZXdVUkkpLCB0aGlzLmFwcE5vZGUpO1xuICAgICAgICAgICAgICAgICAgLy8gLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAgICAgICAvLyAvLyBsb2cuaW5mbygnQEAgc291cmNlcyBvbkNoYW5uZWxSZWRpcmVjdCcrXG4gICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIFwiUmVkaXJlY3RlZDogXCIrXG4gICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHhoci5zdGF0dXMgKyBcIiB0byA8XCIgKyBuZXdVUkkgKyBcIj5cIik7IC8vQEBcbiAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGtiLmJub2RlKCk7XG4gICAgICAgICAgICAgICAgICAvLyBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ2xvY2F0aW9uJyksIG5ld1VSSSwgcmVzcG9uc2UpOyBOb3Qgb24gdGhpcyByZXNwb25zZVxuICAgICAgICAgICAgICAgICAga2IuYWRkKG9sZHJlcSwgbnMubGluaygncmVzcG9uc2UnKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAga2IuYWRkKHJlc3BvbnNlLCBucy5odHRwKCdzdGF0dXMnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzKSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXNUZXh0KSBrYi5hZGQocmVzcG9uc2UsIG5zLmh0dHAoJ3N0YXR1c1RleHQnKSwga2IubGl0ZXJhbCh4aHIuc3RhdHVzVGV4dCksIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgLSAwICE9PSAzMDMpIGtiLkhUVFBSZWRpcmVjdHNbeGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7IC8vIHNhbWUgZG9jdW1lbnQgYXNcbiAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzIC0gMCA9PT0gMzAxICYmIHJ0ZXJtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDMwMSBNb3ZlZFxuICAgICAgICAgICAgICAgICAgICB2YXIgYmFkRG9jID0gVXJpLmRvY3BhcnQocnRlcm0udXJpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9ICdXYXJuaW5nOiAnICsgeGhyLnJlc291cmNlICsgJyBoYXMgbW92ZWQgdG8gPCcgKyBuZXdVUkkgKyAnPi4nO1xuICAgICAgICAgICAgICAgICAgICBpZiAocnRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gJyBMaW5rIGluIDwnICsgYmFkRG9jICsgJyA+c2hvdWxkIGJlIGNoYW5nZWQnO1xuICAgICAgICAgICAgICAgICAgICAgIGtiLmFkZChiYWREb2MsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayN3YXJuaW5nJyksIG1zZywgc2YuYXBwTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgeGhyLmFib3J0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICB2YXIgaGFzaCA9IG5ld1VSSS5pbmRleE9mKCcjJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoaGFzaCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtc2cyID0gJ1dhcm5pbmc6ICcgKyB4aHIucmVzb3VyY2UgKyAnIEhUVFAgcmVkaXJlY3RzIHRvJyArIG5ld1VSSSArICcgd2hpY2ggZG8gbm90IG5vcm1hbGx5IGNvbnRhaW4gYSBcIiNcIiBzaWduJztcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVtcChtc2crXCJcXG5cIilcbiAgICAgICAgICAgICAgICAgICAga2IuYWRkKHhoci5yZXNvdXJjZSwga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3dhcm5pbmcnKSwgbXNnMik7XG4gICAgICAgICAgICAgICAgICAgIG5ld1VSSSA9IG5ld1VSSS5zbGljZSgwLCBoYXNoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICBpZiAoc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZi5mZXRjaENhbGxiYWNrc1tuZXdVUkldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2YuZmV0Y2hDYWxsYmFja3NbbmV3VVJJXSA9IHNmLmZldGNoQ2FsbGJhY2tzW25ld1VSSV0uY29uY2F0KHNmLmZldGNoQ2FsbGJhY2tzW3hoci5yZXNvdXJjZS51cmldKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2YuZmV0Y2hDYWxsYmFja3NbeGhyLnJlc291cmNlLnVyaV1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBzZi5yZXF1ZXN0ZWRbeGhyLnJlc291cmNlLnVyaV0gPSAncmVkaXJlY3RlZCc7XG4gICAgICAgICAgICAgICAgICBzZi5yZWRpcmVjdGVkVG9beGhyLnJlc291cmNlLnVyaV0gPSBuZXdVUkk7XG5cbiAgICAgICAgICAgICAgICAgIHZhciB4aHIyID0gc2YucmVxdWVzdFVSSShuZXdVUkksIHhoci5yZXNvdXJjZSwgeGhyLm9wdGlvbnMsIHhoci51c2VyQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgaWYgKHhocjIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGJlIG5vIFhIUiBpcyBvdGhlciBVUkkgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgeGhyMi5vcmlnaW5hbCA9IHhoci5vcmlnaW5hbDsgLy8gdXNlIHRoaXMgZm9yIGZpbmRpbmcgYmFzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyMi5yZXEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBrYi5hZGQoeGhyLnJlcSwga2Iuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rI3JlZGlyZWN0ZWRSZXF1ZXN0JyksIHhocjIucmVxLCBzZi5hcHBOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gZWxzZSBkdW1wKFwiTm8geGhyLnJlcSBhdmFpbGFibGUgZm9yIHJlZGlyZWN0IGZyb20gXCIreGhyLnJlc291cmNlK1wiIHRvIFwiK25ld1VSSStcIlxcblwiKVxuICAgICAgICAgICAgICAgIH0gLy8gYXN5bmNPbkNoYW5uZWxSZWRpcmVjdFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudHMucmVzdWx0cy5OU19OT0lOVEVSRkFDRTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHNmLmZhaWxGZXRjaCh4aHIsIFwiQEAgQ291bGRuJ3Qgc2V0IGNhbGxiYWNrIGZvciByZWRpcmVjdHM6IFwiICsgZXJyKTtcbiAgICAgIH0gLy8gdHJ5XG4gICAgfSAvLyBpZiBGaXJlZm94IGV4dGVuc2lvblxuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBhY2NlcHRzdHJpbmcgPSAnJztcbiAgICAgIGZvciAodmFyIHR5cGUgaW4gdGhpcy5tZWRpYXR5cGVzKSB7XG4gICAgICAgIC8vIHZhciBhdHRyc3RyaW5nID0gJydcbiAgICAgICAgaWYgKGFjY2VwdHN0cmluZyAhPT0gJycpIHtcbiAgICAgICAgICBhY2NlcHRzdHJpbmcgKz0gJywgJztcbiAgICAgICAgfVxuICAgICAgICBhY2NlcHRzdHJpbmcgKz0gdHlwZTtcbiAgICAgICAgZm9yICh2YXIgYXR0ciBpbiB0aGlzLm1lZGlhdHlwZXNbdHlwZV0pIHtcbiAgICAgICAgICBhY2NlcHRzdHJpbmcgKz0gJzsnICsgYXR0ciArICc9JyArIHRoaXMubWVkaWF0eXBlc1t0eXBlXVthdHRyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsIGFjY2VwdHN0cmluZyk7XG4gICAgICB0aGlzLmFkZFN0YXR1cyh4aHIucmVxLCAnQWNjZXB0OiAnICsgYWNjZXB0c3RyaW5nKTtcblxuICAgICAgLy8gaWYgKHJlcXVlc3RlcikgeyB4aHIuc2V0UmVxdWVzdEhlYWRlcignUmVmZXJlcicscmVxdWVzdGVyKSB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzZXQgQWNjZXB0IGhlYWRlcjogXCIgKyBlcnIpO1xuICAgIH1cblxuICAgIC8vIEZpcmVcbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZhaWxGZXRjaCh4aHIsICdYSFIgc2VuZCBmYWlsZWQ6JyArIGVyKTtcbiAgICB9XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQgJiYgc2YuaXNQZW5kaW5nKHhoci5yZXNvdXJjZS51cmkpKSB7XG4gICAgICAgIHNmLmZhaWxGZXRjaCh4aHIsICdyZXF1ZXN0VGltZW91dCcpO1xuICAgICAgfVxuICAgIH0sIHRoaXMudGltZW91dCk7XG4gICAgdGhpcy5hZGRTdGF0dXMoeGhyLnJlcSwgJ0hUVFAgUmVxdWVzdCBzZW50LicpO1xuICAgIHJldHVybiB4aHI7XG4gIH07IC8vIHRoaXMucmVxdWVzdFVSSSgpXG5cbiAgdGhpcy5vYmplY3RSZWZyZXNoID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICB2YXIgdXJpcyA9IGtiLnVyaXModGVybSk7IC8vIEdldCBhbGwgVVJJc1xuICAgIGlmICh0eXBlb2YgdXJpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlZnJlc2godGhpcy5zdG9yZS5zeW0oVXJpLmRvY3BhcnQodXJpc1tpXSkpKTtcbiAgICAgICAgLy8gd2hhdCBhYm91dCBydGVybT9cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gZGVwcmVjYXRlZCAtLSB1c2UgSW5kZXhlZEZvcm11bGEucmVtb3ZlRG9jdW1lbnQoZG9jKVxuICB0aGlzLnVubG9hZCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgdGhpcy5zdG9yZS5yZW1vdmVNYW55KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRlcm0pO1xuICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RlZFt0ZXJtLnVyaV07IC8vIFNvIGl0IGNhbiBiZSBsb2FkZWQgYWdhaW5cbiAgfTtcblxuICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAodGVybSwgdXNlckNhbGxiYWNrKSB7XG4gICAgLy8gc291cmNlc19yZWZyZXNoXG4gICAgdGhpcy5maXJlQ2FsbGJhY2tzKCdyZWZyZXNoJywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnJlcXVlc3RVUkkodGVybS51cmksIHVuZGVmaW5lZCwgeyBmb3JjZTogdHJ1ZSwgY2xlYXJQcmV2aW91c0RhdGE6IHRydWUgfSwgdXNlckNhbGxiYWNrKTtcbiAgfTtcblxuICB0aGlzLnJldHJhY3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIC8vIHNvdXJjZXNfcmV0cmFjdFxuICAgIHRoaXMuc3RvcmUucmVtb3ZlTWFueSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0ZXJtKTtcbiAgICBpZiAodGVybS51cmkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RlZFtVcmkuZG9jcGFydCh0ZXJtLnVyaSldO1xuICAgIH1cbiAgICB0aGlzLmZpcmVDYWxsYmFja3MoJ3JldHJhY3QnLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHRoaXMuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoZG9jdXJpKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuICd1bnJlcXVlc3RlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJ3JlcXVlc3RlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAnZG9uZScpIHtcbiAgICAgIHJldHVybiAnZmV0Y2hlZCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlcXVlc3RlZFtkb2N1cmldID09PSAncmVkaXJlY3RlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0YXRlKHRoaXMucmVkaXJlY3RlZFRvW2RvY3VyaV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiBub24tMjAwIEhUVFAgZXJyb3Igc3RhdHVzXG4gICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgfVxuICB9O1xuXG4gIC8vIGRvaW5nIGFueVN0YXRlbWVudE1hdGNoaW5nIGlzIHdhc3RpbmcgdGltZVxuICB0aGlzLmlzUGVuZGluZyA9IGZ1bmN0aW9uIChkb2N1cmkpIHtcbiAgICAvLyBzb3VyY2VzX3BlbmRpbmdcbiAgICAvLyBpZiBpdCdzIG5vdCBwZW5kaW5nOiBmYWxzZSAtPiBmbGFpbGVkICdkb25lJyAtPiBkb25lICdyZWRpcmVjdGVkJyAtPiByZWRpcmVjdGVkXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdGVkW2RvY3VyaV0gPT09IHRydWU7XG4gIH07XG4gIC8vIHZhciB1cGRhdGVzVmlhID0gbmV3ICRyZGYuVXBkYXRlc1ZpYSh0aGlzKSAvLyBTdWJzY3JpYmUgdG8gaGVhZGVyc1xuICAvLyBAQEBAQEBAQCBUaGlzIGlzIHR1cm5lZCBvZmYgYmVjYXVzZSBpdCBjYXVzZXMgYSB3ZWJzb2NrZXQgdG8gYmUgc2V0IHVwIGZvciBBTlkgZmV0Y2hcbiAgLy8gd2hldGhlciB3ZSB3YW50IHRvIHRyYWNrIGl0IG90IG5vdC4gaW5jbHVkaW5nIG9udG9sb2dpZXMgbG9hZWQgdGhvdWdoIHRoZSBYU1Nwcm94eVxufTsgLy8gRW5kIG9mIGZldGNoZXJcblxubW9kdWxlLmV4cG9ydHMgPSBGZXRjaGVyOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIgQ2xhc3NPcmRlciA9IHJlcXVpcmUoJy4vY2xhc3Mtb3JkZXInKTtcbnZhciBDb2xsZWN0aW9uID0gcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZScpO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgVmFyaWFibGUgPSByZXF1aXJlKCcuL3ZhcmlhYmxlJyk7XG5cbnZhciBGb3JtdWxhID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhGb3JtdWxhLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gRm9ybXVsYShzdGF0ZW1lbnRzLCBjb25zdHJhaW50cywgaW5pdEJpbmRpbmdzLCBvcHRpb25hbCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtdWxhKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGb3JtdWxhLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybXVsYSkpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBGb3JtdWxhLnRlcm1UeXBlO1xuICAgIF90aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzIHx8IFtdO1xuICAgIF90aGlzLmNvbnN0cmFpbnRzID0gY29uc3RyYWludHMgfHwgW107XG4gICAgX3RoaXMuaW5pdEJpbmRpbmdzID0gaW5pdEJpbmRpbmdzIHx8IFtdO1xuICAgIF90aGlzLm9wdGlvbmFsID0gb3B0aW9uYWwgfHwgW107XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZvcm11bGEsIFt7XG4gICAga2V5OiAnYWRkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHMsIHAsIG8sIGcpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHMucHVzaChuZXcgU3RhdGVtZW50KHMsIHAsIG8sIGcpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdhZGRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRTdGF0ZW1lbnQoc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHMucHVzaChzdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYm5vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBibm9kZShpZCkge1xuICAgICAgcmV0dXJuIG5ldyBCbGFua05vZGUoaWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgdHlwZXMgaW4gdGhlIGxpc3Qgd2hpY2ggaGF2ZSBubyAqc3RvcmVkKiBzdWJ0eXBlc1xuICAgICAqIFRoZXNlIGFyZSBhIHNldCBvZiBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgYnkgdGhlbXNlbHZlcyBjb21wbGV0ZVxuICAgICAqIGluZm9ybWF0aW9uIC0tIHRoZSBvdGhlciBjbGFzc2VzIGFyZSByZWR1bmRhbnQgZm9yIHRob3NlIHdob1xuICAgICAqIGtub3cgdGhlIGNsYXNzIERBRy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnYm90dG9tVHlwZVVSSXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBib3R0b21UeXBlVVJJcyh0eXBlcykge1xuICAgICAgdmFyIGJvdHM7XG4gICAgICB2YXIgYm90dG9tO1xuICAgICAgdmFyIGVsdDtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGs7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHZhciBzdWJzO1xuICAgICAgdmFyIHY7XG4gICAgICBib3RzID0gW107XG4gICAgICBmb3IgKGsgaW4gdHlwZXMpIHtcbiAgICAgICAgaWYgKCF0eXBlcy5oYXNPd25Qcm9wZXJ0eShrKSkgY29udGludWU7XG4gICAgICAgIHYgPSB0eXBlc1trXTtcbiAgICAgICAgc3VicyA9IHRoaXMuZWFjaCh2b2lkIDAsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjc3ViQ2xhc3NPZicpLCB0aGlzLnN5bShrKSk7XG4gICAgICAgIGJvdHRvbSA9IHRydWU7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBmb3IgKGxlbiA9IHN1YnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBlbHQgPSBzdWJzW2ldO1xuICAgICAgICAgIHJlZiA9IGVsdC51cmk7XG4gICAgICAgICAgaWYgKHJlZiBpbiB0eXBlcykge1xuICAgICAgICAgICAgLy8gdGhlIHN1YmNsYXNzIGlzIG9uZSB3ZSBrbm93XG4gICAgICAgICAgICBib3R0b20gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYm90dG9tKSB7XG4gICAgICAgICAgYm90c1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBib3RzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbGxlY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xsZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZWFjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2gocywgcCwgbywgZykge1xuICAgICAgdmFyIGVsdCwgaSwgbCwgbSwgcTtcbiAgICAgIHZhciBsZW4sIGxlbjEsIGxlbjIsIGxlbjM7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgdmFyIHN0cyA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHMsIHAsIG8sIGcsIGZhbHNlKTtcbiAgICAgIGlmIChzID09IG51bGwpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgZWx0ID0gc3RzW2ldO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbHQuc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocCA9PSBudWxsKSB7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSBzdHMubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgICAgZWx0ID0gc3RzW2xdO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbHQucHJlZGljYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgZm9yIChtID0gMCwgbGVuMiA9IHN0cy5sZW5ndGg7IG0gPCBsZW4yOyBtKyspIHtcbiAgICAgICAgICBlbHQgPSBzdHNbbV07XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGVsdC5vYmplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGcgPT0gbnVsbCkge1xuICAgICAgICBmb3IgKHEgPSAwLCBsZW4zID0gc3RzLmxlbmd0aDsgcSA8IGxlbjM7IHErKykge1xuICAgICAgICAgIGVsdCA9IHN0c1txXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goZWx0LndoeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5oYXNoU3RyaW5nKCkgPT09IG90aGVyLmhhc2hTdHJpbmcoKTtcbiAgICB9XG4gICAgLypcbiAgICBGb3IgdGhpc0NsYXNzIG9yIGFueSBzdWJjbGFzcywgYW55dGhpbmcgd2hpY2ggaGFzIGl0IGlzIGl0cyB0eXBlXG4gICAgb3IgaXMgdGhlIG9iamVjdCBvZiBzb21ldGhpbmcgd2hpY2ggaGFzIHRoZSB0eXBlIGFzIGl0cyByYW5nZSwgb3Igc3ViamVjdFxuICAgIG9mIHNvbWV0aGluZyB3aGljaCBoYXMgdGhlIHR5cGUgYXMgaXRzIGRvbWFpblxuICAgIFdlIGRvbid0IGJvdGhlciBkb2luZyBzdWJwcm9wZXJ0eSAoeWV0PylhcyBpdCBkb2Vzbid0IHNlZWVtIHRvIGJlIHVzZWQgbXVjaC5cbiAgICBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgbWVtYmVyXG4gICAgQHJldHVybnMgYSBoYXNoIG9mIFVSSXNcbiAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRm9yIHRoaXNDbGFzcyBvciBhbnkgc3ViY2xhc3MsIGFueXRoaW5nIHdoaWNoIGhhcyBpdCBpcyBpdHMgdHlwZVxuICAgICAqIG9yIGlzIHRoZSBvYmplY3Qgb2Ygc29tZXRoaW5nIHdoaWNoIGhhcyB0aGUgdHlwZSBhcyBpdHMgcmFuZ2UsIG9yIHN1YmplY3RcbiAgICAgKiBvZiBzb21ldGhpbmcgd2hpY2ggaGFzIHRoZSB0eXBlIGFzIGl0cyBkb21haW5cbiAgICAgKiBXZSBkb24ndCBib3RoZXIgZG9pbmcgc3VicHJvcGVydHkgKHlldD8pYXMgaXQgZG9lc24ndCBzZWVlbSB0byBiZSB1c2VkXG4gICAgICogbXVjaC5cbiAgICAgKiBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgbWVtYmVyXG4gICAgICogQHJldHVybiBhIGhhc2ggb2YgVVJJc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmaW5kTWVtYmVyc05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZE1lbWJlcnNOVCh0aGlzQ2xhc3MpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGw7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIGxlbjE7XG4gICAgICB2YXIgbGVuMjtcbiAgICAgIHZhciBsZW4zO1xuICAgICAgdmFyIGxlbjQ7XG4gICAgICB2YXIgbTtcbiAgICAgIHZhciBtZW1iZXJzO1xuICAgICAgdmFyIHByZWQ7XG4gICAgICB2YXIgcTtcbiAgICAgIHZhciByZWY7XG4gICAgICB2YXIgcmVmMTtcbiAgICAgIHZhciByZWYyO1xuICAgICAgdmFyIHJlZjM7XG4gICAgICB2YXIgcmVmNDtcbiAgICAgIHZhciByZWY1O1xuICAgICAgdmFyIHNlZWRzO1xuICAgICAgdmFyIHN0O1xuICAgICAgdmFyIHQ7XG4gICAgICB2YXIgdTtcbiAgICAgIHNlZWRzID0ge307XG4gICAgICBzZWVkc1t0aGlzQ2xhc3MudG9OVCgpXSA9IHRydWU7XG4gICAgICBtZW1iZXJzID0ge307XG4gICAgICByZWYgPSB0aGlzLnRyYW5zaXRpdmVDbG9zdXJlKHNlZWRzLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSwgdHJ1ZSk7XG4gICAgICBmb3IgKHQgaW4gcmVmKSB7XG4gICAgICAgIGlmICghcmVmLmhhc093blByb3BlcnR5KHQpKSBjb250aW51ZTtcbiAgICAgICAgcmVmMSA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHZvaWQgMCwgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyksIHRoaXMuZnJvbU5UKHQpKTtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmMS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHN0ID0gcmVmMVtpXTtcbiAgICAgICAgICBtZW1iZXJzW3N0LnN1YmplY3QudG9OVCgpXSA9IHN0O1xuICAgICAgICB9XG4gICAgICAgIHJlZjIgPSB0aGlzLmVhY2godm9pZCAwLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI2RvbWFpbicpLCB0aGlzLmZyb21OVCh0KSk7XG4gICAgICAgIGZvciAobCA9IDAsIGxlbjEgPSByZWYyLmxlbmd0aDsgbCA8IGxlbjE7IGwrKykge1xuICAgICAgICAgIHByZWQgPSByZWYyW2xdO1xuICAgICAgICAgIHJlZjMgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh2b2lkIDAsIHByZWQpO1xuICAgICAgICAgIGZvciAobSA9IDAsIGxlbjIgPSByZWYzLmxlbmd0aDsgbSA8IGxlbjI7IG0rKykge1xuICAgICAgICAgICAgc3QgPSByZWYzW21dO1xuICAgICAgICAgICAgbWVtYmVyc1tzdC5zdWJqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVmNCA9IHRoaXMuZWFjaCh2b2lkIDAsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjcmFuZ2UnKSwgdGhpcy5mcm9tTlQodCkpO1xuICAgICAgICBmb3IgKHEgPSAwLCBsZW4zID0gcmVmNC5sZW5ndGg7IHEgPCBsZW4zOyBxKyspIHtcbiAgICAgICAgICBwcmVkID0gcmVmNFtxXTtcbiAgICAgICAgICByZWY1ID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCBwcmVkKTtcbiAgICAgICAgICBmb3IgKHUgPSAwLCBsZW40ID0gcmVmNS5sZW5ndGg7IHUgPCBsZW40OyB1KyspIHtcbiAgICAgICAgICAgIHN0ID0gcmVmNVt1XTtcbiAgICAgICAgICAgIG1lbWJlcnNbc3Qub2JqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRNZW1iZXJVUklzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZE1lbWJlclVSSXMoc3ViamVjdCkge1xuICAgICAgcmV0dXJuIHRoaXMuTlR0b1VSSSh0aGlzLmZpbmRNZW1iZXJzTlQoc3ViamVjdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHRoZSBDbGFzc2VzIG9mIHdoaWNoIHdlIGNhbiBSREZTLWluZmVyIHRoZSBzdWJqZWN0IGlzIGEgc3VwZXJjbGFzc1xuICAgICAqIFJldHVybnMgYSBoYXNoIHRhYmxlIHdoZXJlIGtleSBpcyBOVCBvZiB0eXBlIGFuZCB2YWx1ZSBpcyBzdGF0ZW1lbnQgd2h5IHdlXG4gICAgICogdGhpbmsgc28uXG4gICAgICogRG9lcyBOT1QgcmV0dXJuIHRlcm1zLCByZXR1cm5zIFVSSSBzdHJpbmdzLlxuICAgICAqIFdlIHVzZSBOVCByZXByZXNlbnRhdGlvbnMgaW4gdGhpcyB2ZXJzaW9uIGJlY2F1c2UgdGhleSBoYW5kbGUgYmxhbmsgbm9kZXMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRTdWJDbGFzc2VzTlQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kU3ViQ2xhc3Nlc05UKHN1YmplY3QpIHtcbiAgICAgIHZhciB0eXBlcyA9IHt9O1xuICAgICAgdHlwZXNbc3ViamVjdC50b05UKCldID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpdmVDbG9zdXJlKHR5cGVzLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgdGhlIENsYXNzZXMgb2Ygd2hpY2ggd2UgY2FuIFJERlMtaW5mZXIgdGhlIHN1YmplY3QgaXMgYSBzdWJjbGFzc1xuICAgICAqIFJldHVybnMgYSBoYXNoIHRhYmxlIHdoZXJlIGtleSBpcyBOVCBvZiB0eXBlIGFuZCB2YWx1ZSBpcyBzdGF0ZW1lbnQgd2h5IHdlXG4gICAgICogdGhpbmsgc28uXG4gICAgICogRG9lcyBOT1QgcmV0dXJuIHRlcm1zLCByZXR1cm5zIFVSSSBzdHJpbmdzLlxuICAgICAqIFdlIHVzZSBOVCByZXByZXNlbnRhdGlvbnMgaW4gdGhpcyB2ZXJzaW9uIGJlY2F1c2UgdGhleSBoYW5kbGUgYmxhbmsgbm9kZXMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbmRTdXBlckNsYXNzZXNOVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRTdXBlckNsYXNzZXNOVChzdWJqZWN0KSB7XG4gICAgICB2YXIgdHlwZXMgPSB7fTtcbiAgICAgIHR5cGVzW3N1YmplY3QudG9OVCgpXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2l0aXZlQ2xvc3VyZSh0eXBlcywgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNzdWJDbGFzc09mJyksIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB0aGUgQ2xhc3NlcyBvZiB3aGljaCB3ZSBjYW4gUkRGUy1pbmZlciB0aGUgc3ViamVjdCBpcyBhIG1lbWJlclxuICAgICAqIHRvZG86IFRoaXMgd2lsbCBsb29wIGlzIHRoZXJlIGlzIGEgY2xhc3Mgc3ViY2xhc3MgbG9vcCAoU3VibGFzcyBsb29wcyBhcmVcbiAgICAgKiBub3QgaWxsZWdhbClcbiAgICAgKiBSZXR1cm5zIGEgaGFzaCB0YWJsZSB3aGVyZSBrZXkgaXMgTlQgb2YgdHlwZSBhbmQgdmFsdWUgaXMgc3RhdGVtZW50IHdoeSB3ZVxuICAgICAqIHRoaW5rIHNvLlxuICAgICAqIERvZXMgTk9UIHJldHVybiB0ZXJtcywgcmV0dXJucyBVUkkgc3RyaW5ncy5cbiAgICAgKiBXZSB1c2UgTlQgcmVwcmVzZW50YXRpb25zIGluIHRoaXMgdmVyc2lvbiBiZWNhdXNlIHRoZXkgaGFuZGxlIGJsYW5rIG5vZGVzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmaW5kVHlwZXNOVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmRUeXBlc05UKHN1YmplY3QpIHtcbiAgICAgIHZhciBkb21haW47XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBsO1xuICAgICAgdmFyIGxlbjtcbiAgICAgIHZhciBsZW4xO1xuICAgICAgdmFyIGxlbjI7XG4gICAgICB2YXIgbGVuMztcbiAgICAgIHZhciBtO1xuICAgICAgdmFyIHE7XG4gICAgICB2YXIgcmFuZ2U7XG4gICAgICB2YXIgcmRmdHlwZTtcbiAgICAgIHZhciByZWY7XG4gICAgICB2YXIgcmVmMTtcbiAgICAgIHZhciByZWYyO1xuICAgICAgdmFyIHJlZjM7XG4gICAgICB2YXIgc3Q7XG4gICAgICB2YXIgdHlwZXM7XG4gICAgICByZGZ0eXBlID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcbiAgICAgIHR5cGVzID0gW107XG4gICAgICByZWYgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyhzdWJqZWN0LCB2b2lkIDAsIHZvaWQgMCk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3QgPSByZWZbaV07XG4gICAgICAgIGlmIChzdC5wcmVkaWNhdGUudXJpID09PSByZGZ0eXBlKSB7XG4gICAgICAgICAgdHlwZXNbc3Qub2JqZWN0LnRvTlQoKV0gPSBzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWYxID0gdGhpcy5lYWNoKHN0LnByZWRpY2F0ZSwgdGhpcy5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNkb21haW4nKSk7XG4gICAgICAgICAgZm9yIChsID0gMCwgbGVuMSA9IHJlZjEubGVuZ3RoOyBsIDwgbGVuMTsgbCsrKSB7XG4gICAgICAgICAgICByYW5nZSA9IHJlZjFbbF07XG4gICAgICAgICAgICB0eXBlc1tyYW5nZS50b05UKCldID0gc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWYyID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCB2b2lkIDAsIHN1YmplY3QpO1xuICAgICAgZm9yIChtID0gMCwgbGVuMiA9IHJlZjIubGVuZ3RoOyBtIDwgbGVuMjsgbSsrKSB7XG4gICAgICAgIHN0ID0gcmVmMlttXTtcbiAgICAgICAgcmVmMyA9IHRoaXMuZWFjaChzdC5wcmVkaWNhdGUsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjcmFuZ2UnKSk7XG4gICAgICAgIGZvciAocSA9IDAsIGxlbjMgPSByZWYzLmxlbmd0aDsgcSA8IGxlbjM7IHErKykge1xuICAgICAgICAgIGRvbWFpbiA9IHJlZjNbcV07XG4gICAgICAgICAgdHlwZXNbZG9tYWluLnRvTlQoKV0gPSBzdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGl2ZUNsb3N1cmUodHlwZXMsIHRoaXMuc3ltKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjc3ViQ2xhc3NPZicpLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZmluZFR5cGVVUklzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZmluZFR5cGVVUklzKHN1YmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLk5UdG9VUkkodGhpcy5maW5kVHlwZXNOVChzdWJqZWN0KSk7XG4gICAgfVxuICAgIC8vIFRyYWNlIHRoZSBzdGF0ZW1lbnRzIHdoaWNoIGNvbm5lY3QgZGlyZWN0bHksIG9yIHRocm91Z2ggYm5vZGVzXG4gICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBzdGF0ZW1lbnRzXG4gICAgLy8gZG9jIHBhcmFtIG1heSBiZSBudWxsIHRvIHNlYXJjaCBhbGwgZG9jdW1lbnRzIGluIHN0b3JlXG5cbiAgfSwge1xuICAgIGtleTogJ2Nvbm5lY3RlZFN0YXRlbWVudHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25uZWN0ZWRTdGF0ZW1lbnRzKHN1YmplY3QsIGRvYywgZXhjbHVkZVByZWRpY2F0ZVVSSXMpIHtcbiAgICAgIGV4Y2x1ZGVQcmVkaWNhdGVVUklzID0gZXhjbHVkZVByZWRpY2F0ZVVSSXMgfHwgW107XG4gICAgICB2YXIgdG9kbyA9IFtzdWJqZWN0XTtcbiAgICAgIHZhciBkb25lID0gW107XG4gICAgICB2YXIgZG9uZUFyY3MgPSBbXTtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBmb2xsb3cgPSBmdW5jdGlvbiBmb2xsb3coeCkge1xuICAgICAgICB2YXIgcXVldWUgPSBmdW5jdGlvbiBxdWV1ZSh4KSB7XG4gICAgICAgICAgaWYgKHgudGVybVR5cGUgPT09ICdCbGFua05vZGUnICYmICFkb25lW3gudmFsdWVdKSB7XG4gICAgICAgICAgICBkb25lW3gudmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRvZG8ucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzdHMgPSBzZWxmLnN0YXRlbWVudHNNYXRjaGluZyhudWxsLCBudWxsLCB4LCBkb2MpLmNvbmNhdChzZWxmLnN0YXRlbWVudHNNYXRjaGluZyh4LCBudWxsLCBudWxsLCBkb2MpKTtcbiAgICAgICAgc3RzID0gc3RzLmZpbHRlcihmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICBpZiAoZXhjbHVkZVByZWRpY2F0ZVVSSXNbc3QucHJlZGljYXRlLnVyaV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB2YXIgaGFzaCA9IHN0LnRvTlQoKTtcbiAgICAgICAgICBpZiAoZG9uZUFyY3NbaGFzaF0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBkb25lQXJjc1toYXNoXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHMuZm9yRWFjaChmdW5jdGlvbiAoc3QsIGkpIHtcbiAgICAgICAgICBxdWV1ZShzdC5zdWJqZWN0KTtcbiAgICAgICAgICBxdWV1ZShzdC5vYmplY3QpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChzdHMpO1xuICAgICAgfTtcbiAgICAgIHdoaWxlICh0b2RvLmxlbmd0aCkge1xuICAgICAgICBmb2xsb3codG9kby5zaGlmdCgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKCcnICsgcmVzdWx0Lmxlbmd0aCArICcgc3RhdGVtZW50cyBhYm91dCAnICsgc3ViamVjdClcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZm9ybXVsYScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm11bGEoKSB7XG4gICAgICByZXR1cm4gbmV3IEZvcm11bGEoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyBhbiBOVHJpcGxlcyBzdHJpbmcgZm9ybWF0IGludG8gYSBOb2RlLlxuICAgICAqIFRoZSBibm9kZSBiaXQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHByb2dyYW0tZXh0ZXJuYWwgdmFsdWVzOyBkZXNpZ25lZFxuICAgICAqIGZvciBpbnRlcm5hbCB3b3JrIHN1Y2ggYXMgc3RvcmluZyBhIGJub2RlIGlkIGluIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgICAqIFRoaXMgd2lsbCBvbmx5IHBhcnNlIHRoZSBzdHJpbmdzIGdlbmVyYXRlZCBieSB0aGUgdmFpb3VzIHRvTlQoKSBtZXRob2RzLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmcm9tTlQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tTlQoc3RyKSB7XG4gICAgICB2YXIgZHQsIGssIGxhbmcsIHg7XG4gICAgICBzd2l0Y2ggKHN0clswXSkge1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5zeW0oc3RyLnNsaWNlKDEsIC0xKSk7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICBsYW5nID0gdm9pZCAwO1xuICAgICAgICAgIGR0ID0gdm9pZCAwO1xuICAgICAgICAgIGsgPSBzdHIubGFzdEluZGV4T2YoJ1wiJyk7XG4gICAgICAgICAgaWYgKGsgPCBzdHIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgaWYgKHN0cltrICsgMV0gPT09ICdAJykge1xuICAgICAgICAgICAgICBsYW5nID0gc3RyLnNsaWNlKGsgKyAyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKGsgKyAxLCBrICsgMykgPT09ICdeXicpIHtcbiAgICAgICAgICAgICAgZHQgPSB0aGlzLmZyb21OVChzdHIuc2xpY2UoayArIDMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbnZlcnQgc3RyaW5nIGZyb20gTlQ6IFwiICsgc3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDEsIGspO1xuICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKTtcbiAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXRlcmFsKHN0ciwgbGFuZywgZHQpO1xuICAgICAgICBjYXNlICdfJzpcbiAgICAgICAgICB4ID0gbmV3IEJsYW5rTm9kZSgpO1xuICAgICAgICAgIHguaWQgPSBwYXJzZUludChzdHIuc2xpY2UoMyksIDEwKTtcbiAgICAgICAgICBCbGFua05vZGUubmV4dElkLS07XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGUoc3RyLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbnZlcnQgZnJvbSBOVDogXCIgKyBzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hvbGRzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaG9sZHMocywgcCwgbywgZykge1xuICAgICAgdmFyIGk7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5ob2xkcyhzW2ldKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ob2xkcyhzLnN1YmplY3QsIHMucHJlZGljYXRlLCBzLm9iamVjdCwgcy53aHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHMuc3RhdGVtZW50cykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhvbGRzKHMuc3RhdGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHN0ID0gdGhpcy5hbnlTdGF0ZW1lbnRNYXRjaGluZyhzLCBwLCBvLCBnKTtcbiAgICAgIHJldHVybiBzdCAhPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hvbGRzU3RhdGVtZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaG9sZHNTdGF0ZW1lbnQoc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmhvbGRzKHN0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCBzdC53aHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xpc3QnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0KHZhbHVlcykge1xuICAgICAgdmFyIGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbigpO1xuICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBjb2xsZWN0aW9uLmFwcGVuZCh2YWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdsaXRlcmFsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGl0ZXJhbCh2YWwsIGxhbmcsIGR0KSB7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwoJycgKyB2YWwsIGxhbmcsIGR0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJhbnNmb3JtIGEgY29sbGVjdGlvbiBvZiBOVHJpcGxlIFVSSXMgaW50byB0aGVpciBVUkkgc3RyaW5nc1xuICAgICAqIEBwYXJhbSB0IHNvbWUgaXRlcmFibGUgY29sbGV0aW9uIG9mIE5UcmlwbGUgVVJJIHN0cmluZ3NcbiAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgVVJJcyBhcyBzdHJpbmdzXG4gICAgICogdG9kbzogZXhwbGFpbiB3aHkgaXQgaXMgaW1wb3J0YW50IHRvIGdvIHRocm91Z2ggTlRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnTlR0b1VSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIE5UdG9VUkkodCkge1xuICAgICAgdmFyIGssIHY7XG4gICAgICB2YXIgdXJpcyA9IHt9O1xuICAgICAgZm9yIChrIGluIHQpIHtcbiAgICAgICAgaWYgKCF0Lmhhc093blByb3BlcnR5KGspKSBjb250aW51ZTtcbiAgICAgICAgdiA9IHRba107XG4gICAgICAgIGlmIChrWzBdID09PSAnPCcpIHtcbiAgICAgICAgICB1cmlzW2suc2xpY2UoMSwgLTEpXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NlcmlhbGl6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlcmlhbGl6ZShiYXNlLCBjb250ZW50VHlwZSwgcHJvdmVuYW5jZSkge1xuICAgICAgdmFyIGRvY3VtZW50U3RyaW5nO1xuICAgICAgdmFyIHN0cztcbiAgICAgIHZhciBzejtcbiAgICAgIHN6ID0gU2VyaWFsaXplcih0aGlzKTtcbiAgICAgIHN6LnN1Z2dlc3ROYW1lc3BhY2VzKHRoaXMubmFtZXNwYWNlcyk7XG4gICAgICBzei5zZXRCYXNlKGJhc2UpO1xuICAgICAgaWYgKHByb3ZlbmFuY2UpIHtcbiAgICAgICAgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgcHJvdmVuYW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHMgPSB0aGlzLnN0YXRlbWVudHM7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlICE9IG51bGwgPyBjb250ZW50VHlwZSA6ICd0ZXh0L24zJykge1xuICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9yZGYreG1sJzpcbiAgICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb1hNTChzdHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0L24zJzpcbiAgICAgICAgY2FzZSAndGV4dC90dXJ0bGUnOlxuICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMoc3RzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlcmlhbGl6ZTogQ29udGVudC10eXBlICcgKyBjb250ZW50VHlwZSArICcgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2N1bWVudFN0cmluZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHN0YXRlbWVudHNDb3B5ID0gdGhpcy5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoZWEpIHtcbiAgICAgICAgcmV0dXJuIGVhLnN1YnN0aXR1dGUoYmluZGluZ3MpO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygnRm9ybXVsYSBzdWJzIHN0YXRtbnRzOicgKyBzdGF0ZW1lbnRzQ29weSk7XG4gICAgICB2YXIgeSA9IG5ldyBGb3JtdWxhKCk7XG4gICAgICB5LmFkZChzdGF0ZW1lbnRzQ29weSk7XG4gICAgICBjb25zb2xlLmxvZygnaW5kZXhlZC1mb3JtIHN1YnMgZm9ybXVsYTonICsgeSk7XG4gICAgICByZXR1cm4geTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzeW0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzeW0odXJpLCBuYW1lKSB7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZmVhdHVyZSAoa2Iuc3ltIHdpdGggMiBhcmdzKSBpcyByZW1vdmVkLiBEbyBub3QgYXNzdW1lIHByZWZpeCBtYXBwaW5ncy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHVyaSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndGhlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdGhlKHMsIHAsIG8sIGcpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hbnkocywgcCwgbywgZyk7XG4gICAgICBpZiAoeCA9PSBudWxsKSB7XG4gICAgICAgIGxvZy5lcnJvcignTm8gdmFsdWUgZm91bmQgZm9yIHRoZSgpIHsnICsgcyArICcgJyArIHAgKyAnICcgKyBvICsgJ30uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUkRGUyBJbmZlcmVuY2VcbiAgICAgKiBUaGVzZSBhcmUgaGFuZC13cml0dGVuIGltcGxlbWVudGF0aW9ucyBvZiBhIGJhY2t3YXJkLWNoYWluaW5nIHJlYXNvbmVyXG4gICAgICogb3ZlciB0aGUgUkRGUyBheGlvbXMuXG4gICAgICogQHBhcmFtIHNlZWRzIHtPYmplY3R9IGEgaGFzaCBvZiBOVHMgb2YgY2xhc3NlcyB0byBzdGFydCB3aXRoXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgcHJvcGVydHkgdG8gdHJhY2UgdGhvdWdoXG4gICAgICogQHBhcmFtIGludmVyc2UgdHJhY2UgaW52ZXJzZSBkaXJlY3Rpb25cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAndHJhbnNpdGl2ZUNsb3N1cmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFuc2l0aXZlQ2xvc3VyZShzZWVkcywgcHJlZGljYXRlLCBpbnZlcnNlKSB7XG4gICAgICB2YXIgZWx0LCBpLCBsZW4sIHMsIHN1cHMsIHQ7XG4gICAgICB2YXIgYWdlbmRhID0ge307XG4gICAgICBPYmplY3QuYXNzaWduKGFnZW5kYSwgc2VlZHMpOyAvLyBtYWtlIGEgY29weVxuICAgICAgdmFyIGRvbmUgPSB7fTsgLy8gY2xhc3NlcyB3ZSBoYXZlIGxvb2tlZCB1cFxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIGFnZW5kYSkge1xuICAgICAgICAgICAgaWYgKCFhZ2VuZGEuaGFzT3duUHJvcGVydHkocCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgfVxuICAgICAgICB9KCk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgICAgICBzdXBzID0gaW52ZXJzZSA/IHRoaXMuZWFjaCh2b2lkIDAsIHByZWRpY2F0ZSwgdGhpcy5mcm9tTlQodCkpIDogdGhpcy5lYWNoKHRoaXMuZnJvbU5UKHQpLCBwcmVkaWNhdGUpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgZWx0ID0gc3Vwc1tpXTtcbiAgICAgICAgICBzID0gZWx0LnRvTlQoKTtcbiAgICAgICAgICBpZiAocyBpbiBkb25lKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMgaW4gYWdlbmRhKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbmRhW3NdID0gYWdlbmRhW3RdO1xuICAgICAgICB9XG4gICAgICAgIGRvbmVbdF0gPSBhZ2VuZGFbdF07XG4gICAgICAgIGRlbGV0ZSBhZ2VuZGFbdF07XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCB3aGljaCBoYXZlIG5vICpzdG9yZWQqIHN1cGVydHlwZXNcbiAgICAgKiBXZSBleGNsdWRlIHRoZSB1bml2ZXJzYWwgY2xhc3MsIG93bDpUaGluZ3MgYW5kIHJkZjpSZXNvdXJjZSwgYXMgaXQgaXNcbiAgICAgKiBpbmZvcm1hdGlvbi1mcmVlLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd0b3BUeXBlVVJJcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvcFR5cGVVUklzKHR5cGVzKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBqO1xuICAgICAgdmFyIGs7XG4gICAgICB2YXIgbGVuO1xuICAgICAgdmFyIG47XG4gICAgICB2YXIgcmVmO1xuICAgICAgdmFyIHRvcHM7XG4gICAgICB2YXIgdjtcbiAgICAgIHRvcHMgPSBbXTtcbiAgICAgIGZvciAoayBpbiB0eXBlcykge1xuICAgICAgICBpZiAoIXR5cGVzLmhhc093blByb3BlcnR5KGspKSBjb250aW51ZTtcbiAgICAgICAgdiA9IHR5cGVzW2tdO1xuICAgICAgICBuID0gMDtcbiAgICAgICAgcmVmID0gdGhpcy5lYWNoKHRoaXMuc3ltKGspLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI3N1YkNsYXNzT2YnKSk7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGogPSByZWZbaV07XG4gICAgICAgICAgaWYgKGoudXJpICE9PSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI1Jlc291cmNlJykge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbikge1xuICAgICAgICAgIHRvcHNba10gPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9wc1snaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hI1Jlc291cmNlJ10pIHtcbiAgICAgICAgZGVsZXRlIHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDEvcmRmLXNjaGVtYSNSZXNvdXJjZSddO1xuICAgICAgfVxuICAgICAgaWYgKHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI1RoaW5nJ10pIHtcbiAgICAgICAgZGVsZXRlIHRvcHNbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI1RoaW5nJ107XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICd7JyArIHRoaXMuc3RhdGVtZW50cy5qb2luKCdcXG4nKSArICd9JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd3aGV0aGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2hldGhlcihzLCBwLCBvLCBnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcocywgcCwgbywgZywgZmFsc2UpLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9ybXVsYTtcbn0oTm9kZSk7XG5cbkZvcm11bGEudGVybVR5cGUgPSAnR3JhcGgnO1xuXG5Gb3JtdWxhLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnR3JhcGgnXTtcbkZvcm11bGEucHJvdG90eXBlLmlzVmFyID0gMDtcblxuRm9ybXVsYS5wcm90b3R5cGUubnMgPSByZXF1aXJlKCcuL25hbWVzcGFjZScpO1xuRm9ybXVsYS5wcm90b3R5cGUudmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gbmV3IFZhcmlhYmxlKG5hbWUpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGb3JtdWxhOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbmRleGVkRm9ybXVsYSA9IHJlcXVpcmUoJy4vaW5kZXhlZC1mb3JtdWxhJyk7XG5cbnZhciBfaW5kZXhlZEZvcm11bGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5kZXhlZEZvcm11bGEpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgJHJkZiA9IHtcbiAgQmxhbmtOb2RlOiByZXF1aXJlKCcuL2JsYW5rLW5vZGUnKSxcbiAgQ29sbGVjdGlvbjogcmVxdWlyZSgnLi9jb2xsZWN0aW9uJyksXG4gIGNvbnZlcnQ6IHJlcXVpcmUoJy4vY29udmVydCcpLFxuICBEYXRhRmFjdG9yeTogcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKSxcbiAgRW1wdHk6IHJlcXVpcmUoJy4vZW1wdHknKSxcbiAgRmV0Y2hlcjogcmVxdWlyZSgnLi9mZXRjaGVyJyksXG4gIEZvcm11bGE6IHJlcXVpcmUoJy4vZm9ybXVsYScpLFxuICBJbmRleGVkRm9ybXVsYTogX2luZGV4ZWRGb3JtdWxhMi5kZWZhdWx0LFxuICBqc29uUGFyc2VyOiByZXF1aXJlKCcuL2pzb25wYXJzZXInKSxcbiAgTGl0ZXJhbDogcmVxdWlyZSgnLi9saXRlcmFsJyksXG4gIGxvZzogcmVxdWlyZSgnLi9sb2cnKSxcbiAgTjNQYXJzZXI6IHJlcXVpcmUoJy4vbjNwYXJzZXInKSxcbiAgTmFtZWROb2RlOiByZXF1aXJlKCcuL25hbWVkLW5vZGUnKSxcbiAgTmFtZXNwYWNlOiByZXF1aXJlKCcuL25hbWVzcGFjZScpLFxuICBOb2RlOiByZXF1aXJlKCcuL25vZGUnKSxcbiAgcGFyc2U6IHJlcXVpcmUoJy4vcGFyc2UnKSxcbiAgUXVlcnk6IHJlcXVpcmUoJy4vcXVlcnknKS5RdWVyeSxcbiAgcXVlcnlUb1NQQVJRTDogcmVxdWlyZSgnLi9xdWVyeS10by1zcGFycWwnKSxcbiAgUkRGYVByb2Nlc3NvcjogcmVxdWlyZSgnLi9yZGZhcGFyc2VyJyksXG4gIFJERlBhcnNlcjogcmVxdWlyZSgnLi9yZGZ4bWxwYXJzZXInKSxcbiAgc2VyaWFsaXplOiByZXF1aXJlKCcuL3NlcmlhbGl6ZScpLFxuICBTZXJpYWxpemVyOiByZXF1aXJlKCcuL3NlcmlhbGl6ZXInKSxcbiAgU1BBUlFMVG9RdWVyeTogcmVxdWlyZSgnLi9zcGFycWwtdG8tcXVlcnknKSxcbiAgc3BhcnFsVXBkYXRlUGFyc2VyOiByZXF1aXJlKCcuL3BhdGNoLXBhcnNlcicpLFxuICBTdGF0ZW1lbnQ6IHJlcXVpcmUoJy4vc3RhdGVtZW50JyksXG4gIHRlcm06IHJlcXVpcmUoJy4vbm9kZScpLmZyb21WYWx1ZSxcbiAgVXBkYXRlTWFuYWdlcjogcmVxdWlyZSgnLi91cGRhdGUtbWFuYWdlcicpLFxuICBVcGRhdGVzU29ja2V0OiByZXF1aXJlKCcuL3VwZGF0ZXMtdmlhJykuVXBkYXRlc1NvY2tldCxcbiAgVXBkYXRlc1ZpYTogcmVxdWlyZSgnLi91cGRhdGVzLXZpYScpLlVwZGF0ZXNWaWEsXG4gIHVyaTogcmVxdWlyZSgnLi91cmknKSxcbiAgVXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gIFZhcmlhYmxlOiByZXF1aXJlKCcuL3ZhcmlhYmxlJylcbn07XG5cbiRyZGYuTmV4dElkID0gJHJkZi5CbGFua05vZGUubmV4dElkO1xuXG4kcmRmLmZyb21OVCA9ICRyZGYuRm9ybXVsYS5wcm90b3R5cGUuZnJvbU5UO1xuJHJkZi5mZXRjaGVyID0gJHJkZi5EYXRhRmFjdG9yeS5mZXRjaGVyO1xuJHJkZi5ncmFwaCA9ICRyZGYuRGF0YUZhY3RvcnkuZ3JhcGg7XG4kcmRmLmxpdCA9ICRyZGYuRGF0YUZhY3RvcnkubGl0O1xuJHJkZi5zdCA9ICRyZGYuRGF0YUZhY3Rvcnkuc3Q7XG4kcmRmLnN5bSA9ICRyZGYuRGF0YUZhY3RvcnkubmFtZWROb2RlO1xuJHJkZi52YXJpYWJsZSA9ICRyZGYuRGF0YUZhY3RvcnkudmFyaWFibGU7XG5cbi8vIFJERkpTIERhdGFGYWN0b3J5IGludGVyZmFjZVxuJHJkZi5ibGFua05vZGUgPSAkcmRmLkRhdGFGYWN0b3J5LmJsYW5rTm9kZTtcbiRyZGYuZGVmYXVsdEdyYXBoID0gJHJkZi5EYXRhRmFjdG9yeS5kZWZhdWx0R3JhcGg7XG4kcmRmLmxpdGVyYWwgPSAkcmRmLkRhdGFGYWN0b3J5LmxpdGVyYWw7XG4kcmRmLm5hbWVkTm9kZSA9ICRyZGYuRGF0YUZhY3RvcnkubmFtZWROb2RlO1xuJHJkZi5xdWFkID0gJHJkZi5EYXRhRmFjdG9yeS5xdWFkO1xuJHJkZi50cmlwbGUgPSAkcmRmLkRhdGFGYWN0b3J5LnRyaXBsZTtcblxubW9kdWxlLmV4cG9ydHMgPSAkcmRmOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vLyAgSWRlbnRpdHkgbWFuYWdlbWVudCBhbmQgaW5kZXhpbmcgZm9yIFJERlxuLy9cbi8vIFRoaXMgZmlsZSBwcm92aWRlcyAgSW5kZXhlZEZvcm11bGEgYSBmb3JtdWxhIChzZXQgb2YgdHJpcGxlcykgd2hpY2hcbi8vIGluZGV4ZWQgYnkgcHJlZGljYXRlLCBzdWJqZWN0IGFuZCBvYmplY3QuXG4vL1xuLy8gSXQgXCJzbXVzaGVzXCIgIChtZXJnZXMgaW50byBhIHNpbmdsZSBub2RlKSB0aGluZ3Mgd2hpY2ggYXJlIGlkZW50aWNhbFxuLy8gYWNjb3JkaW5nIHRvIG93bDpzYW1lQXMgb3IgYW4gb3dsOkludmVyc2VGdW5jdGlvbmFsUHJvcGVydHlcbi8vIG9yIGFuIG93bDpGdW5jdGlvbmFsUHJvcGVydHlcbi8vXG4vL1xuLy8gIDIwMDUtMTAgV3JpdHRlbiBUaW0gQmVybmVycy1MZWVcbi8vICAyMDA3ICAgIENoYW5nZWQgc28gYXMgbm90IHRvIG11bmdlIHN0YXRlbWVudHMgZnJvbSBkb2N1bWVudHMgd2hlbiBzbXVzaGluZ1xuLy9cbi8vXG4vKiBqc2w6b3B0aW9uIGV4cGxpY2l0ICovXG52YXIgQXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi91dGlsJykuQXJyYXlJbmRleE9mO1xudmFyIEZvcm11bGEgPSByZXF1aXJlKCcuL2Zvcm11bGEnKTtcbi8vIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vbG9nJylcbnZhciBSREZBcnJheVJlbW92ZSA9IHJlcXVpcmUoJy4vdXRpbCcpLlJERkFycmF5UmVtb3ZlO1xudmFyIFN0YXRlbWVudCA9IHJlcXVpcmUoJy4vc3RhdGVtZW50Jyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFZhcmlhYmxlID0gcmVxdWlyZSgnLi92YXJpYWJsZScpO1xuXG52YXIgb3dsX25zID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsIyc7XG4vLyB2YXIgbGlua19ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rIydcblxuLy8gSGFuZGxlIEZ1bmN0aW9uYWwgUHJvcGVydHlcbmZ1bmN0aW9uIGhhbmRsZV9GUChmb3JtdWxhLCBzdWJqLCBwcmVkLCBvYmopIHtcbiAgdmFyIG8xID0gZm9ybXVsYS5hbnkoc3ViaiwgcHJlZCwgdW5kZWZpbmVkKTtcbiAgaWYgKCFvMSkge1xuICAgIHJldHVybiBmYWxzZTsgLy8gRmlyc3QgdGltZSB3aXRoIHRoaXMgdmFsdWVcbiAgfVxuICAvLyBsb2cud2FybihcIkVxdWF0aW5nIFwiK28xLnVyaStcIiBhbmQgXCIrb2JqLnVyaSArIFwiIGJlY2F1c2UgRlAgXCIrcHJlZC51cmkpOyAgLy9AQFxuICBmb3JtdWxhLmVxdWF0ZShvMSwgb2JqKTtcbiAgcmV0dXJuIHRydWU7XG59IC8vIGhhbmRsZV9GUFxuXG4vLyBIYW5kbGUgSW52ZXJzZSBGdW5jdGlvbmFsIFByb3BlcnR5XG5mdW5jdGlvbiBoYW5kbGVfSUZQKGZvcm11bGEsIHN1YmosIHByZWQsIG9iaikge1xuICB2YXIgczEgPSBmb3JtdWxhLmFueSh1bmRlZmluZWQsIHByZWQsIG9iaik7XG4gIGlmICghczEpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIEZpcnN0IHRpbWUgd2l0aCB0aGlzIHZhbHVlXG4gIH1cbiAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIitzMS51cmkrXCIgYW5kIFwiK3N1YmoudXJpICsgXCIgYmVjYXVzZSBJRlAgXCIrcHJlZC51cmkpOyAgLy9AQFxuICBmb3JtdWxhLmVxdWF0ZShzMSwgc3Viaik7XG4gIHJldHVybiB0cnVlO1xufSAvLyBoYW5kbGVfSUZQXG5cbmZ1bmN0aW9uIGhhbmRsZVJERlR5cGUoZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCB3aHkpIHtcbiAgaWYgKGZvcm11bGEudHlwZUNhbGxiYWNrKSB7XG4gICAgZm9ybXVsYS50eXBlQ2FsbGJhY2soZm9ybXVsYSwgb2JqLCB3aHkpO1xuICB9XG5cbiAgdmFyIHggPSBmb3JtdWxhLmNsYXNzQWN0aW9uc1tvYmouaGFzaFN0cmluZygpXTtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgaWYgKHgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvbmUgPSBkb25lIHx8IHhbaV0oZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCB3aHkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZG9uZTsgLy8gc3RhdGVtZW50IGdpdmVuIGlzIG5vdCBuZWVkZWQgaWYgdHJ1ZVxufVxuXG52YXIgSW5kZXhlZEZvcm11bGEgPSBmdW5jdGlvbiAoX0Zvcm11bGEpIHtcbiAgX2luaGVyaXRzKEluZGV4ZWRGb3JtdWxhLCBfRm9ybXVsYSk7XG5cbiAgLy8gSU4gZnV0dXJlIC0gYWxsb3cgcGFzcyBhcnJheSBvZiBzdGF0ZW1lbnRzIHRvIGNvbnN0cnVjdG9yXG4gIGZ1bmN0aW9uIEluZGV4ZWRGb3JtdWxhKGZlYXR1cmVzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEluZGV4ZWRGb3JtdWxhKTtcblxuICAgIC8vIHRoaXMuc3RhdGVtZW50cyA9IFtdIC8vIEFzIGluIEZvcm11bGEgTk8gZG9uJ3Qgb3ZlcndyaXRlIGluaGVyaXRlZFxuICAgIC8vIHRoaXMub3B0aW9uYWwgPSBbXVxuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEluZGV4ZWRGb3JtdWxhLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW5kZXhlZEZvcm11bGEpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnByb3BlcnR5QWN0aW9ucyA9IFtdOyAvLyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGdldHRpbmcgc3RhdGVtZW50IHdpdGgge3MgWCBvfVxuICAgIC8vIG1hcHMgPHVyaT4gdG8gW2YoRixzLHAsbyksLi4uXVxuICAgIF90aGlzLmNsYXNzQWN0aW9ucyA9IFtdOyAvLyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGFkZGluZyB7IHMgdHlwZSBYIH1cbiAgICBfdGhpcy5yZWRpcmVjdGlvbnMgPSBbXTsgLy8gcmVkaXJlY3QgdG8gbGV4aWNhbGx5IHNtYWxsZXIgZXF1aXZhbGVudCBzeW1ib2xcbiAgICBfdGhpcy5hbGlhc2VzID0gW107IC8vIHJldmVyc2UgbWFwcGluZyB0byByZWRpcmVjdGlvbjogYWxpYXNlcyBmb3IgdGhpc1xuICAgIF90aGlzLkhUVFBSZWRpcmVjdHMgPSBbXTsgLy8gcmVkaXJlY3Rpb25zIHdlIGdvdCBmcm9tIEhUVFBcbiAgICBfdGhpcy5zdWJqZWN0SW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBzdWJqZWN0XG4gICAgX3RoaXMucHJlZGljYXRlSW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBzdWJqZWN0XG4gICAgX3RoaXMub2JqZWN0SW5kZXggPSBbXTsgLy8gQXJyYXkgb2Ygc3RhdGVtZW50cyB3aXRoIHRoaXMgWCBhcyBvYmplY3RcbiAgICBfdGhpcy53aHlJbmRleCA9IFtdOyAvLyBBcnJheSBvZiBzdGF0ZW1lbnRzIHdpdGggWCBhcyBwcm92ZW5hbmNlXG4gICAgX3RoaXMuaW5kZXggPSBbX3RoaXMuc3ViamVjdEluZGV4LCBfdGhpcy5wcmVkaWNhdGVJbmRleCwgX3RoaXMub2JqZWN0SW5kZXgsIF90aGlzLndoeUluZGV4XTtcbiAgICBfdGhpcy5uYW1lc3BhY2VzID0ge307IC8vIERpY3Rpb25hcnkgb2YgbmFtZXNwYWNlIHByZWZpeGVzXG4gICAgX3RoaXMuZmVhdHVyZXMgPSBmZWF0dXJlcyB8fCBbJ3NhbWVBcycsICdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JywgJ0Z1bmN0aW9uYWxQcm9wZXJ0eSddO1xuICAgIF90aGlzLmluaXRQcm9wZXJ0eUFjdGlvbnMoX3RoaXMuZmVhdHVyZXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJbmRleGVkRm9ybXVsYSwgW3tcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHN0YXRlbWVudHNDb3B5ID0gdGhpcy5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoZWEpIHtcbiAgICAgICAgcmV0dXJuIGVhLnN1YnN0aXR1dGUoYmluZGluZ3MpO1xuICAgICAgfSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnSW5kZXhlZEZvcm11bGEgc3VicyBzdGF0ZW1udHM6JyArIHN0YXRlbWVudHNDb3B5KVxuICAgICAgdmFyIHkgPSBuZXcgSW5kZXhlZEZvcm11bGEoKTtcbiAgICAgIHkuYWRkKHN0YXRlbWVudHNDb3B5KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdpbmRleGVkLWZvcm0gc3VicyBmb3JtdWxhOicgKyB5KVxuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYXBwbHlQYXRjaCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5UGF0Y2gocGF0Y2gsIHRhcmdldCwgcGF0Y2hDYWxsYmFjaykge1xuICAgICAgLy8gcGF0Y2hDYWxsYmFjayhlcnIpXG4gICAgICB2YXIgUXVlcnkgPSByZXF1aXJlKCcuL3F1ZXJ5JykuUXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0S0IgPSB0aGlzO1xuICAgICAgdmFyIGRzO1xuICAgICAgdmFyIGJpbmRpbmcgPSBudWxsO1xuXG4gICAgICAvLyAvLy8vLy8vLy8vLyBEZWJ1ZyBzdHJpbmdzXG4gICAgICAvKlxuICAgICAgdmFyIGJpbmRpbmdEZWJ1ZyA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHZhciBzdHIgPSAnJ1xuICAgICAgICB2YXIgdlxuICAgICAgICBmb3IgKHYgaW4gYikge1xuICAgICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgICBzdHIgKz0gJyAgICAnICsgdiArICcgLT4gJyArIGJbdl1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuICAgICAgKi9cbiAgICAgIHZhciBkb1BhdGNoID0gZnVuY3Rpb24gZG9QYXRjaChvbkRvbmVQYXRjaCkge1xuICAgICAgICBpZiAocGF0Y2hbJ2RlbGV0ZSddKSB7XG4gICAgICAgICAgZHMgPSBwYXRjaFsnZGVsZXRlJ107XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYmluZGluZ0RlYnVnKGJpbmRpbmcpKVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkcyBiZWZvcmUgc3Vic3RpdHV0ZTogJyArIGRzKVxuICAgICAgICAgIGlmIChiaW5kaW5nKSBkcyA9IGRzLnN1YnN0aXR1dGUoYmluZGluZyk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2FwcGx5UGF0Y2g6IGRlbGV0ZTogJyArIGRzKVxuICAgICAgICAgIGRzID0gZHMuc3RhdGVtZW50cztcbiAgICAgICAgICB2YXIgYmFkID0gW107XG4gICAgICAgICAgdmFyIGRzMiA9IGRzLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGFjdHVhbCBzdGF0ZW1udHMgaW4gdGhlIHN0b3JlXG4gICAgICAgICAgICB2YXIgc3RzID0gdGFyZ2V0S0Iuc3RhdGVtZW50c01hdGNoaW5nKHN0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCB0YXJnZXQpO1xuICAgICAgICAgICAgaWYgKHN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gbG9nLmluZm8oXCJOT1QgRk9VTkQgZGVsZXRhYmxlIFwiICsgc3QpXG4gICAgICAgICAgICAgIGJhZC5wdXNoKHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBsb2cuaW5mbyhcIkZvdW5kIGRlbGV0YWJsZSBcIiArIHN0KVxuICAgICAgICAgICAgICByZXR1cm4gc3RzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChiYWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQ291bGQgbm90IGZpbmQgdG8gZGVsZXRlICcgKyBiYWQubGVuZ3RoICsgJ3N0YXRlbWVudHMnKVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Rlc3BpdGUgJyArIHRhcmdldEtCLnN0YXRlbWVudHNNYXRjaGluZyhiYWRbMF0uc3ViamVjdCwgYmFkWzBdLnByZWRpY2F0ZSlbMF0pXG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnQ291bGQgbm90IGZpbmQgdG8gZGVsZXRlOiAnICsgYmFkLmpvaW4oJ1xcbiBvciAnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRzMi5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgICB0YXJnZXRLQi5yZW1vdmUoc3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaFsnaW5zZXJ0J10pIHtcbiAgICAgICAgICAvLyBsb2cuaW5mbyhcImRvUGF0Y2ggaW5zZXJ0IFwiK3BhdGNoWydpbnNlcnQnXSlcbiAgICAgICAgICBkcyA9IHBhdGNoWydpbnNlcnQnXTtcbiAgICAgICAgICBpZiAoYmluZGluZykgZHMgPSBkcy5zdWJzdGl0dXRlKGJpbmRpbmcpO1xuICAgICAgICAgIGRzID0gZHMuc3RhdGVtZW50cztcbiAgICAgICAgICBkcy5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgICBzdC53aHkgPSB0YXJnZXQ7XG4gICAgICAgICAgICB0YXJnZXRLQi5hZGQoc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QsIHN0LndoeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Eb25lUGF0Y2goKTtcbiAgICAgIH07XG4gICAgICBpZiAocGF0Y2gud2hlcmUpIHtcbiAgICAgICAgLy8gbG9nLmluZm8oXCJQcm9jZXNzaW5nIFdIRVJFOiBcIiArIHBhdGNoLndoZXJlICsgJ1xcbicpXG4gICAgICAgIHZhciBxdWVyeSA9IG5ldyBRdWVyeSgncGF0Y2gnKTtcbiAgICAgICAgcXVlcnkucGF0ID0gcGF0Y2gud2hlcmU7XG4gICAgICAgIHF1ZXJ5LnBhdC5zdGF0ZW1lbnRzLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgICAgICBzdC53aHkgPSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBiaW5kaW5nc0ZvdW5kID0gW107XG5cbiAgICAgICAgdGFyZ2V0S0IucXVlcnkocXVlcnksIGZ1bmN0aW9uIG9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgYmluZGluZ3NGb3VuZC5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCcgICBnb3QgYSBiaW5kaW5nOiAnICsgYmluZGluZ0RlYnVnKGJpbmRpbmcpKVxuICAgICAgICB9LCB0YXJnZXRLQi5mZXRjaGVyLCBmdW5jdGlvbiBvbkRvbmUoKSB7XG4gICAgICAgICAgaWYgKGJpbmRpbmdzRm91bmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnTm8gbWF0Y2ggZm91bmQgdG8gYmUgcGF0Y2hlZDonICsgcGF0Y2gud2hlcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYmluZGluZ3NGb3VuZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0Y2hDYWxsYmFjaygnUGF0Y2ggYW1iaWd1b3VzLiBObyBwYXRjaCBkb25lLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5kaW5nID0gYmluZGluZ3NGb3VuZFswXTtcbiAgICAgICAgICBkb1BhdGNoKHBhdGNoQ2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvUGF0Y2gocGF0Y2hDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGVjbGFyZUV4aXN0ZW50aWFsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVjbGFyZUV4aXN0ZW50aWFsKHgpIHtcbiAgICAgIGlmICghdGhpcy5fZXhpc3RlbnRpYWxWYXJpYWJsZXMpIHRoaXMuX2V4aXN0ZW50aWFsVmFyaWFibGVzID0gW107XG4gICAgICB0aGlzLl9leGlzdGVudGlhbFZhcmlhYmxlcy5wdXNoKHgpO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaW5pdFByb3BlcnR5QWN0aW9ucycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRQcm9wZXJ0eUFjdGlvbnMoZmVhdHVyZXMpIHtcbiAgICAgIC8vIElmIHRoZSBwcmVkaWNhdGUgaXMgI3R5cGUsIHVzZSBoYW5kbGVSREZUeXBlIHRvIGNyZWF0ZSBhIHR5cGVDYWxsYmFjayBvbiB0aGUgb2JqZWN0XG4gICAgICB0aGlzLnByb3BlcnR5QWN0aW9uc1snPGh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlPiddID0gW2hhbmRsZVJERlR5cGVdO1xuXG4gICAgICAvLyBBc3N1bXB0aW9uOiB0aGVzZSB0ZXJtcyBhcmUgbm90IHJlZGlyZWN0ZWQgQEBmaXhtZVxuICAgICAgaWYgKEFycmF5SW5kZXhPZihmZWF0dXJlcywgJ3NhbWVBcycpID49IDApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUFjdGlvbnNbJzxodHRwOi8vd3d3LnczLm9yZy8yMDAyLzA3L293bCNzYW1lQXM+J10gPSBbZnVuY3Rpb24gKGZvcm11bGEsIHN1YmosIHByZWQsIG9iaiwgd2h5KSB7XG4gICAgICAgICAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIitzdWJqLnVyaStcIiBzYW1lQXMgXCIrb2JqLnVyaSk7ICAvL0BAXG4gICAgICAgICAgZm9ybXVsYS5lcXVhdGUoc3Viaiwgb2JqKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBpZiBzdGF0ZW1lbnQgZ2l2ZW4gaXMgTk9UIG5lZWRlZCBpbiB0aGUgc3RvcmVcbiAgICAgICAgfV07IC8vIHNhbWVBcyAtPiBlcXVhdGUgJiBkb24ndCBhZGQgdG8gaW5kZXhcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheUluZGV4T2YoZmVhdHVyZXMsICdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JykgPj0gMCkge1xuICAgICAgICB0aGlzLmNsYXNzQWN0aW9uc1snPCcgKyBvd2xfbnMgKyAnSW52ZXJzZUZ1bmN0aW9uYWxQcm9wZXJ0eT4nXSA9IFtmdW5jdGlvbiAoZm9ybXVsYSwgc3ViaiwgcHJlZCwgb2JqLCBhZGRGbikge1xuICAgICAgICAgIC8vIHllcyBzdWJqIG5vdCBwcmVkIVxuICAgICAgICAgIHJldHVybiBmb3JtdWxhLm5ld1Byb3BlcnR5QWN0aW9uKHN1YmosIGhhbmRsZV9JRlApO1xuICAgICAgICB9XTsgLy8gSUZQIC0+IGhhbmRsZV9JRlAsIGRvIGFkZCB0byBpbmRleFxuICAgICAgfVxuICAgICAgaWYgKEFycmF5SW5kZXhPZihmZWF0dXJlcywgJ0Z1bmN0aW9uYWxQcm9wZXJ0eScpID49IDApIHtcbiAgICAgICAgdGhpcy5jbGFzc0FjdGlvbnNbJzwnICsgb3dsX25zICsgJ0Z1bmN0aW9uYWxQcm9wZXJ0eT4nXSA9IFtmdW5jdGlvbiAoZm9ybXVsYSwgc3ViaiwgcHJvaiwgb2JqLCBhZGRGbikge1xuICAgICAgICAgIHJldHVybiBmb3JtdWxhLm5ld1Byb3BlcnR5QWN0aW9uKHN1YmosIGhhbmRsZV9GUCk7XG4gICAgICAgIH1dOyAvLyBGUCA9PiBoYW5kbGVGUCwgZG8gYWRkIHRvIGluZGV4XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHRyaXBsZSB0byB0aGUgc3RvcmUuXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGVtZW50IGFkZGVkXG4gICAgICogKHdvdWxkIGl0IGJlIGJldHRlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsIGZvcm11bGEgZm9yIGNoYWluaW5nPylcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnYWRkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHN1YmosIHByZWQsIG9iaiwgd2h5KSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmIChzdWJqIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3Viai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGQoc3VialtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN1YmogaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmFkZChzdWJqLnN1YmplY3QsIHN1YmoucHJlZGljYXRlLCBzdWJqLm9iamVjdCwgc3Viai53aHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YmogaW5zdGFuY2VvZiBJbmRleGVkRm9ybXVsYSkge1xuICAgICAgICAgIHRoaXMuYWRkKHN1Ymouc3RhdGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgYWN0aW9ucztcbiAgICAgIHZhciBzdDtcbiAgICAgIGlmICghd2h5KSB7XG4gICAgICAgIC8vIHN5c3RlbSBnZW5lcmF0ZWRcbiAgICAgICAgd2h5ID0gdGhpcy5mZXRjaGVyID8gdGhpcy5mZXRjaGVyLmFwcE5vZGUgOiB0aGlzLnN5bSgnY2hyb21lOnRoZVNlc3Npb24nKTtcbiAgICAgIH1cbiAgICAgIHN1YmogPSBOb2RlLmZyb21WYWx1ZShzdWJqKTtcbiAgICAgIHByZWQgPSBOb2RlLmZyb21WYWx1ZShwcmVkKTtcbiAgICAgIG9iaiA9IE5vZGUuZnJvbVZhbHVlKG9iaik7XG4gICAgICB3aHkgPSBOb2RlLmZyb21WYWx1ZSh3aHkpO1xuICAgICAgaWYgKHRoaXMucHJlZGljYXRlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGVDYWxsYmFjayh0aGlzLCBwcmVkLCB3aHkpO1xuICAgICAgfVxuICAgICAgLy8gQWN0aW9uIHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3QgbmVlZCB0byBiZSBhZGRlZFxuICAgICAgdmFyIHByZWRIYXNoID0gdGhpcy5jYW5vbihwcmVkKS5oYXNoU3RyaW5nKCk7XG4gICAgICBhY3Rpb25zID0gdGhpcy5wcm9wZXJ0eUFjdGlvbnNbcHJlZEhhc2hdOyAvLyBQcmVkaWNhdGUgaGFzaFxuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICAgIC8vIGFsZXJ0KCd0eXBlOiAnK3R5cGVvZiBhY3Rpb25zICsnIEBAIGFjdGlvbnM9JythY3Rpb25zKVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRvbmUgPSBkb25lIHx8IGFjdGlvbnNbaV0odGhpcywgc3ViaiwgcHJlZCwgb2JqLCB3aHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ob2xkcyhzdWJqLCBwcmVkLCBvYmosIHdoeSkpIHtcbiAgICAgICAgLy8gVGFrZXMgdGltZSBidXQgc2F2ZXMgZHVwbGljYXRlc1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncmRmbGliOiBJZ25vcmluZyBkdXAhIHsnICsgc3ViaiArICcgJyArIHByZWQgKyAnICcgKyBvYmogKyAnICcgKyB3aHkgKyAnfScpXG4gICAgICAgIHJldHVybiBudWxsOyAvLyBAQGJldHRlciB0byByZXR1cm4gc2VsZiBpbiBhbGwgY2FzZXM/XG4gICAgICB9XG4gICAgICAvLyBJZiB3ZSBhcmUgdHJhY2tpbmcgcHJvdmVuYW5jZSwgZXZlcnkgdGhpbmcgc2hvdWxkIGJlIGxvYWRlZCBpbnRvIHRoZSBzdG9yZVxuICAgICAgLy8gaWYgKGRvbmUpIHJldHVybiBuZXcgU3RhdGVtZW50KHN1YmosIHByZWQsIG9iaiwgd2h5KVxuICAgICAgLy8gRG9uJ3QgcHV0IGl0IGluIHRoZSBzdG9yZVxuICAgICAgLy8gc3RpbGwgcmV0dXJuIHRoaXMgc3RhdGVtZW50IGZvciBvd2w6c2FtZUFzIGlucHV0XG4gICAgICB2YXIgaGFzaCA9IFt0aGlzLmNhbm9uKHN1YmopLmhhc2hTdHJpbmcoKSwgcHJlZEhhc2gsIHRoaXMuY2Fub24ob2JqKS5oYXNoU3RyaW5nKCksIHRoaXMuY2Fub24od2h5KS5oYXNoU3RyaW5nKCldO1xuICAgICAgc3QgPSBuZXcgU3RhdGVtZW50KHN1YmosIHByZWQsIG9iaiwgd2h5KTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgdmFyIGl4ID0gdGhpcy5pbmRleFtpXTtcbiAgICAgICAgdmFyIGggPSBoYXNoW2ldO1xuICAgICAgICBpZiAoIWl4W2hdKSB7XG4gICAgICAgICAgaXhbaF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpeFtoXS5wdXNoKHN0KTsgLy8gU2V0IG9mIHRoaW5ncyB3aXRoIHRoaXMgYXMgc3ViamVjdCwgZXRjXG4gICAgICB9XG5cbiAgICAgIC8vIGxvZy5kZWJ1ZyhcIkFERElORyAgICB7XCIrc3ViaitcIiBcIitwcmVkK1wiIFwiK29iaitcIn0gXCIrd2h5KVxuICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3QpO1xuICAgICAgcmV0dXJuIHN0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FkZEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEFsbChzdGF0ZW1lbnRzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgc3RhdGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChxdWFkKSB7XG4gICAgICAgIF90aGlzMi5hZGQocXVhZC5zdWJqZWN0LCBxdWFkLnByZWRpY2F0ZSwgcXVhZC5vYmplY3QsIHF1YWQuZ3JhcGgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYW55JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW55KHMsIHAsIG8sIGcpIHtcbiAgICAgIHZhciBzdCA9IHRoaXMuYW55U3RhdGVtZW50TWF0Y2hpbmcocywgcCwgbywgZyk7XG4gICAgICBpZiAoc3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmIChzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0LnN1YmplY3Q7XG4gICAgICB9IGVsc2UgaWYgKHAgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3QucHJlZGljYXRlO1xuICAgICAgfSBlbHNlIGlmIChvID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0Lm9iamVjdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnYW55VmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbnlWYWx1ZShzLCBwLCBvLCBnKSB7XG4gICAgICB2YXIgeSA9IHRoaXMuYW55KHMsIHAsIG8sIGcpO1xuICAgICAgcmV0dXJuIHkgPyB5LnZhbHVlIDogdm9pZCAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FueVN0YXRlbWVudE1hdGNoaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYW55U3RhdGVtZW50TWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHkpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHksIHRydWUpO1xuICAgICAgaWYgKCF4IHx8IHgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4geFswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2wgd2l0aCBjYW5vbmljYWwgVVJJIGFzIHNtdXNoZWRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnY2Fub24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5vbih0ZXJtKSB7XG4gICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICB9XG4gICAgICB2YXIgeSA9IHRoaXMucmVkaXJlY3Rpb25zW3Rlcm0uaGFzaFN0cmluZygpXTtcbiAgICAgIGlmICgheSkge1xuICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NoZWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICB0aGlzLmNoZWNrU3RhdGVtZW50TGlzdCh0aGlzLnN0YXRlbWVudHMpO1xuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgdmFyIGl4ID0gdGhpcy5pbmRleFtwXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGl4KSB7XG4gICAgICAgICAgaWYgKGl4Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZW1lbnRMaXN0KGl4W2tleV0sIHApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGYtY29uc2lzdGVuY3kgY2hlY2tpbmcgZm9yIGRpYWdub3N0aXMgb25seVxuICAgICAqIElzIGVhY2ggc3RhdGVtZW50IHByb3Blcmx5IGluZGV4ZWQ/XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2NoZWNrU3RhdGVtZW50TGlzdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNoZWNrU3RhdGVtZW50TGlzdChzdHMsIGZyb20pIHtcbiAgICAgIHZhciBuYW1lcyA9IFsnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgJ3doeSddO1xuICAgICAgdmFyIG9yaWdpbiA9ICcgZm91bmQgaW4gJyArIG5hbWVzW2Zyb21dICsgJyBpbmRleC4nO1xuICAgICAgdmFyIHN0O1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc3QgPSBzdHNbal07XG4gICAgICAgIHZhciB0ZXJtID0gW3N0LnN1YmplY3QsIHN0LnByZWRpY2F0ZSwgc3Qub2JqZWN0LCBzdC53aHldO1xuICAgICAgICB2YXIgYXJyYXlDb250YWlucyA9IGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYSwgeCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFbaV0uc3ViamVjdC5zYW1lVGVybSh4LnN1YmplY3QpICYmIGFbaV0ucHJlZGljYXRlLnNhbWVUZXJtKHgucHJlZGljYXRlKSAmJiBhW2ldLm9iamVjdC5zYW1lVGVybSh4Lm9iamVjdCkgJiYgYVtpXS53aHkuc2FtZVRlcm0oeC53aHkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgICB2YXIgYyA9IHRoaXMuY2Fub24odGVybVtwXSk7XG4gICAgICAgICAgdmFyIGggPSBjLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaW5kZXhbcF1baF0pIHtcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignTm8gJyArIG5hbWVbcF0gKyAnIGluZGV4IGZvciBzdGF0ZW1lbnQgJyArIHN0ICsgJ0AnICsgc3Qud2h5ICsgb3JpZ2luKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWFycmF5Q29udGFpbnModGhpcy5pbmRleFtwXVtoXSwgc3QpKSB7XG4gICAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignSW5kZXggZm9yICcgKyBuYW1lW3BdICsgJyBkb2VzIG5vdCBoYXZlIHN0YXRlbWVudCAnICsgc3QgKyAnQCcgKyBzdC53aHkgKyBvcmlnaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYXJyYXlDb250YWlucyh0aGlzLnN0YXRlbWVudHMsIHN0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhdGVtZW50IGxpc3QgZG9lcyBub3Qgc3RhdGVtZW50ICcgKyBzdCArICdAJyArIHN0LndoeSArIG9yaWdpbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjbG9zZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVwbGFjZXMgQHRlbXBsYXRlIHdpdGggQHRhcmdldCBhbmQgYWRkIGFwcHJvcHJpYXRlIHRyaXBsZXMgKG5vIHRyaXBsZVxuICAgICAqIHJlbW92ZWQpXG4gICAgICogb25lLWRpcmVjdGlvbiByZXBsaWNhdGlvblxuICAgICAqIEBtZXRob2QgY29weVRvXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2NvcHlUbycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHlUbyh0ZW1wbGF0ZSwgdGFyZ2V0LCBmbGFncykge1xuICAgICAgaWYgKCFmbGFncykgZmxhZ3MgPSBbXTtcbiAgICAgIHZhciBzdGF0TGlzdCA9IHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHRlbXBsYXRlKTtcbiAgICAgIGlmIChBcnJheUluZGV4T2YoZmxhZ3MsICd0d28tZGlyZWN0aW9uJykgIT09IC0xKSB7XG4gICAgICAgIHN0YXRMaXN0LmNvbmNhdCh0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGVtcGxhdGUpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0ID0gc3RhdExpc3RbaV07XG4gICAgICAgIHN3aXRjaCAoc3Qub2JqZWN0LnRlcm1UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnTmFtZWROb2RlJzpcbiAgICAgICAgICAgIHRoaXMuYWRkKHRhcmdldCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTGl0ZXJhbCc6XG4gICAgICAgICAgY2FzZSAnQmxhbmtOb2RlJzpcbiAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHRoaXMuYWRkKHRhcmdldCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QuY29weSh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5SW5kZXhPZihmbGFncywgJ2RlbGV0ZScpICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKHN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNpbXBsaWZ5IGdyYXBoIGluIHN0b3JlIHdoZW4gd2UgcmVhbGl6ZSB0d28gaWRlbnRpZmllcnMgYXJlIGVxdWl2YWxlbnRcbiAgICAgKiBXZSByZXBsYWNlIHRoZSBiaWdnZXIgd2l0aCB0aGUgc21hbGxlci5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZXF1YXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXF1YXRlKHUxLCB1Mikge1xuICAgICAgLy8gbG9nLndhcm4oXCJFcXVhdGluZyBcIit1MStcIiBhbmQgXCIrdTIpOyAvLyBAQFxuICAgICAgLy8gQEBKQU1CTyBNdXN0IGNhbm9uaWNhbGl6ZSB0aGUgdXJpcyB0byBwcmV2ZW50IGVycm9ycyBmcm9tIGE9Yj1jXG4gICAgICAvLyAwMy0yMS0yMDEwXG4gICAgICB1MSA9IHRoaXMuY2Fub24odTEpO1xuICAgICAgdTIgPSB0aGlzLmNhbm9uKHUyKTtcbiAgICAgIHZhciBkID0gdTEuY29tcGFyZVRlcm0odTIpO1xuICAgICAgaWYgKCFkKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBObyBpbmZvcm1hdGlvbiBpbiB7YSA9IGF9XG4gICAgICB9XG4gICAgICAvLyB2YXIgYmlnXG4gICAgICAvLyB2YXIgc21hbGxcbiAgICAgIGlmIChkIDwgMCkge1xuICAgICAgICAvLyB1MSBsZXNzIHRoYW4gdTJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVdpdGgodTIsIHUxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VXaXRoKHUxLCB1Mik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZm9ybXVsYScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm11bGEoZmVhdHVyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgSW5kZXhlZEZvcm11bGEoZmVhdHVyZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIEluZGV4ZWRGb3JtdWxhLlxuICAgICAqIChHZXR0ZXIgcHJveHkgdG8gdGhpcy5zdGF0ZW1lbnRzKS5cbiAgICAgKiBVc2FnZTpcbiAgICAgKiAgICBgYGBcbiAgICAgKiAgICB2YXIga2IgPSByZGYuZ3JhcGgoKVxuICAgICAqICAgIGtiLmxlbmd0aCAgLy8gLT4gMFxuICAgICAqICAgIGBgYFxuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbWF0Y2gnLFxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFueSBxdWFkcyBtYXRjaGluZyB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgICAqIFN0YW5kYXJkIFJERkpTIFRhc2tmb3JjZSBtZXRob2QgZm9yIFNvdXJjZSBvYmplY3RzLCBpbXBsZW1lbnRlZCBhcyBhblxuICAgICAqIGFsaWFzIHRvIGBzdGF0ZW1lbnRzTWF0Y2hpbmcoKWBcbiAgICAgKiBAbWV0aG9kIG1hdGNoXG4gICAgICogQHBhcmFtIHN1YmplY3Qge05vZGV8U3RyaW5nfE9iamVjdH1cbiAgICAgKiBAcGFyYW0gcHJlZGljYXRlIHtOb2RlfFN0cmluZ3xPYmplY3R9XG4gICAgICogQHBhcmFtIG9iamVjdCB7Tm9kZXxTdHJpbmd8T2JqZWN0fVxuICAgICAqIEBwYXJhbSBncmFwaCB7TmFtZWROb2RlfFN0cmluZ31cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gbWF0Y2goc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoTm9kZS5mcm9tVmFsdWUoc3ViamVjdCksIE5vZGUuZnJvbVZhbHVlKHByZWRpY2F0ZSksIE5vZGUuZnJvbVZhbHVlKG9iamVjdCksIE5vZGUuZnJvbVZhbHVlKGdyYXBoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBvdXQgd2hldGhlciBhIGdpdmVuIFVSSSBpcyB1c2VkIGFzIHN5bWJvbCBpbiB0aGUgZm9ybXVsYVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdtZW50aW9uc1VSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1lbnRpb25zVVJJKHVyaSkge1xuICAgICAgdmFyIGhhc2ggPSAnPCcgKyB1cmkgKyAnPic7XG4gICAgICByZXR1cm4gISF0aGlzLnN1YmplY3RJbmRleFtoYXNoXSB8fCAhIXRoaXMub2JqZWN0SW5kZXhbaGFzaF0gfHwgISF0aGlzLnByZWRpY2F0ZUluZGV4W2hhc2hdO1xuICAgIH1cblxuICAgIC8vIEV4aXN0ZW50aWFscyBhcmUgQk5vZGVzIC0gc29tZXRoaW5nIGV4aXN0cyB3aXRob3V0IG5hbWluZ1xuXG4gIH0sIHtcbiAgICBrZXk6ICduZXdFeGlzdGVudGlhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld0V4aXN0ZW50aWFsKHVyaSkge1xuICAgICAgaWYgKCF1cmkpIHJldHVybiB0aGlzLmJub2RlKCk7XG4gICAgICB2YXIgeCA9IHRoaXMuc3ltKHVyaSk7XG4gICAgICByZXR1cm4gdGhpcy5kZWNsYXJlRXhpc3RlbnRpYWwoeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnbmV3UHJvcGVydHlBY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXdQcm9wZXJ0eUFjdGlvbihwcmVkLCBhY3Rpb24pIHtcbiAgICAgIC8vIGxvZy5kZWJ1ZyhcIm5ld1Byb3BlcnR5QWN0aW9uOiAgXCIrcHJlZClcbiAgICAgIHZhciBoYXNoID0gcHJlZC5oYXNoU3RyaW5nKCk7XG4gICAgICBpZiAoIXRoaXMucHJvcGVydHlBY3Rpb25zW2hhc2hdKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlBY3Rpb25zW2hhc2hdID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BlcnR5QWN0aW9uc1toYXNoXS5wdXNoKGFjdGlvbik7XG4gICAgICAvLyBOb3cgYXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHRvIHN0YXRlbWVudHMgYWxyZWFkeSBpbiB0aGUgc3RvcmVcbiAgICAgIHZhciB0b0JlRml4ZWQgPSB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHByZWQsIHVuZGVmaW5lZCk7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0JlRml4ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gTk9UIG9wdGltaXplZCAtIHNvcnQgdG9CZUZpeGVkIGV0Y1xuICAgICAgICBkb25lID0gZG9uZSB8fCBhY3Rpb24odGhpcywgdG9CZUZpeGVkW2ldLnN1YmplY3QsIHByZWQsIHRvQmVGaXhlZFtpXS5vYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvbmU7XG4gICAgfVxuXG4gICAgLy8gVW5pdmVyc2FscyBhcmUgVmFyaWFibGVzXG5cbiAgfSwge1xuICAgIGtleTogJ25ld1VuaXZlcnNhbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld1VuaXZlcnNhbCh1cmkpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5zeW0odXJpKTtcbiAgICAgIGlmICghdGhpcy5fdW5pdmVyc2FsVmFyaWFibGVzKSB0aGlzLl91bml2ZXJzYWxWYXJpYWJsZXMgPSBbXTtcbiAgICAgIHRoaXMuX3VuaXZlcnNhbFZhcmlhYmxlcy5wdXNoKHgpO1xuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgLy8gY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCBieSBOMyBwYXJzZXJcblxuICB9LCB7XG4gICAga2V5OiAndmFyaWFibGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YXJpYWJsZShuYW1lKSB7XG4gICAgICByZXR1cm4gbmV3IFZhcmlhYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYW4gdW51c2VkIGlkIGZvciBhIGZpbGUgYmVpbmcgZWRpdGVkOiByZXR1cm4gYSBzeW1ib2xcbiAgICAgKiAoTm90ZTogU2xvdyBpZmYgYSBsb3Qgb2YgdGhlbSAtLSBjb3VsZCBiZSBPKGxvZyhrKSkgKVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduZXh0U3ltYm9sJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dFN5bWJvbChkb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIHZhciB1cmkgPSBkb2MudXJpICsgJyNuJyArIGk7XG4gICAgICAgIGlmICghdGhpcy5tZW50aW9uc1VSSSh1cmkpKSByZXR1cm4gdGhpcy5zeW0odXJpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdxdWVyeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHF1ZXJ5KG15UXVlcnksIGNhbGxiYWNrLCBmZXRjaGVyLCBvbkRvbmUpIHtcbiAgICAgIHZhciBpbmRleGVkRm9ybXVsYVF1ZXJ5ID0gcmVxdWlyZSgnLi9xdWVyeScpLmluZGV4ZWRGb3JtdWxhUXVlcnk7XG4gICAgICByZXR1cm4gaW5kZXhlZEZvcm11bGFRdWVyeS5jYWxsKHRoaXMsIG15UXVlcnksIGNhbGxiYWNrLCBmZXRjaGVyLCBvbkRvbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGEgc3RhdGVtZW50IG9iamVjdCBhbmQgcmVtb3ZlcyBpdFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdyZW1vdmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoc3QpIHtcbiAgICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZShzdFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAoc3QgaW5zdGFuY2VvZiBJbmRleGVkRm9ybXVsYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUoc3Quc3RhdGVtZW50cyk7XG4gICAgICB9XG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3QsIHN0LndoeSk7XG4gICAgICBpZiAoIXN0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGF0ZW1lbnQgdG8gYmUgcmVtb3ZlZCBpcyBub3Qgb24gc3RvcmU6ICcgKyBzdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZVN0YXRlbWVudChzdHNbMF0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgc3RhdGVtbnRzIGluIGEgZG9jXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZURvY3VtZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlRG9jdW1lbnQoZG9jKSB7XG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZG9jKS5zbGljZSgpOyAvLyBUYWtlIGEgY29weSBhcyB0aGlzIGlzIHRoZSBhY3R1YWwgaW5kZXhcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlU3RhdGVtZW50KHN0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYWxsIHN0YXRlbWVudHMgbWF0Y2hpbmcgYXJncyAod2l0aGluIGxpbWl0KSAqXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZU1hbnknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVNYW55KHN1YmosIHByZWQsIG9iaiwgd2h5LCBsaW1pdCkge1xuICAgICAgLy8gbG9nLmRlYnVnKFwiZW50ZXJpbmcgcmVtb3ZlTWFueSB3LyBzdWJqLHByZWQsb2JqLHdoeSxsaW1pdCA9IFwiICsgc3ViaiArXCIsIFwiKyBwcmVkK1wiLCBcIiArIG9iaitcIiwgXCIgKyB3aHkrXCIsIFwiICsgbGltaXQpXG4gICAgICB2YXIgc3RzID0gdGhpcy5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3ViaiwgcHJlZCwgb2JqLCB3aHksIGZhbHNlKTtcbiAgICAgIC8vIFRoaXMgaXMgYSBzdWJ0bGUgYnVnIHRoYXQgb2NjY3VyZWQgaW4gdXBkYXRlQ2VudGVyLmpzIHRvby5cbiAgICAgIC8vIFRoZSBmYWN0IGlzLCB0aGlzLnN0YXRlbWVudHNNYXRjaGluZyByZXR1cm5zIHRoaXMud2h5SW5kZXggaW5zdGVhZCBvZiBhIGNvcHkgb2YgaXRcbiAgICAgIC8vIGJ1dCBmb3IgcGVyZnJvbWFuY2UgY29uc2lkZXJhdGlvbiwgaXQncyBiZXR0ZXIgdG8ganVzdCBkbyB0aGF0XG4gICAgICAvLyBzbyBtYWtlIGEgY29weSBoZXJlLlxuICAgICAgdmFyIHN0YXRlbWVudHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaChzdHNbaV0pO1xuICAgICAgfWlmIChsaW1pdCkgc3RhdGVtZW50cyA9IHN0YXRlbWVudHMuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoc3RhdGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVtb3ZlTWF0Y2hlcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZU1hdGNoZXMoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIHdoeSkge1xuICAgICAgdGhpcy5yZW1vdmVTdGF0ZW1lbnRzKHRoaXMuc3RhdGVtZW50c01hdGNoaW5nKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHBhcnRpY3VsYXIgc3RhdGVtZW50IG9iamVjdCBmcm9tIHRoZSBzdG9yZVxuICAgICAqXG4gICAgICogc3QgICAgYSBzdGF0ZW1lbnQgd2hpY2ggaXMgYWxyZWFkeSBpbiB0aGUgc3RvcmUgYW5kIGluZGV4ZWQuXG4gICAgICogICAgICBNYWtlIHN1cmUgeW91IG9ubHkgdXNlIHRoaXMgZm9yIHRoZXNlLlxuICAgICAqICAgIE90aGVyd2lzZSwgeW91IHNob3VsZCB1c2UgcmVtb3ZlKCkgYWJvdmUuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3JlbW92ZVN0YXRlbWVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVN0YXRlbWVudChzdCkge1xuICAgICAgLy8gbG9nLmRlYnVnKFwiZW50ZXJpbmcgcmVtb3ZlIHcvIHN0PVwiICsgc3QpXG4gICAgICB2YXIgdGVybSA9IFtzdC5zdWJqZWN0LCBzdC5wcmVkaWNhdGUsIHN0Lm9iamVjdCwgc3Qud2h5XTtcbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgNDsgcCsrKSB7XG4gICAgICAgIHZhciBjID0gdGhpcy5jYW5vbih0ZXJtW3BdKTtcbiAgICAgICAgdmFyIGggPSBjLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4W3BdW2hdKSB7XG4gICAgICAgICAgLy8gbG9nLndhcm4gKFwiU3RhdGVtZW50IHJlbW92YWw6IG5vIGluZGV4ICcrcCsnOiBcIitzdClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSREZBcnJheVJlbW92ZSh0aGlzLmluZGV4W3BdW2hdLCBzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFJERkFycmF5UmVtb3ZlKHRoaXMuc3RhdGVtZW50cywgc3QpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVtb3ZlU3RhdGVtZW50cycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVN0YXRlbWVudHMoc3RzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlbW92ZShzdHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZSBiaWcgd2l0aCBzbWFsbCwgb2Jzb2xldGVkIHdpdGggb2Jzb2xldGluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAncmVwbGFjZVdpdGgnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlV2l0aChiaWcsIHNtYWxsKSB7XG4gICAgICAvLyBsb2cuZGVidWcoXCJSZXBsYWNpbmcgXCIrYmlnK1wiIHdpdGggXCIrc21hbGwpIC8vIEBAXG4gICAgICB2YXIgb2xkaGFzaCA9IGJpZy5oYXNoU3RyaW5nKCk7XG4gICAgICB2YXIgbmV3aGFzaCA9IHNtYWxsLmhhc2hTdHJpbmcoKTtcbiAgICAgIHZhciBtb3ZlSW5kZXggPSBmdW5jdGlvbiBtb3ZlSW5kZXgoaXgpIHtcbiAgICAgICAgdmFyIG9sZGxpc3QgPSBpeFtvbGRoYXNoXTtcbiAgICAgICAgaWYgKCFvbGRsaXN0KSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBub25lIHRvIG1vdmVcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3bGlzdCA9IGl4W25ld2hhc2hdO1xuICAgICAgICBpZiAoIW5ld2xpc3QpIHtcbiAgICAgICAgICBpeFtuZXdoYXNoXSA9IG9sZGxpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXhbbmV3aGFzaF0gPSBvbGRsaXN0LmNvbmNhdChuZXdsaXN0KTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgaXhbb2xkaGFzaF07XG4gICAgICB9O1xuICAgICAgLy8gdGhlIGNhbm9uaWNhbCBvbmUgY2FycmllcyBhbGwgdGhlIGluZGV4ZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIG1vdmVJbmRleCh0aGlzLmluZGV4W2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVkaXJlY3Rpb25zW29sZGhhc2hdID0gc21hbGw7XG4gICAgICBpZiAoYmlnLnVyaSkge1xuICAgICAgICAvLyBAQEpBTUJPOiBtdXN0IHVwZGF0ZSByZWRpcmVjdGlvbnMsYWxpYXNlcyBmcm9tIHN1Yi1pdGVtcywgdG9vLlxuICAgICAgICBpZiAoIXRoaXMuYWxpYXNlc1tuZXdoYXNoXSkge1xuICAgICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXS5wdXNoKGJpZyk7IC8vIEJhY2sgbGlua1xuICAgICAgICBpZiAodGhpcy5hbGlhc2VzW29sZGhhc2hdKSB7XG4gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYWxpYXNlc1tvbGRoYXNoXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGlvbnNbdGhpcy5hbGlhc2VzW29sZGhhc2hdW2ldLmhhc2hTdHJpbmcoKV0gPSBzbWFsbDtcbiAgICAgICAgICAgIHRoaXMuYWxpYXNlc1tuZXdoYXNoXS5wdXNoKHRoaXMuYWxpYXNlc1tvbGRoYXNoXVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkKHNtYWxsLCB0aGlzLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayN1cmknKSwgYmlnLnVyaSk7XG4gICAgICAgIC8vIElmIHR3byB0aGluZ3MgYXJlIGVxdWFsLCBhbmQgb25lIGlzIHJlcXVlc3RlZCwgd2Ugc2hvdWxkIHJlcXVlc3QgdGhlIG90aGVyLlxuICAgICAgICBpZiAodGhpcy5mZXRjaGVyKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaGVyLm5vd0tub3duQXMoYmlnLCBzbWFsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1vdmVJbmRleCh0aGlzLmNsYXNzQWN0aW9ucyk7XG4gICAgICBtb3ZlSW5kZXgodGhpcy5wcm9wZXJ0eUFjdGlvbnMpO1xuICAgICAgLy8gbG9nLmRlYnVnKFwiRXF1YXRlIGRvbmUuIFwiK2JpZytcIiB0byBiZSBrbm93biBhcyBcIitzbWFsbClcbiAgICAgIHJldHVybiB0cnVlOyAvLyB0cnVlIG1lYW5zIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3QgbmVlZCB0byBiZSBwdXQgaW5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIGVxdWl2YWxlbnQgVVJJcyBieSB3aGljaCB0aGlzIGlzIGtub3duXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2FsbEFsaWFzZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhbGxBbGlhc2VzKHgpIHtcbiAgICAgIHZhciBhID0gdGhpcy5hbGlhc2VzW3RoaXMuY2Fub24oeCkuaGFzaFN0cmluZygpXSB8fCBbXTtcbiAgICAgIGEucHVzaCh0aGlzLmNhbm9uKHgpKTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgYnkgY2Fub25pY2FsIFVSSSBhcyBzbXVzaGVkXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NhbWVUaGluZ3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzYW1lVGhpbmdzKHgsIHkpIHtcbiAgICAgIGlmICh4LnNhbWVUZXJtKHkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIHgxID0gdGhpcy5jYW5vbih4KTtcbiAgICAgIC8vICAgIGFsZXJ0KCd4MT0nK3gxKVxuICAgICAgaWYgKCF4MSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHkxID0gdGhpcy5jYW5vbih5KTtcbiAgICAgIC8vICAgIGFsZXJ0KCd5MT0nK3kxKTsgLy9AQFxuICAgICAgaWYgKCF5MSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHgxLnVyaSA9PT0geTEudXJpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFByZWZpeEZvclVSSScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFByZWZpeEZvclVSSShwcmVmaXgsIG5zdXJpKSB7XG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgaGFjayBmb3Igb3VyIG93biBpc3N1ZXMsIHdoaWNoIG91Z2h0IHRvIGJlIGZpeGVkXG4gICAgICAvLyBwb3N0LXJlbGVhc2VcbiAgICAgIC8vIFNlZSBodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvY2dpLWJpbi9yb3VuZHVwLmNnaS8kcmRmL2lzc3VlMjI3XG4gICAgICBpZiAocHJlZml4ID09PSAndGFiJyAmJiB0aGlzLm5hbWVzcGFjZXNbJ3RhYiddKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhlcmUgYXJlIGZpbGVzIGFyb3VuZCB3aXRoIGxvbmcgYmFkbHkgZ2VuZXJhdGVkIHByZWZpeGVzIGxpa2UgdGhpc1xuICAgICAgaWYgKHByZWZpeC5zbGljZSgwLCAyKSA9PT0gJ25zJyB8fCBwcmVmaXguc2xpY2UoMCwgNykgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWVzcGFjZXNbcHJlZml4XSA9IG5zdXJpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBzdGF0ZW1lbnRzIG1hdGNoaW5nIGEgcGF0dGVyblxuICAgICAqIEFMTCBDT05WRU5JRU5DRSBMT09LVVAgRlVOQ1RJT05TIFJFTFkgT04gVEhJUyFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc3RhdGVtZW50c01hdGNoaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhdGVtZW50c01hdGNoaW5nKHN1YmosIHByZWQsIG9iaiwgd2h5LCBqdXN0T25lKSB7XG4gICAgICAvLyBsb2cuZGVidWcoXCJNYXRjaGluZyB7XCIrc3ViaitcIiBcIitwcmVkK1wiIFwiK29iaitcIn1cIilcbiAgICAgIHZhciBwYXQgPSBbc3ViaiwgcHJlZCwgb2JqLCB3aHldO1xuICAgICAgdmFyIHBhdHRlcm4gPSBbXTtcbiAgICAgIHZhciBoYXNoID0gW107XG4gICAgICB2YXIgd2lsZCA9IFtdOyAvLyB3aWxkY2FyZHNcbiAgICAgIHZhciBnaXZlbiA9IFtdOyAvLyBOb3Qgd2lsZFxuICAgICAgdmFyIHA7XG4gICAgICB2YXIgbGlzdDtcbiAgICAgIGZvciAocCA9IDA7IHAgPCA0OyBwKyspIHtcbiAgICAgICAgcGF0dGVybltwXSA9IHRoaXMuY2Fub24oTm9kZS5mcm9tVmFsdWUocGF0W3BdKSk7XG4gICAgICAgIGlmICghcGF0dGVybltwXSkge1xuICAgICAgICAgIHdpbGQucHVzaChwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaXZlbi5wdXNoKHApO1xuICAgICAgICAgIGhhc2hbcF0gPSBwYXR0ZXJuW3BdLmhhc2hTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdpdmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzO1xuICAgICAgfVxuICAgICAgaWYgKGdpdmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBFYXN5IHRvbywgd2UgaGF2ZSBhbiBpbmRleCBmb3IgdGhhdFxuICAgICAgICBwID0gZ2l2ZW5bMF07XG4gICAgICAgIGxpc3QgPSB0aGlzLmluZGV4W3BdW2hhc2hbcF1dO1xuICAgICAgICBpZiAobGlzdCAmJiBqdXN0T25lKSB7XG4gICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGlzdCA9IGxpc3Quc2xpY2UoMCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpc3QgPSBsaXN0IHx8IFtdO1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH1cbiAgICAgIC8vIE5vdyBnaXZlbi5sZW5ndGggaXMgMiwgMyBvciA0LlxuICAgICAgLy8gV2UgaG9wZSB0aGF0IHRoZSBzY2FsZS1mcmVlIG5hdHVyZSBvZiB0aGUgZGF0YSB3aWxsIG1lYW4gd2UgdGVuZCB0byBnZXRcbiAgICAgIC8vIGEgc2hvcnQgaW5kZXggaW4gdGhlcmUgc29tZXdoZXJlIVxuICAgICAgdmFyIGJlc3QgPSAxZTEwOyAvLyByZWFsbHkgYmFkXG4gICAgICB2YXIgYmVzdF9pO1xuICAgICAgdmFyIGk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2l2ZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IGdpdmVuW2ldOyAvLyBXaGljaCBwYXJ0IHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICAgICAgbGlzdCA9IHRoaXMuaW5kZXhbcF1baGFzaFtwXV07XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgIHJldHVybiBbXTsgLy8gTm8gb2NjdXJyZW5jZXNcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPCBiZXN0KSB7XG4gICAgICAgICAgYmVzdCA9IGxpc3QubGVuZ3RoO1xuICAgICAgICAgIGJlc3RfaSA9IGk7IC8vIChub3QgcCEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIE9rLCB3ZSBoYXZlIHBpY2tlZCB0aGUgc2hvcnRlc3QgaW5kZXggYnV0IG5vdyB3ZSBoYXZlIHRvIGZpbHRlciBpdFxuICAgICAgdmFyIGJlc3RfcCA9IGdpdmVuW2Jlc3RfaV07XG4gICAgICB2YXIgcG9zc2libGVzID0gdGhpcy5pbmRleFtiZXN0X3BdW2hhc2hbYmVzdF9wXV07XG4gICAgICB2YXIgY2hlY2sgPSBnaXZlbi5zbGljZSgwLCBiZXN0X2kpLmNvbmNhdChnaXZlbi5zbGljZShiZXN0X2kgKyAxKSk7IC8vIHJlbW92ZSBiZXN0X2lcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgcGFydHMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsICd3aHknXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zc2libGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBzdCA9IHBvc3NpYmxlc1tqXTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hlY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBmb3IgZWFjaCBwb3NpdGlvbiB0byBiZSBjaGVja2VkXG4gICAgICAgICAgcCA9IGNoZWNrW2ldO1xuICAgICAgICAgIGlmICghdGhpcy5jYW5vbihzdFtwYXJ0c1twXV0pLnNhbWVUZXJtKHBhdHRlcm5bcF0pKSB7XG4gICAgICAgICAgICBzdCA9IG51bGw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ICE9IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goc3QpO1xuICAgICAgICAgIGlmIChqdXN0T25lKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEEgbGlzdCBvZiBhbGwgdGhlIFVSSXMgYnkgd2hpY2ggdGhpcyB0aGluZyBpcyBrbm93blxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1cmlzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXJpcyh0ZXJtKSB7XG4gICAgICB2YXIgY3Rlcm0gPSB0aGlzLmNhbm9uKHRlcm0pO1xuICAgICAgdmFyIHRlcm1zID0gdGhpcy5hbGlhc2VzW2N0ZXJtLmhhc2hTdHJpbmcoKV07XG4gICAgICBpZiAoIWN0ZXJtLnVyaSkgcmV0dXJuIFtdO1xuICAgICAgdmFyIHJlcyA9IFtjdGVybS51cmldO1xuICAgICAgaWYgKHRlcm1zKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXMucHVzaCh0ZXJtc1tpXS51cmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xlbmd0aCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnRzLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW5kZXhlZEZvcm11bGE7XG59KEZvcm11bGEpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBJbmRleGVkRm9ybXVsYTtcblxuXG5JbmRleGVkRm9ybXVsYS5oYW5kbGVSREZUeXBlID0gaGFuZGxlUkRGVHlwZTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBqc29uUGFyc2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4ge1xuICAgIHBhcnNlSlNPTjogZnVuY3Rpb24gcGFyc2VKU09OKGRhdGEsIHNvdXJjZSwgc3RvcmUpIHtcbiAgICAgIHZhciBzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdDtcbiAgICAgIHZhciBibm9kZXMgPSB7fTtcbiAgICAgIHZhciB3aHkgPSBzdG9yZS5zeW0oc291cmNlKTtcbiAgICAgIGZvciAodmFyIHggaW4gZGF0YSkge1xuICAgICAgICBpZiAoeC5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgICAgaWYgKGJub2Rlc1t4XSkge1xuICAgICAgICAgICAgc3ViamVjdCA9IGJub2Rlc1t4XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViamVjdCA9IHN0b3JlLmJub2RlKHgpO1xuICAgICAgICAgICAgYm5vZGVzW3hdID0gc3ViamVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViamVjdCA9IHN0b3JlLnN5bSh4KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJlZHMgPSBkYXRhW3hdO1xuICAgICAgICBmb3IgKHZhciB5IGluIHByZWRzKSB7XG4gICAgICAgICAgdmFyIG9iamVjdHMgPSBwcmVkc1t5XTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBzdG9yZS5zeW0oeSk7XG4gICAgICAgICAgZm9yICh2YXIgeiBpbiBvYmplY3RzKSB7XG4gICAgICAgICAgICB2YXIgb2JqID0gb2JqZWN0c1t6XTtcbiAgICAgICAgICAgIGlmIChvYmoudHlwZSA9PT0gJ3VyaScpIHtcbiAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUuc3ltKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgIHN0b3JlLmFkZChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgd2h5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqLnR5cGUgPT09ICdCbGFua05vZGUnKSB7XG4gICAgICAgICAgICAgIGlmIChibm9kZXNbb2JqLnZhbHVlXSkge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IGJub2Rlc1tvYmoudmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9iamVjdCA9IHN0b3JlLmJub2RlKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYm5vZGVzW29iai52YWx1ZV0gPSBvYmplY3Q7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgICAgICAgICAgIC8vIHZhciBkYXRhdHlwZVxuICAgICAgICAgICAgICBpZiAob2JqLmRhdGF0eXBlKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUubGl0ZXJhbChvYmoudmFsdWUsIHVuZGVmaW5lZCwgc3RvcmUuc3ltKG9iai5kYXRhdHlwZSkpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iai5sYW5nKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gc3RvcmUubGl0ZXJhbChvYmoudmFsdWUsIG9iai5sYW5nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBzdG9yZS5saXRlcmFsKG9iai52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvcjogdW5leHBlY3RlZCB0ZXJtdHlwZTogJyArIHoudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25QYXJzZXI7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xudmFyIFhTRCA9IHJlcXVpcmUoJy4veHNkJyk7XG5cbnZhciBMaXRlcmFsID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhMaXRlcmFsLCBfTm9kZSk7XG5cbiAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSwgbGFuZ3VhZ2UsIGRhdGF0eXBlKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpdGVyYWwpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKExpdGVyYWwuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihMaXRlcmFsKSkuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy50ZXJtVHlwZSA9IExpdGVyYWwudGVybVR5cGU7XG4gICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgIF90aGlzLmxhbmcgPSBsYW5ndWFnZTtcbiAgICAgIGRhdGF0eXBlID0gWFNELmxhbmdTdHJpbmc7XG4gICAgfVxuICAgIC8vIElmIG5vdCBzcGVjaWZpZWQsIGEgbGl0ZXJhbCBoYXMgdGhlIGltcGxpZWQgWFNELnN0cmluZyBkZWZhdWx0IGRhdGF0eXBlXG4gICAgaWYgKGRhdGF0eXBlKSB7XG4gICAgICBfdGhpcy5kYXRhdHlwZSA9IE5hbWVkTm9kZS5mcm9tVmFsdWUoZGF0YXR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGl0ZXJhbCwgW3tcbiAgICBrZXk6ICdjb3B5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSgpIHtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh0aGlzLnZhbHVlLCB0aGlzLmxhbmcsIHRoaXMuZGF0YXR5cGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50ZXJtVHlwZSA9PT0gb3RoZXIudGVybVR5cGUgJiYgdGhpcy52YWx1ZSA9PT0gb3RoZXIudmFsdWUgJiYgdGhpcy5sYW5ndWFnZSA9PT0gb3RoZXIubGFuZ3VhZ2UgJiYgKCF0aGlzLmRhdGF0eXBlICYmICFvdGhlci5kYXRhdHlwZSB8fCB0aGlzLmRhdGF0eXBlICYmIHRoaXMuZGF0YXR5cGUuZXF1YWxzKG90aGVyLmRhdGF0eXBlKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9OVCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvTlQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG9mIFJERiBsaXRlcmFsIGlzIG5vdCBzdHJpbmcgb3IgbnVtYmVyOiAnICsgdGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgc3RyID0gdGhpcy52YWx1ZTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpO1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcXCIvZywgJ1xcXFxcIicpO1xuICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKTtcbiAgICAgIHN0ciA9ICdcIicgKyBzdHIgKyAnXCInO1xuXG4gICAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgICBzdHIgKz0gJ0AnICsgdGhpcy5sYW5ndWFnZTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGF0YXR5cGUuZXF1YWxzKFhTRC5zdHJpbmcpKSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIGRhdGF0eXBlIGlmIGl0J3Mgbm90IGEgc3RyaW5nXG4gICAgICAgIHN0ciArPSAnXl4nICsgdGhpcy5kYXRhdHlwZS50b0Nhbm9uaWNhbCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnICsgdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tQm9vbGVhblxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0gdmFsdWUge0Jvb2xlYW59XG4gICAgICogQHJldHVybiB7TGl0ZXJhbH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbGFuZ3VhZ2UnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGxhbmd1YWdlKSB7XG4gICAgICB0aGlzLmxhbmcgPSBsYW5ndWFnZSB8fCAnJztcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ2Zyb21Cb29sZWFuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbUJvb2xlYW4odmFsdWUpIHtcbiAgICAgIHZhciBzdHJWYWx1ZSA9IHZhbHVlID8gJzEnIDogJzAnO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHN0clZhbHVlLCBudWxsLCBYU0QuYm9vbGVhbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZnJvbURhdGVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHZhbHVlIHtEYXRlfVxuICAgICAqIEByZXR1cm4ge0xpdGVyYWx9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2Zyb21EYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbURhdGUodmFsdWUpIHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudCB0byBMaXRlcmFsLmZyb21EYXRlKCknKTtcbiAgICAgIH1cbiAgICAgIHZhciBkMiA9IGZ1bmN0aW9uIGQyKHgpIHtcbiAgICAgICAgcmV0dXJuICgnJyArICgxMDAgKyB4KSkuc2xpY2UoMSwgMyk7XG4gICAgICB9O1xuICAgICAgdmFyIGRhdGUgPSAnJyArIHZhbHVlLmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKyBkMih2YWx1ZS5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKyBkMih2YWx1ZS5nZXRVVENEYXRlKCkpICsgJ1QnICsgZDIodmFsdWUuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBkMih2YWx1ZS5nZXRVVENNaW51dGVzKCkpICsgJzonICsgZDIodmFsdWUuZ2V0VVRDU2Vjb25kcygpKSArICdaJztcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbChkYXRlLCBudWxsLCBYU0QuZGF0ZVRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGZyb21OdW1iZXJcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHZhbHVlIHtOdW1iZXJ9XG4gICAgICogQHJldHVybiB7TGl0ZXJhbH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZnJvbU51bWJlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgdG8gTGl0ZXJhbC5mcm9tTnVtYmVyKCknKTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhdHlwZSA9IHZvaWQgMDtcbiAgICAgIHZhciBzdHJWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoc3RyVmFsdWUuaW5kZXhPZignZScpIDwgMCAmJiBNYXRoLmFicyh2YWx1ZSkgPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgZGF0YXR5cGUgPSBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSA/IFhTRC5pbnRlZ2VyIDogWFNELmRlY2ltYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhdHlwZSA9IFhTRC5kb3VibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWwoc3RyVmFsdWUsIG51bGwsIGRhdGF0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmcm9tVmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtMaXRlcmFsfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdmcm9tVmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICgodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpID09PSAnb2JqZWN0JyAmJiB2YWx1ZS50ZXJtVHlwZSkge1xuICAgICAgICAvLyB0aGlzIGlzIGEgTm9kZSBpbnN0YW5jZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodmFsdWUpKSB7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIExpdGVyYWwuZnJvbURhdGUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgcmV0dXJuIExpdGVyYWwuZnJvbUJvb2xlYW4odmFsdWUpO1xuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgIHJldHVybiBMaXRlcmFsLmZyb21OdW1iZXIodmFsdWUpO1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtYWtlIGxpdGVyYWwgZnJvbSBcIiArIHZhbHVlICsgJyBvZiB0eXBlICcgKyAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWx1ZSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGl0ZXJhbDtcbn0oTm9kZSk7XG5cbkxpdGVyYWwudGVybVR5cGUgPSAnTGl0ZXJhbCc7XG5MaXRlcmFsLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnTGl0ZXJhbCddO1xuTGl0ZXJhbC5wcm90b3R5cGUuZGF0YXR5cGUgPSBYU0Quc3RyaW5nO1xuTGl0ZXJhbC5wcm90b3R5cGUubGFuZyA9ICcnO1xuTGl0ZXJhbC5wcm90b3R5cGUuaXNWYXIgPSAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpdGVyYWw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQSBEdW1teSBsb2dcbiAqIEBtb2R1bGUgbG9nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZWJ1ZzogZnVuY3Rpb24gZGVidWcoeCkge1xuICAgIHJldHVybjtcbiAgfSxcbiAgd2FybjogZnVuY3Rpb24gd2Fybih4KSB7XG4gICAgcmV0dXJuO1xuICB9LFxuICBpbmZvOiBmdW5jdGlvbiBpbmZvKHgpIHtcbiAgICByZXR1cm47XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcih4KSB7XG4gICAgcmV0dXJuO1xuICB9LFxuICBzdWNjZXNzOiBmdW5jdGlvbiBzdWNjZXNzKHgpIHtcbiAgICByZXR1cm47XG4gIH0sXG4gIG1zZzogZnVuY3Rpb24gbXNnKHgpIHtcbiAgICByZXR1cm47XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbi8qKlxuKlxuKiAgVVRGLTggZGF0YSBlbmNvZGUgLyBkZWNvZGVcbiogIGh0dHA6Ly93d3cud2VidG9vbGtpdC5pbmZvL1xuKlxuKiovXG52YXIgVXJpID0gcmVxdWlyZSgnLi91cmknKTtcbnZhciBBcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL3V0aWwnKS5BcnJheUluZGV4T2Y7XG5cbnZhciBOM1BhcnNlciA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIGhleGlmeShzdHIpIHtcbiAgICAgICAgLy8gYWxzbyB1c2VkIGluIHBhcnNlclxuICAgICAgICByZXR1cm4gZW5jb2RlVVJJKHN0cik7XG4gICAgfVxuXG4gICAgdmFyIFV0ZjggPSB7XG4gICAgICAgIC8vIHB1YmxpYyBtZXRob2QgZm9yIHVybCBlbmNvZGluZ1xuICAgICAgICBlbmNvZGU6IGZ1bmN0aW9uIGVuY29kZShzdHJpbmcpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB2YXIgdXRmdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+IDEyNyAmJiBjIDwgMjA0OCkge1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiA2IHwgMTkyKTtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgJiA2MyB8IDEyOCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4gMTIgfCAyMjQpO1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiA2ICYgNjMgfCAxMjgpO1xuICAgICAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyAmIDYzIHwgMTI4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGZ0ZXh0O1xuICAgICAgICB9LFxuICAgICAgICAvLyBwdWJsaWMgbWV0aG9kIGZvciB1cmwgZGVjb2RpbmdcbiAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUodXRmdGV4dCkge1xuICAgICAgICAgICAgdmFyIHN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChpIDwgdXRmdGV4dC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHZhciBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID4gMTkxICYmIGMgPCAyMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiAzMSkgPDwgNiB8IHV0ZnRleHQuY2hhckNvZGVBdChpICsgMSkgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDE1KSA8PCAxMiB8ICh1dGZ0ZXh0LmNoYXJDb2RlQXQoaSArIDEpICYgNjMpIDw8IDYgfCB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSArIDIpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfVxuICAgIH07IC8vIFRoaW5ncyB3ZSBuZWVkIHRvIGRlZmluZSB0byBtYWtlIGNvbnZlcnRlZCBweXRobiBjb2RlIHdvcmsgaW4ganNcbiAgICAvLyBlbnZpcm9ubWVudCBvZiAkcmRmXG5cbiAgICB2YXIgUkRGU2lua19mb3JTb21lU3ltID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI2ZvclNvbWVcIjtcbiAgICB2YXIgUkRGU2lua19mb3JBbGxTeW0gPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjZm9yQWxsXCI7XG4gICAgdmFyIExvZ2ljX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI1wiO1xuXG4gICAgLy8gIHB5anMgc2VlbXMgdG8gcmVmZXJlbmNlIHJ1bnRpbWUgbGlicmFyeSB3aGljaCBJIGRpZG4ndCBmaW5kXG5cbiAgICB2YXIgcHlqc2xpYl9UdXBsZSA9IGZ1bmN0aW9uIHB5anNsaWJfVHVwbGUodGhlTGlzdCkge1xuICAgICAgICByZXR1cm4gdGhlTGlzdDtcbiAgICB9O1xuXG4gICAgdmFyIHB5anNsaWJfTGlzdCA9IGZ1bmN0aW9uIHB5anNsaWJfTGlzdCh0aGVMaXN0KSB7XG4gICAgICAgIHJldHVybiB0aGVMaXN0O1xuICAgIH07XG5cbiAgICB2YXIgcHlqc2xpYl9EaWN0ID0gZnVuY3Rpb24gcHlqc2xpYl9EaWN0KGxpc3RPZlBhaXJzKSB7XG4gICAgICAgIGlmIChsaXN0T2ZQYWlycy5sZW5ndGggPiAwKSB0aHJvdyBcIm1pc3NpbmcuanM6IG9vcHMgbm5vbmVtcHR5IGRpY3Qgbm90IGltcFwiO1xuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcblxuICAgIHZhciBweWpzbGliX2xlbiA9IGZ1bmN0aW9uIHB5anNsaWJfbGVuKHMpIHtcbiAgICAgICAgcmV0dXJuIHMubGVuZ3RoO1xuICAgIH07XG5cbiAgICB2YXIgcHlqc2xpYl9zbGljZSA9IGZ1bmN0aW9uIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBqKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RyLnNsaWNlID09ICd1bmRlZmluZWQnKSB0aHJvdyAnQEAgbWlzaW5nLmpzOiBObyAuc2xpY2UgZnVuY3Rpb24gZm9yICcgKyBzdHIgKyAnIG9mIHR5cGUgJyArICh0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihzdHIpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBqID09ICd1bmRlZmluZWQnIHx8IGogPT0gbnVsbCkgcmV0dXJuIHN0ci5zbGljZShpKTtcbiAgICAgICAgcmV0dXJuIHN0ci5zbGljZShpLCBqKTsgLy8gQCBleGFjdGx5IHRoZSBzYW1lIHNwZWM/XG4gICAgfTtcbiAgICB2YXIgU3RvcEl0ZXJhdGlvbiA9IEVycm9yKCdkdW1teSBlcnJvciBzdG9wIGl0ZXJhdGlvbicpO1xuXG4gICAgdmFyIHB5anNsaWJfSXRlcmF0b3IgPSBmdW5jdGlvbiBweWpzbGliX0l0ZXJhdG9yKHRoZUxpc3QpIHtcbiAgICAgICAgdGhpcy5sYXN0ID0gMDtcbiAgICAgICAgdGhpcy5saSA9IHRoZUxpc3Q7XG4gICAgICAgIHRoaXMubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3QgPT0gdGhpcy5saS5sZW5ndGgpIHRocm93IFN0b3BJdGVyYXRpb247XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saVt0aGlzLmxhc3QrK107XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICB2YXIgb3JkID0gZnVuY3Rpb24gb3JkKHN0cikge1xuICAgICAgICByZXR1cm4gc3RyLmNoYXJDb2RlQXQoMCk7XG4gICAgfTtcblxuICAgIHZhciBzdHJpbmdfZmluZCA9IGZ1bmN0aW9uIHN0cmluZ19maW5kKHN0ciwgcykge1xuICAgICAgICByZXR1cm4gc3RyLmluZGV4T2Yocyk7XG4gICAgfTtcblxuICAgIHZhciBhc3NlcnRGdWRnZSA9IGZ1bmN0aW9uIGFzc2VydEZ1ZGdlKGNvbmRpdGlvbiwgZGVzYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNjKSB0aHJvdyBcInB5dGhvbiBBc3NlcnRpb24gZmFpbGVkOiBcIiArIGRlc2M7XG4gICAgICAgIHRocm93IFwiKHB5dGhvbikgQXNzZXJ0aW9uIGZhaWxlZC5cIjtcbiAgICB9O1xuXG4gICAgdmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IGZ1bmN0aW9uIHN0cmluZ0Zyb21DaGFyQ29kZSh1ZXNjKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHVlc2MpO1xuICAgIH07XG5cbiAgICBTdHJpbmcucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgICAgICBpZiAoZW5jb2RpbmcgIT0gJ3V0Zi04JykgdGhyb3cgXCJVVEY4X2NvbnZlcnRlcjogY2FuIG9ubHkgZG8gdXRmLThcIjtcbiAgICAgICAgcmV0dXJuIFV0ZjguZW5jb2RlKHRoaXMpO1xuICAgIH07XG4gICAgU3RyaW5nLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGVuY29kaW5nICE9ICd1dGYtOCcpIHRocm93IFwiVVRGOF9jb252ZXJ0ZXI6IGNhbiBvbmx5IGRvIHV0Zi04XCI7XG4gICAgICAgIC8vcmV0dXJuIFV0ZjguZGVjb2RlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgdmFyIHVyaXBhdGhfam9pbiA9IGZ1bmN0aW9uIHVyaXBhdGhfam9pbihiYXNlLCBnaXZlbikge1xuICAgICAgICByZXR1cm4gVXJpLmpvaW4oZ2l2ZW4sIGJhc2UpOyAvLyBzYWQgYnV0IHRydWVcbiAgICB9O1xuXG4gICAgdmFyIGJlY2F1c2VTdWJleHByZXNzaW9uID0gbnVsbDsgLy8gTm8gcmVhc29uIG5lZWRlZFxuICAgIHZhciBkaWFnX3RyYWNraW5nID0gMDtcbiAgICB2YXIgZGlhZ19jaGF0dHlfZmxhZyA9IDA7XG4gICAgdmFyIGRpYWdfcHJvZ3Jlc3MgPSBmdW5jdGlvbiBkaWFnX3Byb2dyZXNzKHN0cikge30gLyokcmRmLmxvZy5kZWJ1ZyhzdHIpOyovXG5cbiAgICAvLyB3aHlfQmVjYXVzZU9mRGF0YSA9IGZ1bmN0aW9uKGRvYywgcmVhc29uKSB7IHJldHVybiBkb2MgfTtcblxuXG4gICAgO3ZhciBSREZfdHlwZV9VUkkgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlXCI7XG4gICAgdmFyIERBTUxfc2FtZUFzX1VSSSA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjc2FtZUFzXCI7XG5cbiAgICAvKlxuICAgIGZ1bmN0aW9uIFN5bnRheEVycm9yKGRldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX1N5bnRheEVycm9yKGRldGFpbHMpO1xuICAgIH1cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gX19TeW50YXhFcnJvcihkZXRhaWxzKSB7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuXG4gICAgLypcbiAgICBcbiAgICAkSWQ6IG4zcGFyc2VyLmpzIDE0NTYxIDIwMDgtMDItMjMgMDY6Mzc6MjZaIGtlbm55bHVjayAkXG4gICAgXG4gICAgSEFORCBFRElURUQgRk9SIENPTlZFUlNJT04gVE8gSkFWQVNDUklQVFxuICAgIFxuICAgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBOcHRhdGlvbjMgcGFyc2VyLCBhbmQgdGhlIGZpbmFsXG4gICAgcGFydCBvZiBhIG5vdGF0aW9uMyBzZXJpYWxpemVyLlxuICAgIFxuICAgIFNlZSBhbHNvOlxuICAgIFxuICAgIE5vdGF0aW9uIDNcbiAgICBodHRwOi8vd3d3LnczLm9yZy9EZXNpZ25Jc3N1ZXMvTm90YXRpb24zXG4gICAgXG4gICAgQ2xvc2VkIFdvcmxkIE1hY2hpbmUgLSBhbmQgUkRGIFByb2Nlc3NvclxuICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9jd21cbiAgICBcbiAgICBUbyBETzogU2VlIGFsc28gXCJAQFwiIGluIGNvbW1lbnRzXG4gICAgXG4gICAgLSBDbGVhbiB1cCBpbnRlcmZhY2VzXG4gICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuICAgIFxuICAgIE1vZHVsZSBvcmlnaW5hbGx5IGJ5IERhbiBDb25ub2xseSwgaW5jbHVkZWluZyBub3RhdGlvbjNcbiAgICBwYXJzZXIgYW5kIFJERiBnZW5lcmF0b3IuIFRpbUJMIGFkZGVkIFJERiBzdHJlYW0gbW9kZWxcbiAgICBhbmQgTjMgZ2VuZXJhdGlvbiwgcmVwbGFjZWQgc3RyZWFtIG1vZGVsIHdpdGggdXNlXG4gICAgb2YgY29tbW9uIHN0b3JlL2Zvcm11bGEgQVBJLiAgWW9zaSBTY2hhcmYgZGV2ZWxvcHBlZFxuICAgIHRoZSBtb2R1bGUsIGluY2x1ZGluZyB0ZXN0cyBhbmQgdGVzdCBoYXJuZXNzLlxuICAgIFxuICAgICovXG5cbiAgICB2YXIgQURERURfSEFTSCA9IFwiI1wiO1xuICAgIHZhciBMT0dfaW1wbGllc19VUkkgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjaW1wbGllc1wiO1xuICAgIHZhciBJTlRFR0VSX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRlZ2VyXCI7XG4gICAgdmFyIEZMT0FUX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkb3VibGVcIjtcbiAgICB2YXIgREVDSU1BTF9EQVRBVFlQRSA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiO1xuICAgIHZhciBEQVRFX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlXCI7XG4gICAgdmFyIERBVEVUSU1FX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZVwiO1xuICAgIHZhciBCT09MRUFOX0RBVEFUWVBFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCI7XG4gICAgdmFyIG9wdGlvbl9ub3JlZ2VuID0gMDtcbiAgICB2YXIgX25vdFFOYW1lQ2hhcnMgPSBcIlxcdFxcclxcbiAhXFxcIiMkJSYnKCkqLiwrLzs8PT4/QFtcXFxcXV5ge3x9flwiO1xuICAgIHZhciBfbm90TmFtZUNoYXJzID0gX25vdFFOYW1lQ2hhcnMgKyBcIjpcIjtcbiAgICB2YXIgX3JkZm5zID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjXCI7XG4gICAgdmFyIE4zQ29tbWVudENoYXJhY3RlciA9IFwiI1wiO1xuICAgIHZhciBlb2wgPSBuZXcgUmVnRXhwKFwiXlsgXFxcXHRdKigjW15cXFxcbl0qKT9cXFxccj9cXFxcblwiLCAnZycpO1xuICAgIHZhciBlb2YgPSBuZXcgUmVnRXhwKFwiXlsgXFxcXHRdKigjW15cXFxcbl0qKT8kXCIsICdnJyk7XG4gICAgdmFyIHdzID0gbmV3IFJlZ0V4cChcIl5bIFxcXFx0XSpcIiwgJ2cnKTtcbiAgICB2YXIgc2lnbmVkX2ludGVnZXIgPSBuZXcgUmVnRXhwKFwiXlstK10/WzAtOV0rXCIsICdnJyk7XG4gICAgdmFyIG51bWJlcl9zeW50YXggPSBuZXcgUmVnRXhwKFwiXihbLStdP1swLTldKykoXFxcXC5bMC05XSspPyhlWy0rXT9bMC05XSspP1wiLCAnZycpO1xuICAgIHZhciBkYXRldGltZV9zeW50YXggPSBuZXcgUmVnRXhwKCdeWzAtOV1bMC05XVswLTldWzAtOV0tWzAtOV1bMC05XS1bMC05XVswLTldKFRbMC05XVswLTldOlswLTldWzAtOV0oOlswLTldWzAtOV0oXFxcXC5bMC05XSopPyk/KT9aPycpO1xuXG4gICAgdmFyIGRpZ2l0c3RyaW5nID0gbmV3IFJlZ0V4cChcIl5bMC05XStcIiwgJ2cnKTtcbiAgICB2YXIgaW50ZXJlc3RpbmcgPSBuZXcgUmVnRXhwKFwiW1xcXFxcXFxcXFxcXHJcXFxcblxcXFxcXFwiXVwiLCAnZycpO1xuICAgIHZhciBsYW5nY29kZSA9IG5ldyBSZWdFeHAoXCJeW2EtekEtWjAtOV0rKC1bYS16QS1aMC05XSspKlwiLCAnZycpO1xuICAgIGZ1bmN0aW9uIFNpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX1NpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfX1NpbmtQYXJzZXIoc3RvcmUsIG9wZW5Gb3JtdWxhLCB0aGlzRG9jLCBiYXNlVVJJLCBnZW5QcmVmaXgsIG1ldGFVUkksIGZsYWdzLCB3aHkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVuRm9ybXVsYSA9PSAndW5kZWZpbmVkJykgb3BlbkZvcm11bGEgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNEb2MgPT0gJ3VuZGVmaW5lZCcpIHRoaXNEb2MgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIGJhc2VVUkkgPT0gJ3VuZGVmaW5lZCcpIGJhc2VVUkkgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGdlblByZWZpeCA9PSAndW5kZWZpbmVkJykgZ2VuUHJlZml4ID0gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRhVVJJID09ICd1bmRlZmluZWQnKSBtZXRhVVJJID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBmbGFncyA9PSAndW5kZWZpbmVkJykgZmxhZ3MgPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHdoeSA9PSAndW5kZWZpbmVkJykgd2h5ID0gbnVsbDtcbiAgICAgICAgLypcbiAgICAgICAgbm90ZTogbmFtZXNwYWNlIG5hbWVzIHNob3VsZCAqbm90KiBlbmQgaW4gIztcbiAgICAgICAgdGhlICMgd2lsbCBnZXQgYWRkZWQgZHVyaW5nIHFuYW1lIHByb2Nlc3NpbmcgKi9cblxuICAgICAgICB0aGlzLl9iaW5kaW5ncyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xuICAgICAgICBpZiAodGhpc0RvYyAhPSBcIlwiKSB7XG4gICAgICAgICAgICBhc3NlcnRGdWRnZSh0aGlzRG9jLmluZGV4T2YoXCI6XCIpID49IDAsIFwiRG9jdW1lbnQgVVJJIG5vdCBhYnNvbHV0ZTogXCIgKyB0aGlzRG9jKTtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdzW1wiXCJdID0gdGhpc0RvYyArIFwiI1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIGlmIChnZW5QcmVmaXgpIHtcbiAgICAgICAgICAgIHN0b3JlLnNldEdlblByZWZpeChnZW5QcmVmaXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RoaXNEb2MgPSB0aGlzRG9jO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHN0b3JlLnN5bSh0aGlzRG9jKTtcbiAgICAgICAgdGhpcy5saW5lcyA9IDA7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50Q291bnQgPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0T2ZMaW5lID0gMDtcbiAgICAgICAgdGhpcy5wcmV2aW91c0xpbmUgPSAwO1xuICAgICAgICB0aGlzLl9nZW5QcmVmaXggPSBnZW5QcmVmaXg7XG4gICAgICAgIHRoaXMua2V5d29yZHMgPSBuZXcgcHlqc2xpYl9MaXN0KFtcImFcIiwgXCJ0aGlzXCIsIFwiYmluZFwiLCBcImhhc1wiLCBcImlzXCIsIFwib2ZcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIl0pO1xuICAgICAgICB0aGlzLmtleXdvcmRzU2V0ID0gMDtcbiAgICAgICAgdGhpcy5fYW5vbnltb3VzTm9kZXMgPSBuZXcgcHlqc2xpYl9EaWN0KFtdKTtcbiAgICAgICAgdGhpcy5fdmFyaWFibGVzID0gbmV3IHB5anNsaWJfRGljdChbXSk7XG4gICAgICAgIHRoaXMuX3BhcmVudFZhcmlhYmxlcyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICB0aGlzLl9yZWFzb24gPSB3aHk7XG4gICAgICAgIHRoaXMuX3JlYXNvbjIgPSBudWxsO1xuICAgICAgICBpZiAoZGlhZ190cmFja2luZykge1xuICAgICAgICAgICAgdGhpcy5fcmVhc29uMiA9IHdoeV9CZWNhdXNlT2ZEYXRhKHN0b3JlLnN5bSh0aGlzRG9jKSwgdGhpcy5fcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZVVSSSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZVVSSSA9IGJhc2VVUkk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpc0RvYykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VVUkkgPSB0aGlzRG9jO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iYXNlVVJJID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRGdWRnZSghdGhpcy5fYmFzZVVSSSB8fCB0aGlzLl9iYXNlVVJJLmluZGV4T2YoXCI6XCIpID49IDApO1xuICAgICAgICBpZiAoIXRoaXMuX2dlblByZWZpeCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RoaXNEb2MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW5QcmVmaXggPSB0aGlzLl90aGlzRG9jICsgXCIjX2dcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VuUHJlZml4ID0gUkRGU2lua191bmlxdWVVUkkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlbkZvcm11bGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RoaXNEb2MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtdWxhID0gc3RvcmUuZm9ybXVsYSh0aGlzRG9jICsgXCIjX2Zvcm11bGFcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm11bGEgPSBzdG9yZS5mb3JtdWxhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtdWxhID0gb3BlbkZvcm11bGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2Zvcm11bGE7XG4gICAgICAgIHRoaXMuX3BhcmVudENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmhlcmUgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuUHJlZml4ICsgXCJfTFwiICsgdGhpcy5saW5lcyArIFwiQ1wiICsgKGkgLSB0aGlzLnN0YXJ0T2ZMaW5lICsgMSk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmZvcm11bGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtdWxhO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5sb2FkU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQnVmKHN0cmVhbS5yZWFkKCkpO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5sb2FkQnVmID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAvKlxuICAgICAgICBQYXJzZXMgYSBidWZmZXIgYW5kIHJldHVybnMgaXRzIHRvcCBsZXZlbCBmb3JtdWxhKi9cblxuICAgICAgICB0aGlzLnN0YXJ0RG9jKCk7XG4gICAgICAgIHRoaXMuZmVlZChidWYpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbmREb2MoKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZmVlZCA9IGZ1bmN0aW9uIChvY3RldHMpIHtcbiAgICAgICAgLypcbiAgICAgICAgRmVlZCBhbiBvY3RldCBzdHJlYW0gdG90aGUgcGFyc2VyXG4gICAgICAgICBpZiBCYWRTeW50YXggaXMgcmFpc2VkLCB0aGUgc3RyaW5nXG4gICAgICAgIHBhc3NlZCBpbiB0aGUgZXhjZXB0aW9uIG9iamVjdCBpcyB0aGVcbiAgICAgICAgcmVtYWluZGVyIGFmdGVyIGFueSBzdGF0ZW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQuXG4gICAgICAgIFNvIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBmZWVkIHRvIHRoZVxuICAgICAgICBwYXJzZXIsIGl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgdG8gcmVjb3Zlci4qL1xuXG4gICAgICAgIHZhciBzdHIgPSBvY3RldHMuZGVjb2RlKFwidXRmLThcIik7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRpcmVjdGl2ZU9yU3RhdGVtZW50KHN0ciwgaik7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIGRpcmVjdGl2ZSBvciBzdGF0ZW1lbnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZGlyZWN0aXZlT3JTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RyLCBoKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBoKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMuZGlyZWN0aXZlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrRG90KHN0ciwgaik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnN0YXRlbWVudChzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0RvdChzdHIsIGopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS50b2sgPSBmdW5jdGlvbiAodG9rLCBzdHIsIGkpIHtcbiAgICAgICAgLypcbiAgICAgICAgQ2hlY2sgZm9yIGtleXdvcmQuICBTcGFjZSBtdXN0IGhhdmUgYmVlbiBzdHJpcHBlZCBvbiBlbnRyeSBhbmRcbiAgICAgICAgd2UgbXVzdCBub3QgYmUgYXQgZW5kIG9mIGZpbGUuKi9cbiAgICAgICAgdmFyIHdoaXRlc3BhY2UgPSBcIlxcdFxcblxcdlxcZlxcciBcIjtcbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMSkgPT0gXCJAXCIpIHtcbiAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXlJbmRleE9mKHRoaXMua2V5d29yZHMsIHRvaykgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBrID0gaSArIHB5anNsaWJfbGVuKHRvayk7XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaykgPT0gdG9rICYmIF9ub3RRTmFtZUNoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChrKSkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZGlyZWN0aXZlID0gZnVuY3Rpb24gKHN0ciwgaSkge1xuICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcyA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiYmluZFwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwia2V5d29yZCBiaW5kIGlzIG9ic29sZXRlOiB1c2UgQHByZWZpeFwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwia2V5d29yZHNcIiwgc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMuY29tbWFTZXBhcmF0ZWRMaXN0KHN0ciwgaiwgcmVzLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIidAa2V5d29yZHMnIG5lZWRzIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRLZXl3b3JkcyhweWpzbGliX3NsaWNlKHJlcywgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgICAgaWYgKGRpYWdfY2hhdHR5X2ZsYWcgPiA4MCkge1xuICAgICAgICAgICAgICAgIGRpYWdfcHJvZ3Jlc3MoXCJLZXl3b3JkcyBcIiwgdGhpcy5rZXl3b3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiZm9yQWxsXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmNvbW1hU2VwYXJhdGVkTGlzdChzdHIsIGosIHJlcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkJhZCB2YXJpYWJsZSBsaXN0IGFmdGVyIEBmb3JBbGxcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfX3ggPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihyZXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IF9feC5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5SW5kZXhPZih0aGlzLl92YXJpYWJsZXMsIHgpIDwgMCB8fCBBcnJheUluZGV4T2YodGhpcy5fcGFyZW50VmFyaWFibGVzLCB4KSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZXNbeF0gPSB0aGlzLl9jb250ZXh0Lm5ld1VuaXZlcnNhbCh4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiZm9yU29tZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb21tYVNlcGFyYXRlZExpc3Qoc3RyLCBqLCByZXMsIHRoaXMudXJpX3JlZjIpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJCYWQgdmFyaWFibGUgbGlzdCBhZnRlciBAZm9yU29tZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9feCA9IG5ldyBweWpzbGliX0l0ZXJhdG9yKHJlcyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4ID0gX194Lm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRlY2xhcmVFeGlzdGVudGlhbCh4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgIT0gU3RvcEl0ZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnRvayhcInByZWZpeFwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnFuYW1lKHN0ciwgaiwgdCk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIHFuYW1lIGFmdGVyIEBwcmVmaXhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCB0KTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiZXhwZWN0ZWQgPHVyaXJlZj4gYWZ0ZXIgQHByZWZpeCBfcW5hbWVfXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5zID0gdFsxXS51cmk7XG4gICAgICAgICAgICBpZiAodGhpcy5fYmFzZVVSSSkge1xuICAgICAgICAgICAgICAgIHZhciBucyA9IHVyaXBhdGhfam9pbih0aGlzLl9iYXNlVVJJLCBucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzc2VydEZ1ZGdlKG5zLmluZGV4T2YoXCI6XCIpID49IDAsIFwiV2l0aCBubyBiYXNlIFVSSSwgY2Fubm90IGhhbmRsZSByZWxhdGl2ZSBVUkkgZm9yIE5TXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0RnVkZ2UobnMuaW5kZXhPZihcIjpcIikgPj0gMCk7XG4gICAgICAgICAgICB0aGlzLl9iaW5kaW5nc1t0WzBdWzBdXSA9IG5zO1xuXG4gICAgICAgICAgICB0aGlzLmJpbmQodFswXVswXSwgaGV4aWZ5KG5zKSk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiYmFzZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgdCA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiwgdCk7XG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcImV4cGVjdGVkIDx1cmk+IGFmdGVyIEBiYXNlIFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBucyA9IHRbMF0udXJpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VVUkkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbnMgPSB1cmlwYXRoX2pvaW4odGhpcy5fYmFzZVVSSSwgbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIldpdGggbm8gcHJldmlvdXMgYmFzZSBVUkksIGNhbm5vdCB1c2UgcmVsYXRpdmUgVVJJIGluIEBiYXNlICA8XCIgKyBucyArIFwiPlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydEZ1ZGdlKG5zLmluZGV4T2YoXCI6XCIpID49IDApO1xuICAgICAgICAgICAgdGhpcy5fYmFzZVVSSSA9IG5zO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5iaW5kID0gZnVuY3Rpb24gKHFuLCB1cmkpIHtcbiAgICAgICAgaWYgKHFuID09IFwiXCIpIHt9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmUuc2V0UHJlZml4Rm9yVVJJKHFuLCB1cmkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnNldEtleXdvcmRzID0gZnVuY3Rpb24gKGspIHtcbiAgICAgICAgLypcbiAgICAgICAgVGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MqL1xuXG4gICAgICAgIGlmIChrID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMua2V5d29yZHNTZXQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5rZXl3b3JkcyA9IGs7XG4gICAgICAgICAgICB0aGlzLmtleXdvcmRzU2V0ID0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5zdGFydERvYyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuZW5kRG9jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvKlxuICAgICAgICBTaWduYWwgZW5kIG9mIGRvY3VtZW50IGFuZCBzdG9wIHBhcnNpbmcuIHJldHVybnMgZm9ybXVsYSovXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm11bGE7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm1ha2VTdGF0ZW1lbnQgPSBmdW5jdGlvbiAocXVhZCkge1xuICAgICAgICBxdWFkWzBdLmFkZChxdWFkWzJdLCBxdWFkWzFdLCBxdWFkWzNdLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50Q291bnQgKz0gMTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuc3RhdGVtZW50ID0gZnVuY3Rpb24gKHN0ciwgaSkge1xuICAgICAgICB2YXIgciA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICB2YXIgaSA9IHRoaXMub2JqZWN0KHN0ciwgaSwgcik7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnByb3BlcnR5X2xpc3Qoc3RyLCBpLCByWzBdKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIHByb3BlcnR5bGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gajtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuc3ViamVjdCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtKHN0ciwgaSwgcmVzKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudmVyYiA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBoYXMgX3Byb3BfXG4gICAgICAgIGlzIF9wcm9wXyBvZlxuICAgICAgICBhXG4gICAgICAgID1cbiAgICAgICAgX3Byb3BfXG4gICAgICAgID4tIHByb3AgLT5cbiAgICAgICAgPC0gcHJvcCAtPFxuICAgICAgICBfb3BlcmF0b3JfKi9cblxuICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHIgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnRvayhcImhhc1wiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMucHJvcChzdHIsIGosIHIpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJleHBlY3RlZCBwcm9wZXJ0eSBhZnRlciAnaGFzJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHJbMF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwiaXNcIiwgc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnByb3Aoc3RyLCBqLCByKTtcbiAgICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiZXhwZWN0ZWQgPHByb3BlcnR5PiBhZnRlciAnaXMnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFbmQgb2YgZmlsZSBmb3VuZCwgZXhwZWN0ZWQgcHJvcGVydHkgYWZ0ZXIgJ2lzJ1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpID0gajtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy50b2soXCJvZlwiLCBzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJleHBlY3RlZCAnb2YnIGFmdGVyICdpcycgPHByb3A+XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gobmV3IHB5anNsaWJfVHVwbGUoW1wiPC1cIiwgclswXV0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJhXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHRoaXMuX3N0b3JlLnN5bShSREZfdHlwZV9VUkkpXSkpO1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMikgPT0gXCI8PVwiKSB7XG4gICAgICAgICAgICByZXMucHVzaChuZXcgcHlqc2xpYl9UdXBsZShbXCI8LVwiLCB0aGlzLl9zdG9yZS5zeW0oTG9naWNfTlMgKyBcImltcGxpZXNcIildKSk7XG4gICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMSkgPT0gXCI9XCIpIHtcbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSArIDEsIGkgKyAyKSA9PSBcIj5cIikge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIHRoaXMuX3N0b3JlLnN5bShMb2dpY19OUyArIFwiaW1wbGllc1wiKV0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMucHVzaChuZXcgcHlqc2xpYl9UdXBsZShbXCItPlwiLCB0aGlzLl9zdG9yZS5zeW0oREFNTF9zYW1lQXNfVVJJKV0pKTtcbiAgICAgICAgICAgIHJldHVybiBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAyKSA9PSBcIjo9XCIpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIi0+XCIsIExvZ2ljX05TICsgXCJiZWNvbWVzXCJdKSk7XG4gICAgICAgICAgICByZXR1cm4gaSArIDI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGogPSB0aGlzLnByb3Aoc3RyLCBpLCByKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IHB5anNsaWJfVHVwbGUoW1wiLT5cIiwgclswXV0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDIpID09IFwiPi1cIiB8fCBweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDIpID09IFwiPC1cIikge1xuICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCI+LSAuLi4gLT4gc3ludGF4IGlzIG9ic29sZXRlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnByb3AgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbShzdHIsIGksIHJlcyk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aChzdHIsIGksIHJlcyk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmJsYW5rTm9kZSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuYm5vZGUodXJpLCB0aGlzLl9yZWFzb24yKTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBQYXJzZSB0aGUgcGF0aCBwcm9kdWN0aW9uLlxuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5ub2RlT3JMaXRlcmFsKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoXCIhXi5cIi5pbmRleE9mKHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSkpID49IDApIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSk7XG4gICAgICAgICAgICBpZiAoY2ggPT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWhlYWQgPSBweWpzbGliX3NsaWNlKHN0ciwgaiArIDEsIGogKyAyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFoZWFkIHx8IF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihhaGVhZCkgPj0gMCAmJiBcIjo/PFt7KFwiLmluZGV4T2YoYWhlYWQpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3ViaiA9IHJlcy5wb3AoKTtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmJsYW5rTm9kZSh0aGlzLmhlcmUoaikpO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLm5vZGUoc3RyLCBqICsgMSwgcmVzKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiRU9GIGZvdW5kIGluIG1pZGRsZSBvZiBwYXRoIHN5bnRheFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwcmVkID0gcmVzLnBvcCgpO1xuICAgICAgICAgICAgaWYgKGNoID09IFwiXlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlU3RhdGVtZW50KG5ldyBweWpzbGliX1R1cGxlKFt0aGlzLl9jb250ZXh0LCBwcmVkLCBvYmosIHN1YmpdKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZVN0YXRlbWVudChuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5fY29udGV4dCwgcHJlZCwgc3Viaiwgb2JqXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2gob2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gajtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuYW5vbnltb3VzTm9kZSA9IGZ1bmN0aW9uIChsbikge1xuICAgICAgICAvKlxuICAgICAgICBSZW1lbWJlciBvciBnZW5lcmF0ZSBhIHRlcm0gZm9yIG9uZSBvZiB0aGVzZSBfOiBhbm9ueW1vdXMgbm9kZXMqL1xuXG4gICAgICAgIHZhciB0ZXJtID0gdGhpcy5fYW5vbnltb3VzTm9kZXNbbG5dO1xuICAgICAgICBpZiAodGVybSkge1xuICAgICAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRlcm0gPSB0aGlzLl9zdG9yZS5ibm9kZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9yZWFzb24yKTtcbiAgICAgICAgdGhpcy5fYW5vbnltb3VzTm9kZXNbbG5dID0gdGVybTtcbiAgICAgICAgcmV0dXJuIHRlcm07XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMsIHN1YmplY3RBbHJlYWR5KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdEFscmVhZHkgPT0gJ3VuZGVmaW5lZCcpIHN1YmplY3RBbHJlYWR5ID0gbnVsbDtcbiAgICAgICAgLypcbiAgICAgICAgUGFyc2UgdGhlIDxub2RlPiBwcm9kdWN0aW9uLlxuICAgICAgICBTcGFjZSBpcyBub3cgc2tpcHBlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgaW5zdGVhZCBvZiBpbiBtdWx0aXBlIGNhbGxzIHRvIHNlbGYuc2tpcFNwYWNlKCkuXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIHN1YmogPSBzdWJqZWN0QWxyZWFkeTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gajtcbiAgICAgICAgdmFyIGNoID0gcHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKTtcbiAgICAgICAgaWYgKGNoID09IFwiW1wiKSB7XG4gICAgICAgICAgICB2YXIgYm5vZGVJRCA9IHRoaXMuaGVyZShpKTtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkVPRiBhZnRlciAnWydcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHZhciBpID0gaiArIDE7XG4gICAgICAgICAgICAgICAgdmFyIG9ianMgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMub2JqZWN0TGlzdChzdHIsIGksIG9ianMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViaiA9IG9ianNbMF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChweWpzbGliX2xlbihvYmpzKSA+IDEpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9fb2JqID0gbmV3IHB5anNsaWJfSXRlcmF0b3Iob2Jqcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBfX29iai5uZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWtlU3RhdGVtZW50KG5ldyBweWpzbGliX1R1cGxlKFt0aGlzLl9jb250ZXh0LCB0aGlzLl9zdG9yZS5zeW0oREFNTF9zYW1lQXNfVVJJKSwgc3Viaiwgb2JqXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBTdG9wSXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBqKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIkVPRiB3aGVuIG9iamVjdExpc3QgZXhwZWN0ZWQgYWZ0ZXIgWyA9IFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIjtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwib2JqZWN0TGlzdCBleHBlY3RlZCBhZnRlciBbPSBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1YmogPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJqID0gdGhpcy5ibGFua05vZGUoYm5vZGVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMucHJvcGVydHlfbGlzdChzdHIsIGosIHN1YmopO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJwcm9wZXJ0eV9saXN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFT0Ygd2hlbiAnXScgZXhwZWN0ZWQgYWZ0ZXIgWyA8cHJvcGVydHlMaXN0PlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpICE9IFwiXVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCInXScgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMucHVzaChzdWJqKTtcbiAgICAgICAgICAgIHJldHVybiBqICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT0gXCJ7XCIpIHtcbiAgICAgICAgICAgIHZhciBjaDIgPSBweWpzbGliX3NsaWNlKHN0ciwgaSArIDEsIGkgKyAyKTtcbiAgICAgICAgICAgIGlmIChjaDIgPT0gXCIkXCIpIHtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgbXlsaXN0ID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0X3J1biA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwibmVlZGVkICckfScsIGZvdW5kIGVuZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMikgPT0gXCIkfVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9ydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDEpID09IFwiLFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkOiAnLCdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RfcnVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSB0aGlzLml0ZW0oc3RyLCBpLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIGl0ZW0gaW4gc2V0IG9yICckfSdcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXlsaXN0LnB1c2goaXRlbVswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLm5ld1NldChteWxpc3QsIHRoaXMuX2NvbnRleHQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgb2xkUGFyZW50Q29udGV4dCA9IHRoaXMuX3BhcmVudENvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Q29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudEFub255bW91c05vZGVzID0gdGhpcy5fYW5vbnltb3VzTm9kZXM7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kUGFyZW50VmFyaWFibGVzID0gdGhpcy5fcGFyZW50VmFyaWFibGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudFZhcmlhYmxlcyA9IHRoaXMuX3ZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9hbm9ueW1vdXNOb2RlcyA9IG5ldyBweWpzbGliX0RpY3QoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHRoaXMuX3ZhcmlhYmxlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHZhciByZWFzb24yID0gdGhpcy5fcmVhc29uMjtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFzb24yID0gYmVjYXVzZVN1YmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgaWYgKHN1YmogPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViaiA9IHRoaXMuX3N0b3JlLmZvcm11bGEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IHN1Ymo7XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwibmVlZGVkICd9JywgZm91bmQgZW5kLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKSA9PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gdGhpcy5kaXJlY3RpdmVPclN0YXRlbWVudChzdHIsIGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiZXhwZWN0ZWQgc3RhdGVtZW50IG9yICd9J1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9hbm9ueW1vdXNOb2RlcyA9IHBhcmVudEFub255bW91c05vZGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlcyA9IHRoaXMuX3BhcmVudFZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnRWYXJpYWJsZXMgPSBncmFuZFBhcmVudFZhcmlhYmxlcztcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5fcGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFzb24yID0gcmVhc29uMjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnRDb250ZXh0ID0gb2xkUGFyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICByZXMucHVzaChzdWJqLmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PSBcIihcIikge1xuICAgICAgICAgICAgdmFyIHRoaW5nX3R5cGUgPSB0aGlzLl9zdG9yZS5saXN0O1xuICAgICAgICAgICAgdmFyIGNoMiA9IHB5anNsaWJfc2xpY2Uoc3RyLCBpICsgMSwgaSArIDIpO1xuICAgICAgICAgICAgaWYgKGNoMiA9PSBcIiRcIikge1xuICAgICAgICAgICAgICAgIHZhciB0aGluZ190eXBlID0gdGhpcy5fc3RvcmUubmV3U2V0O1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBqID0gaSArIDE7XG4gICAgICAgICAgICB2YXIgbXlsaXN0ID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBqKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJuZWVkZWQgJyknLCBmb3VuZCBlbmQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAxKSA9PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuaXRlbShzdHIsIGksIGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcImV4cGVjdGVkIGl0ZW0gaW4gbGlzdCBvciAnKSdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG15bGlzdC5wdXNoKGl0ZW1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2godGhpbmdfdHlwZShteWxpc3QsIHRoaXMuX2NvbnRleHQpKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJ0aGlzXCIsIHN0ciwgaSk7XG4gICAgICAgIGlmIChqID49IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiS2V5d29yZCAndGhpcycgd2FzIGFuY2llbnQgTjMuIE5vdyB1c2UgQGZvclNvbWUgYW5kIEBmb3JBbGwga2V5d29yZHMuXCIpO1xuICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IHRoaXMudG9rKFwidHJ1ZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXMucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9XG4gICAgICAgIHZhciBqID0gdGhpcy50b2soXCJmYWxzZVwiLCBzdHIsIGkpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXMucHVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3ViaiA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCByZXMpO1xuICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUucHJvcGVydHlfbGlzdCA9IGZ1bmN0aW9uIChzdHIsIGksIHN1YmopIHtcbiAgICAgICAgLypcbiAgICAgICAgUGFyc2UgcHJvcGVydHkgbGlzdFxuICAgICAgICBMZWF2ZXMgdGhlIHRlcm1pbmF0aW5nIHB1bmN0dWF0aW9uIGluIHRoZSBidWZmZXJcbiAgICAgICAgKi9cblxuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJFT0YgZm91bmQgd2hlbiBleHBlY3RlZCB2ZXJiIGluIHByb3BlcnR5IGxpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyKSA9PSBcIjotXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGogKyAyO1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMubm9kZShzdHIsIGksIHJlcywgc3Viaik7XG4gICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiYmFkIHt9IG9yICgpIG9yIFtdIG5vZGUgYWZ0ZXIgOi0gXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnZlcmIoc3RyLCBpLCB2KTtcbiAgICAgICAgICAgIGlmIChqIDw9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvYmpzID0gbmV3IHB5anNsaWJfTGlzdChbXSk7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMub2JqZWN0TGlzdChzdHIsIGosIG9ianMpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJvYmplY3RMaXN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX19vYmogPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihvYmpzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IF9fb2JqLm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdlswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpciA9IHBhaXJGdWRnZVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bSA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcIi0+XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZVN0YXRlbWVudChuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5fY29udGV4dCwgc3ltLCBzdWJqLCBvYmpdKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ha2VTdGF0ZW1lbnQobmV3IHB5anNsaWJfVHVwbGUoW3RoaXMuX2NvbnRleHQsIHN5bSwgb2JqLCBzdWJqXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiRU9GIGZvdW5kIGluIGxpc3Qgb2Ygb2JqZWN0c1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaSArIDEpICE9IFwiO1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLmNvbW1hU2VwYXJhdGVkTGlzdCA9IGZ1bmN0aW9uIChzdHIsIGosIHJlcywgb2ZVcmlzKSB7XG4gICAgICAgIC8qXG4gICAgICAgIHJldHVybiB2YWx1ZTogLTEgYmFkIHN5bnRheDsgPjEgbmV3IHBvc2l0aW9uIGluIHN0clxuICAgICAgICByZXMgaGFzIHRoaW5ncyBmb3VuZCBhcHBlbmRlZFxuICAgICAgICAgVXNlZCB0byB1c2UgYSBmaW5hbCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLCBlLmcuIHRoaXMuYmFyZVdvcmRcbiAgICAgICAgYnV0IHBhc3NpbmcgdGhlIGZ1bmN0aW9uIGRpZG4ndCB3b3JrIGZvIGpzIGNvbnZlcmlvbiBweWpzXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGopO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiRU9GIGZvdW5kIGV4cGVjdGluZyBjb21tYSBzZXAgbGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiLlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2ZVcmlzKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXMudXJpX3JlZjIoc3RyLCBpLCByZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmJhcmVXb3JkKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2ggPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgaWYgKGNoICE9IFwiLFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoICE9IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2ZVcmlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiArIDEsIHJlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5iYXJlV29yZChzdHIsIGogKyAxLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJiYWQgbGlzdCBjb250ZW50XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLm9iamVjdExpc3QgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLm9iamVjdChzdHIsIGksIHJlcyk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIkVPRiBmb3VuZCBhZnRlciBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSAhPSBcIixcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSB0aGlzLm9iamVjdChzdHIsIGogKyAxLCByZXMpO1xuICAgICAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUuY2hlY2tEb3QgPSBmdW5jdGlvbiAoc3RyLCBpKSB7XG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIi5cIikge1xuICAgICAgICAgICAgcmV0dXJuIGogKyAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpID09IFwifVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIl1cIikge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJleHBlY3RlZCAnLicgb3IgJ30nIG9yICddJyBhdCBlbmQgb2Ygc3RhdGVtZW50XCIpO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9O1xuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudXJpX3JlZjIgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgLypcbiAgICAgICAgR2VuZXJhdGUgdXJpIGZyb20gbjMgcmVwcmVzZW50YXRpb24uXG4gICAgICAgICBOb3RlIHRoYXQgdGhlIFJERiBjb252ZW50aW9uIG9mIGRpcmVjdGx5IGNvbmNhdGVuYXRpbmdcbiAgICAgICAgTlMgYW5kIGxvY2FsIG5hbWUgaXMgbm93IHVzZWQgdGhvdWdoIEkgcHJlZmVyIGluc2VydGluZyBhICcjJ1xuICAgICAgICB0byBtYWtlIHRoZSBuYW1lc2FwY2VzIGxvb2sgbW9yZSBsaWtlIHdoYXQgWE1MIGZvbGtzIGV4cGVjdC5cbiAgICAgICAgKi9cblxuICAgICAgICB2YXIgcW4gPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgdmFyIGogPSB0aGlzLnFuYW1lKHN0ciwgaSwgcW4pO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gcW5bMF07XG4gICAgICAgICAgICB2YXIgcGZ4ID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgdmFyIGxuID0gcGFpckZ1ZGdlWzFdO1xuICAgICAgICAgICAgaWYgKHBmeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0RnVkZ2UoMCwgXCJub3QgdXNlZD9cIik7XG4gICAgICAgICAgICAgICAgdmFyIG5zID0gdGhpcy5fYmFzZVVSSSArIEFEREVEX0hBU0g7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBucyA9IHRoaXMuX2JpbmRpbmdzW3BmeF07XG4gICAgICAgICAgICAgICAgaWYgKCFucykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGZ4ID09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLmFub255bW91c05vZGUobG4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiUHJlZml4IFwiICsgcGZ4ICsgXCIgbm90IGJvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3ltYiA9IHRoaXMuX3N0b3JlLnN5bShucyArIGxuKTtcbiAgICAgICAgICAgIGlmIChBcnJheUluZGV4T2YodGhpcy5fdmFyaWFibGVzLCBzeW1iKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fdmFyaWFibGVzW3N5bWJdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goc3ltYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaSA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiP1wiKSB7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLnZhcmlhYmxlKHN0ciwgaSwgdik7XG4gICAgICAgICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh2WzBdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHIuY2hhckF0KGkpID09IFwiPFwiKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgdmFyIHN0ID0gaTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGkpID09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1cmVmID0gcHlqc2xpYl9zbGljZShzdHIsIHN0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Jhc2VVUkkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmVmID0gdXJpcGF0aF9qb2luKHRoaXMuX2Jhc2VVUkksIHVyZWYpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RnVkZ2UodXJlZi5pbmRleE9mKFwiOlwiKSA+PSAwLCBcIldpdGggbm8gYmFzZSBVUkksIGNhbm5vdCBkZWFsIHdpdGggcmVsYXRpdmUgVVJJc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGkgLSAxLCBpKSA9PSBcIiNcIiAmJiAhKHB5anNsaWJfc2xpY2UodXJlZiwgLTEsIG51bGwpID09IFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVyZWYgPSB1cmVmICsgXCIjXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWIgPSB0aGlzLl9zdG9yZS5zeW0odXJlZik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheUluZGV4T2YodGhpcy5fdmFyaWFibGVzLCBzeW1iKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl92YXJpYWJsZXNbc3ltYl0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goc3ltYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaiwgXCJ1bnRlcm1pbmF0ZWQgVVJJIHJlZmVyZW5jZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmtleXdvcmRzU2V0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBweWpzbGliX0xpc3QoW10pO1xuICAgICAgICAgICAgdmFyIGogPSB0aGlzLmJhcmVXb3JkKHN0ciwgaSwgdik7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXlJbmRleE9mKHRoaXMua2V5d29yZHMsIHZbMF0pID49IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBpLCBcIktleXdvcmQgXFxcIlwiICsgdlswXSArIFwiXFxcIiBub3QgYWxsb3dlZCBoZXJlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLnN5bSh0aGlzLl9iaW5kaW5nc1tcIlwiXSArIHZbMF0pKTtcbiAgICAgICAgICAgIHJldHVybiBqO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnNraXBTcGFjZSA9IGZ1bmN0aW9uIChzdHIsIGkpIHtcbiAgICAgICAgLypcbiAgICAgICAgU2tpcCB3aGl0ZSBzcGFjZSwgbmV3bGluZXMgYW5kIGNvbW1lbnRzLlxuICAgICAgICByZXR1cm4gLTEgaWYgRU9GLCBlbHNlIHBvc2l0aW9uIG9mIGZpcnN0IG5vbi13cyBjaGFyYWN0ZXIqL1xuXG4gICAgICAgIHZhciB3aGl0ZXNwYWNlID0gJyBcXG5cXHJcXHRcXGZcXHgwQlxceEEwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDBCXFx1MjAyOFxcdTIwMjlcXHUzMDAwJztcbiAgICAgICAgZm9yICh2YXIgaiA9IGkgPyBpIDogMDsgaiA8IHN0ci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChqKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiICAgIHNraXBzcGFjZSBqPSBcIitqICsgXCIgaT0gXCIgKyBpICsgXCIgbj0gXCIgKyBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiIHNraXBzcGFjZSBjaCA8XCIgKyBjaCArIFwiPlwiKTtcbiAgICAgICAgICAgIGlmICh3aGl0ZXNwYWNlLmluZGV4T2YoY2gpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vbm90IHdzXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgc2tpcHNwYWNlIDIgY2ggPFwiICsgY2ggKyBcIj5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaikgPT09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDs7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgICAgc2tpcHNwYWNlMiBqPSBcIitqICsgXCIgaT0gXCIgKyBpICsgXCIgbj0gXCIgKyBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBFT0ZcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGopID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3QgaGFzaCAtIHNvbWV0aGluZyBpbnRlcmVzdGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiBza2lwc3BhY2UgMyBjaCA8XCIgKyBjaCArIFwiPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXaGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIgc2tpcHNwYWNlIDUgY2ggPFwiICsgY2ggKyBcIj5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaikgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMgPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gbmV4dCBqXG4gICAgICAgIHJldHVybiAtMTsgLy8gRU9GXG4gICAgfTtcblxuICAgIF9fU2lua1BhcnNlci5wcm90b3R5cGUudmFyaWFibGUgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgLypcbiAgICAgICAgP2FiYyAtPiB2YXJpYWJsZSg6YWJjKVxuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSkgIT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaiA9IGogKyAxO1xuICAgICAgICB2YXIgaSA9IGo7XG4gICAgICAgIGlmIChcIjAxMjM0NTY3ODktXCIuaW5kZXhPZihzdHIuY2hhckF0KGopKSA+PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgdGhpcy5saW5lcywgc3RyLCBqLCBcIlZhcmlibGUgbmFtZSBjYW4ndCBzdGFydCB3aXRoICdcIiArIHN0ci5jaGFyQXQoaikgKyBcInMnXCIpO1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSAmJiBfbm90TmFtZUNoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChpKSkgPCAwKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRDb250ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGosIFwiQ2FuJ3QgdXNlID94eHggc3ludGF4IGZvciB2YXJpYWJsZSBpbiBvdXRlcm1vc3QgbGV2ZWw6IFwiICsgcHlqc2xpYl9zbGljZShzdHIsIGogLSAxLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUudmFyaWFibGUocHlqc2xpYl9zbGljZShzdHIsIGosIGkpKSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5iYXJlV29yZCA9IGZ1bmN0aW9uIChzdHIsIGksIHJlcykge1xuICAgICAgICAvKlxuICAgICAgICBhYmMgLT4gOmFiY1xuICAgICAgICAqL1xuXG4gICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChqKTtcbiAgICAgICAgaWYgKFwiMDEyMzQ1Njc4OS1cIi5pbmRleE9mKGNoKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihjaCkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpID0gajtcbiAgICAgICAgd2hpbGUgKGkgPCBweWpzbGliX2xlbihzdHIpICYmIF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihzdHIuY2hhckF0KGkpKSA8IDApIHtcbiAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2gocHlqc2xpYl9zbGljZShzdHIsIGosIGkpKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnFuYW1lID0gZnVuY3Rpb24gKHN0ciwgaSwgcmVzKSB7XG4gICAgICAgIC8qXG4gICAgICAgICB4eXo6ZGVmIC0+ICgneHl6JywgJ2RlZicpXG4gICAgICAgIElmIG5vdCBpbiBrZXl3b3JkcyBhbmQga2V5d29yZHNTZXQ6IGRlZiAtPiAoJycsICdkZWYnKVxuICAgICAgICA6ZGVmIC0+ICgnJywgJ2RlZicpXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGkgPSB0aGlzLnNraXBTcGFjZShzdHIsIGkpO1xuICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChcIjAxMjM0NTY3ODktK1wiLmluZGV4T2YoYykgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbm90TmFtZUNoYXJzLmluZGV4T2YoYykgPCAwKSB7XG4gICAgICAgICAgICB2YXIgbG4gPSBjO1xuICAgICAgICAgICAgdmFyIGkgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgcHlqc2xpYl9sZW4oc3RyKSkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpZiAoX25vdE5hbWVDaGFycy5pbmRleE9mKGMpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG4gPSBsbiArIGM7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gaSArIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxuID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IHB5anNsaWJfbGVuKHN0cikgJiYgc3RyLmNoYXJBdChpKSA9PSBcIjpcIikge1xuICAgICAgICAgICAgdmFyIHBmeCA9IGxuO1xuICAgICAgICAgICAgdmFyIGkgPSBpICsgMTtcbiAgICAgICAgICAgIHZhciBsbiA9IFwiXCI7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IHB5anNsaWJfbGVuKHN0cikpIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKF9ub3ROYW1lQ2hhcnMuaW5kZXhPZihjKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxuID0gbG4gKyBjO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtwZngsIGxuXSkpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobG4gJiYgdGhpcy5rZXl3b3Jkc1NldCAmJiBBcnJheUluZGV4T2YodGhpcy5rZXl3b3JkcywgbG4pIDwgMCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBweWpzbGliX1R1cGxlKFtcIlwiLCBsbl0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5vYmplY3QgPSBmdW5jdGlvbiAoc3RyLCBpLCByZXMpIHtcbiAgICAgICAgdmFyIGogPSB0aGlzLnN1YmplY3Qoc3RyLCBpLCByZXMpO1xuICAgICAgICBpZiAoaiA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBqID0gdGhpcy5za2lwU3BhY2Uoc3RyLCBpKTtcbiAgICAgICAgICAgIGlmIChqIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaSkgPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAzKSA9PSBcIlxcXCJcXFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbSA9IFwiXFxcIlxcXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGltID0gXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpID0gaSArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdGhpcy5zdHJjb25zdChzdHIsIGksIGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IHBhaXJGdWRnZVswXTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHMpKTtcbiAgICAgICAgICAgICAgICBkaWFnX3Byb2dyZXNzKFwiTmV3IHN0cmluZyBjb25zdCBcIiwgcywgaik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5ub2RlT3JMaXRlcmFsID0gZnVuY3Rpb24gKHN0ciwgaSwgcmVzKSB7XG4gICAgICAgIHZhciBqID0gdGhpcy5ub2RlKHN0ciwgaSwgcmVzKTtcbiAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaiA9IHRoaXMuc2tpcFNwYWNlKHN0ciwgaSk7XG4gICAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoXCItKzA5ODc2NTQzMjFcIi5pbmRleE9mKGNoKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBkYXRldGltZV9zeW50YXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IGRhdGV0aW1lX3N5bnRheC5leGVjKHN0ci5zbGljZShpKSk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBqID0gICggaSArIGRhdGV0aW1lX3N5bnRheC5sYXN0SW5kZXggKSA7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBtWzBdO1xuICAgICAgICAgICAgICAgICAgICBqID0gaSArIHZhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5kZXhPZihcIlRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbCh2YWwsIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERBVEVUSU1FX0RBVEFUWVBFKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbCh2YWwsIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERBVEVfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBudW1iZXJfc3ludGF4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbnVtYmVyX3N5bnRheC5leGVjKHN0ci5zbGljZShpKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiQmFkIG51bWJlciBvciBkYXRlIHN5bnRheFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBqID0gaSArIG51bWJlcl9zeW50YXgubGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gcHlqc2xpYl9zbGljZShzdHIsIGksIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoXCJlXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMuX3N0b3JlLmxpdGVyYWwocGFyc2VGbG9hdCh2YWwpLCB1bmRlZmluZWQsIHRoaXMuX3N0b3JlLnN5bShGTE9BVF9EQVRBVFlQRSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaSwgaikuaW5kZXhPZihcIi5cIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy5fc3RvcmUubGl0ZXJhbChwYXJzZUZsb2F0KHZhbCksIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKERFQ0lNQUxfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHBhcnNlSW50KHZhbCksIHVuZGVmaW5lZCwgdGhpcy5fc3RvcmUuc3ltKElOVEVHRVJfREFUQVRZUEUpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBqOyAvLyBXaGVyZSB3ZSBoYXZlIGdvdCB1cCB0b1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaSkgPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGksIGkgKyAzKSA9PSBcIlxcXCJcXFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxpbSA9IFwiXFxcIlxcXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGltID0gXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpID0gaSArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgICAgICB2YXIgZHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBwYWlyRnVkZ2UgPSB0aGlzLnN0cmNvbnN0KHN0ciwgaSwgZGVsaW0pO1xuICAgICAgICAgICAgICAgIHZhciBqID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgICAgIHZhciBzID0gcGFpckZ1ZGdlWzFdO1xuICAgICAgICAgICAgICAgIHZhciBsYW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAxKSA9PSBcIkBcIikge1xuICAgICAgICAgICAgICAgICAgICBsYW5nY29kZS5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gbGFuZ2NvZGUuZXhlYyhzdHIuc2xpY2UoaiArIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcIkJhZCBsYW5ndWFnZSBjb2RlIHN5bnRheCBvbiBzdHJpbmcgbGl0ZXJhbCwgYWZ0ZXIgQFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGxhbmdjb2RlLmxhc3RJbmRleCArIGogKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gcHlqc2xpYl9zbGljZShzdHIsIGogKyAxLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyKSA9PSBcIl5eXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlczIgPSBuZXcgcHlqc2xpYl9MaXN0KFtdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSB0aGlzLnVyaV9yZWYyKHN0ciwgaiArIDIsIHJlczIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZHQgPSByZXMyWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLl9zdG9yZS5saXRlcmFsKHMsIGxhbmcsIGR0KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGo7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5zdHJjb25zdCA9IGZ1bmN0aW9uIChzdHIsIGksIGRlbGltKSB7XG4gICAgICAgIC8qXG4gICAgICAgIHBhcnNlIGFuIE4zIHN0cmluZyBjb25zdGFudCBkZWxpbWl0ZWQgYnkgZGVsaW0uXG4gICAgICAgIHJldHVybiBpbmRleCwgdmFsXG4gICAgICAgICovXG5cbiAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICB2YXIgdXN0ciA9IFwiXCI7XG4gICAgICAgIHZhciBzdGFydGxpbmUgPSB0aGlzLmxpbmVzO1xuICAgICAgICB3aGlsZSAoaiA8IHB5anNsaWJfbGVuKHN0cikpIHtcbiAgICAgICAgICAgIHZhciBpID0gaiArIHB5anNsaWJfbGVuKGRlbGltKTtcbiAgICAgICAgICAgIGlmIChweWpzbGliX3NsaWNlKHN0ciwgaiwgaSkgPT0gZGVsaW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHB5anNsaWJfVHVwbGUoW2ksIHVzdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KGopID09IFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgXCJcXFwiXCI7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludGVyZXN0aW5nLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICB2YXIgbSA9IGludGVyZXN0aW5nLmV4ZWMoc3RyLnNsaWNlKGopKTtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaiwgXCJDbG9zaW5nIHF1b3RlIG1pc3NpbmcgaW4gc3RyaW5nIGF0IF4gaW4gXCIgKyBweWpzbGliX3NsaWNlKHN0ciwgaiAtIDIwLCBqKSArIFwiXlwiICsgcHlqc2xpYl9zbGljZShzdHIsIGosIGogKyAyMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSBqICsgaW50ZXJlc3RpbmcubGFzdEluZGV4IC0gMTtcbiAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBpKTtcbiAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAoY2ggPT0gXCJcXFwiXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IGk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiXFxyXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaiA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIlxcblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGltID09IFwiXFxcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaSwgXCJuZXdsaW5lIGZvdW5kIGluIHN0cmluZyBsaXRlcmFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzID0gdGhpcy5saW5lcyArIDE7XG4gICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgY2g7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTGluZSA9IHRoaXMuc3RhcnRPZkxpbmU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydE9mTGluZSA9IGo7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwiXFxcXFwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgICAgIGlmICghY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcInVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCAoMilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrID0gc3RyaW5nX2ZpbmQoXCJhYmZydHZuXFxcXFxcXCJcIiwgY2gpO1xuICAgICAgICAgICAgICAgIGlmIChrID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVjaCA9IFwiXFxhXFxiXFxmXFxyXFx0XFx2XFxuXFxcXFxcXCJcIi5jaGFyQXQoayk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIHVjaDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IFwidVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWlyRnVkZ2UgPSB0aGlzLnVFc2NhcGUoc3RyLCBqICsgMSwgc3RhcnRsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBwYWlyRnVkZ2VbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IHBhaXJGdWRnZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVzdHIgPSB1c3RyICsgY2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBcIlVcIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFpckZ1ZGdlID0gdGhpcy5VRXNjYXBlKHN0ciwgaiArIDEsIHN0YXJ0bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBqID0gcGFpckZ1ZGdlWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBwYWlyRnVkZ2VbMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB1c3RyID0gdXN0ciArIGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCB0aGlzLmxpbmVzLCBzdHIsIGksIFwiYmFkIGVzY2FwZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHRoaXMubGluZXMsIHN0ciwgaSwgXCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWxcIik7XG4gICAgfTtcbiAgICBfX1NpbmtQYXJzZXIucHJvdG90eXBlLnVFc2NhcGUgPSBmdW5jdGlvbiAoc3RyLCBpLCBzdGFydGxpbmUpIHtcbiAgICAgICAgdmFyIGogPSBpO1xuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICB2YXIgdmFsdWUgPSAwO1xuICAgICAgICB3aGlsZSAoY291bnQgPCA0KSB7XG4gICAgICAgICAgICB2YXIgY2hGdWRnZSA9IHB5anNsaWJfc2xpY2Uoc3RyLCBqLCBqICsgMSk7XG4gICAgICAgICAgICB2YXIgY2ggPSBjaEZ1ZGdlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgaiA9IGogKyAxO1xuICAgICAgICAgICAgaWYgKGNoID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBCYWRTeW50YXgodGhpcy5fdGhpc0RvYywgc3RhcnRsaW5lLCBzdHIsIGksIFwidW50ZXJtaW5hdGVkIHN0cmluZyBsaXRlcmFsKDMpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGsgPSBzdHJpbmdfZmluZChcIjAxMjM0NTY3ODlhYmNkZWZcIiwgY2gpO1xuICAgICAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcImJhZCBzdHJpbmcgbGl0ZXJhbCBoZXggZXNjYXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWUgKiAxNiArIGs7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IHB5anNsaWJfVHVwbGUoW2osIHVjaF0pO1xuICAgIH07XG4gICAgX19TaW5rUGFyc2VyLnByb3RvdHlwZS5VRXNjYXBlID0gZnVuY3Rpb24gKHN0ciwgaSwgc3RhcnRsaW5lKSB7XG4gICAgICAgIHZhciBqID0gaTtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgdmFyIHZhbHVlID0gJ1xcXFxVJztcbiAgICAgICAgd2hpbGUgKGNvdW50IDwgOCkge1xuICAgICAgICAgICAgdmFyIGNoRnVkZ2UgPSBweWpzbGliX3NsaWNlKHN0ciwgaiwgaiArIDEpO1xuICAgICAgICAgICAgdmFyIGNoID0gY2hGdWRnZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgdmFyIGogPSBqICsgMTtcbiAgICAgICAgICAgIGlmIChjaCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgQmFkU3ludGF4KHRoaXMuX3RoaXNEb2MsIHN0YXJ0bGluZSwgc3RyLCBpLCBcInVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbCgzKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBrID0gc3RyaW5nX2ZpbmQoXCIwMTIzNDU2Nzg5YWJjZGVmXCIsIGNoKTtcbiAgICAgICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IEJhZFN5bnRheCh0aGlzLl90aGlzRG9jLCBzdGFydGxpbmUsIHN0ciwgaSwgXCJiYWQgc3RyaW5nIGxpdGVyYWwgaGV4IGVzY2FwZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlICsgY2g7XG4gICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVjaCA9IHN0cmluZ0Zyb21DaGFyQ29kZShcIjB4XCIgKyBweWpzbGliX3NsaWNlKHZhbHVlLCAyLCAxMCkgLSAwKTtcbiAgICAgICAgcmV0dXJuIG5ldyBweWpzbGliX1R1cGxlKFtqLCB1Y2hdKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIE9MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfX09MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBfX09MRF9CYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgdGhpcy5fc3RyID0gc3RyLmVuY29kZShcInV0Zi04XCIpO1xuICAgICAgICB0aGlzLl9zdHIgPSBzdHI7XG4gICAgICAgIHRoaXMuX2kgPSBpO1xuICAgICAgICB0aGlzLl93aHkgPSB3aHk7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgIH1cbiAgICBfX09MRF9CYWRTeW50YXgucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5fc3RyO1xuICAgICAgICB2YXIgaSA9IHRoaXMuX2k7XG4gICAgICAgIHZhciBzdCA9IDA7XG4gICAgICAgIGlmIChpID4gNjApIHtcbiAgICAgICAgICAgIHZhciBwcmUgPSBcIi4uLlwiO1xuICAgICAgICAgICAgdmFyIHN0ID0gaSAtIDYwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB5anNsaWJfbGVuKHN0cikgLSBpID4gNjApIHtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gXCIuLi5cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3N0ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJMaW5lICVpIG9mIDwlcz46IEJhZCBzeW50YXggKCVzKSBhdCBeIGluOlxcblxcXCIlcyVzXiVzJXNcXFwiXCIgJSBuZXcgcHlqc2xpYl9UdXBsZShbdGhpcy5saW5lcyArIDEsIHRoaXMuX3VyaSwgdGhpcy5fd2h5LCBwcmUsIHB5anNsaWJfc2xpY2Uoc3RyLCBzdCwgaSksIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgNjApLCBwb3N0XSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBCYWRTeW50YXgodXJpLCBsaW5lcywgc3RyLCBpLCB3aHkpIHtcbiAgICAgICAgcmV0dXJuIFwiTGluZSBcIiArIChsaW5lcyArIDEpICsgXCIgb2YgPFwiICsgdXJpICsgXCI+OiBCYWQgc3ludGF4OiBcIiArIHdoeSArIFwiXFxuYXQ6IFxcXCJcIiArIHB5anNsaWJfc2xpY2Uoc3RyLCBpLCBpICsgMzApICsgXCJcXFwiXCI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaXBDUihzdHIpIHtcbiAgICAgICAgdmFyIHJlcyA9IFwiXCI7XG5cbiAgICAgICAgdmFyIF9fY2ggPSBuZXcgcHlqc2xpYl9JdGVyYXRvcihzdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2ggPSBfX2NoLm5leHQoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjaCAhPSBcIlxcclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSByZXMgKyBjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlICE9IFN0b3BJdGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkdW1teVdyaXRlKHgpIHt9XG5cbiAgICByZXR1cm4gU2lua1BhcnNlcjtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOM1BhcnNlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENsYXNzT3JkZXIgPSByZXF1aXJlKCcuL2NsYXNzLW9yZGVyJyk7XG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG4vKipcbiAqIEBjbGFzcyBOYW1lZE5vZGVcbiAqIEBleHRlbmRzIE5vZGVcbiAqL1xuXG52YXIgTmFtZWROb2RlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhOYW1lZE5vZGUsIF9Ob2RlKTtcblxuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpcmkge1N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIE5hbWVkTm9kZShpcmkpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmFtZWROb2RlKTtcblxuICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChOYW1lZE5vZGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihOYW1lZE5vZGUpKS5jYWxsKHRoaXMpKTtcblxuICAgIF90aGlzLnRlcm1UeXBlID0gTmFtZWROb2RlLnRlcm1UeXBlO1xuICAgIGlmICghaXJpLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZWROb2RlIElSSSBcIicgKyBpcmkgKyAnXCIgbXVzdCBiZSBhYnNvbHV0ZS4nKTtcbiAgICB9XG4gICAgaWYgKGlyaS5pbmNsdWRlcygnICcpKSB7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdFcnJvcjogTmFtZWROb2RlIElSSSBcIicgKyBpcmkgKyAnXCIgbXVzdCBub3QgY29udGFpbiB1bmVuY29kZWQgc3BhY2VzLic7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIF90aGlzLnZhbHVlID0gaXJpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiAkcmRmIG5vZGUgZm9yIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeSwgZW5kaW5nIGluIHNsYXNoLlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhOYW1lZE5vZGUsIFt7XG4gICAga2V5OiAnZGlyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlyKCkge1xuICAgICAgdmFyIHN0ciA9IHRoaXMudXJpLnNwbGl0KCcjJylbMF07XG4gICAgICB2YXIgcCA9IHN0ci5zbGljZSgwLCAtMSkubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIHZhciBxID0gc3RyLmluZGV4T2YoJy8vJyk7XG4gICAgICBpZiAocSA+PSAwICYmIHAgPCBxICsgMiB8fCBwIDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gbmV3IE5hbWVkTm9kZShzdHIuc2xpY2UoMCwgcCArIDEpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBOTiBmb3IgdGhlIHdob2xlIHdlYiBzaXRlLCBlbmRpbmcgaW4gc2xhc2guXG4gICAgICogQ29udHJhc3Qgd2l0aCB0aGUgXCJvcmlnaW5cIiB3aGljaCBkb2VzIE5PVCBoYXZlIGEgdHJhaWxpbmcgc2xhc2hcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc2l0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpdGUoKSB7XG4gICAgICB2YXIgc3RyID0gdGhpcy51cmkuc3BsaXQoJyMnKVswXTtcbiAgICAgIHZhciBwID0gc3RyLmluZGV4T2YoJy8vJyk7XG4gICAgICBpZiAocCA8IDApIHRocm93IG5ldyBFcnJvcignVGhpcyBVUkkgZG9lcyBub3QgaGF2ZSBhIHdlYiBzaXRlIHBhcnQgKG9yaWdpbiknKTtcbiAgICAgIHZhciBxID0gc3RyLmluZGV4T2YoJy8nLCBwICsgMik7XG4gICAgICBpZiAocSA8IDApIHRocm93IG5ldyBFcnJvcignVGhpcyBVUkkgZG9lcyBub3QgaGF2ZSBhIHdlYiBzaXRlIHBhcnQuIChvcmlnaW4pJyk7XG4gICAgICByZXR1cm4gbmV3IE5hbWVkTm9kZShzdHIuc2xpY2UoMCwgcSArIDEpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkb2MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb2MoKSB7XG4gICAgICBpZiAodGhpcy51cmkuaW5kZXhPZignIycpIDwgMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHRoaXMudXJpLnNwbGl0KCcjJylbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJzwnICsgdGhpcy51cmkgKyAnPic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVnYWN5IGdldHRlciBhbmQgc2V0dGVyIGFsaWFzLCBub2RlLnVyaVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICd1cmknLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh1cmkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB1cmk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6ICdmcm9tVmFsdWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc05vZGUgPSB2YWx1ZSAmJiB2YWx1ZS50ZXJtVHlwZTtcbiAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBOYW1lZE5vZGUodmFsdWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOYW1lZE5vZGU7XG59KE5vZGUpO1xuXG5OYW1lZE5vZGUudGVybVR5cGUgPSAnTmFtZWROb2RlJztcbk5hbWVkTm9kZS5wcm90b3R5cGUuY2xhc3NPcmRlciA9IENsYXNzT3JkZXJbJ05hbWVkTm9kZSddO1xuTmFtZWROb2RlLnByb3RvdHlwZS5pc1ZhciA9IDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTmFtZWROb2RlOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuXG5mdW5jdGlvbiBOYW1lc3BhY2UobnN1cmkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChsbikge1xuICAgIHJldHVybiBuZXcgTmFtZWROb2RlKG5zdXJpICsgKGxuIHx8ICcnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTmFtZXNwYWNlOyIsIid1c2Ugc3RyaWN0Jztcbi8qKlxuICogVGhlIHN1cGVyY2xhc3Mgb2YgYWxsIFJERiBTdGF0ZW1lbnQgb2JqZWN0cywgdGhhdCBpc1xuICogTmFtZWROb2RlLCBMaXRlcmFsLCBCbGFua05vZGUsIGV0Yy5cbiAqIEBjbGFzcyBOb2RlXG4gKi9cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE5vZGUsIFt7XG4gICAga2V5OiAnc3Vic3RpdHV0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YnN0aXR1dGUoYmluZGluZ3MpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdAQEAgbm9kZSBzdWJzdGl0dXRlJyArIHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcGFyZVRlcm0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wYXJlVGVybShvdGhlcikge1xuICAgICAgaWYgKHRoaXMuY2xhc3NPcmRlciA8IG90aGVyLmNsYXNzT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2xhc3NPcmRlciA+IG90aGVyLmNsYXNzT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuICsxO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFsdWUgPCBvdGhlci52YWx1ZSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YWx1ZSA+IG90aGVyLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiArMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VxdWFscycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50ZXJtVHlwZSA9PT0gb3RoZXIudGVybVR5cGUgJiYgdGhpcy52YWx1ZSA9PT0gb3RoZXIudmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzaFN0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc2hTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0Nhbm9uaWNhbCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NhbWVUZXJtJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtZVRlcm0ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmVxdWFscyhvdGhlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTlQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OVCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZS50b1N0cmluZygpIGlzIGFic3RyYWN0IC0gc2VlIHRoZSBzdWJjbGFzc2VzIGluc3RlYWQnKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTm9kZTtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gUkRGIE5vZGUgZnJvbSBhIG5hdGl2ZSBqYXZhc2NyaXB0IHZhbHVlLlxuICogUkRGIE5vZGVzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQsIHVuZGVmaW5lZCByZXR1cm5lZCBhcyBpdHNlbGYuXG4gKiBAbWV0aG9kIGZyb21WYWx1ZVxuICogQHN0YXRpY1xuICogQHBhcmFtIHZhbHVlIHtOb2RlfERhdGV8U3RyaW5nfE51bWJlcnxCb29sZWFufFVuZGVmaW5lZH1cbiAqIEByZXR1cm4ge05vZGV8Q29sbGVjdGlvbn1cbiAqL1xuTm9kZS5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWUodmFsdWUpIHtcbiAgdmFyIENvbGxlY3Rpb24gPSByZXF1aXJlKCcuL2NvbGxlY3Rpb24nKTtcbiAgdmFyIExpdGVyYWwgPSByZXF1aXJlKCcuL2xpdGVyYWwnKTtcbiAgdmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNOb2RlID0gdmFsdWUgJiYgdmFsdWUudGVybVR5cGU7XG4gIGlmIChpc05vZGUpIHtcbiAgICAvLyBhIE5vZGUgc3ViY2xhc3Mgb3IgYSBDb2xsZWN0aW9uXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIExpdGVyYWwuZnJvbVZhbHVlKHZhbHVlKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIganNvbmxkID0gcmVxdWlyZSgnanNvbmxkJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIE4zID0gcmVxdWlyZSgnbjMnKTsgLy8gQEAgR29hbDogcmVtb3ZlIHRoaXMgZGVwZW5kZW5jeVxudmFyIE4zUGFyc2VyID0gcmVxdWlyZSgnLi9uM3BhcnNlcicpO1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIHBhcnNlUkRGYURPTSA9IHJlcXVpcmUoJy4vcmRmYXBhcnNlcicpLnBhcnNlUkRGYURPTTtcbnZhciBSREZQYXJzZXIgPSByZXF1aXJlKCcuL3JkZnhtbHBhcnNlcicpO1xudmFyIHNwYXJxbFVwZGF0ZVBhcnNlciA9IHJlcXVpcmUoJy4vcGF0Y2gtcGFyc2VyJyk7XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIGFuZCBwdXQgdGhlIHJlc3VsdCBpbnRvIHRoZSBncmFwaCBrYi5cbiAqIE5vcm1hbCBtZXRob2QgaXMgc3luYy5cbiAqIFVuZm9ydHVuYXRlbHkganNkb25sZCBpcyBjdXJyZW50bHkgd3JpdHRlbiB0byBuZWVkIHRvIGJlIGNhbGxlZCBhc3luYy5cbiAqIEhlbmNlIHRoZSBtZXNzIGJlbG93IHdpdGggZXhlY3V0ZUNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBwYXJzZShzdHIsIGtiLCBiYXNlLCBjb250ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZSB8fCAndGV4dC90dXJ0bGUnO1xuICB0cnkge1xuICAgIGlmIChjb250ZW50VHlwZSA9PT0gJ3RleHQvbjMnIHx8IGNvbnRlbnRUeXBlID09PSAndGV4dC90dXJ0bGUnKSB7XG4gICAgICB2YXIgcCA9IE4zUGFyc2VyKGtiLCBrYiwgYmFzZSwgYmFzZSwgbnVsbCwgbnVsbCwgJycsIG51bGwpO1xuICAgICAgcC5sb2FkQnVmKHN0cik7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vcmRmK3htbCcpIHtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgUkRGUGFyc2VyKGtiKTtcbiAgICAgIHBhcnNlci5wYXJzZShVdGlsLnBhcnNlWE1MKHN0ciksIGJhc2UsIGtiLnN5bShiYXNlKSk7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24veGh0bWwreG1sJykge1xuICAgICAgcGFyc2VSREZhRE9NKFV0aWwucGFyc2VYTUwoc3RyLCB7IGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24veGh0bWwreG1sJyB9KSwga2IsIGJhc2UpO1xuICAgICAgZXhlY3V0ZUNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PT0gJ3RleHQvaHRtbCcpIHtcbiAgICAgIHBhcnNlUkRGYURPTShVdGlsLnBhcnNlWE1MKHN0ciwgeyBjb250ZW50VHlwZTogJ3RleHQvaHRtbCcgfSksIGtiLCBiYXNlKTtcbiAgICAgIGV4ZWN1dGVDYWxsYmFjaygpO1xuICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9zcGFycWwtdXBkYXRlJykge1xuICAgICAgLy8gQEAgd2UgaGFuZGxlIGEgc3Vic2V0XG4gICAgICBzcGFycWxVcGRhdGVQYXJzZXIoc3RyLCBrYiwgYmFzZSk7XG4gICAgICBleGVjdXRlQ2FsbGJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vbGQranNvbicgfHwgY29udGVudFR5cGUgPT09ICdhcHBsaWNhdGlvbi9ucXVhZHMnIHx8IGNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vbi1xdWFkcycpIHtcbiAgICAgIHZhciBuM1BhcnNlciA9IE4zLlBhcnNlcigpO1xuICAgICAgdmFyIHRyaXBsZXMgPSBbXTtcbiAgICAgIGlmIChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nKSB7XG4gICAgICAgIHZhciBqc29uRG9jdW1lbnQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAganNvbkRvY3VtZW50ID0gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICB9IGNhdGNoIChwYXJzZUVycikge1xuICAgICAgICAgIGNhbGxiYWNrKHBhcnNlRXJyLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBqc29ubGQudG9SREYoanNvbkRvY3VtZW50LCB7IGZvcm1hdDogJ2FwcGxpY2F0aW9uL25xdWFkcycgfSwgbnF1YWRDYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBucXVhZENhbGxiYWNrKG51bGwsIHN0cik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvbid0IGtub3cgaG93IHRvIHBhcnNlIFwiICsgY29udGVudFR5cGUgKyAnIHlldCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGV4ZWN1dGVFcnJvckNhbGxiYWNrKGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhlY3V0ZUNhbGxiYWNrKCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sobnVsbCwga2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXhlY3V0ZUVycm9yQ2FsbGJhY2soZSkge1xuICAgIGlmIChjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL2xkK2pzb24nIHx8IGNvbnRlbnRUeXBlICE9PSAnYXBwbGljYXRpb24vbnF1YWRzJyB8fCBjb250ZW50VHlwZSAhPT0gJ2FwcGxpY2F0aW9uL24tcXVhZHMnKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soZSwga2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciB0cnlpbmcgdG8gcGFyc2UgPCcgKyBiYXNlICsgJz4gYXMgJyArIGNvbnRlbnRUeXBlICsgJzpcXG4nICsgZSArICc6XFxuJyArIGUuc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKlxuICAgIGZ1bmN0aW9uIHNldEpzb25MZEJhc2UgKGRvYywgYmFzZSkge1xuICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKCEoJ0Bjb250ZXh0JyBpbiBkb2MpKSB7XG4gICAgICAgIGRvY1snQGNvbnRleHQnXSA9IHt9XG4gICAgICB9XG4gICAgICBkb2NbJ0Bjb250ZXh0J11bJ0BiYXNlJ10gPSBiYXNlXG4gICAgfVxuICAqL1xuICBmdW5jdGlvbiBucXVhZENhbGxiYWNrKGVyciwgbnF1YWRzKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBrYik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBuM1BhcnNlci5wYXJzZShucXVhZHMsIHRyaXBsZUNhbGxiYWNrKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwga2IpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaXBsZUNhbGxiYWNrKGVyciwgdHJpcGxlLCBwcmVmaXhlcykge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVyciwga2IpO1xuICAgIH1cbiAgICBpZiAodHJpcGxlKSB7XG4gICAgICB0cmlwbGVzLnB1c2godHJpcGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlwbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZFRyaXBsZShrYiwgdHJpcGxlc1tpXSk7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhudWxsLCBrYik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkVHJpcGxlKGtiLCB0cmlwbGUpIHtcbiAgICB2YXIgc3ViamVjdCA9IGNyZWF0ZVRlcm0odHJpcGxlLnN1YmplY3QpO1xuICAgIHZhciBwcmVkaWNhdGUgPSBjcmVhdGVUZXJtKHRyaXBsZS5wcmVkaWNhdGUpO1xuICAgIHZhciBvYmplY3QgPSBjcmVhdGVUZXJtKHRyaXBsZS5vYmplY3QpO1xuICAgIHZhciB3aHkgPSBudWxsO1xuICAgIGlmICh0cmlwbGUuZ3JhcGgpIHtcbiAgICAgIHdoeSA9IGNyZWF0ZVRlcm0odHJpcGxlLmdyYXBoKTtcbiAgICB9XG4gICAga2IuYWRkKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCB3aHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVGVybSh0ZXJtU3RyaW5nKSB7XG4gICAgdmFyIHZhbHVlO1xuICAgIGlmIChOMy5VdGlsLmlzTGl0ZXJhbCh0ZXJtU3RyaW5nKSkge1xuICAgICAgdmFsdWUgPSBOMy5VdGlsLmdldExpdGVyYWxWYWx1ZSh0ZXJtU3RyaW5nKTtcbiAgICAgIHZhciBsYW5ndWFnZSA9IE4zLlV0aWwuZ2V0TGl0ZXJhbExhbmd1YWdlKHRlcm1TdHJpbmcpO1xuICAgICAgdmFyIGRhdGF0eXBlID0gbmV3IE5hbWVkTm9kZShOMy5VdGlsLmdldExpdGVyYWxUeXBlKHRlcm1TdHJpbmcpKTtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh2YWx1ZSwgbGFuZ3VhZ2UsIGRhdGF0eXBlKTtcbiAgICB9IGVsc2UgaWYgKE4zLlV0aWwuaXNJUkkodGVybVN0cmluZykpIHtcbiAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlKHRlcm1TdHJpbmcpO1xuICAgIH0gZWxzZSBpZiAoTjMuVXRpbC5pc0JsYW5rKHRlcm1TdHJpbmcpKSB7XG4gICAgICB2YWx1ZSA9IHRlcm1TdHJpbmcuc3Vic3RyaW5nKDIsIHRlcm1TdHJpbmcubGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgQmxhbmtOb2RlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBQYXJzZSBhIHNpbXBsZSBTUEFSTC1VcGRhdGUgc3Vic2V0IHN5bnRheCBmb3IgcGF0Y2hlcy5cbi8vXG4vLyAgVGhpcyBwYXJzZXNcbi8vICAgV0hFUkUge3h4eH0gREVMRVRFIHt5eXl9IElOU0VSVCBEQVRBIHt6enp9XG4vLyAobm90IG5lY2Vzc2FyaWx5IGluIHRoYXQgb3JkZXIpXG4vLyBhcyB0aG91Z2ggaXQgd2VyZSB0aGUgbjNcbi8vICAgPCNxdWVyeT4gcGF0Y2g6d2hlcmUge3h4eH07IHBhdGNoOmRlbGV0ZSB7eXl5fTsgcGF0Y2g6aW5zZXJ0IHt6enp9LlxubW9kdWxlLmV4cG9ydHMgPSBzcGFycWxVcGRhdGVQYXJzZXI7XG5cbnZhciBOM1BhcnNlciA9IHJlcXVpcmUoJy4vbjNwYXJzZXInKTtcbnZhciBOYW1lc3BhY2UgPSByZXF1aXJlKCcuL25hbWVzcGFjZScpO1xuXG5mdW5jdGlvbiBzcGFycWxVcGRhdGVQYXJzZXIoc3RyLCBrYiwgYmFzZSkge1xuICB2YXIgaSwgaiwgaztcbiAgdmFyIGtleXdvcmRzID0gWydJTlNFUlQnLCAnREVMRVRFJywgJ1dIRVJFJ107XG4gIHZhciBTUU5TID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy9ucy9waW0vcGF0Y2gjJyk7XG4gIHZhciBwID0gTjNQYXJzZXIoa2IsIGtiLCBiYXNlLCBiYXNlLCBudWxsLCBudWxsLCAnJywgbnVsbCk7XG4gIHZhciBjbGF1c2VzID0ge307XG5cbiAgdmFyIGJhZFN5bnRheCA9IGZ1bmN0aW9uIGJhZFN5bnRheCh1cmksIGxpbmVzLCBzdHIsIGksIHdoeSkge1xuICAgIHJldHVybiAnTGluZSAnICsgKGxpbmVzICsgMSkgKyAnIG9mIDwnICsgdXJpICsgJz46IEJhZCBzeW50YXg6XFxuICAgJyArIHdoeSArICdcXG4gICBhdDogXCInICsgc3RyLnNsaWNlKGksIGkgKyAzMCkgKyAnXCInO1xuICB9O1xuXG4gIC8vIHZhciBjaGVjayA9IGZ1bmN0aW9uIChuZXh0LCBsYXN0LCBtZXNzYWdlKSB7XG4gIC8vICAgaWYgKG5leHQgPCAwKSB7XG4gIC8vICAgICB0aHJvdyBiYWRTeW50YXgocC5fdGhpc0RvYywgcC5saW5lcywgc3RyLCBqLCBsYXN0LCBtZXNzYWdlKVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gbmV4dFxuICAvLyB9XG4gIGkgPSAwO1xuICB2YXIgcXVlcnkgPSBrYi5zeW0oYmFzZSArICcjcXVlcnknKTsgLy8gSW52ZW50IGEgVVJJIGZvciB0aGUgcXVlcnlcbiAgY2xhdXNlc1sncXVlcnknXSA9IHF1ZXJ5OyAvLyBBIHdheSBvZiBhY2Nlc3NpbmcgaXQgaW4gaXRzIE4zIG1vZGVsLlxuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJBIE5vdyBhdCBpID0gXCIgKyBpKVxuICAgIGogPSBwLnNraXBTcGFjZShzdHIsIGkpO1xuICAgIGlmIChqIDwgMCkge1xuICAgICAgcmV0dXJuIGNsYXVzZXM7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQiBBZnRlciBzcGFjZSBhdCBqPSBcIiArIGopXG4gICAgaWYgKHN0cltqXSA9PT0gJzsnKSB7XG4gICAgICBpID0gcC5za2lwU3BhY2Uoc3RyLCBqICsgMSk7XG4gICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGNsYXVzZXM7IC8vIEFsbG93IGVuZCBpbiBhXG4gICAgICB9XG4gICAgICBqID0gaTtcbiAgICB9XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChrID0gMDsgayA8IGtleXdvcmRzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5d29yZHNba107XG4gICAgICBpZiAoc3RyLnNsaWNlKGosIGogKyBrZXkubGVuZ3RoKSA9PT0ga2V5KSB7XG4gICAgICAgIGkgPSBwLnNraXBTcGFjZShzdHIsIGogKyBrZXkubGVuZ3RoKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgYmFkU3ludGF4KHAuX3RoaXNEb2MsIHAubGluZXMsIHN0ciwgaiArIGtleS5sZW5ndGgsICdmb3VuZCBFT0YsIG5lZWRlZCB7Li4ufSBhZnRlciAnICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGtleSA9PT0gJ0lOU0VSVCcgfHwga2V5ID09PSAnREVMRVRFJykgJiYgc3RyLnNsaWNlKGksIGkgKyA0KSA9PT0gJ0RBVEEnKSB7XG4gICAgICAgICAgLy8gU29tZSB3YW50ZWQgJ0RBVEEnLiBXaGF0ZXZlclxuICAgICAgICAgIGogPSBwLnNraXBTcGFjZShzdHIsIGkgKyA0KTtcbiAgICAgICAgICBpZiAoaiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IGJhZFN5bnRheChwLl90aGlzRG9jLCBwLmxpbmVzLCBzdHIsIGkgKyA0LCAnbmVlZGVkIHsuLi59IGFmdGVyIElOU0VSVCBEQVRBICcgKyBrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpID0gajtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzMiA9IFtdO1xuICAgICAgICBqID0gcC5ub2RlKHN0ciwgaSwgcmVzMik7IC8vIFBhcnNlIGFsbCB0aGUgY29tcGxleGl0eSBvZiB0aGUgY2xhdXNlXG5cbiAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgdGhyb3cgYmFkU3ludGF4KHAuX3RoaXNEb2MsIHAubGluZXMsIHN0ciwgaSwgJ2JhZCBzeW50YXggb3IgRU9GIGluIHsuLi59IGFmdGVyICcgKyBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNsYXVzZXNba2V5LnRvTG93ZXJDYXNlKCldID0gcmVzMlswXTtcbiAgICAgICAga2IuYWRkKHF1ZXJ5LCBTUU5TKGtleS50b0xvd2VyQ2FzZSgpKSwgcmVzMlswXSk7IC8vICwga2Iuc3ltKGJhc2UpXG4gICAgICAgIC8vIGtleSBpcyB0aGUga2V5d29yZCBhbmQgcmVzMiBoYXMgdGhlIGNvbnRlbnRzXG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgaSA9IGo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZm91bmQgJiYgc3RyLnNsaWNlKGosIGogKyA3KSA9PT0gJ0BwcmVmaXgnKSB7XG4gICAgICBpID0gcC5kaXJlY3RpdmUoc3RyLCBqKTtcbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICB0aHJvdyBiYWRTeW50YXgocC5fdGhpc0RvYywgcC5saW5lcywgc3RyLCBpLCAnYmFkIHN5bnRheCBvciBFT0YgYWZ0ZXIgQHByZWZpeCAnKTtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiUCBiZWZvcmUgZG90IGk9IFwiICsgaSlcbiAgICAgIGkgPSBwLmNoZWNrRG90KHN0ciwgaSk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlEgYWZ0ZXIgZG90IGk9IFwiICsgaSlcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJCYWQgc3ludGF4IFwiICsgailcbiAgICAgIHRocm93IGJhZFN5bnRheChwLl90aGlzRG9jLCBwLmxpbmVzLCBzdHIsIGosIFwiVW5rbm93biBzeW50YXggYXQgc3RhcnQgb2Ygc3RhdGVtZW10OiAnXCIgKyBzdHIuc2xpY2Uoaikuc2xpY2UoMCwgMjApICsgXCInXCIpO1xuICAgIH1cbiAgfSAvLyB3aGlsZVxuICAvLyByZXR1cm4gY2xhdXNlc1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7XG5cbmZ1bmN0aW9uIHF1ZXJ5VG9TUEFSUUwocXVlcnkpIHtcbiAgdmFyIGluZGVudCA9IDA7XG4gIGZ1bmN0aW9uIGdldFNlbGVjdChxdWVyeSkge1xuICAgIHZhciBzdHIgPSBhZGRJbmRlbnQoKSArICdTRUxFQ1QgJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXJ5LnZhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0ciArPSBxdWVyeS52YXJzW2ldICsgJyAnO1xuICAgIH1cbiAgICBzdHIgKz0gJ1xcbic7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFBhdHRlcm4ocGF0KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHZhciBzdCA9IHBhdC5zdGF0ZW1lbnRzO1xuICAgIGZvciAodmFyIHggaW4gc3QpIHtcbiAgICAgIGxvZy5kZWJ1ZygnRm91bmQgc3RhdGVtZW50OiAnICsgc3QpO1xuICAgICAgc3RyICs9IGFkZEluZGVudCgpICsgc3RbeF0gKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENvbnN0cmFpbnRzKHBhdCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciB2IGluIHBhdC5jb25zdHJhaW50cykge1xuICAgICAgdmFyIGZvbyA9IHBhdC5jb25zdHJhaW50c1t2XTtcbiAgICAgIHN0ciArPSBhZGRJbmRlbnQoKSArICdGSUxURVIgKCAnICsgZm9vLmRlc2NyaWJlKHYpICsgJyApICcgKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE9wdGlvbmFscyhwYXQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBwYXQub3B0aW9uYWwubGVuZ3RoOyB4KyspIHtcbiAgICAgIC8vIGFsZXJ0KHBhdC5vcHRpb25hbC50ZXJtVHlwZSlcbiAgICAgIGxvZy5kZWJ1ZygnRm91bmQgb3B0aW9uYWwgcXVlcnknKTtcbiAgICAgIHN0ciArPSBhZGRJbmRlbnQoKSArICdPUFRJT05BTCB7ICcgKyAnXFxuJztcbiAgICAgIGluZGVudCsrO1xuICAgICAgc3RyICs9IGdldFBhdHRlcm4ocGF0Lm9wdGlvbmFsW3hdKTtcbiAgICAgIHN0ciArPSBnZXRDb25zdHJhaW50cyhwYXQub3B0aW9uYWxbeF0pO1xuICAgICAgc3RyICs9IGdldE9wdGlvbmFscyhwYXQub3B0aW9uYWxbeF0pO1xuICAgICAgaW5kZW50LS07XG4gICAgICBzdHIgKz0gYWRkSW5kZW50KCkgKyAnfScgKyAnXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdoZXJlKHBhdCkge1xuICAgIHZhciBzdHIgPSBhZGRJbmRlbnQoKSArICdXSEVSRSBcXG4nICsgJ3sgXFxuJztcbiAgICBpbmRlbnQrKztcbiAgICBzdHIgKz0gZ2V0UGF0dGVybihwYXQpO1xuICAgIHN0ciArPSBnZXRDb25zdHJhaW50cyhwYXQpO1xuICAgIHN0ciArPSBnZXRPcHRpb25hbHMocGF0KTtcbiAgICBpbmRlbnQtLTtcbiAgICBzdHIgKz0gJ30nO1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRJbmRlbnQoKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHtcbiAgICAgIHN0ciArPSAnICAgICc7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTUEFSUUwocXVlcnkpIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0KHF1ZXJ5KSArIGdldFdoZXJlKHF1ZXJ5LnBhdCk7XG4gIH1cblxuICByZXR1cm4gZ2V0U1BBUlFMKHF1ZXJ5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBxdWVyeVRvU1BBUlFMOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9pbmRleGVkRm9ybXVsYSA9IHJlcXVpcmUoJy4vaW5kZXhlZC1mb3JtdWxhJyk7XG5cbnZhciBfaW5kZXhlZEZvcm11bGEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5kZXhlZEZvcm11bGEpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfSAvLyBNYXRjaGluZyBhIGZvcm11bGEgYWdhaW5zdCBhbm90aGVyIGZvcm11bGFcbi8vIEFzc3luYyBhcyB3ZWxsIGFzIFN5bmNocm9ub3VzbHlcbi8vXG4vLyBXM0Mgb3BlbiBzb3VyY2UgbGljZW5jZSAyMDA1LlxuLy9cbi8vIFRoaXMgYnVpbGRzIG9uIHRlcm0uanMsIG1hdGNoLmpzIChhbmQgaWRlbnRpdHkuanM/KVxuLy8gdG8gYWxsb3cgYSBxdWVyeSBvZiBhIGZvcm11bGEuXG4vL1xuLy8gSGVyZSB3ZSBpbnRyb2R1Y2UgZm9yIHRoZSBmaXJzdCB0aW1lIGEgc3ViY2xhc3Mgb2YgdGVybTogdmFyaWFibGUuXG4vL1xuLy8gU1ZOIElEOiAkSWQ6IHF1ZXJ5LmpzIDI1MTE2IDIwMDgtMTEtMTUgMTY6MTM6NDhaIHRpbWJsICRcblxuLy8gIFZhcmlhYmxlXG4vL1xuLy8gQ29tcGFyZSB3aXRoIEJsYW5rTm9kZS4gIFRoZXkgYXJlIHNpbWlsYXIsIGJ1dCBhIHZhcmlhYmxlXG4vLyBzdGFuZHMgZm9yIHNvbWV0aGluZyB3aG9zZSB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC5cbi8vIEFsc28sIHVzZXJzIG5hbWUgdmFyaWFibGVzIGFuZCB3YW50IHRoZSBzYW1lIG5hbWUgYmFjayB3aGVuIHN0dWZmIGlzIHByaW50ZWRcbi8qIGpzbDpvcHRpb24gZXhwbGljaXQqLyAvLyBUdXJuIG9uIEphdmFTY3JpcHRMaW50IHZhcmlhYmxlIGRlY2xhcmF0aW9uIGNoZWNraW5nXG5cbnZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpO1xudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG5cbi8qKlxuICogUXVlcnkgY2xhc3MsIGZvciB0cmFja2luZyBxdWVyaWVzIHRoZSB1c2VyIGhhcyBpbiB0aGUgVUkuXG4gKi9cblxudmFyIFF1ZXJ5ID0gZnVuY3Rpb24gUXVlcnkobmFtZSwgaWQpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFF1ZXJ5KTtcblxuICB0aGlzLnBhdCA9IG5ldyBfaW5kZXhlZEZvcm11bGEyLmRlZmF1bHQoKTsgLy8gVGhlIHBhdHRlcm4gdG8gc2VhcmNoIGZvclxuICB0aGlzLnZhcnMgPSBbXTsgLy8gVXNlZCBieSBVSSBjb2RlIGJ1dCBub3QgaW4gcXVlcnkuanNcbiAgLy8gICAgdGhpcy5vcmRlckJ5ID0gW10gLy8gTm90IHVzZWQgeWV0XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuaWQgPSBpZDtcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIG1hdGNoIGEgcGF0dGVybiB0byB0aGUgY3VycmVudCBrYlxuICpcbiAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBtYXRjaCBpcyBmb3VuZFxuICogV2hlbiBmZXRjaGVyIGlzIHN1cHBsaWVkIHRoaXMgd2lsbCBiZSBjYWxsZWQgdG8gc2F0aXNmeSBhbnkgcmVzb3VyY2UgcmVxdWVzdHNcbiAqIGN1cnJlbnRseSBub3QgaW4gdGhlIGtiLiBUaGUgZmV0Y2hlciBmdW5jdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkIG1hbnVhbHkgYW5kXG4gKiBzaG91bGQgY2FsbCAkcmRmLlV0aWwuQUpBUl9oYW5kbGVOZXdUZXJtIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS5cbiAqXG4gKiBAcGFyYW1cdG15UXVlcnksXHRhIGtub3dsZWRnZWJhc2UgY29udGFpbmluZyBhIHBhdHRlcm4gdG8gdXNlIGFzIHF1ZXJ5XG4gKiBAcGFyYW1cdGNhbGxiYWNrLCBcdHdoZW5ldmVyIHRoZSBwYXR0ZXJuIGluIG15UXVlcnkgaXMgbWV0IHRoaXMgaXMgY2FsbGVkIHdpdGhcbiAqIFx0XHRcdFx0XHRcdHRoZSBuZXcgYmluZGluZ3MgYXMgcGFyYW1ldGVyXG4gKiBAcGFyYW1cdGZldGNoZXIsXHR3aGVuZXZlciBhIHJlc291cmNlIG5lZWRzIHRvIGJlIGxvYWRlZCB0aGlzIGdldHMgY2FsbGVkICBJR05PUkVEIE9CU09MRVRFXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZmV0ZWNoZXIgaXMgdXNlZCBhcyBhIEZldGNoZXIgaW5zdGFuY2UgdG8gZG8gdGhpcy5cbiAqIEBwYXJhbSAgICAgICBvbkRvbmUgICAgICAgICAgY2FsbGJhY2sgd2hlblxuICovXG5cblxuZnVuY3Rpb24gaW5kZXhlZEZvcm11bGFRdWVyeShteVF1ZXJ5LCBjYWxsYmFjaywgZmV0Y2hlciwgb25Eb25lKSB7XG4gIC8vIHZhciBrYiA9IHRoaXNcbiAgLy8gLy8vLy8vLy8vLy8gRGVidWcgc3RyaW5nc1xuICB2YXIgYmluZGluZ0RlYnVnID0gZnVuY3Rpb24gYmluZGluZ0RlYnVnKGIpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHY7XG4gICAgZm9yICh2IGluIGIpIHtcbiAgICAgIGlmIChiLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgIHN0ciArPSAnICAgICcgKyB2ICsgJyAtPiAnICsgYlt2XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxuICB2YXIgYmluZGluZ3NEZWJ1ZyA9IGZ1bmN0aW9uIGJpbmRpbmdzRGVidWcobmJzKSB7XG4gICAgdmFyIHN0ciA9ICdCaW5kaW5nczogJztcbiAgICB2YXIgaTtcbiAgICB2YXIgbiA9IG5icy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgc3RyICs9IGJpbmRpbmdEZWJ1ZyhuYnNbaV1bMF0pICsgJztcXG5cXHQnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9OyAvLyBiaW5kaW5nc0RlYnVnXG5cbiAgLy8gVW5pZmljYXRpb246IHNlZSBhbHNvXG4gIC8vICBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvdGVybS5weVxuICAvLyBmb3Igc2ltaWxhciB0aGluZ3MgaW4gcHl0aG9uXG4gIC8vXG4gIC8vIFVuaWZpY2F0aW9uIGZpbmRzIGFsbCBiaW5kaW5ncyBzdWNoIHRoYXQgd2hlbiB0aGUgYmluZGluZyBpcyBhcHBsaWVkXG4gIC8vIHRvIG9uZSB0ZXJtIGl0IGlzIGVxdWFsIHRvIHRoZSBvdGhlci5cbiAgLy8gUmV0dXJuczogYSBsaXN0IG9mIGJpbmRpbmdzLCB3aGVyZSBhIGJpbmRpbmcgaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXlcbiAgLy8gIG1hcHBpbmcgdmFyaXVhYmxlIHRvIHZhbHVlLlxuXG4gIHZhciB1bmlmeVRlcm0gPSBmdW5jdGlvbiB1bmlmeVRlcm0oc2VsZiwgb3RoZXIsIGJpbmRpbmdzLCBmb3JtdWxhKSB7XG4gICAgdmFyIGFjdHVhbCA9IGJpbmRpbmdzW3NlbGZdO1xuICAgIGlmIChhY3R1YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTm90IG1hcHBlZFxuICAgICAgaWYgKHNlbGYuaXNWYXIpIHtcbiAgICAgICAgLyogaWYgKHNlbGYuaXNCbGFuaykgIC8vYm5vZGVzIGFyZSBleGlzdGVudGlhbCB2YXJpYWJsZXNcbiAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnRvU3RyaW5nKCkgPT0gb3RoZXIudG9TdHJpbmcoKSkgcmV0dXJuIFtbIFtdLCBudWxsXV1cbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBbXVxuICAgICAgICB9Ki9cbiAgICAgICAgdmFyIGIgPSBbXTtcbiAgICAgICAgYltzZWxmXSA9IG90aGVyO1xuICAgICAgICByZXR1cm4gW1tiLCBudWxsXV07IC8vIE1hdGNoXG4gICAgICB9XG4gICAgICBhY3R1YWwgPSBzZWxmO1xuICAgIH1cbiAgICBpZiAoIWFjdHVhbC5jb21wbGV4VHlwZSkge1xuICAgICAgaWYgKGZvcm11bGEucmVkaXJlY3Rpb25zW2FjdHVhbF0pIHtcbiAgICAgICAgYWN0dWFsID0gZm9ybXVsYS5yZWRpcmVjdGlvbnNbYWN0dWFsXTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtdWxhLnJlZGlyZWN0aW9uc1tvdGhlcl0pIHtcbiAgICAgICAgb3RoZXIgPSBmb3JtdWxhLnJlZGlyZWN0aW9uc1tvdGhlcl07XG4gICAgICB9XG4gICAgICBpZiAoYWN0dWFsLnNhbWVUZXJtKG90aGVyKSkge1xuICAgICAgICByZXR1cm4gW1tbXSwgbnVsbF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoc2VsZiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5pZnlDb250ZW50cyhzZWxmLCBvdGhlciwgYmluZGluZ3MpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5LmpzOiBvb3BzIC0gY29kZSBub3Qgd3JpdHRlbiB5ZXQnKTtcbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkOyAgLy8gZm9yIGxpbnQgLSBubyBqc2xpbnQgb2JqZWN0cyB0byB1bnJlYWNoYWJsZXNcbiAgICAvLyAgICByZXR1cm4gYWN0dWFsLnVuaWZ5Q29udGVudHMob3RoZXIsIGJpbmRpbmdzKVxuICB9OyAvLyB1bmlmeVRlcm1cblxuICB2YXIgdW5pZnlDb250ZW50cyA9IGZ1bmN0aW9uIHVuaWZ5Q29udGVudHMoc2VsZiwgb3RoZXIsIGJpbmRpbmdzLCBmb3JtdWxhKSB7XG4gICAgdmFyIG5iczI7XG4gICAgaWYgKHNlbGYubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gbm8gd2F5XG4gICAgfVxuICAgIGlmICghc2VsZi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbW1tdLCBudWxsXV07IC8vIFN1Y2Nlc3NcbiAgICB9XG4gICAgdmFyIG5icyA9IHVuaWZ5VGVybShzZWxmWzBdLCBvdGhlclswXSwgYmluZGluZ3MsIGZvcm11bGEpO1xuICAgIGlmIChuYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmJzO1xuICAgIH1cbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGk7XG4gICAgdmFyIG4gPSBuYnMubGVuZ3RoO1xuICAgIHZhciBuYjtcbiAgICB2YXIgajtcbiAgICB2YXIgbTtcbiAgICB2YXIgdjtcbiAgICB2YXIgbmIyO1xuICAgIHZhciBiaW5kaW5nczI7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgLy8gZm9yIGVhY2ggcG9zc2liaWxpdHkgZnJvbSB0aGUgZmlyc3QgdGVybVxuICAgICAgbmIgPSBuYnNbaV1bMF07IC8vIG5ldyBiaW5kaW5nc1xuICAgICAgYmluZGluZ3MyID0gW107XG4gICAgICBmb3IgKHYgaW4gbmIpIHtcbiAgICAgICAgaWYgKG5iLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgYmluZGluZ3MyW3ZdID0gbmJbdl07IC8vIGNvcHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yICh2IGluIGJpbmRpbmdzKSB7XG4gICAgICAgIGlmIChiaW5kaW5ncy5oYXNPd25Qcm9wZXJ0eSh2KSkge1xuICAgICAgICAgIGJpbmRpbmdzMlt2XSA9IGJpbmRpbmdzW3ZdOyAvLyBjb3B5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5iczIgPSB1bmlmeUNvbnRlbnRzKHNlbGYuc2xpY2UoMSksIG90aGVyLnNsaWNlKDEpLCBiaW5kaW5nczIsIGZvcm11bGEpO1xuICAgICAgbSA9IG5iczIubGVuZ3RoO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07IGorKykge1xuICAgICAgICBuYjIgPSBuYnMyW2pdWzBdOyAvLyBAQEBAIG5vIGlkZWEgd2hldGhlciB0aGlzIGlzIHVzZWQgb3IgcmlnaHRcbiAgICAgICAgZm9yICh2IGluIG5iKSB7XG4gICAgICAgICAgaWYgKG5iLmhhc093blByb3BlcnR5KHYpKSB7XG4gICAgICAgICAgICBuYjJbdl0gPSBuYlt2XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goW25iMiwgbnVsbF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9OyAvLyB1bmlmeUNvbnRlbnRzXG5cbiAgLy8gIE1hdGNoaW5nXG4gIC8vXG4gIC8vIE1hdGNoaW5nIGZpbmRzIGFsbCBiaW5kaW5ncyBzdWNoIHRoYXQgd2hlbiB0aGUgYmluZGluZyBpcyBhcHBsaWVkXG4gIC8vIHRvIG9uZSB0ZXJtIGl0IGlzIGVxdWFsIHRvIHRoZSBvdGhlciB0ZXJtLiAgV2Ugb25seSBtYXRjaCBmb3JtdWxhZS5cblxuICAvKiogaWYgeCBpcyBub3QgaW4gdGhlIGJpbmRpbmdzIGFycmF5LCByZXR1cm4gdGhlIHZhcjsgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGJpbmRpbmdzICoqL1xuICB2YXIgYmluZCA9IGZ1bmN0aW9uIGJpbmQoeCwgYmluZGluZykge1xuICAgIHZhciB5ID0gYmluZGluZ1t4XTtcbiAgICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG4gIH07XG5cbiAgLy8gV2hlbiB0aGVyZSBhcmUgT1BUSU9OQUwgY2xhdXNlcywgd2UgbXVzdCByZXR1cm4gYmluZGluZ3Mgd2l0aG91dCB0aGVtIGlmIG5vbmUgb2YgdGhlbVxuICAvLyBzdWNjZWVkLiBIb3dldmVyLCBpZiBhbnkgb2YgdGhlbSBkbyBzdWNjZWVkLCB3ZSBzaG91bGQgbm90LiAgKFRoaXMgaXMgd2hhdCBicmFuY2hDb3VudCgpXG4gIC8vIHRyYWNrZWQuIFRoZSBwcm9ibGVtIGN1cnJlbnRseSBpcyAoMjAxMS83KSB0aGF0IHdoZW4gc2V2ZXJhbCBvcHRpb25hbHMgZXhpc3QsIGFuZCB0aGV5XG4gIC8vIGFsbCBtYXRjaCwgbXVsdGlwbGUgc2V0cyBvZiBiaW5kaW5ncyBhcmUgcmV0dXJuZWQsIGVhY2ggd2l0aCBvbmUgb3B0aW9uYWwgZmlsbGVkIGluLilcblxuICB2YXIgdW5pb24gPSBmdW5jdGlvbiB1bmlvbihhLCBiKSB7XG4gICAgdmFyIGMgPSB7fTtcbiAgICB2YXIgeDtcbiAgICBmb3IgKHggaW4gYSkge1xuICAgICAgaWYgKGEuaGFzT3duUHJvcGVydHkoeCkpIHtcbiAgICAgICAgY1t4XSA9IGFbeF07XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoeCBpbiBiKSB7XG4gICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eSh4KSkge1xuICAgICAgICBjW3hdID0gYlt4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgdmFyIE9wdGlvbmFsQnJhbmNoSnVuY3Rpb24gPSBmdW5jdGlvbiBPcHRpb25hbEJyYW5jaEp1bmN0aW9uKG9yaWdpbmFsQ2FsbGJhY2ssIHRydW5rQmluZGluZ3MpIHtcbiAgICB0aGlzLnRydW5rQmluZGluZ3MgPSB0cnVua0JpbmRpbmdzO1xuICAgIHRoaXMub3JpZ2luYWxDYWxsYmFjayA9IG9yaWdpbmFsQ2FsbGJhY2s7XG4gICAgdGhpcy5icmFuY2hlcyA9IFtdO1xuICAgIC8vIHRoaXMucmVzdWx0cyA9IFtdOyAvLyByZXN1bHRbaV0gaXMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIGJyYW5jaCBpXG4gICAgLy8gdGhpcy5kb25lID0ge307ICAvLyBkb25lW2ldIG1lYW5zIGFsbC9hbnkgcmVzdWx0cyBhcmUgaW4gZm9yIGJyYW5jaCBpXG4gICAgLy8gdGhpcy5jb3VudCA9IHt9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgT3B0aW9uYWxCcmFuY2hKdW5jdGlvbi5wcm90b3R5cGUuY2hlY2tBbGxEb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuYnJhbmNoZXNbaV0uZG9uZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5kZWJ1ZygnT1BUSU9OQUwgQklETklOR1MgQUxMIERPTkU6Jyk7XG4gICAgdGhpcy5kb0NhbGxCYWNrcyh0aGlzLmJyYW5jaGVzLmxlbmd0aCAtIDEsIHRoaXMudHJ1bmtCaW5kaW5ncyk7XG4gIH07XG4gIC8vIFJlY3J1cnNpdmVseSBnZW5lcmF0ZSB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0aGUgYmluZGluZ3NcbiAgT3B0aW9uYWxCcmFuY2hKdW5jdGlvbi5wcm90b3R5cGUuZG9DYWxsQmFja3MgPSBmdW5jdGlvbiAoYiwgYmluZGluZ3MpIHtcbiAgICB2YXIgajtcbiAgICBpZiAoYiA8IDApIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ2FsbGJhY2soYmluZGluZ3MpO1xuICAgIH1cbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5icmFuY2hlc1tiXS5yZXN1bHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICB0aGlzLmRvQ2FsbEJhY2tzKGIgLSAxLCB1bmlvbihiaW5kaW5ncywgdGhpcy5icmFuY2hlc1tiXS5yZXN1bHRzW2pdKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEEgbWFuZGF0b3J5IGJyYW5jaCBpcyB0aGUgbm9ybWFsIG9uZSwgd2hlcmUgY2FsbGJhY2tzXG4gIC8vIGFyZSBtYWRlIGltbWVkaWF0ZWx5IGFuZCBubyBqdW5jdGlvbiBpcyBuZWVkZWQuXG4gIC8vIE1pZ2h0IGJlIHVzZWZ1bCBmb3Igb25GaW5zaWhlZCBjYWxsYmFjayBmb3IgcXVlcnkgQVBJLlxuICB2YXIgTWFuZGF0b3J5QnJhbmNoID0gZnVuY3Rpb24gTWFuZGF0b3J5QnJhbmNoKGNhbGxiYWNrLCBvbkRvbmUpIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAvLyB0aGlzLnJlc3VsdHMgPSBbXVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLm9uRG9uZSA9IG9uRG9uZTtcbiAgICAvLyB0aGlzLmp1bmN0aW9uID0ganVuY3Rpb25cbiAgICAvLyBqdW5jdGlvbi5icmFuY2hlcy5wdXNoKHRoaXMpXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgTWFuZGF0b3J5QnJhbmNoLnByb3RvdHlwZS5yZXBvcnRNYXRjaCA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgIC8vIGxvZy5lcnJvcihcIkBAQEAgcXVlcnkuanMgMVwiKTsgLy8gQEBcbiAgICB0aGlzLmNhbGxiYWNrKGJpbmRpbmdzKTtcbiAgICB0aGlzLnN1Y2Nlc3MgPSB0cnVlO1xuICB9O1xuXG4gIE1hbmRhdG9yeUJyYW5jaC5wcm90b3R5cGUucmVwb3J0RG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgIGxvZy5pbmZvKCdNYW5kYXRvcnkgcXVlcnkgYnJhbmNoIGZpbmlzaGVkLioqKicpO1xuICAgIGlmICh0aGlzLm9uRG9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9uRG9uZSgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBbiBvcHRpb25hbCBicmFuY2ggaG9hcmRzIGl0cyByZXN1bHRzLlxuICB2YXIgT3B0aW9uYWxCcmFuY2ggPSBmdW5jdGlvbiBPcHRpb25hbEJyYW5jaChqdW5jdGlvbikge1xuICAgIHRoaXMuY291bnQgPSAwO1xuICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgIHRoaXMuanVuY3Rpb24gPSBqdW5jdGlvbjtcbiAgICBqdW5jdGlvbi5icmFuY2hlcy5wdXNoKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIE9wdGlvbmFsQnJhbmNoLnByb3RvdHlwZS5yZXBvcnRNYXRjaCA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgIHRoaXMucmVzdWx0cy5wdXNoKGJpbmRpbmdzKTtcbiAgfTtcblxuICBPcHRpb25hbEJyYW5jaC5wcm90b3R5cGUucmVwb3J0RG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2cuZGVidWcoJ09wdGlvbmFsIGJyYW5jaCBmaW5pc2hlZCAtIHJlc3VsdHMubGVuZ3RoID0gJyArIHRoaXMucmVzdWx0cy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUaGlzIGlzIHdoYXQgb3B0aW9uYWwgbWVhbnM6IGlmIG5vIGhpdHMsXG4gICAgICB0aGlzLnJlc3VsdHMucHVzaCh7fSk7IC8vIG1pbWljIHN1Y2Nlc3MsIGJ1dCB3aXRoIG5vIGJpbmRpbmdzXG4gICAgICBsb2cuZGVidWcoXCJPcHRpb25hbCBicmFuY2ggRkFJTEVEIC0gdGhhdCdzIE9LLlwiKTtcbiAgICB9XG4gICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICB0aGlzLmp1bmN0aW9uLmNoZWNrQWxsRG9uZSgpO1xuICB9O1xuXG4gIC8qKiBwcmVwYXJlIC0tIHNldHMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHRoZSBwb3NzaWJsZSBtYXRjaGVzXG4gICAgICAqIEBwYXJhbSBmIC0gZm9ybXVsYVxuICAgICAgKiBAcGFyYW0gaXRlbSAtIGFuIFN0YXRlbWVudCwgcG9zc2libHkgdy8gdmFycyBpbiBpdFxuICAgICAgKiBAcGFyYW0gYmluZGluZ3MgLVxuICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXJ5IGZhaWxzIC0tIHRoZXJlIGFyZSBubyBpdGVtcyB0aGF0IG1hdGNoICoqL1xuICB2YXIgcHJlcGFyZSA9IGZ1bmN0aW9uIHByZXBhcmUoZiwgaXRlbSwgYmluZGluZ3MpIHtcbiAgICB2YXIgdCwgdGVybXMsIHRlcm1JbmRleCwgaSwgaW5kO1xuICAgIGl0ZW0ubnZhcnMgPSAwO1xuICAgIGl0ZW0uaW5kZXggPSBudWxsO1xuICAgIC8vIGlmICghZi5zdGF0ZW1lbnRzKSBsb2cud2FybihcIkBAQCBwcmVwYXJlOiBmIGlzIFwiK2YpXG4gICAgLy8gICAgbG9nLmRlYnVnKFwiUHJlcGFyZTogZiBoYXMgXCIrIGYuc3RhdGVtZW50cy5sZW5ndGgpXG4gICAgLy8gbG9nLmRlYnVnKFwiUHJlcGFyZTogS2Igc2l6ZSBcIitmLnN0YXRlbWVudHMubGVuZ3RoK1wiIFByZXBhcmluZyBcIitpdGVtKVxuXG4gICAgdGVybXMgPSBbaXRlbS5zdWJqZWN0LCBpdGVtLnByZWRpY2F0ZSwgaXRlbS5vYmplY3RdO1xuICAgIGluZCA9IFtmLnN1YmplY3RJbmRleCwgZi5wcmVkaWNhdGVJbmRleCwgZi5vYmplY3RJbmRleF07XG4gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgLy8gYWxlcnQoXCJQcmVwYXJlIFwiK3Rlcm1zW2ldK1wiIFwiKyh0ZXJtc1tpXSBpbiBiaW5kaW5ncykpXG4gICAgICBpZiAodGVybXNbaV0uaXNWYXIgJiYgIShiaW5kaW5nc1t0ZXJtc1tpXV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgaXRlbS5udmFycysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdCA9IGJpbmQodGVybXNbaV0sIGJpbmRpbmdzKTsgLy8gcmV0dXJucyB0aGUgUkRGIGJpbmRpbmcgaWYgYm91bmQsIG90aGVyd2lzZSBpdHNlbGZcbiAgICAgICAgLy8gaWYgKHRlcm1zW2ldIT1iaW5kKHRlcm1zW2ldLGJpbmRpbmdzKSBhbGVydChcIlRlcm06IFwiK3Rlcm1zW2ldK1wiQmluZGluZzogXCIrYmluZCh0ZXJtc1tpXSwgYmluZGluZ3MpKVxuICAgICAgICBpZiAoZi5yZWRpcmVjdGlvbnNbdC5oYXNoU3RyaW5nKCldKSB7XG4gICAgICAgICAgdCA9IGYucmVkaXJlY3Rpb25zW3QuaGFzaFN0cmluZygpXTsgLy8gcmVkaXJlY3RcbiAgICAgICAgfVxuICAgICAgICB0ZXJtSW5kZXggPSBpbmRbaV1bdC5oYXNoU3RyaW5nKCldO1xuXG4gICAgICAgIGlmICghdGVybUluZGV4KSB7XG4gICAgICAgICAgaXRlbS5pbmRleCA9IFtdO1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUXVlcnkgbGluZSBjYW5ub3QgbWF0Y2hcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5pbmRleCA9PT0gbnVsbCB8fCBpdGVtLmluZGV4Lmxlbmd0aCA+IHRlcm1JbmRleC5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmluZGV4ID0gdGVybUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uaW5kZXggPT09IG51bGwpIHtcbiAgICAgIC8vIEFsbCAzIGFyZSB2YXJpYWJsZXM/XG4gICAgICBpdGVtLmluZGV4ID0gZi5zdGF0ZW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTsgLy8gcHJlcGFyZVxuXG4gIC8qKiBzb3J0aW5nIGZ1bmN0aW9uIC0tIG5lZ2F0aXZlIGlmIHNlbGYgaXMgZWFzaWVyICoqL1xuICAvLyBXZSBhbHdheXMgcHJlZmVyIHRvIHN0YXJ0IHdpdGggYSBVUkkgdG8gYmUgYWJsZSB0byBicm93c2UgYSBncmFwaFxuICAvLyB0aGlzIGlzIHdoeSB3ZSBwdXQgb2ZmIGl0ZW1zIHdpdGggbW9yZSB2YXJpYWJsZXMgdGlsbCBsYXRlci5cbiAgZnVuY3Rpb24gZWFzaWVzdFF1ZXJ5KHNlbGYsIG90aGVyKSB7XG4gICAgaWYgKHNlbGYubnZhcnMgIT09IG90aGVyLm52YXJzKSB7XG4gICAgICByZXR1cm4gc2VsZi5udmFycyAtIG90aGVyLm52YXJzO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5pbmRleC5sZW5ndGggLSBvdGhlci5pbmRleC5sZW5ndGg7XG4gIH1cblxuICB2YXIgbWF0Y2hfaW5kZXggPSAwOyAvLyBpbmRleFxuICAvKiogbWF0Y2hlcyBhIHBhdHRlcm4gZm9ybXVsYSBhZ2FpbnN0IHRoZSBrbm93bGVkZ2UgYmFzZSwgZS5nLiB0byBmaW5kIG1hdGNoZXMgZm9yIHRhYmxlLXZpZXdcbiAgKlxuICAqIEBwYXJhbSBmIC0ga25vd2xlZGdlIGJhc2UgZm9ybXVsYVxuICAqIEBwYXJhbSBnIC0gcGF0dGVybiBmb3JtdWxhIChtYXkgaGF2ZSB2YXJzKVxuICAqIEBwYXJhbSBiaW5kaW5nc1NvRmFyICAtIGJpbmRpbmdzIGFjY3VtdWxhdGVkIGluIG1hdGNoaW5nIHRvIGRhdGVcbiAgKiBAcGFyYW0gbGV2ZWwgLSBzcGFjZXMgdG8gaW5kZW50IHN0dWZmIGFsc28gbGV0cyB5b3Uga25vdyB3aGF0IGxldmVsIG9mIHJlY3Vyc2lvbiB5b3UncmUgYXRcbiAgKiBAcGFyYW0gZmV0Y2hlciAtIGZ1bmN0aW9uICh0ZXJtLCByZXF1ZXN0ZWRCeSkgLSBteUZldGNoZXIgLyBBSkFSX2hhbmRsZU5ld1Rlcm0gLyB0aGUgc29ydFxuICAqIEBwYXJhbSBsb2NhbENhbGxiYWNrIC0gZnVuY3Rpb24oYmluZGluZ3MsIHBhdHRlcm4sIGJyYW5jaCkgY2FsbGVkIG9uIHN1Y2Vzc1xuICAqIEByZXR1cm5zIG5vdGhpbmdcbiAgKlxuICAqIFdpbGwgZmV0Y2ggbGlua2VkIGRhdGEgZnJvbSB0aGUgd2ViIGlmZiB0aGUga25vd2xlZGdlIGJhc2UgYW4gYXNzb2NpYXRlZCBzb3VyY2UgZmV0Y2hlciAoZi5mZXRjaGVyKVxuICAqKiovXG4gIHZhciBtYXRjaCA9IGZ1bmN0aW9uIG1hdGNoKGYsIGcsIGJpbmRpbmdzU29GYXIsIGxldmVsLCBmZXRjaGVyLCBsb2NhbENhbGxiYWNrLCBicmFuY2gpIHtcbiAgICBsb2cuZGVidWcoJ01hdGNoIGJlZ2lucywgQnJhbmNoIGNvdW50IG5vdzogJyArIGJyYW5jaC5jb3VudCArICcgZm9yICcgKyBicmFuY2gucGF0dGVybl9kZWJ1Zyk7XG4gICAgdmFyIHNmID0gZi5mZXRjaGVyID8gZi5mZXRjaGVyIDogbnVsbDtcbiAgICAvLyBsb2cuZGVidWcoXCJtYXRjaDogZiBoYXMgXCIrZi5zdGF0ZW1lbnRzLmxlbmd0aCtcIiwgZyBoYXMgXCIrZy5zdGF0ZW1lbnRzLmxlbmd0aClcbiAgICB2YXIgcGF0dGVybiA9IGcuc3RhdGVtZW50cztcbiAgICBpZiAocGF0dGVybi5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdoZW4gaXQncyBzYXRpc2ZpZWQgYWxsIHRoZSBwYXR0ZXJuIHRyaXBsZXNcbiAgICAgIGxvZy5kZWJ1ZygnRk9VTkQgTUFUQ0ggV0lUSCBCSU5ESU5HUzonICsgYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKTtcbiAgICAgIGlmIChnLm9wdGlvbmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmFuY2gucmVwb3J0TWF0Y2goYmluZGluZ3NTb0Zhcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoJ09QVElPTkFMOiAnICsgZy5vcHRpb25hbCk7XG4gICAgICAgIHZhciBqdW5jdGlvbiA9IG5ldyBPcHRpb25hbEJyYW5jaEp1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nc1NvRmFyKTsgLy8gQEAgd29uJ3Qgd29yayB3aXRoIG5lc3RlZCBvcHRpb25hbHM/IG5lc3QgY2FsbGJhY2tzXG4gICAgICAgIHZhciBiciA9IFtdO1xuICAgICAgICB2YXIgYjtcbiAgICAgICAgZm9yIChiID0gMDsgYiA8IGcub3B0aW9uYWwubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICBicltiXSA9IG5ldyBPcHRpb25hbEJyYW5jaChqdW5jdGlvbik7IC8vIEFsbG9jYXRlIGJyYW5jaGVzIHRvIHByZXZlbnQgcHJlbWF0dXJlIGVuZGluZ1xuICAgICAgICAgIGJyW2JdLnBhdHRlcm5fZGVidWcgPSBnLm9wdGlvbmFsW2JdOyAvLyBmb3IgZGlhZ25vdGljcyBvbmx5XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChiID0gMDsgYiA8IGcub3B0aW9uYWwubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICBicltiXS5jb3VudCA9IGJyW2JdLmNvdW50ICsgMTsgLy8gQ291bnQgaG93IG1hbnkgbWF0Y2hlcyB3ZSBoYXZlIHlldCB0byBjb21wbGV0ZVxuICAgICAgICAgIG1hdGNoKGYsIGcub3B0aW9uYWxbYl0sIGJpbmRpbmdzU29GYXIsICcnLCBmZXRjaGVyLCBjYWxsYmFjaywgYnJbYl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmFuY2guY291bnQtLTtcbiAgICAgIGxvZy5kZWJ1ZygnTWF0Y2ggZW5kcyAtLSBzdWNjZXNzICwgQnJhbmNoIGNvdW50IG5vdzogJyArIGJyYW5jaC5jb3VudCArICcgZm9yICcgKyBicmFuY2gucGF0dGVybl9kZWJ1Zyk7XG4gICAgICByZXR1cm47IC8vIFN1Y2Nlc3NcbiAgICB9XG5cbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaTtcbiAgICB2YXIgbiA9IHBhdHRlcm4ubGVuZ3RoO1xuICAgIC8vIGxvZy5kZWJ1ZyhsZXZlbCArIFwiTWF0Y2ggXCIrbitcIiBsZWZ0LCBicyBzbyBmYXI6XCIrYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKVxuXG4gICAgLy8gRm9sbG93IGxpbmtzIGZyb20gdmFyaWFibGVzIGluIHF1ZXJ5XG4gICAgaWYgKHNmKSB7XG4gICAgICAvLyBGZXRjaGVyIGlzIHVzZWQgdG8gZmV0Y2ggVVJJcywgZnVuY3Rpb24gZmlyc3QgdGVybSBpcyBhIFVSSSB0ZXJtLCBzZWNvbmQgaXMgdGhlIHJlcXVlc3RlclxuICAgICAgdmFyIGlkID0gJ21hdGNoJyArIG1hdGNoX2luZGV4Kys7XG4gICAgICB2YXIgZmV0Y2hSZXNvdXJjZSA9IGZ1bmN0aW9uIGZldGNoUmVzb3VyY2UocmVxdWVzdGVkVGVybSwgaWQpIHtcbiAgICAgICAgdmFyIGRvY3VyaSA9IHJlcXVlc3RlZFRlcm0udXJpLnNwbGl0KCcjJylbMF07XG4gICAgICAgIHNmLm5vd09yV2hlbkZldGNoZWQoZG9jdXJpLCB1bmRlZmluZWQsIGZ1bmN0aW9uIChlcnIsIGJvZHksIHhocikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBmb2xsb3dpbmcgbGluayB0byA8JyArIHJlcXVlc3RlZFRlcm0udXJpICsgJz4gaW4gcXVlcnk6ICcgKyBib2R5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0Y2goZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIC8vIG1hdGNoIG5vdCBtYXRjaDIgdG8gbG9vayB1cCBhbnkgb3RoZXJzIG5lY2Vzc2FyeS5cbiAgICAgICAgICBsb2NhbENhbGxiYWNrLCBicmFuY2gpO1xuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgaWYoIHNmICkge1xuICAgICAgICAgICAgc2YuYWRkQ2FsbGJhY2soJ2RvbmUnLCBmdW5jdGlvbih1cmkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGtiLmNhbm9uKGtiLnN5bSh1cmkpKS51cmkgIT09IHBhdGgpICYmICh1cmkgIT09IGtiLmNhbm9uKGtiLnN5bShwYXRoKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBmZXRjaGVyKHJlcXVlc3RlZFRlcm0sIGlkKVxuICAgICAgICAqL1xuICAgICAgfTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaXRlbSA9IHBhdHRlcm5baV07IC8vIGZvciBlYWNoIG9mIHRoZSB0cmlwbGVzIGluIHRoZSBxdWVyeVxuICAgICAgICBpZiAoYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdICE9PSB1bmRlZmluZWQgJiYgYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdLnVyaSAmJiBzZiAmJiBzZi5nZXRTdGF0ZShkb2NwYXJ0KGJpbmRpbmdzU29GYXJbaXRlbS5zdWJqZWN0XS51cmkpKSA9PT0gJ3VucmVxdWVzdGVkJykge1xuICAgICAgICAgIC8vIGZldGNoIHRoZSBzdWJqZWN0IGluZm8gYW5kIHJldHVybiB0byBpZFxuICAgICAgICAgIGZldGNoUmVzb3VyY2UoYmluZGluZ3NTb0ZhcltpdGVtLnN1YmplY3RdLCBpZCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBvbmx5IGxvb2sgdXAgb25lIHBlciBsaW5lIHRoaXMgdGltZSwgYnV0IHdlIHdpbGwgY29tZSBiYWNrIGFnYWluIHRob3VnaCBtYXRjaFxuICAgICAgICB9XG4gICAgICAgIGlmIChiaW5kaW5nc1NvRmFyW2l0ZW0ub2JqZWN0XSAhPT0gdW5kZWZpbmVkICYmIGJpbmRpbmdzU29GYXJbaXRlbS5vYmplY3RdLnVyaSAmJiBzZiAmJiBzZi5nZXRTdGF0ZShkb2NwYXJ0KGJpbmRpbmdzU29GYXJbaXRlbS5vYmplY3RdLnVyaSkpID09PSAndW5yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgZmV0Y2hSZXNvdXJjZShiaW5kaW5nc1NvRmFyW2l0ZW0ub2JqZWN0XSwgaWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gaWYgc2ZcbiAgICBtYXRjaDIoZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIGxvY2FsQ2FsbGJhY2ssIGJyYW5jaCk7XG4gICAgcmV0dXJuO1xuICB9OyAvLyBtYXRjaFxuXG4gIHZhciBjb25zdHJhaW50c1NhdGlzZmllZCA9IGZ1bmN0aW9uIGNvbnN0cmFpbnRzU2F0aXNmaWVkKGJpbmRpbmdzLCBjb25zdHJhaW50cykge1xuICAgIHZhciByZXMgPSB0cnVlO1xuICAgIHZhciB4O1xuICAgIHZhciB0ZXN0O1xuICAgIGZvciAoeCBpbiBiaW5kaW5ncykge1xuICAgICAgaWYgKGJpbmRpbmdzLmhhc093blByb3BlcnR5KHgpKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50c1t4XSkge1xuICAgICAgICAgIHRlc3QgPSBjb25zdHJhaW50c1t4XS50ZXN0O1xuICAgICAgICAgIGlmICh0ZXN0ICYmICF0ZXN0KGJpbmRpbmdzW3hdKSkge1xuICAgICAgICAgICAgcmVzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLyoqIG1hdGNoMiAtLSBzdHVmZiBhZnRlciB0aGUgZmV0Y2ggKiovXG4gIHZhciBtYXRjaDIgPSBmdW5jdGlvbiBtYXRjaDIoZiwgZywgYmluZGluZ3NTb0ZhciwgbGV2ZWwsIGZldGNoZXIsIGNhbGxiYWNrLCBicmFuY2gpIHtcbiAgICAvLyBwb3N0IGZldGNoXG4gICAgdmFyIHBhdHRlcm4gPSBnLnN0YXRlbWVudHM7XG4gICAgdmFyIG4gPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgaztcbiAgICB2YXIgbms7XG4gICAgdmFyIHY7XG4gICAgdmFyIGJpbmRpbmdzMjtcbiAgICB2YXIgbmV3QmluZGluZ3MxO1xuICAgIHZhciBpdGVtO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIC8vIEZvciBlYWNoIHN0YXRlbWVudCBsZWZ0IGluIHRoZSBxdWVyeSwgcnVuIHByZXBhcmVcbiAgICAgIGl0ZW0gPSBwYXR0ZXJuW2ldO1xuICAgICAgbG9nLmluZm8oJ21hdGNoMjogaXRlbT0nICsgaXRlbSArICcsIGJpbmRpbmdzU29GYXI9JyArIGJpbmRpbmdEZWJ1ZyhiaW5kaW5nc1NvRmFyKSk7XG4gICAgICBwcmVwYXJlKGYsIGl0ZW0sIGJpbmRpbmdzU29GYXIpO1xuICAgIH1cbiAgICBwYXR0ZXJuLnNvcnQoZWFzaWVzdFF1ZXJ5KTtcbiAgICBpdGVtID0gcGF0dGVyblswXTtcbiAgICAvLyBsb2cuZGVidWcoXCJTb3J0ZWQgcGF0dGVybjpcXG5cIitwYXR0ZXJuKVxuICAgIHZhciByZXN0ID0gZi5mb3JtdWxhKCk7XG4gICAgcmVzdC5vcHRpb25hbCA9IGcub3B0aW9uYWw7XG4gICAgcmVzdC5jb25zdHJhaW50cyA9IGcuY29uc3RyYWludHM7XG4gICAgcmVzdC5zdGF0ZW1lbnRzID0gcGF0dGVybi5zbGljZSgxKTsgLy8gTm8gaW5kZXhlczogd2Ugd2lsbCBub3QgcXVlcnkgZy5cbiAgICBsb2cuZGVidWcobGV2ZWwgKyAnbWF0Y2gyIHNlYXJjaGluZyAnICsgaXRlbS5pbmRleC5sZW5ndGggKyAnIGZvciAnICsgaXRlbSArICc7IGJpbmRpbmdzIHNvIGZhcj0nICsgYmluZGluZ0RlYnVnKGJpbmRpbmdzU29GYXIpKTtcbiAgICAvLyB2YXIgcmVzdWx0cyA9IFtdXG4gICAgdmFyIGM7XG4gICAgdmFyIG5jID0gaXRlbS5pbmRleC5sZW5ndGg7XG4gICAgdmFyIG5iczE7XG4gICAgdmFyIHN0O1xuICAgIHZhciBvbndhcmQgPSAwO1xuICAgIC8vIHZhciB4XG4gICAgZm9yIChjID0gMDsgYyA8IG5jOyBjKyspIHtcbiAgICAgIC8vIEZvciBlYWNoIGNhbmRpZGF0ZSBzdGF0ZW1lbnRcbiAgICAgIHN0ID0gaXRlbS5pbmRleFtjXTsgLy8gZm9yIGVhY2ggc3RhdGVtZW50IGluIHRoZSBpdGVtJ3MgaW5kZXgsIHNwYXduIGEgbmV3IG1hdGNoIHdpdGggdGhhdCBiaW5kaW5nXG4gICAgICBuYnMxID0gdW5pZnlDb250ZW50cyhbaXRlbS5zdWJqZWN0LCBpdGVtLnByZWRpY2F0ZSwgaXRlbS5vYmplY3RdLCBbc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3RdLCBiaW5kaW5nc1NvRmFyLCBmKTtcbiAgICAgIGxvZy5pbmZvKGxldmVsICsgJyBGcm9tIGZpcnN0OiAnICsgbmJzMS5sZW5ndGggKyAnOiAnICsgYmluZGluZ3NEZWJ1ZyhuYnMxKSk7XG4gICAgICBuayA9IG5iczEubGVuZ3RoO1xuICAgICAgLy8gYnJhbmNoLmNvdW50ICs9IG5rXG4gICAgICAvLyBsb2cuZGVidWcoXCJCcmFuY2ggY291bnQgYnVtcGVkIFwiK25rK1wiIHRvOiBcIiticmFuY2guY291bnQpXG4gICAgICBmb3IgKGsgPSAwOyBrIDwgbms7IGsrKykge1xuICAgICAgICAvLyBGb3IgZWFjaCB3YXkgdGhhdCBzdGF0ZW1lbnQgYmluZHNcbiAgICAgICAgYmluZGluZ3MyID0gW107XG4gICAgICAgIG5ld0JpbmRpbmdzMSA9IG5iczFba11bMF07XG4gICAgICAgIGlmICghY29uc3RyYWludHNTYXRpc2ZpZWQobmV3QmluZGluZ3MxLCBnLmNvbnN0cmFpbnRzKSkge1xuICAgICAgICAgIC8vIGJyYW5jaC5jb3VudC0tXG4gICAgICAgICAgbG9nLmRlYnVnKCdCcmFuY2ggY291bnQgQ1M6ICcgKyBicmFuY2guY291bnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodiBpbiBuZXdCaW5kaW5nczEpIHtcbiAgICAgICAgICAgIGlmIChuZXdCaW5kaW5nczEuaGFzT3duUHJvcGVydHkodikpIHtcbiAgICAgICAgICAgICAgYmluZGluZ3MyW3ZdID0gbmV3QmluZGluZ3MxW3ZdOyAvLyBjb3B5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodiBpbiBiaW5kaW5nc1NvRmFyKSB7XG4gICAgICAgICAgICBpZiAoYmluZGluZ3NTb0Zhci5oYXNPd25Qcm9wZXJ0eSh2KSkge1xuICAgICAgICAgICAgICBiaW5kaW5nczJbdl0gPSBiaW5kaW5nc1NvRmFyW3ZdOyAvLyBjb3B5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJhbmNoLmNvdW50Kys7IC8vIENvdW50IGhvdyBtYW55IG1hdGNoZXMgd2UgaGF2ZSB5ZXQgdG8gY29tcGxldGVcbiAgICAgICAgICBvbndhcmQrKztcbiAgICAgICAgICBtYXRjaChmLCByZXN0LCBiaW5kaW5nczIsIGxldmVsICsgJyAgJywgZmV0Y2hlciwgY2FsbGJhY2ssIGJyYW5jaCk7IC8vIGNhbGwgbWF0Y2hcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBicmFuY2guY291bnQtLTtcbiAgICBpZiAob253YXJkID09PSAwKSB7XG4gICAgICBsb2cuZGVidWcoJ01hdGNoMiBmYWlscyBjb21wbGV0ZWx5IG9uICcgKyBpdGVtKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKCdNYXRjaDIgZW5kcywgQnJhbmNoIGNvdW50OiAnICsgYnJhbmNoLmNvdW50ICsgJyBmb3IgJyArIGJyYW5jaC5wYXR0ZXJuX2RlYnVnKTtcbiAgICBpZiAoYnJhbmNoLmNvdW50ID09PSAwKSB7XG4gICAgICBsb2cuZGVidWcoJ0JyYW5jaCBmaW5pc2hlZC4nKTtcbiAgICAgIGJyYW5jaC5yZXBvcnREb25lKCk7XG4gICAgfVxuICB9OyAvLyBtYXRjaDJcbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQm9keSBvZiBxdWVyeSgpICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvKlxuICBpZighZmV0Y2hlcikge1xuICAgICAgZmV0Y2hlcj1mdW5jdGlvbiAoeCwgcmVxdWVzdGVkQnkpIHtcbiAgICAgICAgICBpZiAoeCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgJHJkZi5VdGlsLkFKQVJfaGFuZGxlTmV3VGVybShrYiwgeCwgcmVxdWVzdGVkQnkpXG4gICAgICB9XG4gIH1cbiAgKi9cbiAgLy8gcHJlcGFyZSwgb25jYWxsYmFjazogbWF0Y2gxXG4gIC8vIG1hdGNoMTogZmV0Y2hlciwgb25jYWxsYmFjazogbWF0Y2gyXG4gIC8vIG1hdGNoMiwgb25jYWxsYmFjazogcG9wdWxhdGV0YWJsZVxuICAvLyAgICBsb2cuZGVidWcoXCJRdWVyeSBGIGxlbmd0aFwiK3RoaXMuc3RhdGVtZW50cy5sZW5ndGgrXCIgRz1cIitteVF1ZXJ5KVxuICB2YXIgZiA9IHRoaXM7XG4gIGxvZy5kZWJ1ZygnUXVlcnkgb24gJyArIHRoaXMuc3RhdGVtZW50cy5sZW5ndGgpO1xuICAvLyBrYi5yZW1vdGVRdWVyeShteVF1ZXJ5LCdodHRwOi8vamVuYS5ocGwuaHAuY29tOjMwNDAvYmFja3N0YWdlJyxjYWxsYmFjaylcbiAgLy8gcmV0dXJuXG4gIHZhciB0cnVuY2sgPSBuZXcgTWFuZGF0b3J5QnJhbmNoKGNhbGxiYWNrLCBvbkRvbmUpO1xuICB0cnVuY2suY291bnQrKzsgLy8gY291bnQgb25lIGJyYW5jaCB0byBjb21wbGV0ZSBhdCB0aGUgbW9tZW50XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIG1hdGNoKGYsIG15UXVlcnkucGF0LCBteVF1ZXJ5LnBhdC5pbml0QmluZGluZ3MsICcnLCBmZXRjaGVyLCBjYWxsYmFjaywgdHJ1bmNrIC8qIGJyYW5jaCAqLyk7XG4gIH0sIDApO1xuXG4gIHJldHVybjsgLy8gcmV0dXJucyBub3RoaW5nOyBjYWxsYmFjayBkb2VzIHRoZSB3b3JrXG59IC8vIHF1ZXJ5XG5cbm1vZHVsZS5leHBvcnRzLlF1ZXJ5ID0gUXVlcnk7XG5tb2R1bGUuZXhwb3J0cy5pbmRleGVkRm9ybXVsYVF1ZXJ5ID0gaW5kZXhlZEZvcm11bGFRdWVyeTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8vICBSREZhIFBhcnNlciBmb3IgcmRmbGliLmpzXG5cbi8vIE9yaWdpbmFsbHkgYnk6IEFsZXggTWlsb3dza2lcbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FsZXhtaWxvd3NraS9ncmVlbi10dXJ0bGVcbi8vIENvbnZlcnRlZDogdGltYmwgMjAxNS0wOC0yNSBub3QgeWV0IHdvcmtpbmdcbi8vIEFkZGVkIHdyYXBwZXI6IGNzYXJ2ZW4gMjAxNi0wNS0wOSB3b3JraW5nXG5cbi8vIFJERmFQcm9jZXNzb3IucHJvdG90eXBlID0gbmV3IE9iamVjdCgpIC8vIFdhcyBVUklSZXNvbHZlclxuXG4vLyBSREZhUHJvY2Vzc29yLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SREZhUHJvY2Vzc29yXG5cbi8vIG9wdGlvbnMuYmFzZSA9IGJhc2UgVVJJICAgIG5vdCByZWFsbHkgYW4gb3B0aW9uLCBzaG9wdWxkIGFsd2F5cyBiZSBzZXQuXG4vL1xuXG52YXIgQmxhbmtOb2RlID0gcmVxdWlyZSgnLi9ibGFuay1ub2RlJyk7XG52YXIgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xudmFyIHJkZiA9IHJlcXVpcmUoJy4vZGF0YS1mYWN0b3J5Jyk7XG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG52YXIgVXJpID0gcmVxdWlyZSgnLi91cmknKTtcbnZhciBVdGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmlmICh0eXBlb2YgTm9kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gIEBAQEBAQCBHbG9iYWwuIEludGVyZmFjZSB0byB4bWxkb20uXG4gIHZhciBOb2RlID0ge1xuICAgIEVMRU1FTlRfTk9ERTogMSxcbiAgICBBVFRSSUJVVEVfTk9ERTogMixcbiAgICBURVhUX05PREU6IDMsXG4gICAgQ0RBVEFfU0VDVElPTl9OT0RFOiA0LFxuICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTogNSxcbiAgICBFTlRJVFlfTk9ERTogNixcbiAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IDcsXG4gICAgQ09NTUVOVF9OT0RFOiA4LFxuICAgIERPQ1VNRU5UX05PREU6IDksXG4gICAgRE9DVU1FTlRfVFlQRV9OT0RFOiAxMCxcbiAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOiAxMSxcbiAgICBOT1RBVElPTl9OT0RFOiAxMlxuICB9O1xufVxuXG52YXIgUkRGYVByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUkRGYVByb2Nlc3NvcihrYiwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSREZhUHJvY2Vzc29yKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5rYiA9IGtiO1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgfHwge1xuICAgICAgZ3JhcGg6IHtcbiAgICAgICAgc3ViamVjdHM6IHt9LFxuICAgICAgICBwcmVmaXhlczoge30sXG4gICAgICAgIHRlcm1zOiB7fVxuICAgICAgfVxuICAgIH07XG4gICAgLy8gWFhYOiBBZGRlZCB0byB0cmFjayBibm9kZXNcbiAgICB0aGlzLmJsYW5rTm9kZXMgPSBbXTtcbiAgICAvLyBYWFg6IEFkZGVkIGZvciBub3JtYWxpc2F0aW9uXG4gICAgdGhpcy5odG1sT3B0aW9ucyA9IHtcbiAgICAgICdzZWxmQ2xvc2luZyc6ICdiciBpbWcgaW5wdXQgYXJlYSBiYXNlIGJhc2Vmb250IGNvbCBjb2xncm91cCBzb3VyY2Ugd2JyIGlzaW5kZXggbGluayBtZXRhIHBhcmFtIGhyJ1xuICAgIH07XG4gICAgdGhpcy50aGVPbmUgPSAnXzonICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5sYW5ndWFnZSA9IG51bGw7XG4gICAgdGhpcy52b2NhYnVsYXJ5ID0gbnVsbDtcbiAgICB0aGlzLmJsYW5rQ291bnRlciA9IDA7XG4gICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7IG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGxvY2FsTmFtZTogJ2xhbmcnIH1dO1xuICAgIHRoaXMuaW5YSFRNTE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmFic1VSSVJFID0gL1tcXHdcXF9cXC1dKzpcXFMrLztcbiAgICB0aGlzLmZpbmlzaGVkSGFuZGxlcnMgPSBbXTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSREZhUHJvY2Vzc29yLCBbe1xuICAgIGtleTogJ2FkZFRyaXBsZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRyaXBsZShvcmlnaW4sIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KSB7XG4gICAgICB2YXIgc3UsIG9iLCBwciwgb3I7XG4gICAgICBpZiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHN1ID0gcmRmLm5hbWVkTm9kZSh0aGlzLm9wdGlvbnMuYmFzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdSA9IHRoaXMudG9SREZOb2RlT2JqZWN0KHN1YmplY3QpO1xuICAgICAgfVxuICAgICAgcHIgPSB0aGlzLnRvUkRGTm9kZU9iamVjdChwcmVkaWNhdGUpO1xuICAgICAgb2IgPSB0aGlzLnRvUkRGTm9kZU9iamVjdChvYmplY3QpO1xuICAgICAgb3IgPSByZGYubmFtZWROb2RlKHRoaXMub3B0aW9ucy5iYXNlKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdBZGRpbmcgeyAnICsgc3UgKyAnICcgKyBwciArICcgJyArIG9iICsgJyAnICsgb3IgKyAnIH0nKVxuICAgICAgdGhpcy5rYi5hZGQoc3UsIHByLCBvYiwgb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2FuY2VzdG9yUGF0aCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFuY2VzdG9yUGF0aChub2RlKSB7XG4gICAgICB2YXIgcGF0aCA9ICcnO1xuICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgIHBhdGggPSAnLycgKyBub2RlLmxvY2FsTmFtZSArIHBhdGg7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb3B5TWFwcGluZ3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5TWFwcGluZ3MobWFwcGluZ3MpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5ncyA9IHt9O1xuICAgICAgZm9yICh2YXIgayBpbiBtYXBwaW5ncykge1xuICAgICAgICBuZXdNYXBwaW5nc1trXSA9IG1hcHBpbmdzW2tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld01hcHBpbmdzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvcHlQcm9wZXJ0aWVzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weVByb3BlcnRpZXMoKSB7fVxuICB9LCB7XG4gICAga2V5OiAnZGVyaXZlRGF0ZVRpbWVUeXBlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVyaXZlRGF0ZVRpbWVUeXBlKHZhbHVlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFJERmFQcm9jZXNzb3IuZGF0ZVRpbWVUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNoZWNraW5nIFwiK3ZhbHVlK1wiIGFnYWluc3QgXCIrUkRGYVByb2Nlc3Nvci5kYXRlVGltZVR5cGVzW2ldLnR5cGUpXG4gICAgICAgIHZhciBtYXRjaGVkID0gUkRGYVByb2Nlc3Nvci5kYXRlVGltZVR5cGVzW2ldLnBhdHRlcm4uZXhlYyh2YWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaGVkICYmIG1hdGNoZWRbMF0ubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk1hdGNoZWQhXCIpXG4gICAgICAgICAgcmV0dXJuIFJERmFQcm9jZXNzb3IuZGF0ZVRpbWVUeXBlc1tpXS50eXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdpbml0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdCgpIHt9XG4gIH0sIHtcbiAgICBrZXk6ICduZXdCbGFua05vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXdCbGFua05vZGUoKSB7XG4gICAgICB0aGlzLmJsYW5rQ291bnRlcisrO1xuICAgICAgcmV0dXJuICdfOicgKyB0aGlzLmJsYW5rQ291bnRlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICduZXdTdWJqZWN0T3JpZ2luJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV3U3ViamVjdE9yaWdpbihvcmlnaW4sIHN1YmplY3QpIHt9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZUNVUklFJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VDVVJJRSh2YWx1ZSwgcHJlZml4ZXMsIGJhc2UpIHtcbiAgICAgIHZhciBjb2xvbiA9IHZhbHVlLmluZGV4T2YoJzonKTtcbiAgICAgIHZhciB1cmk7XG4gICAgICBpZiAoY29sb24gPj0gMCkge1xuICAgICAgICB2YXIgcHJlZml4ID0gdmFsdWUuc3Vic3RyaW5nKDAsIGNvbG9uKTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gJycpIHtcbiAgICAgICAgICAvLyBkZWZhdWx0IHByZWZpeFxuICAgICAgICAgIHVyaSA9IHByZWZpeGVzWycnXTtcbiAgICAgICAgICByZXR1cm4gdXJpID8gdXJpICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSkgOiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCA9PT0gJ18nKSB7XG4gICAgICAgICAgLy8gYmxhbmsgbm9kZVxuICAgICAgICAgIHJldHVybiAnXzonICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoUkRGYVByb2Nlc3Nvci5OQ05BTUUudGVzdChwcmVmaXgpKSB7XG4gICAgICAgICAgdXJpID0gcHJlZml4ZXNbcHJlZml4XTtcbiAgICAgICAgICBpZiAodXJpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJpICsgdmFsdWUuc3Vic3RyaW5nKGNvbG9uICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZUNVUklFT3JVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNVUklFT3JVUkkodmFsdWUsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICB2YXIgY3VyaWUgPSB0aGlzLnBhcnNlQ1VSSUUodmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgIGlmIChjdXJpZSkge1xuICAgICAgICByZXR1cm4gY3VyaWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQW5kTm9ybWFsaXplKGJhc2UsIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVByZWRpY2F0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUHJlZGljYXRlKHZhbHVlLCBkZWZhdWx0Vm9jYWJ1bGFyeSwgdGVybXMsIHByZWZpeGVzLCBiYXNlLCBpZ25vcmVUZXJtcykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSSh2YWx1ZSwgZGVmYXVsdFZvY2FidWxhcnksIGlnbm9yZVRlcm1zID8gbnVsbCA6IHRlcm1zLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICBpZiAocHJlZGljYXRlICYmIHByZWRpY2F0ZS5pbmRleE9mKCdfOicpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZWRpY2F0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVByZWZpeE1hcHBpbmdzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VQcmVmaXhNYXBwaW5ncyhzdHIsIHRhcmdldCkge1xuICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudG9rZW5pemUoc3RyKTtcbiAgICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgICAgLy8gdmFyIHVyaSA9IG51bGxcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbaV1bdmFsdWVzW2ldLmxlbmd0aCAtIDFdID09PSAnOicpIHtcbiAgICAgICAgICBwcmVmaXggPSB2YWx1ZXNbaV0uc3Vic3RyaW5nKDAsIHZhbHVlc1tpXS5sZW5ndGggLSAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICB0YXJnZXRbcHJlZml4XSA9IHRoaXMub3B0aW9ucy5iYXNlID8gVXJpLmpvaW4odmFsdWVzW2ldLCB0aGlzLm9wdGlvbnMuYmFzZSkgOiB2YWx1ZXNbaV07XG4gICAgICAgICAgcHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3BhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkodmFsdWUsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbSh2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSAnWycgJiYgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpID09PSAnXScpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09ICdfOicpIHtcbiAgICAgICAgICAvLyB0aGUgb25lIG5vZGVcbiAgICAgICAgICByZXR1cm4gdGhpcy50aGVPbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDVVJJRSh2YWx1ZSwgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDVVJJRU9yVVJJKHZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncGFyc2VUZXJtT3JDVVJJRU9yQWJzVVJJJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VUZXJtT3JDVVJJRU9yQWJzVVJJKHZhbHVlLCBkZWZhdWx0Vm9jYWJ1bGFyeSwgdGVybXMsIHByZWZpeGVzLCBiYXNlKSB7XG4gICAgICAvLyBhbGVydChcIlBhcnNpbmcgXCIrdmFsdWUrXCIgd2l0aCBkZWZhdWx0IHZvY2FiIFwiK2RlZmF1bHRWb2NhYnVsYXJ5KVxuICAgICAgdmFsdWUgPSB0aGlzLnRyaW0odmFsdWUpO1xuICAgICAgdmFyIGN1cmllID0gdGhpcy5wYXJzZUNVUklFKHZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICBpZiAoY3VyaWUpIHtcbiAgICAgICAgcmV0dXJuIGN1cmllO1xuICAgICAgfSBlbHNlIGlmICh0ZXJtcykge1xuICAgICAgICBpZiAoZGVmYXVsdFZvY2FidWxhcnkgJiYgIXRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZvY2FidWxhcnkgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGVybSA9IHRlcm1zW3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGN2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRlcm0gPSB0ZXJtc1tsY3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdwYXJzZVRlcm1PckNVUklFT3JVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVRlcm1PckNVUklFT3JVUkkodmFsdWUsIGRlZmF1bHRWb2NhYnVsYXJ5LCB0ZXJtcywgcHJlZml4ZXMsIGJhc2UpIHtcbiAgICAgIC8vIGFsZXJ0KFwiUGFyc2luZyBcIit2YWx1ZStcIiB3aXRoIGRlZmF1bHQgdm9jYWIgXCIrZGVmYXVsdFZvY2FidWxhcnkpXG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgY3VyaWUgPSB0aGlzLnBhcnNlQ1VSSUUodmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgIGlmIChjdXJpZSkge1xuICAgICAgICByZXR1cm4gY3VyaWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGVybSA9IHRlcm1zW3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGN2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRlcm0gPSB0ZXJtc1tsY3ZhbHVlXTtcbiAgICAgICAgaWYgKHRlcm0pIHtcbiAgICAgICAgICByZXR1cm4gdGVybTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFZvY2FidWxhcnkgJiYgIXRoaXMuYWJzVVJJUkUuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZvY2FidWxhcnkgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncGFyc2VVUkknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVVSSSh1cmkpIHtcbiAgICAgIHJldHVybiB1cmk7IC8vIFdlIGp1c3QgdXNlIHN0cmluZ3MgYXMgVVJJcywgbm90IG9iamVjdHMgbm93LlxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3Byb2Nlc3MnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9jZXNzKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgIC8qXG4gICAgICBpZiAoIXdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICB3aW5kb3cuY29uc29sZSA9IHsgbG9nOiBmdW5jdGlvbigpIHt9IH1cbiAgICAgIH0qL1xuICAgICAgdmFyIGJhc2U7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgIGJhc2UgPSBub2RlLmJhc2VVUkk7XG4gICAgICAgIG5vZGUgPSBub2RlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbm9kZS5iYXNlVVJJID0gYmFzZTtcbiAgICAgICAgdGhpcy5zZXRDb250ZXh0KG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICB0aGlzLnNldENvbnRleHQobm9kZSk7XG4gICAgICB9XG4gICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgIC8vIEZpeCBmb3IgRmlyZWZveCB0aGF0IGluY2x1ZGVzIHRoZSBoYXNoIGluIHRoZSBiYXNlIFVSSVxuICAgICAgdmFyIHJlbW92ZUhhc2ggPSBmdW5jdGlvbiByZW1vdmVIYXNoKGJhc2VVUkkpIHtcbiAgICAgICAgLy8gRml4IGZvciB1bmRlZmluZWQgYmFzZVVSSSBwcm9wZXJ0eVxuICAgICAgICBpZiAoIWJhc2VVUkkgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmJhc2VVUkkpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5iYXNlVVJJO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc2ggPSBiYXNlVVJJLmluZGV4T2YoJyMnKTtcbiAgICAgICAgaWYgKGhhc2ggPj0gMCkge1xuICAgICAgICAgIGJhc2VVUkkgPSBiYXNlVVJJLnN1YnN0cmluZygwLCBoYXNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmJhc2VVUklNYXApIHtcbiAgICAgICAgICBiYXNlVVJJID0gb3B0aW9ucy5iYXNlVVJJTWFwKGJhc2VVUkkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVVJJO1xuICAgICAgfTtcbiAgICAgIHF1ZXVlLnB1c2goeyBjdXJyZW50OiBub2RlLFxuICAgICAgICBjb250ZXh0OiB0aGlzLnB1c2gobnVsbCwgcmVtb3ZlSGFzaChub2RlLmJhc2VVUkkpKVxuICAgICAgfSk7XG4gICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGlmIChpdGVtLnBhcmVudCkge1xuICAgICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMTQ6IGxpc3QgdHJpcGxlIGdlbmVyYXRpb25cbiAgICAgICAgICBpZiAoaXRlbS5jb250ZXh0LnBhcmVudCAmJiBpdGVtLmNvbnRleHQucGFyZW50Lmxpc3RNYXBwaW5nID09PSBpdGVtLmxpc3RNYXBwaW5nKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGEgY2hpbGQgY29udGV4dCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgbWFwcGluZ1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBsaXN0cyBmb3IgXCIraXRlbS5zdWJqZWN0K1wiLCB0YWcgXCIraXRlbS5wYXJlbnQubG9jYWxOYW1lKVxuICAgICAgICAgIGZvciAodmFyIF9wcmVkaWNhdGUgaW4gaXRlbS5saXN0TWFwcGluZykge1xuICAgICAgICAgICAgdmFyIGxpc3QgPSBpdGVtLmxpc3RNYXBwaW5nW19wcmVkaWNhdGVdO1xuICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGl0ZW0ucGFyZW50LCBpdGVtLnN1YmplY3QsIF9wcmVkaWNhdGUsIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI25pbCcgfSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJub2RlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxpc3QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIGJub2Rlcy5wdXNoKHRoaXMubmV3QmxhbmtOb2RlKCkpO1xuICAgICAgICAgICAgICAvLyB0aGlzLm5ld1N1YmplY3QoaXRlbS5wYXJlbnQsYm5vZGVzW2ldKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgYm5vZGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoaXRlbS5wYXJlbnQsIGJub2Rlc1tfaTJdLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2ZpcnN0JywgbGlzdFtfaTJdKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoaXRlbS5wYXJlbnQsIGJub2Rlc1tfaTJdLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3Jlc3QnLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogX2kyICsgMSA8IGJub2Rlcy5sZW5ndGggPyBibm9kZXNbX2kyICsgMV0gOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI25pbCcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShpdGVtLnBhcmVudCwgaXRlbS5zdWJqZWN0LCBfcHJlZGljYXRlLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogYm5vZGVzWzBdIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VycmVudCA9IGl0ZW0uY3VycmVudDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBpdGVtLmNvbnRleHQ7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVGFnOiBcIitjdXJyZW50LmxvY2FsTmFtZStcIiwgbGlzdE1hcHBpbmc9XCIrSlNPTi5zdHJpbmdpZnkoY29udGV4dC5saXN0TWFwcGluZykpXG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMVxuICAgICAgICB2YXIgc2tpcCA9IGZhbHNlO1xuICAgICAgICB2YXIgbmV3U3ViamVjdCA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSBudWxsO1xuICAgICAgICB2YXIgdHlwZWRSZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIHZhciBwcmVmaXhlcyA9IGNvbnRleHQucHJlZml4ZXM7XG4gICAgICAgIHZhciBwcmVmaXhlc0NvcGllZCA9IGZhbHNlO1xuICAgICAgICB2YXIgaW5jb21wbGV0ZSA9IFtdO1xuICAgICAgICB2YXIgbGlzdE1hcHBpbmcgPSBjb250ZXh0Lmxpc3RNYXBwaW5nO1xuICAgICAgICB2YXIgbGlzdE1hcHBpbmdEaWZmZXJlbnQgPSAhY29udGV4dC5wYXJlbnQ7XG4gICAgICAgIHZhciBsYW5ndWFnZSA9IGNvbnRleHQubGFuZ3VhZ2U7XG4gICAgICAgIHZhciB2b2NhYnVsYXJ5ID0gY29udGV4dC52b2NhYnVsYXJ5O1xuICAgICAgICAvLyBUT0RPOiB0aGUgXCJiYXNlXCIgZWxlbWVudCBtYXkgYmUgdXNlZCBmb3IgSFRNTCtSREZhIDEuMVxuICAgICAgICBiYXNlID0gdGhpcy5wYXJzZVVSSShyZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSkpO1xuICAgICAgICBjdXJyZW50Lml0ZW0gPSBudWxsO1xuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDI6IHNldCB0aGUgZGVmYXVsdCB2b2NhYnVsYXJ5XG4gICAgICAgIHZhciB2b2NhYkF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgndm9jYWInKTtcbiAgICAgICAgaWYgKHZvY2FiQXR0KSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50cmltKHZvY2FiQXR0LnZhbHVlKTtcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdm9jYWJ1bGFyeSA9IHZhbHVlO1xuICAgICAgICAgICAgdmFyIGJhc2VTdWJqZWN0ID0gYmFzZS5zcGVjO1xuICAgICAgICAgICAgLy8gdGhpcy5uZXdTdWJqZWN0KGN1cnJlbnQsYmFzZVN1YmplY3QpXG4gICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShjdXJyZW50LCBiYXNlU3ViamVjdCwgJ2h0dHA6Ly93d3cudzMub3JnL25zL3JkZmEjdXNlc1ZvY2FidWxhcnknLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogdm9jYWJ1bGFyeSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdm9jYWJ1bGFyeSA9IHRoaXMudm9jYWJ1bGFyeTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VxdWVuY2UgU3RlcCAzOiBJUkkgbWFwcGluZ3NcbiAgICAgICAgLy8gaGFuZGxlIHhtbG5zIGF0dHJpYnV0ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgYXR0ID0gY3VycmVudC5hdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgIC8vIGlmIChhdHQubmFtZXNwYWNlVVJJPT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCIpIHtcbiAgICAgICAgICBpZiAoYXR0Lm5vZGVOYW1lLmNoYXJBdCgwKSA9PT0gJ3gnICYmIGF0dC5ub2RlTmFtZS5pbmRleE9mKCd4bWxuczonKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKCFwcmVmaXhlc0NvcGllZCkge1xuICAgICAgICAgICAgICBwcmVmaXhlcyA9IHRoaXMuY29weU1hcHBpbmdzKHByZWZpeGVzKTtcbiAgICAgICAgICAgICAgcHJlZml4ZXNDb3BpZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHByZWZpeCA9IGF0dC5ub2RlTmFtZS5zdWJzdHJpbmcoNik7XG4gICAgICAgICAgICAvLyBUT0RPOiByZXNvbHZlIHJlbGF0aXZlP1xuICAgICAgICAgICAgdmFyIHJlZiA9IFJERmFQcm9jZXNzb3IudHJpbShhdHQudmFsdWUpO1xuICAgICAgICAgICAgcHJlZml4ZXNbcHJlZml4XSA9IHRoaXMub3B0aW9ucy5iYXNlID8gVXJpLmpvaW4ocmVmLCB0aGlzLm9wdGlvbnMuYmFzZSkgOiByZWY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaXggbWFwcGluZ3MgKEBwcmVmaXgpXG4gICAgICAgIHZhciBwcmVmaXhBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3ByZWZpeCcpO1xuICAgICAgICBpZiAocHJlZml4QXR0KSB7XG4gICAgICAgICAgaWYgKCFwcmVmaXhlc0NvcGllZCkge1xuICAgICAgICAgICAgcHJlZml4ZXMgPSB0aGlzLmNvcHlNYXBwaW5ncyhwcmVmaXhlcyk7XG4gICAgICAgICAgICBwcmVmaXhlc0NvcGllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucGFyc2VQcmVmaXhNYXBwaW5ncyhwcmVmaXhBdHQudmFsdWUsIHByZWZpeGVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDQ6IGxhbmd1YWdlXG4gICAgICAgIHZhciB4bWxMYW5nQXR0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgIXhtbExhbmdBdHQgJiYgX2kzIDwgdGhpcy5sYW5nQXR0cmlidXRlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgICAgeG1sTGFuZ0F0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZU5TKHRoaXMubGFuZ0F0dHJpYnV0ZXNbX2kzXS5uYW1lc3BhY2VVUkksIHRoaXMubGFuZ0F0dHJpYnV0ZXNbX2kzXS5sb2NhbE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4bWxMYW5nQXR0KSB7XG4gICAgICAgICAgdmFyIF92YWx1ZSA9IFJERmFQcm9jZXNzb3IudHJpbSh4bWxMYW5nQXR0LnZhbHVlKTtcbiAgICAgICAgICBpZiAoX3ZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxhbmd1YWdlID0gX3ZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYW5ndWFnZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZWxBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3JlbCcpO1xuICAgICAgICB2YXIgcmV2QXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdyZXYnKTtcbiAgICAgICAgdmFyIHR5cGVvZkF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgndHlwZW9mJyk7XG4gICAgICAgIHZhciBwcm9wZXJ0eUF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgncHJvcGVydHknKTtcbiAgICAgICAgdmFyIGRhdGF0eXBlQXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdkYXRhdHlwZScpO1xuICAgICAgICB2YXIgZGF0ZXRpbWVBdHQgPSB0aGlzLmluSFRNTE1vZGUgPyBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2RhdGV0aW1lJykgOiBudWxsO1xuICAgICAgICB2YXIgY29udGVudEF0dCA9IGN1cnJlbnQuZ2V0QXR0cmlidXRlTm9kZSgnY29udGVudCcpO1xuICAgICAgICB2YXIgYWJvdXRBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2Fib3V0Jyk7XG4gICAgICAgIHZhciBzcmNBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3NyYycpO1xuICAgICAgICB2YXIgcmVzb3VyY2VBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3Jlc291cmNlJyk7XG4gICAgICAgIHZhciBocmVmQXR0ID0gY3VycmVudC5nZXRBdHRyaWJ1dGVOb2RlKCdocmVmJyk7XG4gICAgICAgIHZhciBpbmxpc3RBdHQgPSBjdXJyZW50LmdldEF0dHJpYnV0ZU5vZGUoJ2lubGlzdCcpO1xuICAgICAgICB2YXIgcmVsQXR0UHJlZGljYXRlcyA9IFtdO1xuICAgICAgICB2YXIgcHJlZGljYXRlLCB2YWx1ZXM7XG4gICAgICAgIGlmIChyZWxBdHQpIHtcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHJlbEF0dC52YWx1ZSk7XG4gICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgdmFsdWVzLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHRoaXMucGFyc2VQcmVkaWNhdGUodmFsdWVzW19pNF0sIHZvY2FidWxhcnksIGNvbnRleHQudGVybXMsIHByZWZpeGVzLCBiYXNlLCB0aGlzLmluSFRNTE1vZGUgJiYgcHJvcGVydHlBdHQgIT09IG51bGwpO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgICByZWxBdHRQcmVkaWNhdGVzLnB1c2gocHJlZGljYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJldkF0dFByZWRpY2F0ZXMgPSBbXTtcbiAgICAgICAgaWYgKHJldkF0dCkge1xuICAgICAgICAgIHZhbHVlcyA9IHRoaXMudG9rZW5pemUocmV2QXR0LnZhbHVlKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCB2YWx1ZXMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgICAgICAgcHJlZGljYXRlID0gdGhpcy5wYXJzZVByZWRpY2F0ZSh2YWx1ZXNbX2k1XSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UsIHRoaXMuaW5IVE1MTW9kZSAmJiBwcm9wZXJ0eUF0dCk7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICAgICAgICAgIHJldkF0dFByZWRpY2F0ZXMucHVzaChwcmVkaWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZWN0aW9uIDMuMSwgYnVsbGV0IDdcbiAgICAgICAgaWYgKHRoaXMuaW5IVE1MTW9kZSAmJiAocmVsQXR0IHx8IHJldkF0dCkgJiYgcHJvcGVydHlBdHQpIHtcbiAgICAgICAgICBpZiAocmVsQXR0UHJlZGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlbEF0dCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXZBdHRQcmVkaWNhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV2QXR0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbEF0dCB8fCByZXZBdHQpIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDY6IGVzdGFibGlzaCBuZXcgc3ViamVjdCBhbmQgdmFsdWVcbiAgICAgICAgICBpZiAoYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKGFib3V0QXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSBuZXdTdWJqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIW5ld1N1YmplY3QpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICBuZXdTdWJqZWN0ID0gcmVtb3ZlSGFzaChjdXJyZW50LmJhc2VVUkkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LnBhcmVudE9iamVjdCkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBWZXJpZnk6IElmIHRoZSB4bWw6YmFzZSBoYXMgYmVlbiBzZXQgYW5kIHRoZSBwYXJlbnRPYmplY3QgaXMgdGhlIGJhc2VVUkkgb2YgdGhlIHBhcmVudCwgdGhlbiB0aGUgc3ViamVjdCBuZWVkcyB0byBiZSB0aGUgbmV3IGJhc2UgVVJJXG4gICAgICAgICAgICAgIG5ld1N1YmplY3QgPSByZW1vdmVIYXNoKGN1cnJlbnQucGFyZW50Tm9kZS5iYXNlVVJJKSA9PT0gY29udGV4dC5wYXJlbnRPYmplY3QgPyByZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSkgOiBjb250ZXh0LnBhcmVudE9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc291cmNlQXR0KSB7XG4gICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKHJlc291cmNlQXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaHJlZkF0dCkge1xuICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjQXR0KSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQgJiYgISh0aGlzLmluWEhUTUxNb2RlICYmIChjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2hlYWQnIHx8IGN1cnJlbnQubG9jYWxOYW1lID09PSAnYm9keScpKSkge1xuICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0UmVzb3VyY2UgPSB0aGlzLm5ld0JsYW5rTm9kZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICFhYm91dEF0dCAmJiB0aGlzLmluWEhUTUxNb2RlICYmIChjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2hlYWQnIHx8IGN1cnJlbnQubG9jYWxOYW1lID09PSAnYm9keScpKSB7XG4gICAgICAgICAgICB0eXBlZFJlc291cmNlID0gbmV3U3ViamVjdDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSBjdXJyZW50T2JqZWN0UmVzb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5QXR0ICYmICFjb250ZW50QXR0ICYmICFkYXRhdHlwZUF0dCkge1xuICAgICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgNS4xOiBlc3RhYmxpc2ggYSBuZXcgc3ViamVjdFxuICAgICAgICAgIGlmIChhYm91dEF0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkoYWJvdXRBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCAmJiBjdXJyZW50LnBhcmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICghbmV3U3ViamVjdCAmJiBjb250ZXh0LnBhcmVudE9iamVjdCkge1xuICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5OiBJZiB0aGUgeG1sOmJhc2UgaGFzIGJlZW4gc2V0IGFuZCB0aGUgcGFyZW50T2JqZWN0IGlzIHRoZSBiYXNlVVJJIG9mIHRoZSBwYXJlbnQsIHRoZW4gdGhlIHN1YmplY3QgbmVlZHMgdG8gYmUgdGhlIG5ldyBiYXNlIFVSSVxuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICF0eXBlZFJlc291cmNlKSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSAmJiBocmVmQXR0KSB7XG4gICAgICAgICAgICAgIHR5cGVkUmVzb3VyY2UgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSAmJiBzcmNBdHQpIHtcbiAgICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXR5cGVkUmVzb3VyY2UgJiYgKHRoaXMuaW5YSFRNTE1vZGUgfHwgdGhpcy5pbkhUTUxNb2RlKSAmJiAoY3VycmVudC5sb2NhbE5hbWUgPT09ICdoZWFkJyB8fCBjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ2JvZHknKSkge1xuICAgICAgICAgICAgICB0eXBlZFJlc291cmNlID0gbmV3U3ViamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdHlwZWRSZXNvdXJjZSkge1xuICAgICAgICAgICAgICB0eXBlZFJlc291cmNlID0gdGhpcy5uZXdCbGFua05vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHR5cGVkUmVzb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQubG9jYWxOYW1lK1wiLCBuZXdTdWJqZWN0PVwiK25ld1N1YmplY3QrXCIsIHR5cGVkUmVzb3VyY2U9XCIrdHlwZWRSZXNvdXJjZStcIiwgY3VycmVudE9iamVjdFJlc291cmNlPVwiK2N1cnJlbnRPYmplY3RSZXNvdXJjZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDUuMjogZXN0YWJsaXNoIGEgbmV3IHN1YmplY3RcbiAgICAgICAgICBpZiAoYWJvdXRBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnBhcnNlU2FmZUNVUklFT3JDVVJJRU9yVVJJKGFib3V0QXR0LnZhbHVlLCBwcmVmaXhlcywgYmFzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCAmJiByZXNvdXJjZUF0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuZXdTdWJqZWN0ICYmIGhyZWZBdHQpIHtcbiAgICAgICAgICAgIG5ld1N1YmplY3QgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuZXdTdWJqZWN0ICYmIHNyY0F0dCkge1xuICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMucmVzb2x2ZUFuZE5vcm1hbGl6ZShiYXNlLCBlbmNvZGVVUkkoc3JjQXR0LnZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghbmV3U3ViamVjdCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgIG5ld1N1YmplY3QgPSByZW1vdmVIYXNoKGN1cnJlbnQuYmFzZVVSSSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmluWEhUTUxNb2RlIHx8IHRoaXMuaW5IVE1MTW9kZSkgJiYgKGN1cnJlbnQubG9jYWxOYW1lID09PSAnaGVhZCcgfHwgY3VycmVudC5sb2NhbE5hbWUgPT09ICdib2R5JykpIHtcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2ZBdHQpIHtcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHRoaXMubmV3QmxhbmtOb2RlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQucGFyZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeTogSWYgdGhlIHhtbDpiYXNlIGhhcyBiZWVuIHNldCBhbmQgdGhlIHBhcmVudE9iamVjdCBpcyB0aGUgYmFzZVVSSSBvZiB0aGUgcGFyZW50LCB0aGVuIHRoZSBzdWJqZWN0IG5lZWRzIHRvIGJlIHRoZSBuZXcgYmFzZSBVUklcbiAgICAgICAgICAgICAgbmV3U3ViamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5QXR0KSB7XG4gICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZkF0dCkge1xuICAgICAgICAgICAgdHlwZWRSZXNvdXJjZSA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQudGFnTmFtZStcIjogbmV3U3ViamVjdD1cIituZXdTdWJqZWN0K1wiLCBjdXJyZW50T2JqZWN0UmVzb3VyY2U9XCIrY3VycmVudE9iamVjdFJlc291cmNlK1wiLCB0eXBlZFJlc291cmNlPVwiK3R5cGVkUmVzb3VyY2UrXCIsIHNraXA9XCIrc2tpcClcbiAgICAgICAgLy8gdmFyIHJkZmFEYXRhID0gbnVsbFxuICAgICAgICBpZiAobmV3U3ViamVjdCkge1xuICAgICAgICAgIC8vIHRoaXMubmV3U3ViamVjdChjdXJyZW50LG5ld1N1YmplY3QpXG4gICAgICAgICAgaWYgKGFib3V0QXR0IHx8IHJlc291cmNlQXR0IHx8IHR5cGVkUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IG5ld1N1YmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mQXR0ICYmICFhYm91dEF0dCAmJiAhcmVzb3VyY2VBdHQgJiYgY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICAgIGlkID0gY3VycmVudE9iamVjdFJlc291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJTZXR0aW5nIGRhdGEgYXR0cmlidXRlIGZvciBcIitjdXJyZW50LmxvY2FsTmFtZStcIiBmb3Igc3ViamVjdCBcIitpZClcbiAgICAgICAgICAgIHRoaXMubmV3U3ViamVjdE9yaWdpbihjdXJyZW50LCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgNzogZ2VuZXJhdGUgdHlwZSB0cmlwbGVcbiAgICAgICAgaWYgKHR5cGVkUmVzb3VyY2UpIHtcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHR5cGVvZkF0dC52YWx1ZSk7XG4gICAgICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgdmFsdWVzLmxlbmd0aDsgX2k2KyspIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSSh2YWx1ZXNbX2k2XSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKG9iamVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmFkZFRyaXBsZShjdXJyZW50LCB0eXBlZFJlc291cmNlLCBSREZhUHJvY2Vzc29yLnR5cGVVUkksIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiBvYmplY3QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgODogbmV3IGxpc3QgbWFwcGluZ3MgaWYgdGhlcmUgaXMgYSBuZXcgc3ViamVjdFxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlN0ZXAgODogbmV3U3ViamVjdD1cIituZXdTdWJqZWN0K1wiLCBjb250ZXh0LnBhcmVudE9iamVjdD1cIitjb250ZXh0LnBhcmVudE9iamVjdClcbiAgICAgICAgaWYgKG5ld1N1YmplY3QgJiYgbmV3U3ViamVjdCAhPT0gY29udGV4dC5wYXJlbnRPYmplY3QpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGxpc3QgbWFwcGluZyBmb3IgXCIrbmV3U3ViamVjdClcbiAgICAgICAgICBsaXN0TWFwcGluZyA9IHt9O1xuICAgICAgICAgIGxpc3RNYXBwaW5nRGlmZmVyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXF1ZW5jZSBTdGVwIDk6IGdlbmVyYXRlIG9iamVjdCB0cmlwbGVcbiAgICAgICAgaWYgKGN1cnJlbnRPYmplY3RSZXNvdXJjZSkge1xuICAgICAgICAgIGlmIChyZWxBdHQgJiYgaW5saXN0QXR0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCByZWxBdHRQcmVkaWNhdGVzLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgICAgICAgdmFyIF9saXN0ID0gbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTddXTtcbiAgICAgICAgICAgICAgaWYgKCFfbGlzdCkge1xuICAgICAgICAgICAgICAgIF9saXN0ID0gW107XG4gICAgICAgICAgICAgICAgbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTddXSA9IF9saXN0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9saXN0LnB1c2goeyB0eXBlOiBSREZhUHJvY2Vzc29yLm9iamVjdFVSSSwgdmFsdWU6IGN1cnJlbnRPYmplY3RSZXNvdXJjZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJlbEF0dCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIHJlbEF0dFByZWRpY2F0ZXNbX2k4XSwgeyB0eXBlOiBSREZhUHJvY2Vzc29yLm9iamVjdFVSSSwgdmFsdWU6IGN1cnJlbnRPYmplY3RSZXNvdXJjZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldkF0dCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgcmV2QXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pOSsrKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIGN1cnJlbnRPYmplY3RSZXNvdXJjZSwgcmV2QXR0UHJlZGljYXRlc1tfaTldLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VxdWVuY2UgU3RlcCAxMDogaW5jb21wbGV0ZSB0cmlwbGVzXG4gICAgICAgICAgaWYgKG5ld1N1YmplY3QgJiYgIWN1cnJlbnRPYmplY3RSZXNvdXJjZSAmJiAocmVsQXR0IHx8IHJldkF0dCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRPYmplY3RSZXNvdXJjZSA9IHRoaXMubmV3QmxhbmtOb2RlKCk7XG4gICAgICAgICAgICAvLyBhbGVydChjdXJyZW50LnRhZ05hbWUrXCI6IGdlbmVyYXRlZCBibGFuayBub2RlLCBuZXdTdWJqZWN0PVwiK25ld1N1YmplY3QrXCIgY3VycmVudE9iamVjdFJlc291cmNlPVwiK2N1cnJlbnRPYmplY3RSZXNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlbEF0dCAmJiBpbmxpc3RBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTAgPSAwOyBfaTEwIDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTArKykge1xuICAgICAgICAgICAgICB2YXIgX2xpc3QyID0gbGlzdE1hcHBpbmdbcmVsQXR0UHJlZGljYXRlc1tfaTEwXV07XG4gICAgICAgICAgICAgIGlmICghX2xpc3QyKSB7XG4gICAgICAgICAgICAgICAgX2xpc3QyID0gW107XG4gICAgICAgICAgICAgICAgbGlzdE1hcHBpbmdbcHJlZGljYXRlXSA9IF9saXN0MjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkZGluZyBpbmNvbXBsZXRlIGxpc3QgZm9yIFwiK3ByZWRpY2F0ZSlcbiAgICAgICAgICAgICAgaW5jb21wbGV0ZS5wdXNoKHsgcHJlZGljYXRlOiByZWxBdHRQcmVkaWNhdGVzW19pMTBdLCBsaXN0OiBfbGlzdDIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWxBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgcmVsQXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTErKykge1xuICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goeyBwcmVkaWNhdGU6IHJlbEF0dFByZWRpY2F0ZXNbX2kxMV0sIGZvcndhcmQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXZBdHQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgcmV2QXR0UHJlZGljYXRlcy5sZW5ndGg7IF9pMTIrKykge1xuICAgICAgICAgICAgICBpbmNvbXBsZXRlLnB1c2goeyBwcmVkaWNhdGU6IHJldkF0dFByZWRpY2F0ZXNbX2kxMl0sIGZvcndhcmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTdGVwIDExOiBDdXJyZW50IHByb3BlcnR5IHZhbHVlc1xuICAgICAgICBpZiAocHJvcGVydHlBdHQpIHtcbiAgICAgICAgICB2YXIgZGF0YXR5cGUgPSBudWxsO1xuICAgICAgICAgIHZhciBjb250ZW50ID0gbnVsbDtcbiAgICAgICAgICBpZiAoZGF0YXR5cGVBdHQpIHtcbiAgICAgICAgICAgIGRhdGF0eXBlID0gZGF0YXR5cGVBdHQudmFsdWUgPT09ICcnID8gUkRGYVByb2Nlc3Nvci5QbGFpbkxpdGVyYWxVUkkgOiB0aGlzLnBhcnNlVGVybU9yQ1VSSUVPckFic1VSSShkYXRhdHlwZUF0dC52YWx1ZSwgdm9jYWJ1bGFyeSwgY29udGV4dC50ZXJtcywgcHJlZml4ZXMsIGJhc2UpO1xuICAgICAgICAgICAgaWYgKGRhdGV0aW1lQXR0ICYmICFjb250ZW50QXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBkYXRldGltZUF0dC52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBkYXRhdHlwZSA9PT0gUkRGYVByb2Nlc3Nvci5YTUxMaXRlcmFsVVJJIHx8IGRhdGF0eXBlID09PSBSREZhUHJvY2Vzc29yLkhUTUxMaXRlcmFsVVJJID8gbnVsbCA6IGNvbnRlbnRBdHQgPyBjb250ZW50QXR0LnZhbHVlIDogY3VycmVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRBdHQpIHtcbiAgICAgICAgICAgIGRhdGF0eXBlID0gUkRGYVByb2Nlc3Nvci5QbGFpbkxpdGVyYWxVUkk7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudEF0dC52YWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGV0aW1lQXR0KSB7XG4gICAgICAgICAgICBjb250ZW50ID0gZGF0ZXRpbWVBdHQudmFsdWU7XG4gICAgICAgICAgICBkYXRhdHlwZSA9IFJERmFQcm9jZXNzb3IuZGVyaXZlRGF0ZVRpbWVUeXBlKGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFkYXRhdHlwZSkge1xuICAgICAgICAgICAgICBkYXRhdHlwZSA9IFJERmFQcm9jZXNzb3IuUGxhaW5MaXRlcmFsVVJJO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoIXJlbEF0dCAmJiAhcmV2QXR0KSB7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VBdHQpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMucGFyc2VTYWZlQ1VSSUVPckNVUklFT3JVUkkocmVzb3VyY2VBdHQudmFsdWUsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29udGVudCAmJiBocmVmQXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKGhyZWZBdHQudmFsdWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbnRlbnQgJiYgc3JjQXR0KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLnJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgZW5jb2RlVVJJKHNyY0F0dC52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFkYXRhdHlwZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZkF0dCAmJiAhYWJvdXRBdHQpIHtcbiAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTtcbiAgICAgICAgICAgICAgY29udGVudCA9IHR5cGVkUmVzb3VyY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb250ZW50ID0gY3VycmVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW5IVE1MTW9kZSAmJiBjdXJyZW50LmxvY2FsTmFtZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLmRlcml2ZURhdGVUaW1lVHlwZShjb250ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhdGF0eXBlKSB7XG4gICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRva2VuaXplKHByb3BlcnR5QXR0LnZhbHVlKTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gMDsgX2kxMyA8IHZhbHVlcy5sZW5ndGg7IF9pMTMrKykge1xuICAgICAgICAgICAgdmFyIF9wcmVkaWNhdGUyID0gdGhpcy5wYXJzZVByZWRpY2F0ZSh2YWx1ZXNbX2kxM10sIHZvY2FidWxhcnksIGNvbnRleHQudGVybXMsIHByZWZpeGVzLCBiYXNlKTtcbiAgICAgICAgICAgIGlmIChfcHJlZGljYXRlMikge1xuICAgICAgICAgICAgICBpZiAoaW5saXN0QXR0KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9saXN0MyA9IGxpc3RNYXBwaW5nW19wcmVkaWNhdGUyXTtcbiAgICAgICAgICAgICAgICBpZiAoIV9saXN0Mykge1xuICAgICAgICAgICAgICAgICAgX2xpc3QzID0gW107XG4gICAgICAgICAgICAgICAgICBsaXN0TWFwcGluZ1tfcHJlZGljYXRlMl0gPSBfbGlzdDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9saXN0My5wdXNoKGRhdGF0eXBlID09PSBSREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkkgfHwgZGF0YXR5cGUgPT09IFJERmFQcm9jZXNzb3IuSFRNTExpdGVyYWxVUkkgPyB7IHR5cGU6IGRhdGF0eXBlLCB2YWx1ZTogY3VycmVudC5jaGlsZE5vZGVzIH0gOiB7IHR5cGU6IGRhdGF0eXBlID8gZGF0YXR5cGUgOiBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSwgdmFsdWU6IGNvbnRlbnQsIGxhbmd1YWdlOiBsYW5ndWFnZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YXR5cGUgPT09IFJERmFQcm9jZXNzb3IuWE1MTGl0ZXJhbFVSSSB8fCBkYXRhdHlwZSA9PT0gUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoY3VycmVudCwgbmV3U3ViamVjdCwgX3ByZWRpY2F0ZTIsIHsgdHlwZTogZGF0YXR5cGUsIHZhbHVlOiBjdXJyZW50LmNoaWxkTm9kZXMgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIF9wcmVkaWNhdGUyLCB7IHR5cGU6IGRhdGF0eXBlID8gZGF0YXR5cGUgOiBSREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSwgdmFsdWU6IGNvbnRlbnQsIGxhbmd1YWdlOiBsYW5ndWFnZSB9KTtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG5ld1N1YmplY3QrXCIgXCIrcHJlZGljYXRlK1wiPVwiK2NvbnRlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNlcXVlbmNlIFN0ZXAgMTI6IGNvbXBsZXRlIGluY29tcGxldGUgdHJpcGxlcyB3aXRoIG5ldyBzdWJqZWN0XG4gICAgICAgIGlmIChuZXdTdWJqZWN0ICYmICFza2lwKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBjb250ZXh0LmluY29tcGxldGUubGVuZ3RoOyBfaTE0KyspIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluY29tcGxldGVbX2kxNF0ubGlzdCkge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkZGluZyBzdWJqZWN0IFwiK25ld1N1YmplY3QrXCIgdG8gbGlzdCBmb3IgXCIrY29udGV4dC5pbmNvbXBsZXRlW2ldLnByZWRpY2F0ZSlcbiAgICAgICAgICAgICAgLy8gVE9ETzogaXQgaXMgdW5jbGVhciB3aGF0IHRvIGRvIGhlcmVcbiAgICAgICAgICAgICAgY29udGV4dC5pbmNvbXBsZXRlW19pMTRdLmxpc3QucHVzaCh7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5pbmNvbXBsZXRlW19pMTRdLmZvcndhcmQpIHtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY3VycmVudC50YWdOYW1lK1wiOiBjb21wbGV0aW5nIGZvcndhcmQgdHJpcGxlIFwiK2NvbnRleHQuaW5jb21wbGV0ZVtpXS5wcmVkaWNhdGUrXCIgd2l0aCBvYmplY3Q9XCIrbmV3U3ViamVjdClcbiAgICAgICAgICAgICAgdGhpcy5hZGRUcmlwbGUoY3VycmVudCwgY29udGV4dC5zdWJqZWN0LCBjb250ZXh0LmluY29tcGxldGVbX2kxNF0ucHJlZGljYXRlLCB7IHR5cGU6IFJERmFQcm9jZXNzb3Iub2JqZWN0VVJJLCB2YWx1ZTogbmV3U3ViamVjdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGN1cnJlbnQudGFnTmFtZStcIjogY29tcGxldGluZyByZXZlcnNlIHRyaXBsZSB3aXRoIG9iamVjdD1cIitjb250ZXh0LnN1YmplY3QpXG4gICAgICAgICAgICAgIHRoaXMuYWRkVHJpcGxlKGN1cnJlbnQsIG5ld1N1YmplY3QsIGNvbnRleHQuaW5jb21wbGV0ZVtfaTE0XS5wcmVkaWNhdGUsIHsgdHlwZTogUkRGYVByb2Nlc3Nvci5vYmplY3RVUkksIHZhbHVlOiBjb250ZXh0LnN1YmplY3QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZENvbnRleHQgPSBudWxsO1xuICAgICAgICB2YXIgbGlzdFN1YmplY3QgPSBuZXdTdWJqZWN0O1xuICAgICAgICBpZiAoc2tpcCkge1xuICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBzdWJqZWN0IGJlIG51bGw/XG4gICAgICAgICAgY2hpbGRDb250ZXh0ID0gdGhpcy5wdXNoKGNvbnRleHQsIGNvbnRleHQuc3ViamVjdCk7XG4gICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHRoZSBlbnRPYmplY3QgYmUgcGFzc2VkIGFsb25nPyAgSWYgbm90LCB0aGVuIGludGVybWVkaWFyeSBjaGlsZHJlbiB3aWxsIGtlZXAgcHJvcGVydGllcyBmcm9tIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBpbmNvbXBsZXRlIHRyaXBsZXMuXG4gICAgICAgICAgLy8gVE9ETzogVmVyaWZ5OiBpZiB0aGUgY3VycmVudCBiYXNlVVJJIGhhcyBjaGFuZ2VkIGFuZCB0aGUgcGFyZW50T2JqZWN0IGlzIHRoZSBwYXJlbnQncyBiYXNlIFVSSSwgdGhlbiB0aGUgYmFzZVVSSSBzaG91bGQgY2hhbmdlXG4gICAgICAgICAgY2hpbGRDb250ZXh0LnBhcmVudE9iamVjdCA9IHJlbW92ZUhhc2goY3VycmVudC5wYXJlbnROb2RlLmJhc2VVUkkpID09PSBjb250ZXh0LnBhcmVudE9iamVjdCA/IHJlbW92ZUhhc2goY3VycmVudC5iYXNlVVJJKSA6IGNvbnRleHQucGFyZW50T2JqZWN0O1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5pbmNvbXBsZXRlID0gY29udGV4dC5pbmNvbXBsZXRlO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5wcmVmaXhlcyA9IHByZWZpeGVzO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC52b2NhYnVsYXJ5ID0gdm9jYWJ1bGFyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZENvbnRleHQgPSB0aGlzLnB1c2goY29udGV4dCwgbmV3U3ViamVjdCk7XG4gICAgICAgICAgY2hpbGRDb250ZXh0LnBhcmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RSZXNvdXJjZSA/IGN1cnJlbnRPYmplY3RSZXNvdXJjZSA6IG5ld1N1YmplY3QgPyBuZXdTdWJqZWN0IDogY29udGV4dC5zdWJqZWN0O1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5wcmVmaXhlcyA9IHByZWZpeGVzO1xuICAgICAgICAgIGNoaWxkQ29udGV4dC5pbmNvbXBsZXRlID0gaW5jb21wbGV0ZTtcbiAgICAgICAgICBpZiAoY3VycmVudE9iamVjdFJlc291cmNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbmV3IGxpc3QgbWFwcGluZyBmb3IgXCIrY3VycmVudE9iamVjdFJlc291cmNlKVxuICAgICAgICAgICAgbGlzdFN1YmplY3QgPSBjdXJyZW50T2JqZWN0UmVzb3VyY2U7XG4gICAgICAgICAgICBsaXN0TWFwcGluZyA9IHt9O1xuICAgICAgICAgICAgbGlzdE1hcHBpbmdEaWZmZXJlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZENvbnRleHQubGlzdE1hcHBpbmcgPSBsaXN0TWFwcGluZztcbiAgICAgICAgICBjaGlsZENvbnRleHQubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgICBjaGlsZENvbnRleHQudm9jYWJ1bGFyeSA9IHZvY2FidWxhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RNYXBwaW5nRGlmZmVyZW50KSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQdXNoaW5nIGxpc3QgcGFyZW50IFwiK2N1cnJlbnQubG9jYWxOYW1lKVxuICAgICAgICAgIHF1ZXVlLnVuc2hpZnQoeyBwYXJlbnQ6IGN1cnJlbnQsIGNvbnRleHQ6IGNvbnRleHQsIHN1YmplY3Q6IGxpc3RTdWJqZWN0LCBsaXN0TWFwcGluZzogbGlzdE1hcHBpbmcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBjdXJyZW50Lmxhc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQdXNoaW5nIGNoaWxkIFwiK2NoaWxkLmxvY2FsTmFtZSlcbiAgICAgICAgICAgIGNoaWxkLmJhc2VVUkkgPSBjdXJyZW50LmJhc2VVUkk7XG4gICAgICAgICAgICBxdWV1ZS51bnNoaWZ0KHsgY3VycmVudDogY2hpbGQsIGNvbnRleHQ6IGNoaWxkQ29udGV4dCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluSFRNTE1vZGUpIHtcbiAgICAgICAgdGhpcy5jb3B5UHJvcGVydGllcygpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCB0aGlzLmZpbmlzaGVkSGFuZGxlcnMubGVuZ3RoOyBfaTE1KyspIHtcbiAgICAgICAgdGhpcy5maW5pc2hlZEhhbmRsZXJzW19pMTVdKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3B1c2gnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwdXNoKHBhcmVudCwgc3ViamVjdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIHN1YmplY3Q6IHN1YmplY3QgPyBzdWJqZWN0IDogcGFyZW50ID8gcGFyZW50LnN1YmplY3QgOiBudWxsLFxuICAgICAgICBwYXJlbnRPYmplY3Q6IG51bGwsXG4gICAgICAgIGluY29tcGxldGU6IFtdLFxuICAgICAgICBsaXN0TWFwcGluZzogcGFyZW50ID8gcGFyZW50Lmxpc3RNYXBwaW5nIDoge30sXG4gICAgICAgIGxhbmd1YWdlOiBwYXJlbnQgPyBwYXJlbnQubGFuZ3VhZ2UgOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICBwcmVmaXhlczogcGFyZW50ID8gcGFyZW50LnByZWZpeGVzIDogdGhpcy50YXJnZXQuZ3JhcGgucHJlZml4ZXMsXG4gICAgICAgIHRlcm1zOiBwYXJlbnQgPyBwYXJlbnQudGVybXMgOiB0aGlzLnRhcmdldC5ncmFwaC50ZXJtcyxcbiAgICAgICAgdm9jYWJ1bGFyeTogcGFyZW50ID8gcGFyZW50LnZvY2FidWxhcnkgOiB0aGlzLnZvY2FidWxhcnlcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVzb2x2ZUFuZE5vcm1hbGl6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVBbmROb3JtYWxpemUoYmFzZSwgdXJpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkpvaW5pbmcgXCIgKyB1cmkgKyBcIiB0byBcIiArIGJhc2UgKyBcIiBtYWtpbmcgXCIgKyAgVXJpLmpvaW4odXJpLCBiYXNlKSlcbiAgICAgIHJldHVybiBVcmkuam9pbih1cmksIGJhc2UpOyAvLyBAQCBub3JtYWxpemU/XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnc2V0Q29udGV4dCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRleHQobm9kZSkge1xuICAgICAgLy8gV2Ugb25seSByZWNvZ25pemVkIFhIVE1MK1JERmEgMS4xIGlmIHRoZSB2ZXJzaW9uIGlzIHNldCBwcm9wZXJ0eWx5XG4gICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdodG1sJyAmJiBub2RlLmdldEF0dHJpYnV0ZSgndmVyc2lvbicpID09PSAnWEhUTUwrUkRGYSAxLjEnKSB7XG4gICAgICAgIHRoaXMuc2V0WEhUTUxDb250ZXh0KCk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubG9jYWxOYW1lID09PSAnaHRtbCcgfHwgbm9kZS5uYW1lc3BhY2VVUkkgPT09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJykge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N0eXBlKSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3R5cGUucHVibGljSWQgPT09ICctLy9XM0MvL0RURCBYSFRNTCtSREZhIDEuMC8vRU4nICYmIGRvY3VtZW50LmRvY3R5cGUuc3lzdGVtSWQgPT09ICdodHRwOi8vd3d3LnczLm9yZy9NYXJrVXAvRFREL3hodG1sLXJkZmEtMS5kdGQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogUkRGIDEuMCBpcyBub3Qgc3VwcG9ydGVkLiAgRGVmYXVsdGluZyB0byBIVE1MNSBtb2RlLicpO1xuICAgICAgICAgICAgdGhpcy5zZXRIVE1MQ29udGV4dCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZG9jdHlwZS5wdWJsaWNJZCA9PT0gJy0vL1czQy8vRFREIFhIVE1MK1JERmEgMS4xLy9FTicgJiYgZG9jdW1lbnQuZG9jdHlwZS5zeXN0ZW1JZCA9PT0gJ2h0dHA6Ly93d3cudzMub3JnL01hcmtVcC9EVEQveGh0bWwtcmRmYS0yLmR0ZCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0WEhUTUxDb250ZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SFRNTENvbnRleHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRIVE1MQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFhNTENvbnRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRIVE1MQ29udGV4dCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEhUTUxDb250ZXh0KCkge1xuICAgICAgdGhpcy5zZXRJbml0aWFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnXG4gICAgICB9LCB7IG5hbWVzcGFjZVVSSTogbnVsbCwgbG9jYWxOYW1lOiAnbGFuZycgfV07XG4gICAgICB0aGlzLmluWEhUTUxNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmluSFRNTE1vZGUgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldEluaXRpYWxDb250ZXh0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SW5pdGlhbENvbnRleHQoKSB7XG4gICAgICB0aGlzLnZvY2FidWxhcnkgPSBudWxsO1xuICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIHByZWZpeGVzIGFyZSB0ZXJtcyBhcmUgbG9hZGVkIHRvIHRoZSBSREZhIDEuMS4gc3RhbmRhcmQgd2l0aGluIHRoZSBncmFwaCBjb25zdHJ1Y3RvclxuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnXG4gICAgICB9XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXRYSFRNTENvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRYSFRNTENvbnRleHQoKSB7XG4gICAgICB0aGlzLnNldEluaXRpYWxDb250ZXh0KCk7XG4gICAgICB0aGlzLmluWEhUTUxNb2RlID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5IVE1MTW9kZSA9IGZhbHNlO1xuICAgICAgdGhpcy5sYW5nQXR0cmlidXRlcyA9IFt7XG4gICAgICAgIG5hbWVzcGFjZVVSSTogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgICAgIGxvY2FsTmFtZTogJ2xhbmcnIH0sIHsgbmFtZXNwYWNlVVJJOiBudWxsLCBsb2NhbE5hbWU6ICdsYW5nJyB9XTtcbiAgICAgIC8vIEZyb20gaHR0cDovL3d3dy53My5vcmcvMjAxMS9yZGZhLWNvbnRleHQveGh0bWwtcmRmYS0xLjFcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydhbHRlcm5hdGUnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2FsdGVybmF0ZSc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snYXBwZW5kaXgnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2FwcGVuZGl4JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydib29rbWFyayddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjYm9va21hcmsnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NpdGUnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2NpdGUnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NoYXB0ZXInXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2NoYXB0ZXInO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2NvbnRlbnRzJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNjb250ZW50cyc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snY29weXJpZ2h0J10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNjb3B5cmlnaHQnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2ZpcnN0J10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNmaXJzdCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snZ2xvc3NhcnknXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2dsb3NzYXJ5JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydoZWxwJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNoZWxwJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydpY29uJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNpY29uJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydpbmRleCddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjaW5kZXgnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2xhc3QnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2xhc3QnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ2xpY2Vuc2UnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI2xpY2Vuc2UnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ21ldGEnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI21ldGEnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ25leHQnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI25leHQnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ3ByZXYnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3ByZXYnO1xuICAgICAgdGhpcy50YXJnZXQuZ3JhcGgudGVybXNbJ3ByZXZpb3VzJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNwcmV2aW91cyc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc2VjdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc2VjdGlvbic7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3R5bGVzaGVldCddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc3R5bGVzaGVldCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3Vic2VjdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjc3Vic2VjdGlvbic7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1snc3RhcnQnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3N0YXJ0JztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWyd0b3AnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3RvcCc7XG4gICAgICB0aGlzLnRhcmdldC5ncmFwaC50ZXJtc1sndXAnXSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sL3ZvY2FiI3VwJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydwM3B2MSddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjcDNwdjEnO1xuICAgICAgLy8gb3RoZXJcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydyZWxhdGVkJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNyZWxhdGVkJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWydyb2xlJ10gPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbC92b2NhYiNyb2xlJztcbiAgICAgIHRoaXMudGFyZ2V0LmdyYXBoLnRlcm1zWyd0cmFuc2Zvcm1hdGlvbiddID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwvdm9jYWIjdHJhbnNmb3JtYXRpb24nO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3NldFhNTENvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRYTUxDb250ZXh0KCkge1xuICAgICAgdGhpcy5zZXRJbml0aWFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5pblhIVE1MTW9kZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pbkhUTUxNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9rZW5pemUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b2tlbml6ZShzdHIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyaW0oc3RyKS5zcGxpdCgvXFxzKy8pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvUkRGTm9kZU9iamVjdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvUkRGTm9kZU9iamVjdCh4KSB7XG4gICAgICBpZiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoeC5zdWJzdHJpbmcoMCwgMikgPT09ICdfOicpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmxhbmtOb2Rlc1t4LnN1YnN0cmluZygyKV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmJsYW5rTm9kZXNbeC5zdWJzdHJpbmcoMildID0gbmV3IEJsYW5rTm9kZSh4LnN1YnN0cmluZygyKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmJsYW5rTm9kZXNbeC5zdWJzdHJpbmcoMildO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZGYubmFtZWROb2RlKHgpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh4LnR5cGUpIHtcbiAgICAgICAgY2FzZSBSREZhUHJvY2Vzc29yLm9iamVjdFVSSTpcbiAgICAgICAgICBpZiAoeC52YWx1ZS5zdWJzdHJpbmcoMCwgMikgPT09ICdfOicpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5ibGFua05vZGVzW3gudmFsdWUuc3Vic3RyaW5nKDIpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5ibGFua05vZGVzW3gudmFsdWUuc3Vic3RyaW5nKDIpXSA9IG5ldyBCbGFua05vZGUoeC52YWx1ZS5zdWJzdHJpbmcoMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxhbmtOb2Rlc1t4LnZhbHVlLnN1YnN0cmluZygyKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZGYubmFtZWROb2RlKHgudmFsdWUpO1xuICAgICAgICBjYXNlIFJERmFQcm9jZXNzb3IuUGxhaW5MaXRlcmFsVVJJOlxuICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh4LnZhbHVlLCB4Lmxhbmd1YWdlIHx8ICcnKTtcbiAgICAgICAgY2FzZSBSREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkk6XG4gICAgICAgIGNhc2UgUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSTpcbiAgICAgICAgICB2YXIgc3RyaW5nID0gJyc7XG4gICAgICAgICAgT2JqZWN0LmtleXMoeC52YWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgc3RyaW5nICs9IFV0aWwuZG9tVG9TdHJpbmcoeC52YWx1ZVtpXSwgdGhpcy5odG1sT3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHN0cmluZywgJycsIG5ldyBOYW1lZE5vZGUoeC50eXBlKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHgudmFsdWUsICcnLCBuZXcgTmFtZWROb2RlKHgudHlwZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RyaW0nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmltKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzXFxzKi8sICcnKS5yZXBsYWNlKC9cXHNcXHMqJC8sICcnKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogJ3BhcnNlUkRGYURPTScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUkRGYURPTShkb20sIGtiLCBiYXNlKSB7XG4gICAgICB2YXIgcCA9IG5ldyBSREZhUHJvY2Vzc29yKGtiLCB7ICdiYXNlJzogYmFzZSB9KTtcbiAgICAgIGRvbS5iYXNlVVJJID0gYmFzZTtcbiAgICAgIHAucHJvY2Vzcyhkb20pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSREZhUHJvY2Vzc29yO1xufSgpO1xuXG5SREZhUHJvY2Vzc29yLlhNTExpdGVyYWxVUkkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI1hNTExpdGVyYWwnO1xuUkRGYVByb2Nlc3Nvci5IVE1MTGl0ZXJhbFVSSSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjSFRNTCc7XG5SREZhUHJvY2Vzc29yLlBsYWluTGl0ZXJhbFVSSSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjUGxhaW5MaXRlcmFsJztcblJERmFQcm9jZXNzb3Iub2JqZWN0VVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyNvYmplY3QnO1xuUkRGYVByb2Nlc3Nvci50eXBlVVJJID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJztcblJERmFQcm9jZXNzb3IubmFtZUNoYXIgPSAnWy1BLVpfYS16XFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUxMDAwMC1cXHVFRkZGRi4wLTlcXHhCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0nO1xuUkRGYVByb2Nlc3Nvci5uYW1lU3RhcnRDaGFyID0gJ1tBLVphLXpcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx4RkZcXHUwMTAwLVxcdTAxMzFcXHUwMTM0LVxcdTAxM0VcXHUwMTQxLVxcdTAxNDhcXHUwMTRBLVxcdTAxN0VcXHUwMTgwLVxcdTAxQzNcXHUwMUNELVxcdTAxRjBcXHUwMUY0LVxcdTAxRjVcXHUwMUZBLVxcdTAyMTdcXHUwMjUwLVxcdTAyQThcXHUwMkJCLVxcdTAyQzFcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNDRVxcdTAzRDAtXFx1MDNENlxcdTAzREFcXHUwM0RDXFx1MDNERVxcdTAzRTBcXHUwM0UyLVxcdTAzRjNcXHUwNDAxLVxcdTA0MENcXHUwNDBFLVxcdTA0NEZcXHUwNDUxLVxcdTA0NUNcXHUwNDVFLVxcdTA0ODFcXHUwNDkwLVxcdTA0QzRcXHUwNEM3LVxcdTA0QzhcXHUwNENCLVxcdTA0Q0NcXHUwNEQwLVxcdTA0RUJcXHUwNEVFLVxcdTA0RjVcXHUwNEY4LVxcdTA0RjlcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg2XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMS1cXHUwNjNBXFx1MDY0MS1cXHUwNjRBXFx1MDY3MS1cXHUwNkI3XFx1MDZCQS1cXHUwNkJFXFx1MDZDMC1cXHUwNkNFXFx1MDZEMC1cXHUwNkQzXFx1MDZENVxcdTA2RTUtXFx1MDZFNlxcdTA5MDUtXFx1MDkzOVxcdTA5M0RcXHUwOTU4LVxcdTA5NjFcXHUwOTg1LVxcdTA5OENcXHUwOThGLVxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlEQy1cXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMC1cXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRi1cXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMi1cXHUwQTMzXFx1MEEzNS1cXHUwQTM2XFx1MEEzOC1cXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4QlxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyLVxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFFMFxcdTBCMDUtXFx1MEIwQ1xcdTBCMEYtXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzItXFx1MEIzM1xcdTBCMzYtXFx1MEIzOVxcdTBCM0RcXHUwQjVDLVxcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5LVxcdTBCOUFcXHUwQjlDXFx1MEI5RS1cXHUwQjlGXFx1MEJBMy1cXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI1XFx1MEJCNy1cXHUwQkI5XFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzMzXFx1MEMzNS1cXHUwQzM5XFx1MEM2MC1cXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENERVxcdTBDRTAtXFx1MENFMVxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQyOFxcdTBEMkEtXFx1MEQzOVxcdTBENjAtXFx1MEQ2MVxcdTBFMDEtXFx1MEUyRVxcdTBFMzBcXHUwRTMyLVxcdTBFMzNcXHUwRTQwLVxcdTBFNDVcXHUwRTgxLVxcdTBFODJcXHUwRTg0XFx1MEU4Ny1cXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUEtXFx1MEVBQlxcdTBFQUQtXFx1MEVBRVxcdTBFQjBcXHUwRUIyLVxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjY5XFx1MTBBMC1cXHUxMEM1XFx1MTBEMC1cXHUxMEY2XFx1MTEwMFxcdTExMDItXFx1MTEwM1xcdTExMDUtXFx1MTEwN1xcdTExMDlcXHUxMTBCLVxcdTExMENcXHUxMTBFLVxcdTExMTJcXHUxMTNDXFx1MTEzRVxcdTExNDBcXHUxMTRDXFx1MTE0RVxcdTExNTBcXHUxMTU0LVxcdTExNTVcXHUxMTU5XFx1MTE1Ri1cXHUxMTYxXFx1MTE2M1xcdTExNjVcXHUxMTY3XFx1MTE2OVxcdTExNkQtXFx1MTE2RVxcdTExNzItXFx1MTE3M1xcdTExNzVcXHUxMTlFXFx1MTFBOFxcdTExQUJcXHUxMUFFLVxcdTExQUZcXHUxMUI3LVxcdTExQjhcXHUxMUJBXFx1MTFCQy1cXHUxMUMyXFx1MTFFQlxcdTExRjBcXHUxMUY5XFx1MUUwMC1cXHUxRTlCXFx1MUVBMC1cXHUxRUY5XFx1MUYwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIxMjZcXHUyMTJBLVxcdTIxMkJcXHUyMTJFXFx1MjE4MC1cXHUyMTgyXFx1MzA0MS1cXHUzMDk0XFx1MzBBMS1cXHUzMEZBXFx1MzEwNS1cXHUzMTJDXFx1QUMwMC1cXHVEN0EzXFx1NEUwMC1cXHU5RkE1XFx1MzAwN1xcdTMwMjEtXFx1MzAyOV9dJztcblJERmFQcm9jZXNzb3IuTkNOQU1FID0gbmV3IFJlZ0V4cCgnXicgKyBSREZhUHJvY2Vzc29yLm5hbWVTdGFydENoYXIgKyBSREZhUHJvY2Vzc29yLm5hbWVDaGFyICsgJyokJyk7XG5cbi8qXG5SREZhUHJvY2Vzc29yLnByb3RvdHlwZS5yZXNvbHZlQW5kTm9ybWFsaXplID0gZnVuY3Rpb24oYmFzZSxocmVmKSB7XG4gICB2YXIgdSA9IGJhc2UucmVzb2x2ZShocmVmKVxuICAgdmFyIHBhcnNlZCA9IHRoaXMucGFyc2VVUkkodSlcbiAgIHBhcnNlZC5ub3JtYWxpemUoKVxuICAgcmV0dXJuIHBhcnNlZC5zcGVjXG59XG4qL1xuXG5SREZhUHJvY2Vzc29yLmRhdGVUaW1lVHlwZXMgPSBbeyBwYXR0ZXJuOiAvLT9QKD86WzAtOV0rWSk/KD86WzAtOV0rTSk/KD86WzAtOV0rRCk/KD86VCg/OlswLTldK0gpPyg/OlswLTldK00pPyg/OlswLTldKyg/OlxcLlswLTldKyk/Uyk/KT8vLFxuICB0eXBlOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZHVyYXRpb24nIH0sIHsgcGF0dGVybjogLy0/KD86WzEtOV1bMC05XVswLTldWzAtOV18MFsxLTldWzAtOV1bMC05XXwwMFsxLTldWzAtOV18MDAwWzEtOV0pLVswLTldWzAtOV0tWzAtOV1bMC05XVQoPzpbMC0xXVswLTldfDJbMC00XSk6WzAtNV1bMC05XTpbMC01XVswLTldKD86XFwuWzAtOV0rKT8oPzpafFsrXFwtXVswLTldWzAtOV06WzAtOV1bMC05XSk/LyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RhdGVUaW1lJyB9LCB7IHBhdHRlcm46IC8tPyg/OlsxLTldWzAtOV1bMC05XVswLTldfDBbMS05XVswLTldWzAtOV18MDBbMS05XVswLTldfDAwMFsxLTldKS1bMC05XVswLTldLVswLTldWzAtOV0oPzpafFsrXFwtXVswLTldWzAtOV06WzAtOV1bMC05XSk/LyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RhdGUnIH0sIHsgcGF0dGVybjogLyg/OlswLTFdWzAtOV18MlswLTRdKTpbMC01XVswLTldOlswLTVdWzAtOV0oPzpcXC5bMC05XSspPyg/Olp8WytcXC1dWzAtOV1bMC05XTpbMC05XVswLTldKT8vLFxuICB0eXBlOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjdGltZScgfSwgeyBwYXR0ZXJuOiAvLT8oPzpbMS05XVswLTldWzAtOV1bMC05XXwwWzEtOV1bMC05XVswLTldfDAwWzEtOV1bMC05XXwwMDBbMS05XSktWzAtOV1bMC05XS8sXG4gIHR5cGU6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNnWWVhck1vbnRoJyB9LCB7IHBhdHRlcm46IC8tP1sxLTldWzAtOV1bMC05XVswLTldfDBbMS05XVswLTldWzAtOV18MDBbMS05XVswLTldfDAwMFsxLTldLyxcbiAgdHlwZTogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2dZZWFyJyB9XTtcblxubW9kdWxlLmV4cG9ydHMgPSBSREZhUHJvY2Vzc29yOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiAgUkRGL1hNTCBQQVJTRVJcbiAqXG4gKiBWZXJzaW9uIDAuMVxuICogIFBhcnNlciBiZWxpZXZlZCB0byBiZSBpbiBmdWxsIHBvc2l0aXZlIFJERi9YTUwgcGFyc2luZyBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mIGhhbmRsaW5nIGRlcHJlY2F0ZWQgUkRGIGF0dHJpYnV0ZXNcbiAqICBhcHByb3ByaWF0ZWx5LiBQYXJzZXIgaXMgYmVsaWV2ZWQgdG8gY29tcGx5IGZ1bGx5IHdpdGggb3RoZXIgVzNDXG4gKiAgYW5kIGluZHVzdHJ5IHN0YW5kYXJkcyB3aGVyZSBhcHByb3ByaWF0ZSAoRE9NLCBFQ01BU2NyaXB0LCAmYy4pXG4gKlxuICogIEF1dGhvcjogRGF2aWQgU2hlZXRzIDxkc2hlZXRzQG1pdC5lZHU+XG4gKlxuICogVzNDwq4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFXG4gKiBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxXG4gKiBUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yXG4gKiBvdGhlciByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXJcbiAqIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssXG4gKiB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbFxuICogY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucy5cbiAqXG4gKiBQZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzXG4gKiBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBmb3IgYW55IHB1cnBvc2UgYW5kXG4gKiB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHlvdSBpbmNsdWRlXG4gKiB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yXG4gKiBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uczpcbiAqXG4gKiAxLiBUaGUgZnVsbCB0ZXh0IG9mIHRoaXMgTk9USUNFIGluIGEgbG9jYXRpb24gdmlld2FibGUgdG8gdXNlcnMgb2ZcbiAqIHRoZSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay5cbiAqIDIuIEFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSBXM0MgU29mdHdhcmUgU2hvcnQgTm90aWNlIHNob3VsZCBiZVxuICogaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHlcbiAqIG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZS5cbiAqIDMuIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZVxuICogZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvblxuICogZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLilcbiAqXG4gKiBUSElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEIFwiQVMgSVMsXCIgQU5EIENPUFlSSUdIVFxuICogSE9MREVSUyBNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTXG4gKiBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SXG4gKiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLFxuICogVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuXG4gKlxuICogQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTFxuICogT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SXG4gKiBET0NVTUVOVEFUSU9OLlxuICpcbiAqIFRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpblxuICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsXG4gKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnlcbiAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHRcbiAqIGhvbGRlcnMuXG4gKi9cbi8qKlxuICogQGNsYXNzIENsYXNzIGRlZmluaW5nIGFuIFJERlBhcnNlciByZXNvdXJjZSBvYmplY3QgdGllZCB0byBhbiBSREZTdG9yZVxuICpcbiAqIEBhdXRob3IgRGF2aWQgU2hlZXRzIDxkc2hlZXRzQG1pdC5lZHU+XG4gKiBAdmVyc2lvbiAwLjFcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UkRGU3RvcmV9IHN0b3JlIEFuIFJERlN0b3JlIG9iamVjdFxuICovXG52YXIgdXJpVXRpbCA9IHJlcXVpcmUoJy4vdXJpJyk7XG5cbnZhciBSREZQYXJzZXIgPSBmdW5jdGlvbiBSREZQYXJzZXIoc3RvcmUpIHtcbiAgdmFyIFJERlBhcnNlciA9IHt9O1xuXG4gIC8qKiBTdGFuZGFyZCBuYW1lc3BhY2VzIHRoYXQgd2Uga25vdyBob3cgdG8gaGFuZGxlIEBmaW5hbFxuICAgKiAgQG1lbWJlciBSREZQYXJzZXJcbiAgICovXG4gIFJERlBhcnNlci5ucyA9IHsgJ1JERic6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJywgJ1JERlMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIycgfTtcblxuICAvKiogRE9NIExldmVsIDIgbm9kZSB0eXBlIG1hZ2ljIG51bWJlcnMgQGZpbmFsXG4gICAqICBAbWVtYmVyIFJERlBhcnNlclxuICAgKi9cbiAgUkRGUGFyc2VyLm5vZGVUeXBlID0geyAnRUxFTUVOVCc6IDEsICdBVFRSSUJVVEUnOiAyLCAnVEVYVCc6IDMsXG4gICAgJ0NEQVRBX1NFQ1RJT04nOiA0LCAnRU5USVRZX1JFRkVSRU5DRSc6IDUsXG4gICAgJ0VOVElUWSc6IDYsICdQUk9DRVNTSU5HX0lOU1RSVUNUSU9OJzogNyxcbiAgICAnQ09NTUVOVCc6IDgsICdET0NVTUVOVCc6IDksICdET0NVTUVOVF9UWVBFJzogMTAsXG4gICAgJ0RPQ1VNRU5UX0ZSQUdNRU5UJzogMTEsICdOT1RBVElPTic6IDEyIH07XG5cbiAgLyoqXG4gICAqIEZyYW1lIGNsYXNzIGZvciBuYW1lc3BhY2UgYW5kIGJhc2UgVVJJIGxvb2t1cHNcbiAgICogQmFzZSBsb29rdXBzIHdpbGwgYWx3YXlzIHJlc29sdmUgYmVjYXVzZSB0aGUgcGFyc2VyIGtub3dzXG4gICAqIHRoZSBkZWZhdWx0IGJhc2UuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHRoaXMuZnJhbWVGYWN0b3J5ID0gZnVuY3Rpb24gKHBhcnNlciwgcGFyZW50LCBlbGVtZW50KSB7XG4gICAgcmV0dXJuIHsgJ05PREUnOiAxLCAnQVJDJzogMiwgJ3BhcmVudCc6IHBhcmVudCwgJ3BhcnNlcic6IHBhcnNlciwgJ3N0b3JlJzogcGFyc2VyLnN0b3JlLCAnZWxlbWVudCc6IGVsZW1lbnQsXG4gICAgICAnbGFzdENoaWxkJzogMCwgJ2Jhc2UnOiBudWxsLCAnbGFuZyc6IG51bGwsICdub2RlJzogbnVsbCwgJ25vZGVUeXBlJzogbnVsbCwgJ2xpc3RJbmRleCc6IDEsICdyZGZpZCc6IG51bGwsICdkYXRhdHlwZSc6IG51bGwsICdjb2xsZWN0aW9uJzogZmFsc2UsIC8qKiBUZXJtaW5hdGUgdGhlIGZyYW1lIGFuZCBub3RpZnkgdGhlIHN0b3JlIHRoYXQgd2UncmUgZG9uZSAqL1xuICAgICAgJ3Rlcm1pbmF0ZUZyYW1lJzogZnVuY3Rpb24gdGVybWluYXRlRnJhbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLm5vZGUuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIEFkZCBhIHN5bWJvbCBvZiBhIGNlcnRhaW4gdHlwZSB0byB0aGUgdGhpcyBmcmFtZSAqLydhZGRTeW1ib2wnOiBmdW5jdGlvbiBhZGRTeW1ib2wodHlwZSwgdXJpKSB7XG4gICAgICAgIHVyaSA9IHVyaVV0aWwuam9pbih1cmksIHRoaXMuYmFzZSk7XG4gICAgICAgIHRoaXMubm9kZSA9IHRoaXMuc3RvcmUuc3ltKHVyaSk7XG5cbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHR5cGU7XG4gICAgICB9LCAvKiogTG9hZCBhbnkgY29uc3RydWN0ZWQgdHJpcGxlcyBpbnRvIHRoZSBzdG9yZSAqLydsb2FkVHJpcGxlJzogZnVuY3Rpb24gbG9hZFRyaXBsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50LnBhcmVudC5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQucGFyZW50Lm5vZGUuYXBwZW5kKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5hZGQodGhpcy5wYXJlbnQucGFyZW50Lm5vZGUsIHRoaXMucGFyZW50Lm5vZGUsIHRoaXMubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQucmRmaWQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHJlaWZ5XG4gICAgICAgICAgdmFyIHRyaXBsZSA9IHRoaXMuc3RvcmUuc3ltKHVyaVV0aWwuam9pbignIycgKyB0aGlzLnBhcmVudC5yZGZpZCwgdGhpcy5iYXNlKSk7XG4gICAgICAgICAgdGhpcy5zdG9yZS5hZGQodHJpcGxlLCB0aGlzLnN0b3JlLnN5bShSREZQYXJzZXIubnMuUkRGICsgJ3R5cGUnKSwgdGhpcy5zdG9yZS5zeW0oUkRGUGFyc2VyLm5zLlJERiArICdTdGF0ZW1lbnQnKSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAnc3ViamVjdCcpLCB0aGlzLnBhcmVudC5wYXJlbnQubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAncHJlZGljYXRlJyksIHRoaXMucGFyZW50Lm5vZGUsIHRoaXMucGFyc2VyLndoeSk7XG5cbiAgICAgICAgICB0aGlzLnN0b3JlLmFkZCh0cmlwbGUsIHRoaXMuc3RvcmUuc3ltKFJERlBhcnNlci5ucy5SREYgKyAnb2JqZWN0JyksIHRoaXMubm9kZSwgdGhpcy5wYXJzZXIud2h5KTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIENoZWNrIGlmIGl0J3MgT0sgdG8gbG9hZCBhIHRyaXBsZSAqLydpc1RyaXBsZVRvTG9hZCc6IGZ1bmN0aW9uIGlzVHJpcGxlVG9Mb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLnBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJiB0aGlzLm5vZGVUeXBlID09PSB0aGlzLk5PREUgJiYgdGhpcy5wYXJlbnQubm9kZVR5cGUgPT09IHRoaXMuQVJDICYmIHRoaXMucGFyZW50LnBhcmVudC5ub2RlVHlwZSA9PT0gdGhpcy5OT0RFO1xuICAgICAgfSwgLyoqIEFkZCBhIHN5bWJvbGljIG5vZGUgdG8gdGhpcyBmcmFtZSAqLydhZGROb2RlJzogZnVuY3Rpb24gYWRkTm9kZSh1cmkpIHtcbiAgICAgICAgdGhpcy5hZGRTeW1ib2wodGhpcy5OT0RFLCB1cmkpO1xuICAgICAgICBpZiAodGhpcy5pc1RyaXBsZVRvTG9hZCgpKSB7XG4gICAgICAgICAgdGhpcy5sb2FkVHJpcGxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIC8qKiBBZGQgYSBjb2xsZWN0aW9uIG5vZGUgdG8gdGhpcyBmcmFtZSAqLydhZGRDb2xsZWN0aW9uJzogZnVuY3Rpb24gYWRkQ29sbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHRoaXMuTk9ERTtcbiAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5zdG9yZS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmlzVHJpcGxlVG9Mb2FkKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRUcmlwbGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgLyoqIEFkZCBhIGNvbGxlY3Rpb24gYXJjIHRvIHRoaXMgZnJhbWUgKi8nYWRkQ29sbGVjdGlvbkFyYyc6IGZ1bmN0aW9uIGFkZENvbGxlY3Rpb25BcmMoKSB7XG4gICAgICAgIHRoaXMubm9kZVR5cGUgPSB0aGlzLkFSQztcbiAgICAgIH0sIC8qKiBBZGQgYSBibm9kZSB0byB0aGlzIGZyYW1lICovJ2FkZEJOb2RlJzogZnVuY3Rpb24gYWRkQk5vZGUoaWQpIHtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXJzZXIuYm5vZGVzW2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnBhcnNlci5ibm9kZXNbaWRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnBhcnNlci5ibm9kZXNbaWRdID0gdGhpcy5zdG9yZS5ibm9kZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnN0b3JlLmJub2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlVHlwZSA9IHRoaXMuTk9ERTtcbiAgICAgICAgaWYgKHRoaXMuaXNUcmlwbGVUb0xvYWQoKSkge1xuICAgICAgICAgIHRoaXMubG9hZFRyaXBsZSgpO1xuICAgICAgICB9XG4gICAgICB9LCAvKiogQWRkIGFuIGFyYyBvciBwcm9wZXJ0eSB0byB0aGlzIGZyYW1lICovJ2FkZEFyYyc6IGZ1bmN0aW9uIGFkZEFyYyh1cmkpIHtcbiAgICAgICAgaWYgKHVyaSA9PT0gUkRGUGFyc2VyLm5zLlJERiArICdsaScpIHtcbiAgICAgICAgICB1cmkgPSBSREZQYXJzZXIubnMuUkRGICsgJ18nICsgdGhpcy5wYXJlbnQubGlzdEluZGV4O1xuICAgICAgICAgIHRoaXMucGFyZW50Lmxpc3RJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRTeW1ib2wodGhpcy5BUkMsIHVyaSk7XG4gICAgICB9LCAvKiogQWRkIGEgbGl0ZXJhbCB0byB0aGlzIGZyYW1lICovJ2FkZExpdGVyYWwnOiBmdW5jdGlvbiBhZGRMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudC5kYXRhdHlwZSkge1xuICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMuc3RvcmUubGl0ZXJhbCh2YWx1ZSwgJycsIHRoaXMuc3RvcmUuc3ltKHRoaXMucGFyZW50LmRhdGF0eXBlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5zdG9yZS5saXRlcmFsKHZhbHVlLCB0aGlzLmxhbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVR5cGUgPSB0aGlzLk5PREU7XG4gICAgICAgIGlmICh0aGlzLmlzVHJpcGxlVG9Mb2FkKCkpIHtcbiAgICAgICAgICB0aGlzLmxvYWRUcmlwbGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gZnJvbSB0aGUgT3BlbkxheWVycyBzb3VyY2UgLi4gbmVlZGVkIHRvIGdldCBhcm91bmQgSUUgcHJvYmxlbXMuXG4gIHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TID0gZnVuY3Rpb24gKG5vZGUsIHVyaSwgbmFtZSkge1xuICAgIHZhciBhdHRyaWJ1dGVOb2RlID0gbnVsbDtcbiAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGVOb2RlTlMpIHtcbiAgICAgIGF0dHJpYnV0ZU5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgIHZhciBwb3RlbnRpYWxOb2RlLCBmdWxsTmFtZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBwb3RlbnRpYWxOb2RlID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgaWYgKHBvdGVudGlhbE5vZGUubmFtZXNwYWNlVVJJID09PSB1cmkpIHtcbiAgICAgICAgICBmdWxsTmFtZSA9IHBvdGVudGlhbE5vZGUucHJlZml4ID8gcG90ZW50aWFsTm9kZS5wcmVmaXggKyAnOicgKyBuYW1lIDogbmFtZTtcbiAgICAgICAgICBpZiAoZnVsbE5hbWUgPT09IHBvdGVudGlhbE5vZGUubm9kZU5hbWUpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5vZGUgPSBwb3RlbnRpYWxOb2RlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVOb2RlO1xuICB9O1xuXG4gIC8qKiBPdXIgdHJpcGxlIHN0b3JlIHJlZmVyZW5jZSBAcHJpdmF0ZSAqL1xuXG4gIHRoaXMuc3RvcmUgPSBzdG9yZTsgLyoqIE91ciBpZGVudGlmaWVkIGJsYW5rIG5vZGVzIEBwcml2YXRlICovXG4gIHRoaXMuYm5vZGVzID0ge307IC8qKiBBIGNvbnRleHQgZm9yIGNvbnRleHQtYXdhcmUgc3RvcmVzIEBwcml2YXRlICovXG4gIHRoaXMud2h5ID0gbnVsbDsgLyoqIFJlaWZpY2F0aW9uIGZsYWcgKi9cbiAgdGhpcy5yZWlmeSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBvdXIgaW5pdGlhbCBzY29wZSBmcmFtZSBhbmQgcGFyc2UgdGhlIERPTSBpbnRvIHRyaXBsZXNcbiAgICogQHBhcmFtIHtET01UcmVlfSBkb2N1bWVudCBUaGUgRE9NIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBiYXNlIFRoZSBiYXNlIFVSTCB0byB1c2VcbiAgICogQHBhcmFtIHtPYmplY3R9IHdoeSBUaGUgY29udGV4dCB0byB3aGljaCB0aGlzIHJlc291cmNlIGJlbG9uZ3NcbiAgICovXG5cbiAgdGhpcy5wYXJzZSA9IGZ1bmN0aW9uIChkb2N1bWVudCwgYmFzZSwgd2h5KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZG9jdW1lbnQuY2hpbGROb2RlczsgLy8gY2xlYW4gdXAgZm9yIHRoZSBuZXh0IHJ1blxuICAgIHRoaXMuY2xlYW5QYXJzZXIoKTsgLy8gZmlndXJlIG91dCB0aGUgcm9vdCBlbGVtZW50XG4gICAgdmFyIHJvb3Q7XG4gICAgaWYgKGRvY3VtZW50Lm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuRE9DVU1FTlQpIHtcbiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NdLm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuRUxFTUVOVCkge1xuICAgICAgICAgIHJvb3QgPSBjaGlsZHJlbltjXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5FTEVNRU5UKSB7XG4gICAgICByb290ID0gZG9jdW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJERlBhcnNlcjogY2FuJ3QgZmluZCByb290IGluIFwiICsgYmFzZSArICcuIEhhbHRpbmcuICcpO1xuICAgICAgLy8gcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHRoaXMud2h5ID0gd2h5OyAvLyBvdXIgdG9wbW9zdCBmcmFtZVxuICAgIHZhciBmID0gdGhpcy5mcmFtZUZhY3RvcnkodGhpcyk7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICBmLmJhc2UgPSBiYXNlO1xuICAgIGYubGFuZyA9IG51bGw7IC8vIHdhcyAnJyBidXQgY2FuJ3QgaGF2ZSBsYW5ncyBsaWtlIHRoYXQgMjAxNSAoISlcbiAgICB0aGlzLnBhcnNlRE9NKHRoaXMuYnVpbGRGcmFtZShmLCByb290KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdGhpcy5wYXJzZURPTSA9IGZ1bmN0aW9uIChmcmFtZSkge1xuICAgIC8vIGEgRE9NIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBpbiBwYXJzaW5nXG4gICAgdmFyIHJkZmlkO1xuICAgIHZhciBlbGVtZW50VVJJID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICBpZiAoZWwubmFtZXNwYWNlVVJJID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSREYvWE1MIHN5bnRheCBlcnJvcjogTm8gbmFtZXNwYWNlIGZvciAnICsgZWwubG9jYWxOYW1lICsgJyBpbiAnICsgdGhpcy5iYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5uYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgZWwubmFtZXNwYWNlVVJJO1xuICAgICAgfVxuICAgICAgaWYgKGVsLmxvY2FsTmFtZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBlbC5sb2NhbE5hbWU7XG4gICAgICB9IGVsc2UgaWYgKGVsLm5vZGVOYW1lKSB7XG4gICAgICAgIGlmIChlbC5ub2RlTmFtZS5pbmRleE9mKCc6JykgPj0gMCkgcmVzdWx0ID0gcmVzdWx0ICsgZWwubm9kZU5hbWUuc3BsaXQoJzonKVsxXTtlbHNlIHJlc3VsdCA9IHJlc3VsdCArIGVsLm5vZGVOYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LmJpbmQodGhpcyk7XG4gICAgdmFyIGRpZyA9IHRydWU7IC8vIGlmIHdlJ2xsIGRpZyBkb3duIGluIHRoZSB0cmVlIG9uIHRoZSBuZXh0IGl0ZXJcbiAgICB3aGlsZSAoZnJhbWUucGFyZW50KSB7XG4gICAgICB2YXIgZG9tID0gZnJhbWUuZWxlbWVudDtcbiAgICAgIHZhciBhdHRycyA9IGRvbS5hdHRyaWJ1dGVzO1xuICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PT0gUkRGUGFyc2VyLm5vZGVUeXBlLlRFWFQgfHwgZG9tLm5vZGVUeXBlID09PSBSREZQYXJzZXIubm9kZVR5cGUuQ0RBVEFfU0VDVElPTikge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgbGl0ZXJhbFxuICAgICAgICBpZiAoZnJhbWUucGFyZW50Lm5vZGVUeXBlID09PSBmcmFtZS5OT0RFKSB7XG4gICAgICAgICAgLy8gbXVzdCBoYXZlIGhhZCBhdHRyaWJ1dGVzLCBzdG9yZSBhcyByZGY6dmFsdWVcbiAgICAgICAgICBmcmFtZS5hZGRBcmMoUkRGUGFyc2VyLm5zLlJERiArICd2YWx1ZScpO1xuICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5hZGRMaXRlcmFsKGRvbS5ub2RlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50VVJJKGRvbSkgIT09IFJERlBhcnNlci5ucy5SREYgKyAnUkRGJykge1xuICAgICAgICAvLyBub3Qgcm9vdFxuICAgICAgICBpZiAoZnJhbWUucGFyZW50ICYmIGZyYW1lLnBhcmVudC5jb2xsZWN0aW9uKSB7XG4gICAgICAgICAgLy8gd2UncmUgYSBjb2xsZWN0aW9uIGVsZW1lbnRcbiAgICAgICAgICBmcmFtZS5hZGRDb2xsZWN0aW9uQXJjKCk7XG4gICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgIGZyYW1lLnBhcmVudC5lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyYW1lLnBhcmVudCB8fCAhZnJhbWUucGFyZW50Lm5vZGVUeXBlIHx8IGZyYW1lLnBhcmVudC5ub2RlVHlwZSA9PT0gZnJhbWUuQVJDKSB7XG4gICAgICAgICAgLy8gd2UgbmVlZCBhIG5vZGVcbiAgICAgICAgICB2YXIgYWJvdXQgPSB0aGlzLmdldEF0dHJpYnV0ZU5vZGVOUyhkb20sIFJERlBhcnNlci5ucy5SREYsICdhYm91dCcpO1xuICAgICAgICAgIHJkZmlkID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnSUQnKTtcbiAgICAgICAgICBpZiAoYWJvdXQgJiYgcmRmaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUkRGUGFyc2VyOiAnICsgZG9tLm5vZGVOYW1lICsgJyBoYXMgYm90aCByZGY6aWQgYW5kIHJkZjphYm91dC4nICsgJyBIYWx0aW5nLiBPbmx5IG9uZSBvZiB0aGVzZScgKyAnIHByb3BlcnRpZXMgbWF5IGJlIHNwZWNpZmllZCBvbiBhJyArICcgbm9kZS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFhYm91dCAmJiByZGZpZCkge1xuICAgICAgICAgICAgZnJhbWUuYWRkTm9kZSgnIycgKyByZGZpZC5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUocmRmaWQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYWJvdXQgPT0gbnVsbCAmJiByZGZpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgYm5pZCA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ25vZGVJRCcpO1xuICAgICAgICAgICAgaWYgKGJuaWQpIHtcbiAgICAgICAgICAgICAgZnJhbWUuYWRkQk5vZGUoYm5pZC5ub2RlVmFsdWUpO1xuICAgICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlTm9kZShibmlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyYW1lLmFkZE5vZGUoYWJvdXQubm9kZVZhbHVlKTtcbiAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGFib3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVHlwZWQgbm9kZXNcbiAgICAgICAgICB2YXIgcmRmdHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ3R5cGUnKTtcbiAgICAgICAgICBpZiAoUkRGUGFyc2VyLm5zLlJERiArICdEZXNjcmlwdGlvbicgIT09IGVsZW1lbnRVUkkoZG9tKSkge1xuICAgICAgICAgICAgcmRmdHlwZSA9IHsgJ25vZGVWYWx1ZSc6IGVsZW1lbnRVUkkoZG9tKSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmRmdHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmFkZChmcmFtZS5ub2RlLCB0aGlzLnN0b3JlLnN5bShSREZQYXJzZXIubnMuUkRGICsgJ3R5cGUnKSwgdGhpcy5zdG9yZS5zeW0odXJpVXRpbC5qb2luKHJkZnR5cGUubm9kZVZhbHVlLCBmcmFtZS5iYXNlKSksIHRoaXMud2h5KTtcbiAgICAgICAgICAgIGlmIChyZGZ0eXBlLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHJkZnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBQcm9wZXJ0eSBBdHRyaWJ1dGVzXG4gICAgICAgICAgZm9yICh2YXIgeCA9IGF0dHJzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmFkZChmcmFtZS5ub2RlLCB0aGlzLnN0b3JlLnN5bShlbGVtZW50VVJJKGF0dHJzW3hdKSksIHRoaXMuc3RvcmUubGl0ZXJhbChhdHRyc1t4XS5ub2RlVmFsdWUsIGZyYW1lLmxhbmcpLCB0aGlzLndoeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCBhZGQgYW4gYXJjIChvciBpbXBsaWNpdCBibm9kZSthcmMpXG4gICAgICAgICAgZnJhbWUuYWRkQXJjKGVsZW1lbnRVUkkoZG9tKSk7IC8vIHNhdmUgdGhlIGFyYydzIHJkZjpJRCBpZiBpdCBoYXMgb25lXG4gICAgICAgICAgaWYgKHRoaXMucmVpZnkpIHtcbiAgICAgICAgICAgIHJkZmlkID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnSUQnKTtcbiAgICAgICAgICAgIGlmIChyZGZpZCkge1xuICAgICAgICAgICAgICBmcmFtZS5yZGZpZCA9IHJkZmlkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUocmRmaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcGFyc2V0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAncGFyc2VUeXBlJyk7XG4gICAgICAgICAgdmFyIGRhdGF0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMoZG9tLCBSREZQYXJzZXIubnMuUkRGLCAnZGF0YXR5cGUnKTtcbiAgICAgICAgICBpZiAoZGF0YXR5cGUpIHtcbiAgICAgICAgICAgIGZyYW1lLmRhdGF0eXBlID0gZGF0YXR5cGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUoZGF0YXR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyc2V0eXBlKSB7XG4gICAgICAgICAgICB2YXIgbnYgPSBwYXJzZXR5cGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgaWYgKG52ID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgICAgICAgICAgZnJhbWUuZGF0YXR5cGUgPSBSREZQYXJzZXIubnMuUkRGICsgJ1hNTExpdGVyYWwnOyAvLyAodGhpcy5idWlsZEZyYW1lKGZyYW1lKSkuYWRkTGl0ZXJhbChkb20pXG4gICAgICAgICAgICAgIC8vIHNob3VsZCB3b3JrIGJ1dCBkb2Vzbid0XG4gICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgICAgZnJhbWUuYWRkTGl0ZXJhbChkb20pO1xuICAgICAgICAgICAgICBkaWcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobnYgPT09ICdSZXNvdXJjZScpIHtcbiAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgICAgICBmcmFtZS5wYXJlbnQuZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG52ID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUsIGZyYW1lLmVsZW1lbnQpO1xuICAgICAgICAgICAgICBmcmFtZS5wYXJlbnQuZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGZyYW1lLmFkZENvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHBhcnNldHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRycy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKGRvbSwgUkRGUGFyc2VyLm5zLlJERiwgJ3Jlc291cmNlJyk7XG4gICAgICAgICAgICB2YXIgYm5pZDIgPSB0aGlzLmdldEF0dHJpYnV0ZU5vZGVOUyhkb20sIFJERlBhcnNlci5ucy5SREYsICdub2RlSUQnKTtcbiAgICAgICAgICAgIGZyYW1lID0gdGhpcy5idWlsZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICBmcmFtZS5hZGROb2RlKHJlc291cmNlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGVOb2RlKHJlc291cmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChibmlkMikge1xuICAgICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKGJuaWQyLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYm5pZDIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyYW1lLmFkZEJOb2RlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIHgxID0gYXR0cnMubGVuZ3RoIC0gMTsgeDEgPj0gMDsgeDEtLSkge1xuICAgICAgICAgICAgICB2YXIgZiA9IHRoaXMuYnVpbGRGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgIGYuYWRkQXJjKGVsZW1lbnRVUkkoYXR0cnNbeDFdKSk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50VVJJKGF0dHJzW3gxXSkgPT09IFJERlBhcnNlci5ucy5SREYgKyAndHlwZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZikuYWRkTm9kZShhdHRyc1t4MV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZikuYWRkTGl0ZXJhbChhdHRyc1t4MV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZG9tLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRnJhbWUoZnJhbWUpLmFkZExpdGVyYWwoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyByZGY6UkRGXG4gICAgICAvLyBkaWcgZHVnXG4gICAgICBkb20gPSBmcmFtZS5lbGVtZW50O1xuICAgICAgd2hpbGUgKGZyYW1lLnBhcmVudCkge1xuICAgICAgICB2YXIgcGZyYW1lID0gZnJhbWU7XG4gICAgICAgIHdoaWxlIChkb20gPT0gbnVsbCkge1xuICAgICAgICAgIGZyYW1lID0gZnJhbWUucGFyZW50O1xuICAgICAgICAgIGRvbSA9IGZyYW1lLmVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGRvbS5jaGlsZE5vZGVzICYmIGRvbS5jaGlsZE5vZGVzW2ZyYW1lLmxhc3RDaGlsZF07XG4gICAgICAgIGlmICghY2FuZGlkYXRlIHx8ICFkaWcpIHtcbiAgICAgICAgICBmcmFtZS50ZXJtaW5hdGVGcmFtZSgpO1xuICAgICAgICAgIGlmICghKGZyYW1lID0gZnJhbWUucGFyZW50KSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSAvLyBkb25lXG4gICAgICAgICAgZG9tID0gZnJhbWUuZWxlbWVudDtcbiAgICAgICAgICBkaWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5ub2RlVHlwZSAhPT0gUkRGUGFyc2VyLm5vZGVUeXBlLkVMRU1FTlQgJiYgY2FuZGlkYXRlLm5vZGVUeXBlICE9PSBSREZQYXJzZXIubm9kZVR5cGUuVEVYVCAmJiBjYW5kaWRhdGUubm9kZVR5cGUgIT09IFJERlBhcnNlci5ub2RlVHlwZS5DREFUQV9TRUNUSU9OIHx8IChjYW5kaWRhdGUubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5URVhUIHx8IGNhbmRpZGF0ZS5ub2RlVHlwZSA9PT0gUkRGUGFyc2VyLm5vZGVUeXBlLkNEQVRBX1NFQ1RJT04pICYmIGRvbS5jaGlsZE5vZGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIGZyYW1lLmxhc3RDaGlsZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vdCBhIGxlYWZcbiAgICAgICAgICBmcmFtZS5sYXN0Q2hpbGQrKztcbiAgICAgICAgICBmcmFtZSA9IHRoaXMuYnVpbGRGcmFtZShwZnJhbWUsIGRvbS5jaGlsZE5vZGVzW2ZyYW1lLmxhc3RDaGlsZCAtIDFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gd2hpbGVcbiAgfTtcblxuICAvKipcbiAgICogQ2xlYW5zIG91dCBzdGF0ZSBmcm9tIGEgcHJldmlvdXMgcGFyc2UgcnVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLmNsZWFuUGFyc2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYm5vZGVzID0ge307XG4gICAgdGhpcy53aHkgPSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2NvcGUgZnJhbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuYnVpbGRGcmFtZSA9IGZ1bmN0aW9uIChwYXJlbnQsIGVsZW1lbnQpIHtcbiAgICB2YXIgZnJhbWUgPSB0aGlzLmZyYW1lRmFjdG9yeSh0aGlzLCBwYXJlbnQsIGVsZW1lbnQpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIGZyYW1lLmJhc2UgPSBwYXJlbnQuYmFzZTtcbiAgICAgIGZyYW1lLmxhbmcgPSBwYXJlbnQubGFuZztcbiAgICB9XG4gICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5URVhUIHx8IGVsZW1lbnQubm9kZVR5cGUgPT09IFJERlBhcnNlci5ub2RlVHlwZS5DREFUQV9TRUNUSU9OKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICAgIHZhciBhdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICB2YXIgYmFzZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgneG1sOmJhc2UnKTtcbiAgICBpZiAoYmFzZSAhPSBudWxsKSB7XG4gICAgICBmcmFtZS5iYXNlID0gYmFzZS5ub2RlVmFsdWU7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgneG1sOmJhc2UnKTtcbiAgICB9XG4gICAgdmFyIGxhbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3htbDpsYW5nJyk7XG4gICAgaWYgKGxhbmcgIT0gbnVsbCkge1xuICAgICAgZnJhbWUubGFuZyA9IGxhbmcubm9kZVZhbHVlO1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3htbDpsYW5nJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBhbGwgZXh0cmFuZW91cyB4bWwgYW5kIHhtbG5zIGF0dHJpYnV0ZXNcbiAgICBmb3IgKHZhciB4ID0gYXR0cnMubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHtcbiAgICAgIGlmIChhdHRyc1t4XS5ub2RlTmFtZS5zdWJzdHIoMCwgMykgPT09ICd4bWwnKSB7XG4gICAgICAgIGlmIChhdHRyc1t4XS5uYW1lLnNsaWNlKDAsIDYpID09PSAneG1sbnM6Jykge1xuICAgICAgICAgIHZhciB1cmkgPSBhdHRyc1t4XS5ub2RlVmFsdWU7IC8vIGFsZXJ0KCdiYXNlIGZvciBuYW1lc3BhYyBhdHRyOicrdGhpcy5iYXNlKVxuICAgICAgICAgIGlmICh0aGlzLmJhc2UpIHVyaSA9IHVyaVV0aWwuam9pbih1cmksIHRoaXMuYmFzZSk7XG4gICAgICAgICAgdGhpcy5zdG9yZS5zZXRQcmVmaXhGb3JVUkkoYXR0cnNbeF0ubmFtZS5zbGljZSg2KSwgdXJpKTtcbiAgICAgICAgfVxuICAgICAgICAvL1x0XHRhbGVydCgncmRmcGFyc2VyOiB4bWwgYXRyaWJ1dGU6ICcrYXR0cnNbeF0ubmFtZSkgLy9AQFxuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cnNbeF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhbWU7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJERlBhcnNlcjsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VyaWFsaXplO1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpO1xudmFyIFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZXInKTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdFxuICogQEAgQ3VycmVudGx5IE5RdWFkcyBhbmQgSlNPTi9MRCBhcmUgZGVhbCB3aXRoIGV4dHJlbGVtZW50bHkgaW5lZmZpY2llbnRseVxuICogdGhyb3VnaCBtdXRpcGxlIGNvbnZlcnNpb25zLlxuICovXG5mdW5jdGlvbiBzZXJpYWxpemUodGFyZ2V0LCBrYiwgYmFzZSwgY29udGVudFR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIGJhc2UgPSBiYXNlIHx8IHRhcmdldC51cmk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICd0ZXh0L3R1cnRsZSc7IC8vIHRleHQvbjMgaWYgY29tcGxleD9cbiAgdmFyIGRvY3VtZW50U3RyaW5nID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB2YXIgc3ogPSBTZXJpYWxpemVyKGtiKTtcbiAgICBpZiAob3B0aW9ucy5mbGFncykgc3ouc2V0RmxhZ3Mob3B0aW9ucy5mbGFncyk7XG4gICAgdmFyIG5ld1N0cyA9IGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0YXJnZXQpO1xuICAgIHZhciBuM1N0cmluZztcbiAgICBzei5zdWdnZXN0TmFtZXNwYWNlcyhrYi5uYW1lc3BhY2VzKTtcbiAgICBzei5zZXRCYXNlKGJhc2UpO1xuICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOlxuICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb1hNTChuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgY2FzZSAnYXBwbGljYXRpb24vbjMnOlxuICAgICAgICAvLyBMZWdhY3lcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OMyhuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ3RleHQvdHVydGxlJzpcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtdHVydGxlJzpcbiAgICAgICAgLy8gTGVnYWN5XG4gICAgICAgIHN6LnNldEZsYWdzKCdzaScpOyAvLyBTdXBwcmVzcyA9IGZvciBzYW1lQXMgYW5kID0+IGZvciBpbXBsaWVzXG4gICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVDYWxsYmFjayhudWxsLCBkb2N1bWVudFN0cmluZyk7XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9uLXRyaXBsZXMnOlxuICAgICAgICBzei5zZXRGbGFncygnZGVpbnByc3R1eCcpOyAvLyBTdXBwcmVzcyBuaWNlIHBhcnRzIG9mIE4zIHRvIG1ha2UgbnRyaXBsZXNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpO1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUNhbGxiYWNrKG51bGwsIGRvY3VtZW50U3RyaW5nKTtcbiAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL2xkK2pzb24nOlxuICAgICAgICBzei5zZXRGbGFncygnZGVpbnByc3R1eCcpOyAvLyBVc2UgYWRhcHRlcnMgdG8gY29ubmVjdCB0byBpbmNtcGF0aWJsZSBwYXJzZXJcbiAgICAgICAgbjNTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpO1xuICAgICAgICAvLyBuM1N0cmluZyA9IHN6LnN0YXRlbWVudHNUb04zKG5ld1N0cylcbiAgICAgICAgY29udmVydC5jb252ZXJ0VG9Kc29uKG4zU3RyaW5nLCBjYWxsYmFjayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24vbi1xdWFkcyc6XG4gICAgICBjYXNlICdhcHBsaWNhdGlvbi9ucXVhZHMnOlxuICAgICAgICAvLyBAQEAganVzdCBvdXRwb3V0IHRoZSBxdWFkcz8gRG9lcyBub3Qgd29yayBmb3IgY29sbGVjdGlvbnNcbiAgICAgICAgc3ouc2V0RmxhZ3MoJ2RlaW5wcnN0dXggcScpOyAvLyBTdXBwcmVzcyBuaWNlIHBhcnRzIG9mIE4zIHRvIG1ha2UgbnRyaXBsZXNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OVHJpcGxlcyhuZXdTdHMpOyAvLyBxIGluIGZsYWcgbWVhbnMgYWN0dWFsbHkgcXVhZHNcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVDYWxsYmFjayhudWxsLCBkb2N1bWVudFN0cmluZyk7XG4gICAgICAgIC8vIG4zU3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKVxuICAgICAgICAvLyBkb2N1bWVudFN0cmluZyA9IGNvbnZlcnQuY29udmVydFRvTlF1YWRzKG4zU3RyaW5nLCBjYWxsYmFjaylcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZTogQ29udGVudC10eXBlICcgKyBjb250ZW50VHlwZSArICcgbm90IHN1cHBvcnRlZCBmb3IgZGF0YSB3cml0ZS4nKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHRocm93IGVycjsgLy8gRG9uJ3QgaGlkZSBwcm9ibGVtcyBmcm9tIGNhbGxlciBpbiBzeW5jIG1vZGVcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhlcnIsIHJlc3VsdCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxuLyogICAgICBTZXJpYWxpemF0aW9uIG9mIFJERiBHcmFwaHNcbioqXG4qKiBUaW0gQmVybmVycy1MZWUgMjAwNlxuKiogVGhpcyBpcyB3YXMgaHR0cDovL2RpZy5jc2FpbC5taXQuZWR1LzIwMDUvYWphci9hamF3L2pzL3JkZi9zZXJpYWxpemUuanNcbioqIFRoaXMgaXMgb3Igd2FzIGh0dHBzOi8vZ2l0aHViLmNvbS9saW5rZWRkYXRhL3JkZmxpYi5qcy9ibG9iL21hc3Rlci9zcmMvc2VyaWFsaXplci5qc1xuKiogTGljZW5jZTogTUlUXG4qL1xudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xudmFyIEJsYW5rTm9kZSA9IHJlcXVpcmUoJy4vYmxhbmstbm9kZScpO1xudmFyIFVyaSA9IHJlcXVpcmUoJy4vdXJpJyk7XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIFhTRCA9IHJlcXVpcmUoJy4veHNkJyk7XG5cbnZhciBTZXJpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX19TZXJpYWxpemVyID0gZnVuY3Rpb24gX19TZXJpYWxpemVyKHN0b3JlKSB7XG4gICAgdGhpcy5mbGFncyA9ICcnO1xuICAgIHRoaXMuYmFzZSA9IG51bGw7XG5cbiAgICB0aGlzLnByZWZpeGVzID0gW107IC8vIHN1Z2dlc3RlZCBwcmVmaXhlc1xuICAgIHRoaXMubmFtZXNwYWNlcyA9IFtdOyAvLyBjb21wbGVtZW50YXJ5IGluZGV4ZXNcblxuICAgIHRoaXMuc3VnZ2VzdFByZWZpeCgncmRmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnKTsgLy8gWE1MIGNvZGUgYXNzdW1lcyB0aGlzIVxuICAgIHRoaXMuc3VnZ2VzdFByZWZpeCgneG1sJywgJ3Jlc2VydmVkOnJlc2VydmVkRm9yRnV0dXJlVXNlJyk7IC8vIFhNTCByZXNlcnZlcyB4bWw6IGluIHRoZSBzcGVjLlxuXG4gICAgdGhpcy5uYW1lc3BhY2VzVXNlZCA9IFtdOyAvLyBDb3VudCBhY3R1YWxseSB1c2VkIGFuZCBzbyBuZWVkZWQgaW4gQHByZWZpeGVzXG4gICAgdGhpcy5rZXl3b3JkcyA9IFsnYSddOyAvLyBUaGUgb25seSBvbmUgd2UgZ2VuZXJhdGUgYXQgdGhlIG1vbWVudFxuICAgIHRoaXMucHJlZml4Y2hhcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHF1c3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XG4gICAgdGhpcy5pbmNvbWluZyA9IG51bGw7IC8vIEFycmF5IG5vdCBjYWxjdWxhdGVkIHlldFxuICAgIHRoaXMuZm9ybXVsYXMgPSBbXTsgLy8gcmVtZWJlcmluZyBvcmlnaW5hbCBmb3JtdWxhZSBmcm9tIGhhc2hlc1xuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnNldEJhc2UgPSBmdW5jdGlvbiAoYmFzZSkge1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7cmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncyB8fCAnJztyZXR1cm4gdGhpcztcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnRvU3RyID0gZnVuY3Rpb24gKHgpIHtcbiAgICB2YXIgcyA9IHgudG9OVCgpO1xuICAgIGlmICh4LnRlcm1UeXBlID09PSAnR3JhcGgnKSB7XG4gICAgICB0aGlzLmZvcm11bGFzW3NdID0geDsgLy8gcmVtZW1iZXIgYXMgcmV2ZXJzZSBkb2VzIG5vdCB3b3JrXG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuZnJvbVN0ciA9IGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHNbMF0gPT09ICd7Jykge1xuICAgICAgdmFyIHggPSB0aGlzLmZvcm11bGFzW3NdO1xuICAgICAgaWYgKCF4KSBjb25zb2xlLmxvZygnTm8gZm9ybXVsYSBvYmplY3QgZm9yICcgKyBzKTtcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5mcm9tTlQocyk7XG4gIH07XG4gIC8qIEFjY3VtdWxhdGUgTmFtZXNwYWNlc1xuICAqKlxuICAqKiBUaGVzZSBhcmUgb25seSBoaW50cy4gIElmIHR3byBvdmVybGFwLCBvbmx5IG9uZSBnZXRzIHVzZWRcbiAgKiogVGhlcmUgaXMgdGhlcmVmb3JlIG5vIGd1YXJhbnRlZSBpbiBnZW5lcmFsLlxuICAqL1xuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN1Z2dlc3RQcmVmaXggPSBmdW5jdGlvbiAocHJlZml4LCB1cmkpIHtcbiAgICBpZiAocHJlZml4LnNsaWNlKDAsIDcpID09PSAnZGVmYXVsdCcpIHJldHVybjsgLy8gVHJ5IHRvIHdlZWQgdGhlc2Ugb3V0XG4gICAgaWYgKHByZWZpeC5zbGljZSgwLCAyKSA9PT0gJ25zJykgcmV0dXJuOyAvLyAgRnJvbSBvdGhlcnMgaW5mZXJpb3IgYWxnb3NcbiAgICBpZiAoIXByZWZpeCB8fCAhdXJpKSByZXR1cm47IC8vIGVtcHR5IHN0cmluZ3Mgbm90IHN1aXRhYmxlXG4gICAgaWYgKHByZWZpeCBpbiB0aGlzLm5hbWVzcGFjZXMgfHwgdXJpIGluIHRoaXMucHJlZml4ZXMpIHJldHVybjsgLy8gYWxyZWFkeSB1c2VkXG4gICAgdGhpcy5wcmVmaXhlc1t1cmldID0gcHJlZml4O1xuICAgIHRoaXMubmFtZXNwYWNlc1twcmVmaXhdID0gdXJpO1xuICB9O1xuXG4gIC8vIFRha2VzIGEgbmFtZXNwYWNlIC0+IHByZWZpeCBtYXBcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdWdnZXN0TmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChuYW1lc3BhY2VzKSB7XG4gICAgZm9yICh2YXIgcHggaW4gbmFtZXNwYWNlcykge1xuICAgICAgdGhpcy5zdWdnZXN0UHJlZml4KHB4LCBuYW1lc3BhY2VzW3B4XSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuY2hlY2tJbnRlZ3JpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHAsIG5zO1xuICAgIGZvciAocCBpbiB0aGlzLm5hbWVzcGFjZXMpIHtcbiAgICAgIGlmICh0aGlzLnByZWZpeGVzW3RoaXMubmFtZXNwYWNlc1twXV0gIT09IHApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXJpYWxpemVyIGludGVnaXR5IGVycm9yIDE6ICcgKyBwICsgJywgJyArIHRoaXMubmFtZXNwYWNlc1twXSArICcsICcgKyB0aGlzLnByZWZpeGVzW3RoaXMubmFtZXNwYWNlc1twXV0gKyAnIScpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKG5zIGluIHRoaXMucHJlZml4ZXMpIHtcbiAgICAgIGlmICh0aGlzLm5hbWVzcGFjZXNbdGhpcy5wcmVmaXhlc1tuc11dICE9PSBucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZXIgaW50ZWdpdHkgZXJyb3IgMjogJyArIG5zICsgJywgJyArIHRoaXMucHJlZml4c1tuc10gKyAnLCAnICsgdGhpcy5uYW1lc3BhY2VzW3RoaXMucHJlZml4ZXNbbnNdXSArICchJyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIE1ha2UgdXAgYW4gdW51c2VkIHByZWZpeCBmb3IgYSByYW5kb20gbmFtZXNwYWNlXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUubWFrZVVwUHJlZml4ID0gZnVuY3Rpb24gKHVyaSkge1xuICAgIHZhciBwID0gdXJpO1xuICAgIGZ1bmN0aW9uIGNhblVzZU1ldGhvZChwcCkge1xuICAgICAgaWYgKCFfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnZhbGlkUHJlZml4LnRlc3QocHApKSByZXR1cm4gZmFsc2U7IC8vIGJhZCBmb3JtYXRcbiAgICAgIGlmIChwcCA9PT0gJ25zJykgcmV0dXJuIGZhbHNlOyAvLyBib3JpbmdcbiAgICAgIGlmIChwcCBpbiB0aGlzLm5hbWVzcGFjZXMpIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSB1c2VkXG4gICAgICB0aGlzLnByZWZpeGVzW3VyaV0gPSBwcDtcbiAgICAgIHRoaXMubmFtZXNwYWNlc1twcF0gPSB1cmk7XG4gICAgICByZXR1cm4gcHA7XG4gICAgfVxuICAgIHZhciBjYW5Vc2UgPSBjYW5Vc2VNZXRob2QuYmluZCh0aGlzKTtcblxuICAgIGlmICgnIy8nLmluZGV4T2YocFtwLmxlbmd0aCAtIDFdKSA+PSAwKSBwID0gcC5zbGljZSgwLCAtMSk7XG4gICAgdmFyIHNsYXNoID0gcC5sYXN0SW5kZXhPZignLycpO1xuICAgIGlmIChzbGFzaCA+PSAwKSBwID0gcC5zbGljZShzbGFzaCArIDEpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHAubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5wcmVmaXhjaGFycy5pbmRleE9mKHBbaV0pKSB7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwID0gcC5zbGljZSgwLCBpKTtcblxuICAgIGlmIChwLmxlbmd0aCA8IDYgJiYgY2FuVXNlKHApKSByZXR1cm4gcDsgLy8gZXhhY3QgaXMgYmVzdFxuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAzKSkpIHJldHVybiBwLnNsaWNlKDAsIDMpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAyKSkpIHJldHVybiBwLnNsaWNlKDAsIDIpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCA0KSkpIHJldHVybiBwLnNsaWNlKDAsIDQpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAxKSkpIHJldHVybiBwLnNsaWNlKDAsIDEpO1xuICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCA1KSkpIHJldHVybiBwLnNsaWNlKDAsIDUpO1xuICAgIGlmICghX19TZXJpYWxpemVyLnByb3RvdHlwZS52YWxpZFByZWZpeC50ZXN0KHApKSB7XG4gICAgICBwID0gJ24nOyAvLyBPdGhlcndpc2UgdGhlIGxvb3AgYmVsb3cgbWF5IG5ldmVyIHRlcm1pbW5hdGVcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7OyBqKyspIHtcbiAgICAgIGlmIChjYW5Vc2UocC5zbGljZSgwLCAzKSArIGopKSByZXR1cm4gcC5zbGljZSgwLCAzKSArIGo7XG4gICAgfVxuICB9O1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUucm9vdFN1YmplY3RzID0gZnVuY3Rpb24gKHN0cykge1xuICAgIHZhciBpbmNvbWluZyA9IHt9O1xuICAgIHZhciBzdWJqZWN0cyA9IHt9O1xuICAgIHZhciBhbGxCbm9kZXMgPSB7fTtcblxuICAgIC8qIFRoaXMgc2NhbiBpcyB0byBmaW5kIG91dCB3aGljaCBub2RlcyB3aWxsIGhhdmUgdG8gYmUgdGhlIHJvb3RzIG9mIHRyZWVzXG4gICAgKiogaW4gdGhlIHNlcmlhbGl6ZWQgZm9ybS4gVGhpcyB3aWxsIGJlIGFueSBzeW1ib2xzLCBhbmQgYW55IGJub2Rlc1xuICAgICoqIHdoaWNoIGh2ZSBtb3JlIG9yIGxlc3MgdGhhbiBvbmUgaW5jb21pbmcgYXJjLCBhbmQgYW55IGJub2RlcyB3aGljaCBoYXZlXG4gICAgKiogb25lIGluY29taW5nIGFyYyBidXQgaXQgaXMgYW4gdW5pbnRlcnJ1cHRlZCBsb29wIG9mIHN1Y2ggbm9kZXMgYmFjayB0byBpdHNlbGYuXG4gICAgKiogVGhpcyBzaG91bGQgYmUga2VwdCBsaW5lYXIgdGltZSB3aXRoIHJlcGVjdCB0byB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMuXG4gICAgKiogTm90ZSBpdCBkb2VzIG5vdCB1c2UgYW55IGluZGV4aW5nIG9mIHRoZSBzdG9yZS5cbiAgICAqL1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3QgPSBzdHNbaV07XG4gICAgICB2YXIgY2hlY2tNZW50aW9ucyA9IGZ1bmN0aW9uIGNoZWNrTWVudGlvbnMoeCkge1xuICAgICAgICBpZiAoIWluY29taW5nLmhhc093blByb3BlcnR5KHgpKSBpbmNvbWluZ1t4XSA9IFtdO1xuICAgICAgICBpbmNvbWluZ1t4XS5wdXNoKHN0LnN1YmplY3QpOyAvLyBMaXN0IG9mIHRoaW5ncyB3aGljaCB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgcHJpbnRlZFxuICAgICAgfTtcbiAgICAgIHZhciBzdDIgPSBbc3Quc3ViamVjdCwgc3QucHJlZGljYXRlLCBzdC5vYmplY3RdO1xuICAgICAgc3QyLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICBpZiAoeS50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScpIHtcbiAgICAgICAgICBhbGxCbm9kZXNbeS50b05UKCldID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh5LnRlcm1UeXBlID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICB5LmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKHopIHtcbiAgICAgICAgICAgIGNoZWNrTWVudGlvbnMoeik7IC8vIGJub2RlcyBpbiBjb2xsZWN0aW9ucyBpbXBvcnRhbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjaGVja01lbnRpb25zKHN0c1tpXS5vYmplY3QpO1xuICAgICAgdmFyIHNzID0gc3ViamVjdHNbdGhpcy50b1N0cihzdC5zdWJqZWN0KV07IC8vIFN0YXRlbWVudHMgd2l0aCB0aGlzIGFzIHN1YmplY3RcbiAgICAgIGlmICghc3MpIHNzID0gW107XG4gICAgICBzcy5wdXNoKHN0KTtcbiAgICAgIHN1YmplY3RzW3RoaXMudG9TdHIoc3Quc3ViamVjdCldID0gc3M7IC8vIE1ha2UgaGFzaC4gQEAgdG9vIHNsb3cgZm9yIGZvcm11bGE/XG4gICAgfVxuXG4gICAgdmFyIHJvb3RzID0gW107XG4gICAgZm9yICh2YXIgeE5UIGluIHN1YmplY3RzKSB7XG4gICAgICBpZiAoIXN1YmplY3RzLmhhc093blByb3BlcnR5KHhOVCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHkgPSB0aGlzLmZyb21TdHIoeE5UKTtcbiAgICAgIGlmICh5LnRlcm1UeXBlICE9PSAnQmxhbmtOb2RlJyB8fCAhaW5jb21pbmdbeV0gfHwgaW5jb21pbmdbeV0ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHJvb3RzLnB1c2goeSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluY29taW5nID0gaW5jb21pbmc7IC8vIEtlZXAgZm9yIHNlcmlhbGl6aW5nIEBAIEJ1ZyBmb3IgbmVzdGVkIGZvcm11bGFzXG5cbiAgICAvLyBOb3cgZG8gdGhlIHNjYW4gdXNpbmcgZXhpc3Rpbmcgcm9vdHNcbiAgICB2YXIgcm9vdHNIYXNoID0ge307XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCByb290cy5sZW5ndGg7IGsrKykge1xuICAgICAgcm9vdHNIYXNoW3Jvb3RzW2tdLnRvTlQoKV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4geyAncm9vdHMnOiByb290cywgJ3N1YmplY3RzJzogc3ViamVjdHMsXG4gICAgICAncm9vdHNIYXNoJzogcm9vdHNIYXNoLCAnaW5jb21pbmcnOiBpbmNvbWluZyB9O1xuICB9O1xuXG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUudG9OMyA9IGZ1bmN0aW9uIChmKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50c1RvTjMoZi5zdGF0ZW1lbnRzKTtcbiAgfTtcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3RRTmFtZUNoYXJzID0gJ1xcdFxcclxcbiAhXCIjJCUmXFwnKCkqLiwrLzs8PT4/QFtcXFxcXV5ge3x9fic7XG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuX25vdE5hbWVDaGFycyA9IF9fU2VyaWFsaXplci5wcm90b3R5cGUuX25vdFFOYW1lQ2hhcnMgKyAnOic7XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5leHBsaWNpdFVSSSA9IGZ1bmN0aW9uICh1cmkpIHtcbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdyJykgPCAwICYmIHRoaXMuYmFzZSkge1xuICAgICAgdXJpID0gVXJpLnJlZlRvKHRoaXMuYmFzZSwgdXJpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmxhZ3MuaW5kZXhPZigndScpID49IDApIHtcbiAgICAgIC8vIFVuaWNvZGUgZW5jb2RpbmcgTlRyaXBsZXMgc3R5bGVcbiAgICAgIHVyaSA9IGJhY2tzbGFzaFVpZnkodXJpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXJpID0gaGV4aWZ5KHVyaSk7XG4gICAgfVxuICAgIHJldHVybiAnPCcgKyB1cmkgKyAnPic7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdGF0ZW1lbnRzVG9OVHJpcGxlcyA9IGZ1bmN0aW9uIChzdHMpIHtcbiAgICB2YXIgc29ydGVkID0gc3RzLnNsaWNlKCk7XG4gICAgc29ydGVkLnNvcnQoKTtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHJkZm5zID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIHZhciB0ZXJtVG9OVCA9IGZ1bmN0aW9uIHRlcm1Ub05UKHgpIHtcbiAgICAgIGlmICh4LnRlcm1UeXBlICE9PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuYXRvbWljVGVybVRvTjMoeCk7XG4gICAgICB9XG4gICAgICB2YXIgbGlzdCA9IHguZWxlbWVudHM7XG4gICAgICB2YXIgcmVzdCA9IGtiLnN5bShyZGZucyArICduaWxsJyk7XG4gICAgICBmb3IgKHZhciBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgYm5vZGUgPSBuZXcgQmxhbmtOb2RlKCk7XG4gICAgICAgIHN0ciArPSB0ZXJtVG9OVChibm9kZSkgKyAnICcgKyB0ZXJtVG9OVChrYi5zeW0ocmRmbnMgKyAnZmlyc3QnKSkgKyAnICcgKyB0ZXJtVG9OVChsaXN0W2ldKSArICcuXFxuJztcbiAgICAgICAgc3RyICs9IHRlcm1Ub05UKGJub2RlKSArICcgJyArIHRlcm1Ub05UKGtiLnN5bShyZGZucyArICdyZXN0JykpICsgJyAnICsgdGVybVRvTlQocmVzdCkgKyAnLlxcbic7XG4gICAgICAgIHJlc3QgPSBibm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmLmF0b21pY1Rlcm1Ub04zKHJlc3QpO1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdCA9IHNvcnRlZFtpXTtcbiAgICAgIHZhciBzID0gJyc7XG4gICAgICBzICs9IHRlcm1Ub05UKHN0LnN1YmplY3QpICsgJyAnO1xuICAgICAgcyArPSB0ZXJtVG9OVChzdC5wcmVkaWNhdGUpICsgJyAnO1xuICAgICAgcyArPSB0ZXJtVG9OVChzdC5vYmplY3QpICsgJyAnO1xuICAgICAgaWYgKHRoaXMuZmxhZ3MuaW5kZXhPZigncScpID49IDApIHtcbiAgICAgICAgLy8gRG8gcXVhZHMgbm90IG5ydGlwbGVzXG4gICAgICAgIHMgKz0gdGVybVRvTlQoc3Qud2h5KSArICcgJztcbiAgICAgIH1cbiAgICAgIHMgKz0gJy5cXG4nO1xuICAgICAgc3RyICs9IHM7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5zdGF0ZW1lbnRzVG9OMyA9IGZ1bmN0aW9uIChzdHMpIHtcbiAgICB2YXIgaW5kZW50ID0gNDtcbiAgICB2YXIgd2lkdGggPSA4MDtcbiAgICB2YXIga2IgPSB0aGlzLnN0b3JlO1xuICAgIC8vIEEgVVJJIE1hcCBhbG93cyB1cyB0byBwdXQgdGhlIHR5cGUgc3RhdGVtbnRzIGF0IHRoZSB0b3AuXG4gICAgdmFyIHVyaU1hcCA9IHsgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJzogJ2FhYTowMCcgfTtcbiAgICB2YXIgU1BPID0gZnVuY3Rpb24gU1BPKHgsIHkpIHtcbiAgICAgIC8vIERvIGxpbWl0ZWQgY2Fub25pY2FsaXphdGlvbiBvZiBibm9kZXNcbiAgICAgIHJldHVybiBVdGlsLmhlYXZ5Q29tcGFyZVNQTyh4LCB5LCBrYiwgdXJpTWFwKTtcbiAgICB9O1xuICAgIHN0cy5zb3J0KFNQTyk7XG5cbiAgICBpZiAodGhpcy5iYXNlICYmICF0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgIHRoaXMuZGVmYXVsdE5hbWVzcGFjZSA9IHRoaXMuYmFzZSArICcjJztcbiAgICB9XG5cbiAgICB2YXIgcHJlZE1hcCA9IHt9O1xuICAgIGlmICh0aGlzLmZsYWdzLmluZGV4T2YoJ3MnKSA8IDApIHtcbiAgICAgIHByZWRNYXBbJ2h0dHA6Ly93d3cudzMub3JnLzIwMDIvMDcvb3dsI3NhbWVBcyddID0gJz0nO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCd0JykgPCAwKSB7XG4gICAgICBwcmVkTWFwWydodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZSddID0gJ2EnO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdpJykgPCAwKSB7XG4gICAgICBwcmVkTWFwWydodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL3N3YXAvbG9nI2ltcGxpZXMnXSA9ICc9Pic7XG4gICAgfVxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBcnJhbmdlIHRoZSBiaXRzIG9mIHRleHRcblxuICAgIHZhciBzcGFjZXMgPSBmdW5jdGlvbiBzcGFjZXMobikge1xuICAgICAgdmFyIHMgPSAnJztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHMgKz0gJyAnO1xuICAgICAgfXJldHVybiBzO1xuICAgIH07XG5cbiAgICB2YXIgdHJlZVRvTGluZSA9IGZ1bmN0aW9uIHRyZWVUb0xpbmUodHJlZSkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBicmFuY2ggPSB0cmVlW2ldO1xuICAgICAgICB2YXIgczIgPSB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IHRyZWVUb0xpbmUoYnJhbmNoKTtcbiAgICAgICAgLy8gTm90ZSB0aGUgc3BhY2UgYmVmb3JlIHRoZSBkb3QgaW4gY2FzZSBzdGF0ZW1lbnQgZW5kcyAxMjMuIHdoaWNoIGlzIGluIGZhY3QgYWxsb3dlZCBidXQgYmUgY29uc2VydmF0aXZlLlxuICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgIHZhciBjaCA9IHN0ci5zbGljZSgtMSkgfHwgJyAnO1xuICAgICAgICAgIGlmIChzMiA9PT0gJywnIHx8IHMyID09PSAnOycpIHtcbiAgICAgICAgICAgIC8vIG5vIGdhcFxuICAgICAgICAgIH0gZWxzZSBpZiAoczIgPT09ICcuJyAmJiAhJzAxMjM0NTY3ODkuJy5pbmNsdWRlcyhjaCkpIHsvLyBubyBnYXAgZXhjZXB0IGFmdGVyIG51bWJlclxuICAgICAgICAgICAgLy8gbm8gZ2FwXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciArPSAnICc7IC8vIHNlcGFyYXRlIGZyb20gcHJldmlvdXMgdG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IHMyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9O1xuXG4gICAgLy8gQ29udmVydCBhIG5lc3RlZCB0cmVlIG9mIGxpc3RzIGFuZCBzdHJpbmdzIHRvIGEgc3RyaW5nXG4gICAgdmFyIHRyZWVUb1N0cmluZyA9IGZ1bmN0aW9uIHRyZWVUb1N0cmluZyh0cmVlLCBsZXZlbCkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgdmFyIGxhc3RMZW5ndGggPSAxMDAwMDA7XG4gICAgICBpZiAobGV2ZWwgPT09IHVuZGVmaW5lZCkgbGV2ZWwgPSAtMTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnJhbmNoID0gdHJlZVtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBicmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFyIHN1YnN0ciA9IHRyZWVUb1N0cmluZyhicmFuY2gsIGxldmVsICsgMSk7XG4gICAgICAgICAgaWYgKHN1YnN0ci5sZW5ndGggPCAxMCAqICh3aWR0aCAtIGluZGVudCAqIGxldmVsKSAmJiBzdWJzdHIuaW5kZXhPZignXCJcIlwiJykgPCAwKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBtZXNzIHVwIG11bHRpbGluZSBzdHJpbmdzXG4gICAgICAgICAgICB2YXIgbGluZSA9IHRyZWVUb0xpbmUoYnJhbmNoKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IHdpZHRoIC0gaW5kZW50ICogbGV2ZWwpIHtcbiAgICAgICAgICAgICAgYnJhbmNoID0gbGluZTsgLy8gICBOb3RlISB0cmVhdCBhcyBzdHJpbmcgYmVsb3dcbiAgICAgICAgICAgICAgc3Vic3RyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJzdHIpIGxhc3RMZW5ndGggPSAxMDAwMDtcbiAgICAgICAgICBzdHIgKz0gc3Vic3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmIChicmFuY2gubGVuZ3RoID09PSAxICYmIHN0ci5zbGljZSgtMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAoJywuOycuaW5kZXhPZihicmFuY2gpID49IDApIHtcbiAgICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArIGJyYW5jaCArICdcXG4nOyAvLyAgc2xpcCBwdW5jdCduIG9uIGVuZFxuICAgICAgICAgICAgICBsYXN0TGVuZ3RoICs9IDE7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGFzdExlbmd0aCA8IGluZGVudCAqIGxldmVsICsgNCB8fCAvLyBpZiBuZXcgbGluZSBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgbGFzdExlbmd0aCArIGJyYW5jaC5sZW5ndGggKyAxIDwgd2lkdGggJiYgJzsuJy5pbmRleE9mKHN0cltzdHIubGVuZ3RoIC0gMl0pIDwgMCkge1xuICAgICAgICAgICAgLy8gb3IgdGhlIHN0cmluZyBmaXRzIG9uIGxhc3QgbGluZVxuICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArICcgJyArIGJyYW5jaCArICdcXG4nOyAvLyB0aGVuIGNvbnRpbnVlIG9uIHRoaXMgbGluZVxuICAgICAgICAgICAgbGFzdExlbmd0aCArPSBicmFuY2gubGVuZ3RoICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIF9saW5lID0gc3BhY2VzKGluZGVudCAqIGxldmVsKSArIGJyYW5jaDtcbiAgICAgICAgICAgIHN0ciArPSBfbGluZSArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCA9IF9saW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHtcbiAgICAgICAgICAgICAgc3RyICs9ICdcXG4nOyAvLyBleHRyYSBibGFuayBsaW5lXG4gICAgICAgICAgICAgIGxhc3RMZW5ndGggPSAxMDAwMDA7IC8vIGRvbid0IHRvdWNoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH07XG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTdHJ1Y3R1cmUgZm9yIE4zXG4gICAgLy8gQ29udmVydCBhIHNldCBvZiBzdGF0ZW1lbnRzIGludG8gYSBuZXN0ZWQgdHJlZSBvZiBsaXN0cyBhbmQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIHN0YXRlbWVudExpc3RUb1RyZWVNZXRob2Qoc3RhdGVtZW50cykge1xuICAgICAgdmFyIHN0YXRzID0gdGhpcy5yb290U3ViamVjdHMoc3RhdGVtZW50cyk7XG4gICAgICB2YXIgcm9vdHMgPSBzdGF0cy5yb290cztcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb290ID0gcm9vdHNbaV07XG4gICAgICAgIHJlc3VsdHMucHVzaChzdWJqZWN0VHJlZShyb290LCBzdGF0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBzdGF0ZW1lbnRMaXN0VG9UcmVlID0gc3RhdGVtZW50TGlzdFRvVHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gVGhlIHRyZWUgZm9yIGEgc3ViamVjdFxuICAgIGZ1bmN0aW9uIHN1YmplY3RUcmVlKHN1YmplY3QsIHN0YXRzKSB7XG4gICAgICBpZiAoc3ViamVjdC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScgJiYgIXN0YXRzLmluY29taW5nW3N1YmplY3RdKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RUcmVlKHN1YmplY3QsIHN0YXRzLCB0cnVlKS5jb25jYXQoWycuJ10pOyAvLyBBbm9ueW1vdXMgYm5vZGUgc3ViamVjdFxuICAgICAgfVxuICAgICAgcmV0dXJuIFt0ZXJtVG9OMyhzdWJqZWN0LCBzdGF0cyldLmNvbmNhdChbcHJvcGVydHlUcmVlKHN1YmplY3QsIHN0YXRzKV0pLmNvbmNhdChbJy4nXSk7XG4gICAgfVxuICAgIC8vIFRoZSBwcm9wZXJ0eSB0cmVlIGZvciBhIHNpbmdsZSBzdWJqZWN0IG9yIGFub255bW91cyBub2RlXG4gICAgZnVuY3Rpb24gcHJvcGVydHlUcmVlTWV0aG9kKHN1YmplY3QsIHN0YXRzKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgdmFyIGxhc3RQcmVkID0gbnVsbDtcbiAgICAgIHZhciBzdHMgPSBzdGF0cy5zdWJqZWN0c1t0aGlzLnRvU3RyKHN1YmplY3QpXSB8fCBbXTsgLy8gcmVsZXZhbnQgc3RhdGVtZW50c1xuICAgICAgaWYgKHR5cGVvZiBzdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FudCBmaW5kIHN0YXRlbWVudHMgZm9yICcgKyBzdWJqZWN0KTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdCA9IHN0c1tpXTtcbiAgICAgICAgaWYgKHN0LnByZWRpY2F0ZS51cmkgPT09IGxhc3RQcmVkKSB7XG4gICAgICAgICAgb2JqZWN0cy5wdXNoKCcsJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGxhc3RQcmVkKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoW29iamVjdHNdKS5jb25jYXQoWyc7J10pO1xuICAgICAgICAgICAgb2JqZWN0cyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRzLnB1c2gocHJlZE1hcFtzdC5wcmVkaWNhdGUudXJpXSA/IHByZWRNYXBbc3QucHJlZGljYXRlLnVyaV0gOiB0ZXJtVG9OMyhzdC5wcmVkaWNhdGUsIHN0YXRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFByZWQgPSBzdC5wcmVkaWNhdGUudXJpO1xuICAgICAgICBvYmplY3RzLnB1c2gob2JqZWN0VHJlZShzdC5vYmplY3QsIHN0YXRzKSk7XG4gICAgICB9XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoW29iamVjdHNdKTtcbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICB2YXIgcHJvcGVydHlUcmVlID0gcHJvcGVydHlUcmVlTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBmdW5jdGlvbiBvYmplY3RUcmVlTWV0aG9kKG9iaiwgc3RhdHMsIGZvcmNlKSB7XG4gICAgICBpZiAob2JqLnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJyAmJiAoZm9yY2UgfHwgc3RhdHMucm9vdHNIYXNoW29iai50b05UKCldID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vIGlmIG5vdCBhIHJvb3RcbiAgICAgICAgaWYgKHN0YXRzLnN1YmplY3RzW3RoaXMudG9TdHIob2JqKV0pIHtcbiAgICAgICAgICByZXR1cm4gWydbJywgcHJvcGVydHlUcmVlKG9iaiwgc3RhdHMpLCAnXSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnW10nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybVRvTjMob2JqLCBzdGF0cyk7XG4gICAgfVxuICAgIHZhciBvYmplY3RUcmVlID0gb2JqZWN0VHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gdGVybVRvTjNNZXRob2QoZXhwciwgc3RhdHMpIHtcbiAgICAgIC8vXG4gICAgICB2YXIgaSwgcmVzO1xuICAgICAgc3dpdGNoIChleHByLnRlcm1UeXBlKSB7XG4gICAgICAgIGNhc2UgJ0dyYXBoJzpcbiAgICAgICAgICByZXMgPSBbJ3snXTtcbiAgICAgICAgICByZXMgPSByZXMuY29uY2F0KHN0YXRlbWVudExpc3RUb1RyZWUoZXhwci5zdGF0ZW1lbnRzKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoWyd9J10pO1xuXG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJlcyA9IFsnKCddO1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXMucHVzaChbb2JqZWN0VHJlZShleHByLmVsZW1lbnRzW2ldLCBzdGF0cyldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnB1c2goJyknKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXRvbWljVGVybVRvTjMoZXhwcik7XG4gICAgICB9XG4gICAgfVxuICAgIF9fU2VyaWFsaXplci5wcm90b3R5cGUudGVybVRvTjMgPSB0ZXJtVG9OMztcbiAgICB2YXIgdGVybVRvTjMgPSB0ZXJtVG9OM01ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gcHJlZml4RGlyZWN0aXZlc01ldGhvZCgpIHtcbiAgICAgIHZhciBzdHIgPSAnJztcbiAgICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgICAgc3RyICs9ICdAcHJlZml4IDogJyArIHRoaXMuZXhwbGljaXRVUkkodGhpcy5kZWZhdWx0TmFtZXNwYWNlKSArICcuXFxuJztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIG5zIGluIHRoaXMucHJlZml4ZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByZWZpeGVzLmhhc093blByb3BlcnR5KG5zKSkgY29udGludWU7XG4gICAgICAgIGlmICghdGhpcy5uYW1lc3BhY2VzVXNlZFtuc10pIGNvbnRpbnVlO1xuICAgICAgICBzdHIgKz0gJ0BwcmVmaXggJyArIHRoaXMucHJlZml4ZXNbbnNdICsgJzogJyArIHRoaXMuZXhwbGljaXRVUkkobnMpICsgJy5cXG4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ciArICdcXG4nO1xuICAgIH1cbiAgICB2YXIgcHJlZml4RGlyZWN0aXZlcyA9IHByZWZpeERpcmVjdGl2ZXNNZXRob2QuYmluZCh0aGlzKTtcbiAgICAvLyBCb2R5IG9mIHN0YXRlbWVudHNUb04zOlxuICAgIHZhciB0cmVlID0gc3RhdGVtZW50TGlzdFRvVHJlZShzdHMpO1xuICAgIHJldHVybiBwcmVmaXhEaXJlY3RpdmVzKCkgKyB0cmVlVG9TdHJpbmcodHJlZSk7XG4gIH07XG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEF0b21pYyBUZXJtc1xuXG4gIC8vICBEZWFsIHdpdGggdGVybSBsZXZlbCB0aGluZ3MgYW5kIG5lc3Rpbmcgd2l0aCBubyBibm9kZSBzdHJ1Y3R1cmVcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5hdG9taWNUZXJtVG9OMyA9IGZ1bmN0aW9uIGF0b21pY1Rlcm1Ub04zKGV4cHIsIHN0YXRzKSB7XG4gICAgc3dpdGNoIChleHByLnRlcm1UeXBlKSB7XG4gICAgICBjYXNlICdCbGFua05vZGUnOlxuICAgICAgY2FzZSAnVmFyaWFibGUnOlxuICAgICAgICByZXR1cm4gZXhwci50b05UKCk7XG4gICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgdmFyIHZhbCA9IGV4cHIudmFsdWUudG9TdHJpbmcoKTsgLy8gc2hvdWxkIGJlIGEgc3RyaW5nIGFscmVhZHlcbiAgICAgICAgaWYgKGV4cHIuZGF0YXR5cGUgJiYgdGhpcy5mbGFncy5pbmRleE9mKCd4JykgPCAwKSB7XG4gICAgICAgICAgLy8gU3VwcmVzcyBuYXRpdmUgbnVtYmVyc1xuICAgICAgICAgIHN3aXRjaCAoZXhwci5kYXRhdHlwZS51cmkpIHtcblxuICAgICAgICAgICAgY2FzZSAnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50ZWdlcic6XG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XG5cbiAgICAgICAgICAgIGNhc2UgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWwnOlxuICAgICAgICAgICAgICAvLyBJbiB1cnRsZSBtdXN0IGhhdmUgZG90XG4gICAgICAgICAgICAgIGlmICh2YWwuaW5kZXhPZignLicpIDwgMCkgdmFsICs9ICcuMCc7XG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XG5cbiAgICAgICAgICAgIGNhc2UgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RvdWJsZSc6XG4gICAgICAgICAgICAgIC8vIE11c3QgZm9yY2UgdXNlIG9mICdlJ1xuICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJy4nKSA8IDApIHZhbCArPSAnLjAnO1xuICAgICAgICAgICAgICBpZiAodmFsLmluZGV4T2YoJ2UnKSA8IDApIHZhbCArPSAnZTAnO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuXG4gICAgICAgICAgICBjYXNlICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJpbmdUb04zKGV4cHIudmFsdWUpO1xuICAgICAgICBpZiAoZXhwci5sYW5ndWFnZSkge1xuICAgICAgICAgIHN0ciArPSAnQCcgKyBleHByLmxhbmd1YWdlO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHByLmRhdGF0eXBlLmVxdWFscyhYU0Quc3RyaW5nKSkge1xuICAgICAgICAgIHN0ciArPSAnXl4nICsgdGhpcy5hdG9taWNUZXJtVG9OMyhleHByLmRhdGF0eXBlLCBzdGF0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgIGNhc2UgJ05hbWVkTm9kZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFRvTjMoZXhwcik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsOiBhdG9taWNUZXJtVG9OMyBjYW5ub3QgaGFuZGxlICcgKyBleHByICsgJyBvZiB0ZXJtVHlwZTogJyArIGV4cHIudGVybVR5cGUpO1xuICAgIH1cbiAgfTtcblxuICAvLyAgc3RyaW5nVG9OMzogIFN0cmluZyBlc2NhcGluZyBmb3IgTjNcblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnZhbGlkUHJlZml4ID0gbmV3IFJlZ0V4cCgvXlthLXpBLVpdW2EtekEtWjAtOV0qJC8pO1xuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuZm9yYmlkZGVuMSA9IG5ldyBSZWdFeHAoL1tcXFxcXCJcXGJcXGZcXHJcXHZcXHRcXG5cXHUwMDgwLVxcdWZmZmZdL2dtKTtcbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS5mb3JiaWRkZW4zID0gbmV3IFJlZ0V4cCgvW1xcXFxcIlxcYlxcZlxcclxcdlxcdTAwODAtXFx1ZmZmZl0vZ20pO1xuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN0cmluZ1RvTjMgPSBmdW5jdGlvbiBzdHJpbmdUb04zKHN0ciwgZmxhZ3MpIHtcbiAgICBpZiAoIWZsYWdzKSBmbGFncyA9ICdlJztcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGksIGosIGs7XG4gICAgdmFyIGRlbGltO1xuICAgIHZhciBmb3JiaWRkZW47XG4gICAgaWYgKHN0ci5sZW5ndGggPiAyMCAmJiAvLyBMb25nIGVub3VnaCB0byBtYWtlIHNlbnNlXG4gICAgc3RyLnNsaWNlKC0xKSAhPT0gJ1wiJyAmJiAvLyBjb3JuZXIgY2FzZSdcbiAgICBmbGFncy5pbmRleE9mKCduJykgPCAwICYmICggLy8gRm9yY2Ugc2luZ2xlIGxpbmVcbiAgICBzdHIuaW5kZXhPZignXFxuJykgPiAwIHx8IHN0ci5pbmRleE9mKCdcIicpID4gMCkpIHtcbiAgICAgIGRlbGltID0gJ1wiXCJcIic7XG4gICAgICBmb3JiaWRkZW4gPSBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLmZvcmJpZGRlbjM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGltID0gJ1wiJztcbiAgICAgIGZvcmJpZGRlbiA9IF9fU2VyaWFsaXplci5wcm90b3R5cGUuZm9yYmlkZGVuMTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IHN0ci5sZW5ndGg7KSB7XG4gICAgICBmb3JiaWRkZW4ubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBtID0gZm9yYmlkZGVuLmV4ZWMoc3RyLnNsaWNlKGkpKTtcbiAgICAgIGlmIChtID09IG51bGwpIGJyZWFrO1xuICAgICAgaiA9IGkgKyBmb3JiaWRkZW4ubGFzdEluZGV4IC0gMTtcbiAgICAgIHJlcyArPSBzdHIuc2xpY2UoaSwgaik7XG4gICAgICB2YXIgY2ggPSBzdHJbal07XG4gICAgICBpZiAoY2ggPT09ICdcIicgJiYgZGVsaW0gPT09ICdcIlwiXCInICYmIHN0ci5zbGljZShqLCBqICsgMykgIT09ICdcIlwiXCInKSB7XG4gICAgICAgIHJlcyArPSBjaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsgPSAnXFxiXFxmXFxyXFx0XFx2XFxuXFxcXFwiJy5pbmRleE9mKGNoKTsgLy8gTm8gZXNjYXBpbmcgb2YgYmVsbCAoNyk/XG4gICAgICAgIGlmIChrID49IDApIHtcbiAgICAgICAgICByZXMgKz0gJ1xcXFwnICsgJ2JmcnR2blxcXFxcIidba107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ2UnKSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBVbmljb2RlIGVzY2FwaW5nIGluIHN0cmluZ3Mgbm90IHVuaXggc3R5bGVcbiAgICAgICAgICAgIHJlcyArPSAnXFxcXHUnICsgKCcwMDAnICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKSkuc2xpY2UoLTQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyAnZScgZmxhZ1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSA9IGogKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZGVsaW0gKyByZXMgKyBzdHIuc2xpY2UoaSkgKyBkZWxpbTtcbiAgfTtcbiAgLy8gIEEgc2luZ2xlIHN5bWJvbCwgZWl0aGVyIGluICA8PiBvciBuYW1lc3BhY2Ugbm90YXRpb25cblxuICBfX1NlcmlhbGl6ZXIucHJvdG90eXBlLnN5bWJvbFRvTjMgPSBmdW5jdGlvbiBzeW1ib2xUb04zKHgpIHtcbiAgICAvLyBjLmYuIHN5bWJvbFN0cmluZygpIGluIG5vdGF0aW9uMy5weVxuICAgIHZhciB1cmkgPSB4LnVyaTtcbiAgICB2YXIgaiA9IHVyaS5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGogPCAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZignLycpIDwgMCkge1xuICAgICAgaiA9IHVyaS5sYXN0SW5kZXhPZignLycpO1xuICAgIH1cbiAgICBpZiAoaiA+PSAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZigncCcpIDwgMCAmJiAoXG4gICAgLy8gQ2FuIHNwbGl0IGF0IG5hbWVzcGFjZSBidXQgb25seSBpZiBodHRwW3NdOiBVUkkgb3IgZmlsZTogb3Igd3Nbc10gKHdoeSBub3Qgb3RoZXJzPylcbiAgICB1cmkuaW5kZXhPZignaHR0cCcpID09PSAwIHx8IHVyaS5pbmRleE9mKCd3cycpID09PSAwIHx8IHVyaS5pbmRleE9mKCdmaWxlJykgPT09IDApKSB7XG4gICAgICB2YXIgY2FuU3BsaXQgPSB0cnVlO1xuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgdXJpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3ROYW1lQ2hhcnMuaW5kZXhPZih1cmlba10pID49IDApIHtcbiAgICAgICAgICBjYW5TcGxpdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgICAgICAgaWYgKHVyaS5zbGljZSgwLCBqICsgMSkgPT09IHRoaXMuYmFzZSArICcjJykgeyAvLyBiYXNlLXJlbGF0aXZlXG4gICAgICAgICAgICAgIGlmIChjYW5TcGxpdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnOicgKyB1cmkuc2xpY2UoaiArIDEpIC8vIGFzc3VtZSBkZWFmdWx0IG5zIGlzIGxvY2FsXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICc8IycgKyB1cmkuc2xpY2UoaiArIDEpICsgJz4nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICovXG4gICAgICBpZiAoY2FuU3BsaXQpIHtcbiAgICAgICAgdmFyIGxvY2FsaWQgPSB1cmkuc2xpY2UoaiArIDEpO1xuICAgICAgICB2YXIgbmFtZXNwID0gdXJpLnNsaWNlKDAsIGogKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdE5hbWVzcGFjZSAmJiB0aGlzLmRlZmF1bHROYW1lc3BhY2UgPT09IG5hbWVzcCAmJiB0aGlzLmZsYWdzLmluZGV4T2YoJ2QnKSA8IDApIHtcbiAgICAgICAgICAvLyBkIC0+IHN1cHByZXNzIGRlZmF1bHRcbiAgICAgICAgICBpZiAodGhpcy5mbGFncy5pbmRleE9mKCdrJykgPj0gMCAmJiB0aGlzLmtleW9yZHMuaW5kZXhPZihsb2NhbGlkKSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJzonICsgbG9jYWxpZDtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLmNoZWNrSW50ZWdyaXR5KCkgLy8gIEBAQCBSZW1vdmUgd2hlbiBub3QgdGVzdGluZ1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5wcmVmaXhlc1tuYW1lc3BdO1xuICAgICAgICBpZiAoIXByZWZpeCkgcHJlZml4ID0gdGhpcy5tYWtlVXBQcmVmaXgobmFtZXNwKTtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgIHRoaXMubmFtZXNwYWNlc1VzZWRbbmFtZXNwXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCArICc6JyArIGxvY2FsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbCB0aG91Z2ggaWYgY2FuJ3QgZG8gcW5hbWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXRVUkkodXJpKTtcbiAgfTtcbiAgLy8gU3RyaW5nIGVzY2FwaW5nIHV0aWxpdGllc1xuXG4gIGZ1bmN0aW9uIGhleGlmeShzdHIpIHtcbiAgICAvLyBhbHNvIHVzZWQgaW4gcGFyc2VyXG4gICAgcmV0dXJuIGVuY29kZVVSSShzdHIpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFja3NsYXNoVWlmeShzdHIpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGs7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGsgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChrID4gNjU1MzUpIHtcbiAgICAgICAgcmVzICs9ICdcXFxcVScgKyAoJzAwMDAwMDAwJyArIGsudG9TdHJpbmcoMTYpKS5zbGljZSgtOCk7IC8vIGNvbnZlcnQgdG8gdXBwZXI/XG4gICAgICB9IGVsc2UgaWYgKGsgPiAxMjYpIHtcbiAgICAgICAgcmVzICs9ICdcXFxcdScgKyAoJzAwMDAnICsgay50b1N0cmluZygxNikpLnNsaWNlKC00KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyArPSBzdHJbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gUXVhZCBzdG9yZSBzZXJpYWxpemF0aW9uXG5cbiAgLy8gQHBhcmEuIHdyaXRlICAtIGEgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIHN0cmluZyB0byBiZSBvdXRwdXRcbiAgLy9cbiAgX19TZXJpYWxpemVyLnByb3RvdHlwZS53cml0ZVN0b3JlID0gZnVuY3Rpb24gKHdyaXRlKSB7XG4gICAgdmFyIGtiID0gdGhpcy5zdG9yZTtcbiAgICB2YXIgZmV0Y2hlciA9IGtiLmZldGNoZXI7XG4gICAgdmFyIHNlc3Npb24gPSBmZXRjaGVyICYmIGZldGNoZXIuYXBwTm9kZTtcblxuICAgIC8vIFRoZSBjb3JlIGRhdGFcblxuICAgIHZhciBzb3VyY2VzID0gdGhpcy5zdG9yZS5pbmRleFszXTtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZXMpIHtcbiAgICAgIC8vIC0+IGFzc3VtZSB3ZSBjYW4gdXNlIC0+IGFzIHNob3J0IGZvciBsb2c6c2VtYW50aWNzXG4gICAgICB2YXIgc291cmNlID0ga2IuZnJvbU5UKHMpO1xuICAgICAgaWYgKHNlc3Npb24gJiYgc291cmNlLnNhbWVUZXJtKHNlc3Npb24pKSBjb250aW51ZTtcbiAgICAgIHdyaXRlKCdcXG4nICsgdGhpcy5hdG9taWNUZXJtVG9OMyhzb3VyY2UpICsgJyAnICsgdGhpcy5hdG9taWNUZXJtVG9OMyhrYi5zeW0oJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvc3dhcC9sb2cjc2VtYW50aWNzJykpICsgJyB7ICcgKyB0aGlzLnN0YXRlbWVudHNUb04zKGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzb3VyY2UpKSArICcgfS5cXG4nKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWV0YWRhdGEgZnJvbSBIVFRQIGludGVyYWN0aW9uczpcblxuICAgIGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIGtiLnN5bSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNyZXF1ZXN0ZWRVUkknKSkubWFwKGZ1bmN0aW9uIChzdCkge1xuICAgICAgd3JpdGUoJ1xcbjwnICsgc3Qub2JqZWN0LnZhbHVlICsgJz4gbG9nOm1ldGFkYXRhIHtcXG4nKTtcbiAgICAgIHZhciBzdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgc3Quc3ViamVjdCk7XG4gICAgICB3cml0ZSh0aGlzLnN0YXRlbWVudHNUb04zKHRoaXMuc3RhdGVtZW50c1RvTjMoc3RzKSkpO1xuICAgICAgd3JpdGUoJ30uXFxuJyk7XG4gICAgfSk7XG5cbiAgICAvLyBJbmZlcmVuY2VzIHdlIGhhdmUgbWFkZSBvdXJzZWx2ZXMgbm90IGF0dHJpYnV0YWJsZSB0byBhbnlvbmUgZWxzZVxuXG4gICAgdmFyIG1ldGFTb3VyY2VzID0gW107XG4gICAgaWYgKHNlc3Npb24pIG1ldGFTb3VyY2VzLnB1c2goc2Vzc2lvbik7XG4gICAgdmFyIG1ldGFkYXRhID0gW107XG4gICAgbWV0YVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGEuY29uY2F0KGtiLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBzb3VyY2UpKTtcbiAgICB9KTtcbiAgICB3cml0ZSh0aGlzLnN0YXRlbWVudHNUb04zKG1ldGFkYXRhKSk7XG4gIH07XG5cbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBYTUwgc2VyaWFsaXphdGlvblxuXG4gIF9fU2VyaWFsaXplci5wcm90b3R5cGUuc3RhdGVtZW50c1RvWE1MID0gZnVuY3Rpb24gKHN0cykge1xuICAgIHZhciBpbmRlbnQgPSA0O1xuICAgIHZhciB3aWR0aCA9IDgwO1xuXG4gICAgdmFyIG5hbWVzcGFjZUNvdW50cyA9IFtdOyAvLyB3aGljaCBoYXZlIGJlZW4gdXNlZFxuICAgIG5hbWVzcGFjZUNvdW50c1snaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyddID0gdHJ1ZTtcblxuICAgIHZhciBsaVByZWZpeCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjXyc7IC8vIHByZWZpeCBmb3Igb3JkZXJlZCBsaXN0IGl0ZW1zXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQXJyYW5nZSB0aGUgYml0cyBvZiBYTUwgdGV4dFxuXG4gICAgdmFyIHNwYWNlcyA9IGZ1bmN0aW9uIHNwYWNlcyhuKSB7XG4gICAgICB2YXIgcyA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgcyArPSAnICc7XG4gICAgICB9cmV0dXJuIHM7XG4gICAgfTtcblxuICAgIHZhciBYTUx0cmVlVG9MaW5lID0gZnVuY3Rpb24gWE1MdHJlZVRvTGluZSh0cmVlKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGJyYW5jaCA9IHRyZWVbaV07XG4gICAgICAgIHZhciBzMiA9IHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogWE1MdHJlZVRvTGluZShicmFuY2gpO1xuICAgICAgICBzdHIgKz0gczI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH07XG5cbiAgICAvLyBDb252ZXJ0IGEgbmVzdGVkIHRyZWUgb2YgbGlzdHMgYW5kIHN0cmluZ3MgdG8gYSBzdHJpbmdcbiAgICB2YXIgWE1MdHJlZVRvU3RyaW5nID0gZnVuY3Rpb24gWE1MdHJlZVRvU3RyaW5nKHRyZWUsIGxldmVsKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG4gICAgICB2YXIgbGluZTtcbiAgICAgIHZhciBsYXN0TGVuZ3RoID0gMTAwMDAwO1xuICAgICAgaWYgKCFsZXZlbCkgbGV2ZWwgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBicmFuY2ggPSB0cmVlW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YXIgc3Vic3RyID0gWE1MdHJlZVRvU3RyaW5nKGJyYW5jaCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICBpZiAoc3Vic3RyLmxlbmd0aCA8IDEwICogKHdpZHRoIC0gaW5kZW50ICogbGV2ZWwpICYmIHN1YnN0ci5pbmRleE9mKCdcIlwiXCInKSA8IDApIHtcbiAgICAgICAgICAgIC8vIERvbid0IG1lc3MgdXAgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgICAgIGxpbmUgPSBYTUx0cmVlVG9MaW5lKGJyYW5jaCk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPCB3aWR0aCAtIGluZGVudCAqIGxldmVsKSB7XG4gICAgICAgICAgICAgIGJyYW5jaCA9ICcgICAnICsgbGluZTsgLy8gICBAQCBIYWNrOiB0cmVhdCBhcyBzdHJpbmcgYmVsb3dcbiAgICAgICAgICAgICAgc3Vic3RyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJzdHIpIGxhc3RMZW5ndGggPSAxMDAwMDtcbiAgICAgICAgICBzdHIgKz0gc3Vic3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmIChsYXN0TGVuZ3RoIDwgaW5kZW50ICogbGV2ZWwgKyA0KSB7XG4gICAgICAgICAgICAvLyBjb250aW51ZVxuICAgICAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKSArICcgJyArIGJyYW5jaCArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCArPSBicmFuY2gubGVuZ3RoICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZSA9IHNwYWNlcyhpbmRlbnQgKiBsZXZlbCkgKyBicmFuY2g7XG4gICAgICAgICAgICBzdHIgKz0gbGluZSArICdcXG4nO1xuICAgICAgICAgICAgbGFzdExlbmd0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsvLyBub3Qgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHI7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHN0YXRlbWVudExpc3RUb1hNTFRyZWVNZXRob2Qoc3RhdGVtZW50cykge1xuICAgICAgdGhpcy5zdWdnZXN0UHJlZml4KCdyZGYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycpO1xuICAgICAgdmFyIHN0YXRzID0gdGhpcy5yb290U3ViamVjdHMoc3RhdGVtZW50cyk7XG4gICAgICB2YXIgcm9vdHMgPSBzdGF0cy5yb290cztcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb290ID0gcm9vdHNbaV07XG4gICAgICAgIHJlc3VsdHMucHVzaChzdWJqZWN0WE1MVHJlZShyb290LCBzdGF0cykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBzdGF0ZW1lbnRMaXN0VG9YTUxUcmVlID0gc3RhdGVtZW50TGlzdFRvWE1MVHJlZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gZXNjYXBlRm9yWE1MKHN0cikge1xuICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0BAQHVuZGVmaW5lZEBAQEAnO1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bJjxcIl0vZywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgc3dpdGNoIChtWzBdKSB7XG4gICAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJyZhbXA7JztcbiAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIHJldHVybiAnJmx0Oyc7XG4gICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgcmV0dXJuICcmcXVvdDsnOyAvLyAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbFVSSU1ldGhvZCh0ZXJtKSB7XG4gICAgICByZXR1cm4gZXNjYXBlRm9yWE1MKHRoaXMuYmFzZSA/IFV0aWwudXJpLnJlZlRvKHRoaXMuYmFzZSwgdGVybS51cmkpIDogdGVybS51cmkpO1xuICAgIH1cbiAgICB2YXIgcmVsVVJJID0gcmVsVVJJTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICAvLyBUaGUgdHJlZSBmb3IgYSBzdWJqZWN0XG4gICAgZnVuY3Rpb24gc3ViamVjdFhNTFRyZWVNZXRob2Qoc3ViamVjdCwgc3RhdHMpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgdHlwZSwgdCwgc3QsIHByZWQ7XG4gICAgICB2YXIgc3RzID0gc3RhdHMuc3ViamVjdHNbdGhpcy50b1N0cihzdWJqZWN0KV07IC8vIHJlbGV2YW50IHN0YXRlbWVudHNcbiAgICAgIGlmICh0eXBlb2Ygc3RzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBlbXB0eSBibm9kZVxuICAgICAgICByZXR1cm4gcHJvcGVydHlYTUxUcmVlKHN1YmplY3QsIHN0YXRzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBvbmx5IG9uIHRoZSBwcmVkaWNhdGUsIGxlYXZlIHRoZSBvcmRlciBhdCBvYmplY3RcbiAgICAgIC8vIGxldmVsIHVuZGlzdHVyYmVkLiAgVGhpcyBsZWF2ZXMgbXVsdGlsaW5ndWFsIGNvbnRlbnQgaW5cbiAgICAgIC8vIHRoZSBvcmRlciBvZiBlbnRyeSAoZm9yIHBhcnRuZXIgbGl0ZXJhbHMpLCB3aGljaCBoZWxwc1xuICAgICAgLy8gcmVhZGFiaWxpdHkuXG4gICAgICAvL1xuICAgICAgLy8gRm9yIHRoZSBwcmVkaWNhdGUgc29ydCwgd2UgYXR0ZW1wdCB0byBzcGxpdCB0aGUgdXJpXG4gICAgICAvLyBhcyBhIGhpbnQgdG8gdGhlIHNlcXVlbmNlXG4gICAgICBzdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2YXIgYXAgPSBhLnByZWRpY2F0ZS51cmk7XG4gICAgICAgIHZhciBicCA9IGIucHJlZGljYXRlLnVyaTtcbiAgICAgICAgaWYgKGFwLnN1YnN0cmluZygwLCBsaVByZWZpeC5sZW5ndGgpID09PSBsaVByZWZpeCB8fCBicC5zdWJzdHJpbmcoMCwgbGlQcmVmaXgubGVuZ3RoKSA9PT0gbGlQcmVmaXgpIHtcbiAgICAgICAgICAvLyB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gc29ydGluZyBsaXN0IGl0ZW1zXG4gICAgICAgICAgcmV0dXJuIGFwLmxvY2FsZUNvbXBhcmUoYnApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFzID0gYXAuc3Vic3RyaW5nKGxpUHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIHZhciBicyA9IGJwLnN1YnN0cmluZyhsaVByZWZpeC5sZW5ndGgpO1xuICAgICAgICB2YXIgYW4gPSBwYXJzZUludChhcywgMTApO1xuICAgICAgICB2YXIgYm4gPSBwYXJzZUludChicywgMTApO1xuICAgICAgICBpZiAoaXNOYU4oYW4pIHx8IGlzTmFOKGJuKSB8fCBhbiAhPT0gYXMgfHwgYm4gIT09IGJzKSB7XG4gICAgICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IGludGVnZXJzXG4gICAgICAgICAgcmV0dXJuIGFwLmxvY2FsZUNvbXBhcmUoYnApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuIC0gYm47XG4gICAgICB9KTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3QgPSBzdHNbaV07XG4gICAgICAgIC8vIGxvb2sgZm9yIGEgdHlwZVxuICAgICAgICBpZiAoc3QucHJlZGljYXRlLnVyaSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyAmJiAhdHlwZSAmJiBzdC5vYmplY3QudGVybVR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgdHlwZSA9IHN0Lm9iamVjdDtcbiAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgaW5jbHVkZSBpdCBhcyBhIGNoaWxkIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlZSB3aGV0aGVyIHByZWRpY2F0ZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBcImxpXCJcbiAgICAgICAgcHJlZCA9IHN0LnByZWRpY2F0ZTtcbiAgICAgICAgaWYgKHByZWQudXJpLnN1YnN0cigwLCBsaVByZWZpeC5sZW5ndGgpID09PSBsaVByZWZpeCkge1xuICAgICAgICAgIHZhciBudW1iZXIgPSBwcmVkLnVyaS5zdWJzdHIobGlQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlc2UgYXJlIGFjdHVhbGx5IG51bWVyaWMgbGlzdCBpdGVtc1xuICAgICAgICAgIHZhciBpbnROdW1iZXIgPSBwYXJzZUludChudW1iZXIsIDEwKTtcbiAgICAgICAgICBpZiAobnVtYmVyID09PSBpbnROdW1iZXIudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgLy8gd2FzIG51bWVyaWM7IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgb3JkZXJpbmcgc2luY2Ugd2UndmUgYWxyZWFkeVxuICAgICAgICAgICAgLy8gc29ydGVkIHRoZSBzdGF0ZW1lbnRzXG4gICAgICAgICAgICBwcmVkID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xpJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdCA9IHFuYW1lKHByZWQpO1xuICAgICAgICBzd2l0Y2ggKHN0Lm9iamVjdC50ZXJtVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0JsYW5rTm9kZSc6XG4gICAgICAgICAgICBpZiAoc3RhdHMuaW5jb21pbmdbc3Qub2JqZWN0XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBzb21ldGhpbmcgaW4gdGhlIGluY29taW5nIGFycmF5IGZvciBhIGJub2RlXG4gICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnBhcnNlVHlwZT1cIlJlc291cmNlXCI+Jywgc3ViamVjdFhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyB0ICsgJz4nXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHQgKyAnIHJkZjpub2RlSUQ9XCInICsgc3Qub2JqZWN0LnRvTlQoKS5zbGljZSgyKSArICdcIi8+J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnTmFtZWROb2RlJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnJlc291cmNlPVwiJyArIHJlbFVSSShzdC5vYmplY3QpICsgJ1wiLz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArIChzdC5vYmplY3QuZGF0YXR5cGUuZXF1YWxzKFhTRC5zdHJpbmcpID8gJycgOiAnIHJkZjpkYXRhdHlwZT1cIicgKyBlc2NhcGVGb3JYTUwoc3Qub2JqZWN0LmRhdGF0eXBlLnVyaSkgKyAnXCInKSArIChzdC5vYmplY3QubGFuZ3VhZ2UgPyAnIHhtbDpsYW5nPVwiJyArIHN0Lm9iamVjdC5sYW5ndWFnZSArICdcIicgOiAnJykgKyAnPicgKyBlc2NhcGVGb3JYTUwoc3Qub2JqZWN0LnZhbHVlKSArICc8LycgKyB0ICsgJz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChbJzwnICsgdCArICcgcmRmOnBhcnNlVHlwZT1cIkNvbGxlY3Rpb25cIj4nLCBjb2xsZWN0aW9uWE1MVHJlZShzdC5vYmplY3QsIHN0YXRzKSwgJzwvJyArIHQgKyAnPiddKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgXCIgKyBzdC5vYmplY3QudGVybVR5cGUgKyAnIGludG8gWE1MJyk7XG4gICAgICAgIH0gLy8gc3dpdGNoXG4gICAgICB9XG5cbiAgICAgIHZhciB0YWcgPSB0eXBlID8gcW5hbWUodHlwZSkgOiAncmRmOkRlc2NyaXB0aW9uJztcblxuICAgICAgdmFyIGF0dHJzID0gJyc7XG4gICAgICBpZiAoc3ViamVjdC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScpIHtcbiAgICAgICAgaWYgKCFzdGF0cy5pbmNvbWluZ1tzdWJqZWN0XSB8fCBzdGF0cy5pbmNvbWluZ1tzdWJqZWN0XS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAvLyBub3QgYW4gYW5vbnltb3VzIGJub2RlXG4gICAgICAgICAgYXR0cnMgPSAnIHJkZjpub2RlSUQ9XCInICsgc3ViamVjdC50b05UKCkuc2xpY2UoMikgKyAnXCInO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdHRycyA9ICcgcmRmOmFib3V0PVwiJyArIHJlbFVSSShzdWJqZWN0KSArICdcIic7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbJzwnICsgdGFnICsgYXR0cnMgKyAnPiddLmNvbmNhdChbcmVzdWx0c10pLmNvbmNhdChbJzwvJyArIHRhZyArICc+J10pO1xuICAgIH1cblxuICAgIHZhciBzdWJqZWN0WE1MVHJlZSA9IHN1YmplY3RYTUxUcmVlTWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBmdW5jdGlvbiBjb2xsZWN0aW9uWE1MVHJlZShzdWJqZWN0LCBzdGF0cykge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJqZWN0LmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHN1YmplY3RYTUxUcmVlKHN1YmplY3QuZWxlbWVudHNbaV0sIHN0YXRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcm9wZXJ0eSB0cmVlIGZvciBhIHNpbmdsZSBzdWJqZWN0IG9yIGFub255bW9zIG5vZGVcbiAgICBmdW5jdGlvbiBwcm9wZXJ0eVhNTFRyZWVNZXRob2Qoc3ViamVjdCwgc3RhdHMpIHtcbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB2YXIgc3RzID0gc3RhdHMuc3ViamVjdHNbdGhpcy50b1N0cihzdWJqZWN0KV07IC8vIHJlbGV2YW50IHN0YXRlbWVudHNcbiAgICAgIGlmICghc3RzKSByZXR1cm4gcmVzdWx0czsgLy8gTm8gcmVsZXZhbnQgc3RhdGVtZW50c1xuICAgICAgc3RzLnNvcnQoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdCA9IHN0c1tpXTtcbiAgICAgICAgc3dpdGNoIChzdC5vYmplY3QudGVybVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdCbGFua05vZGUnOlxuICAgICAgICAgICAgaWYgKHN0YXRzLnJvb3RzSGFzaFtzdC5vYmplY3QudG9OVCgpXSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGJub2RlIGhhcyBiZWVuIGRvbmUgYXMgYSByb290IC0tIG5vIGNvbnRlbnQgaGVyZSBAQCB3aGF0IGJvdXQgZmlyc3QgdGltZVxuICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHFuYW1lKHN0LnByZWRpY2F0ZSkgKyAnIHJkZjpub2RlSUQ9XCInICsgc3Qub2JqZWN0LnRvTlQoKS5zbGljZSgyKSArICdcIj4nLCAnPC8nICsgcW5hbWUoc3QucHJlZGljYXRlKSArICc+J10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJyByZGY6cGFyc2VUeXBlPVwiUmVzb3VyY2VcIj4nLCBwcm9wZXJ0eVhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJz4nXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdOYW1lZE5vZGUnOlxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJyByZGY6cmVzb3VyY2U9XCInICsgcmVsVVJJKHN0Lm9iamVjdCkgKyAnXCIvPiddKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KFsnPCcgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgKHN0Lm9iamVjdC5kYXRhdHlwZS5lcXVhbHMoWFNELnN0cmluZykgPyAnJyA6ICcgcmRmOmRhdGF0eXBlPVwiJyArIGVzY2FwZUZvclhNTChzdC5vYmplY3QuZGF0YXR5cGUudmFsdWUpICsgJ1wiJykgKyAoc3Qub2JqZWN0Lmxhbmd1YWdlID8gJyB4bWw6bGFuZz1cIicgKyBzdC5vYmplY3QubGFuZ3VhZ2UgKyAnXCInIDogJycpICsgJz4nICsgZXNjYXBlRm9yWE1MKHN0Lm9iamVjdC52YWx1ZSkgKyAnPC8nICsgcW5hbWUoc3QucHJlZGljYXRlKSArICc+J10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoWyc8JyArIHFuYW1lKHN0LnByZWRpY2F0ZSkgKyAnIHJkZjpwYXJzZVR5cGU9XCJDb2xsZWN0aW9uXCI+JywgY29sbGVjdGlvblhNTFRyZWUoc3Qub2JqZWN0LCBzdGF0cyksICc8LycgKyBxbmFtZShzdC5wcmVkaWNhdGUpICsgJz4nXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlIFwiICsgc3Qub2JqZWN0LnRlcm1UeXBlICsgJyBpbnRvIFhNTCcpO1xuICAgICAgICB9IC8vIHN3aXRjaFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHZhciBwcm9wZXJ0eVhNTFRyZWUgPSBwcm9wZXJ0eVhNTFRyZWVNZXRob2QuYmluZCh0aGlzKTtcblxuICAgIGZ1bmN0aW9uIHFuYW1lTWV0aG9kKHRlcm0pIHtcbiAgICAgIHZhciB1cmkgPSB0ZXJtLnVyaTtcblxuICAgICAgdmFyIGogPSB1cmkuaW5kZXhPZignIycpO1xuICAgICAgaWYgKGogPCAwICYmIHRoaXMuZmxhZ3MuaW5kZXhPZignLycpIDwgMCkge1xuICAgICAgICBqID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICB9XG4gICAgICBpZiAoaiA8IDApIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1ha2UgcW5hbWUgb3V0IG9mIDwnICsgdXJpICsgJz4nKTtcblxuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgdXJpLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChfX1NlcmlhbGl6ZXIucHJvdG90eXBlLl9ub3ROYW1lQ2hhcnMuaW5kZXhPZih1cmlba10pID49IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIFwiJyArIHVyaVtrXSArICdcIiBjYW5ub3QgYmUgaW4gWE1MIHFuYW1lIGZvciBVUkk6ICcgKyB1cmkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgbG9jYWxpZCA9IHVyaS5zbGljZShqICsgMSk7XG4gICAgICB2YXIgbmFtZXNwID0gdXJpLnNsaWNlKDAsIGogKyAxKTtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UgJiYgdGhpcy5kZWZhdWx0TmFtZXNwYWNlID09PSBuYW1lc3AgJiYgdGhpcy5mbGFncy5pbmRleE9mKCdkJykgPCAwKSB7XG4gICAgICAgIC8vIGQgLT4gc3VwcHJlc3MgZGVmYXVsdFxuICAgICAgICByZXR1cm4gbG9jYWxpZDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmVmaXggPSB0aGlzLnByZWZpeGVzW25hbWVzcF07XG4gICAgICBpZiAoIXByZWZpeCkgcHJlZml4ID0gdGhpcy5tYWtlVXBQcmVmaXgobmFtZXNwKTtcbiAgICAgIG5hbWVzcGFjZUNvdW50c1tuYW1lc3BdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBwcmVmaXggKyAnOicgKyBsb2NhbGlkO1xuICAgIH1cbiAgICB2YXIgcW5hbWUgPSBxbmFtZU1ldGhvZC5iaW5kKHRoaXMpO1xuXG4gICAgLy8gQm9keSBvZiB0b1hNTDpcblxuICAgIHZhciB0cmVlID0gc3RhdGVtZW50TGlzdFRvWE1MVHJlZShzdHMpO1xuICAgIHZhciBzdHIgPSAnPHJkZjpSREYnO1xuICAgIGlmICh0aGlzLmRlZmF1bHROYW1lc3BhY2UpIHtcbiAgICAgIHN0ciArPSAnIHhtbG5zPVwiJyArIGVzY2FwZUZvclhNTCh0aGlzLmRlZmF1bHROYW1lc3BhY2UpICsgJ1wiJztcbiAgICB9XG4gICAgZm9yICh2YXIgbnMgaW4gbmFtZXNwYWNlQ291bnRzKSB7XG4gICAgICBpZiAoIW5hbWVzcGFjZUNvdW50cy5oYXNPd25Qcm9wZXJ0eShucykpIGNvbnRpbnVlO1xuICAgICAgLy8gUmVsIHVyaXMgaW4geG1sIG5zIGlzIG5vdCBzdHJpY3RseSBhbGxvd2VkIGluIHRoZSBYTUxOUyBzcGVjIGJ1dCBuZWVkZWQgaW4gcHJhY3RpY2Ugb2Z0ZW5cbiAgICAgIHZhciBuczIgPSB0aGlzLmJhc2UgJiYgdGhpcy5mbGFncy5pbmNsdWRlcygneicpID8gVXRpbC51cmkucmVmVG8odGhpcy5iYXNlLCBucykgOiBucztcbiAgICAgIHN0ciArPSAnXFxuIHhtbG5zOicgKyB0aGlzLnByZWZpeGVzW25zXSArICc9XCInICsgZXNjYXBlRm9yWE1MKG5zMikgKyAnXCInO1xuICAgIH1cbiAgICBzdHIgKz0gJz4nO1xuXG4gICAgdmFyIHRyZWUyID0gW3N0ciwgdHJlZSwgJzwvcmRmOlJERj4nXTsgLy8gQEAgbmFtZXNwYWNlIGRlY2xyYXRpb25zXG4gICAgcmV0dXJuIFhNTHRyZWVUb1N0cmluZyh0cmVlMiwgLTEpO1xuICB9OyAvLyBFbmQgQEAgYm9keVxuXG4gIHZhciBTZXJpYWxpemVyID0gZnVuY3Rpb24gU2VyaWFsaXplcihzdG9yZSkge1xuICAgIHJldHVybiBuZXcgX19TZXJpYWxpemVyKHN0b3JlKTtcbiAgfTtcbiAgcmV0dXJuIFNlcmlhbGl6ZXI7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VyaWFsaXplcjsiLCIndXNlIHN0cmljdCc7XG5cbi8vIENvbnZlcnRpbmcgYmV0d2VlbiBTUEFSUUwgcXVlcmllcyBhbmQgdGhlICRyZGYgcXVlcnkgQVBJXG4vKlxuXG5mdW5jdGlvbiBTUXVlcnkgKCkge1xuICB0aGlzLnRlcm1zID0gW11cbiAgcmV0dXJuIHRoaXNcbn1cblxuU1Rlcm0ucHJvdG90eXBlLnRvU3RyaW5nID0gU1Rlcm0udmFsXG5TUXVlcnkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChzdHIpIHt0aGlzLnRlcm1zLnB1c2goKX0qL1xuXG52YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTtcbnZhciBRdWVyeSA9IHJlcXVpcmUoJy4vcXVlcnknKS5RdWVyeTtcbi8vIGNvbnN0IEZldGNoZXIgPSByZXF1aXJlKCcuL2ZldGNoZXInKVxuXG4vKipcbiAqIEBTUEFSUUw6IFNQQVJRTCB0ZXh0IHRoYXQgaXMgY29udmVydGVkIHRvIGEgcXVlcnkgb2JqZWN0IHdoaWNoIGlzIHJldHVybmVkLlxuICogQHRlc3RNb2RlOiB0ZXN0aW5nIGZsYWcuIFByZXZlbnRzIGxvYWRpbmcgb2Ygc291cmNlcy5cbiAqL1xuZnVuY3Rpb24gU1BBUlFMVG9RdWVyeShTUEFSUUwsIHRlc3RNb2RlLCBrYikge1xuICAvLyBBSkFSX0NsZWFyVGFibGUoKVxuICB2YXIgdmFyaWFibGVIYXNoID0gW107XG4gIGZ1bmN0aW9uIG1ha2VWYXIobmFtZSkge1xuICAgIGlmICh2YXJpYWJsZUhhc2hbbmFtZV0pIHtcbiAgICAgIHJldHVybiB2YXJpYWJsZUhhc2hbbmFtZV07XG4gICAgfVxuICAgIHZhciBuZXdWYXIgPSBrYi52YXJpYWJsZShuYW1lKTtcbiAgICB2YXJpYWJsZUhhc2hbbmFtZV0gPSBuZXdWYXI7XG4gICAgcmV0dXJuIG5ld1ZhcjtcbiAgfVxuXG4gIC8vIHRlcm0gdHlwZSBmdW5jdGlvbnNcbiAgZnVuY3Rpb24gaXNSZWFsVGV4dCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC9bXiBcXG5cXHRdLyk7XG4gIH1cbiAgZnVuY3Rpb24gaXNWYXIodGVybSkge1xuICAgIHJldHVybiB0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycgJiYgdGVybS5tYXRjaCgvXltcXD9cXCRdLyk7XG4gIH1cbiAgZnVuY3Rpb24gZml4U3ltYm9sQnJhY2tldHModGVybSkge1xuICAgIGlmICh0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0ZXJtLnJlcGxhY2UoL14mbHQ7LywgJzwnKS5yZXBsYWNlKC8mZ3Q7JC8sICc+Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc1N5bWJvbCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC9ePFtePl0qPiQvKTtcbiAgfVxuICBmdW5jdGlvbiBpc0Jub2RlKHRlcm0pIHtcbiAgICByZXR1cm4gdHlwZW9mIHRlcm0gPT09ICdzdHJpbmcnICYmICh0ZXJtLm1hdGNoKC9eXzovKSB8fCB0ZXJtLm1hdGNoKC9eJC8pKTtcbiAgfVxuICBmdW5jdGlvbiBpc1ByZWZpeCh0ZXJtKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXJtID09PSAnc3RyaW5nJyAmJiB0ZXJtLm1hdGNoKC86JC8pO1xuICB9XG4gIGZ1bmN0aW9uIGlzUHJlZml4ZWRTeW1ib2wodGVybSkge1xuICAgIHJldHVybiB0eXBlb2YgdGVybSA9PT0gJ3N0cmluZycgJiYgdGVybS5tYXRjaCgvXjp8XlteX11bXjpdKjovKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRQcmVmaXgodGVybSkge1xuICAgIHZhciBhID0gdGVybS5zcGxpdCgnOicpO1xuICAgIHJldHVybiBhWzBdO1xuICB9XG4gIGZ1bmN0aW9uIGdldFN1ZmZpeCh0ZXJtKSB7XG4gICAgdmFyIGEgPSB0ZXJtLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIGFbMV07XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHModGVybSkge1xuICAgIGlmIChpc1N5bWJvbCh0ZXJtKSkge1xuICAgICAgcmV0dXJuIHRlcm0uc2xpY2UoMSwgdGVybS5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRlcm07XG4gICAgfVxuICB9XG4gIC8vIHRha2VzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIExpdGVyYWxzIGluIHRoZSBwbGFjZSBvZiBsaXRlcmFsc1xuICBmdW5jdGlvbiBwYXJzZUxpdGVyYWxzKHN0cikge1xuICAgIC8vIHZhciBzaW4gPSAoc3RyLmluZGV4T2YoL1sgXFxuXVxcJy8pPT0tMSk/bnVsbDpzdHIuaW5kZXhPZigvWyBcXG5dXFwnLyksIGRvdWIgPSAoc3RyLmluZGV4T2YoL1sgXFxuXVxcXCIvKT09LTEpP251bGw6c3RyLmluZGV4T2YoL1sgXFxuXVxcXCIvKVxuICAgIHZhciBzaW4gPSBzdHIuaW5kZXhPZihcIidcIikgPT09IC0xID8gbnVsbCA6IHN0ci5pbmRleE9mKFwiJ1wiKTtcbiAgICB2YXIgZG91YiA9IHN0ci5pbmRleE9mKCdcIicpID09PSAtMSA/IG51bGwgOiBzdHIuaW5kZXhPZignXCInKTtcbiAgICAvLyBhbGVydChcIlM6IFwiK3NpbitcIiBEOiBcIitkb3ViKVxuICAgIGlmICghc2luICYmICFkb3ViKSB7XG4gICAgICB2YXIgYSA9IG5ldyBBcnJheSgxKTtcbiAgICAgIGFbMF0gPSBzdHI7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSgyKTtcbiAgICB2YXIgYnI7XG4gICAgdmFyIGluZDtcbiAgICBpZiAoIXNpbiB8fCBkb3ViICYmIGRvdWIgPCBzaW4pIHtcbiAgICAgIGJyID0gJ1wiJztcbiAgICAgIGluZCA9IGRvdWI7XG4gICAgfSBlbHNlIGlmICghZG91YiB8fCBzaW4gJiYgc2luIDwgZG91Yikge1xuICAgICAgYnIgPSBcIidcIjtcbiAgICAgIGluZCA9IHNpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmVycm9yKCdTUUFSUUwgUVVFUlkgT09QUyEnKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJlc1swXSA9IHN0ci5zbGljZSgwLCBpbmQpO1xuICAgIHZhciBlbmQgPSBzdHIuc2xpY2UoaW5kICsgMSkuaW5kZXhPZihicik7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIGxvZy5lcnJvcignU1BBUlFMIHBhcnNpbmcgZXJyb3I6IG5vIG1hdGNoaW5nIHBhcmVudGhlc2VzIGluIGxpdGVyYWwgJyArIHN0cik7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvLyBhbGVydChzdHIuc2xpY2UoZW5kICsgaW5kICsgMikubWF0Y2goL15cXF5cXF4vKSlcbiAgICB2YXIgZW5kMjtcbiAgICBpZiAoc3RyLnNsaWNlKGVuZCArIGluZCArIDIpLm1hdGNoKC9eXFxeXFxeLykpIHtcbiAgICAgIGVuZDIgPSBzdHIuc2xpY2UoZW5kICsgaW5kICsgMikuaW5kZXhPZignICcpO1xuICAgICAgLy8gYWxlcnQoZW5kMilcbiAgICAgIHJlc1sxXSA9IGtiLmxpdGVyYWwoc3RyLnNsaWNlKGluZCArIDEsIGluZCArIDEgKyBlbmQpLCAnJywga2Iuc3ltKHJlbW92ZUJyYWNrZXRzKHN0ci5zbGljZShpbmQgKyA0ICsgZW5kLCBpbmQgKyAyICsgZW5kICsgZW5kMikpKSk7XG4gICAgICAvLyBhbGVydChyZXNbMV0uZGF0YXR5cGUudXJpKVxuICAgICAgcmVzID0gcmVzLmNvbmNhdChwYXJzZUxpdGVyYWxzKHN0ci5zbGljZShlbmQgKyBpbmQgKyAzICsgZW5kMikpKTtcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZShlbmQgKyBpbmQgKyAyKS5tYXRjaCgvXkAvKSkge1xuICAgICAgZW5kMiA9IHN0ci5zbGljZShlbmQgKyBpbmQgKyAyKS5pbmRleE9mKCcgJyk7XG4gICAgICAvLyBhbGVydChlbmQyKVxuICAgICAgcmVzWzFdID0ga2IubGl0ZXJhbChzdHIuc2xpY2UoaW5kICsgMSwgaW5kICsgMSArIGVuZCksIHN0ci5zbGljZShpbmQgKyAzICsgZW5kLCBpbmQgKyAyICsgZW5kICsgZW5kMiksIG51bGwpO1xuICAgICAgLy8gYWxlcnQocmVzWzFdLmRhdGF0eXBlLnVyaSlcbiAgICAgIHJlcyA9IHJlcy5jb25jYXQocGFyc2VMaXRlcmFscyhzdHIuc2xpY2UoZW5kICsgaW5kICsgMiArIGVuZDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1sxXSA9IGtiLmxpdGVyYWwoc3RyLnNsaWNlKGluZCArIDEsIGluZCArIDEgKyBlbmQpLCAnJywgbnVsbCk7XG4gICAgICBsb2cuaW5mbygnTGl0ZXJhbCBmb3VuZDogJyArIHJlc1sxXSk7XG4gICAgICByZXMgPSByZXMuY29uY2F0KHBhcnNlTGl0ZXJhbHMoc3RyLnNsaWNlKGVuZCArIGluZCArIDIpKSk7IC8vIGZpbmRzIGFueSBvdGhlciBsaXRlcmFsc1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgZnVuY3Rpb24gc3BhY2VEZWxpbWl0KHN0cikge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXCgvZywgJyAoICcpLnJlcGxhY2UoL1xcKS9nLCAnICkgJykucmVwbGFjZSgvPC9nLCAnIDwnKS5yZXBsYWNlKC8+L2csICc+ICcpLnJlcGxhY2UoL3svZywgJyB7ICcpLnJlcGxhY2UoL30vZywgJyB9ICcpLnJlcGxhY2UoL1tcXHRcXG5cXHJdL2csICcgJykucmVwbGFjZSgvOyAvZywgJyA7ICcpLnJlcGxhY2UoL1xcLiAvZywgJyAuICcpLnJlcGxhY2UoLywgL2csICcgLCAnKTtcbiAgICBsb2cuaW5mbygnTmV3IHN0ciBpbnRvIHNwYWNlRGVsaW1pdDogXFxuJyArIHN0cik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBiciA9IHN0ci5zcGxpdCgnICcpO1xuICAgIGZvciAodmFyIHggaW4gYnIpIHtcbiAgICAgIGlmIChpc1JlYWxUZXh0KGJyW3hdKSkge1xuICAgICAgICByZXMgPSByZXMuY29uY2F0KGJyW3hdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VLZXl3b3JkcyhpbnB1dCkge1xuICAgIHZhciBzdHJhcnIgPSBpbnB1dDtcbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHN0cmFyci5sZW5ndGg7IHgrKykge1xuICAgICAgaWYgKHN0cmFyclt4XSA9PT0gJ2EnKSB7XG4gICAgICAgIHN0cmFyclt4XSA9ICc8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+JztcbiAgICAgIH1cbiAgICAgIGlmIChzdHJhcnJbeF0gPT09ICdpcycgJiYgc3RyYXJyW3ggKyAyXSA9PT0gJ29mJykge1xuICAgICAgICBzdHJhcnIuc3BsaWNlKHgsIDEpO1xuICAgICAgICBzdHJhcnIuc3BsaWNlKHggKyAxLCAxKTtcbiAgICAgICAgdmFyIHMgPSBzdHJhcnJbeCAtIDFdO1xuICAgICAgICBzdHJhcnJbeCAtIDFdID0gc3RyYXJyW3ggKyAxXTtcbiAgICAgICAgc3RyYXJyW3ggKyAxXSA9IHM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHJhcnI7XG4gIH1cblxuICBmdW5jdGlvbiB0b1Rlcm1zKGlucHV0KSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgaW5wdXQubGVuZ3RoOyB4KyspIHtcbiAgICAgIGlmICh0eXBlb2YgaW5wdXRbeF0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc1t4XSA9IGlucHV0W3hdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlucHV0W3hdID0gZml4U3ltYm9sQnJhY2tldHMoaW5wdXRbeF0pO1xuICAgICAgaWYgKGlzVmFyKGlucHV0W3hdKSkge1xuICAgICAgICByZXNbeF0gPSBtYWtlVmFyKGlucHV0W3hdLnNsaWNlKDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCbm9kZShpbnB1dFt4XSkpIHtcbiAgICAgICAgbG9nLmluZm8oaW5wdXRbeF0gKyAnIHdhcyBpZGVudGlmaWVkIGFzIGEgYm5vZGUuJyk7XG4gICAgICAgIHJlc1t4XSA9IGtiLmJub2RlKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3ltYm9sKGlucHV0W3hdKSkge1xuICAgICAgICBsb2cuaW5mbyhpbnB1dFt4XSArICcgd2FzIGlkZW50aWZpZWQgYXMgYSBzeW1ib2wuJyk7XG4gICAgICAgIHJlc1t4XSA9IGtiLnN5bShyZW1vdmVCcmFja2V0cyhpbnB1dFt4XSkpO1xuICAgICAgfSBlbHNlIGlmIChpc1ByZWZpeGVkU3ltYm9sKGlucHV0W3hdKSkge1xuICAgICAgICBsb2cuaW5mbyhpbnB1dFt4XSArICcgd2FzIGlkZW50aWZpZWQgYXMgYSBwcmVmaXhlZCBzeW1ib2wnKTtcbiAgICAgICAgaWYgKHByZWZpeGVzW2dldFByZWZpeChpbnB1dFt4XSldKSB7XG4gICAgICAgICAgcmVzW3hdID0ga2Iuc3ltKGlucHV0W3hdID0gcHJlZml4ZXNbZ2V0UHJlZml4KGlucHV0W3hdKV0gKyBnZXRTdWZmaXgoaW5wdXRbeF0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1NQQVJRTCBlcnJvcjogJyArIGlucHV0W3hdICsgJyB3aXRoIHByZWZpeCAnICsgZ2V0UHJlZml4KGlucHV0W3hdKSArICcgZG9lcyBub3QgaGF2ZSBhIGNvcnJlY3QgcHJlZml4IGVudHJ5LicpO1xuICAgICAgICAgIHJlc1t4XSA9IGlucHV0W3hdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNbeF0gPSBpbnB1dFt4XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuaXplKHN0cikge1xuICAgIHZhciB0b2tlbjEgPSBwYXJzZUxpdGVyYWxzKHN0cik7XG4gICAgdmFyIHRva2VuMiA9IFtdO1xuICAgIGZvciAodmFyIHggaW4gdG9rZW4xKSB7XG4gICAgICBpZiAodHlwZW9mIHRva2VuMVt4XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdG9rZW4yID0gdG9rZW4yLmNvbmNhdChzcGFjZURlbGltaXQodG9rZW4xW3hdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbjIgPSB0b2tlbjIuY29uY2F0KHRva2VuMVt4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRva2VuMiA9IHJlcGxhY2VLZXl3b3Jkcyh0b2tlbjIpO1xuICAgIGxvZy5pbmZvKCdTUEFSUUwgVG9rZW5zOiAnICsgdG9rZW4yKTtcbiAgICByZXR1cm4gdG9rZW4yO1xuICB9XG5cbiAgLy8gQ0FTRS1JTlNFTlNJVElWRVxuICBmdW5jdGlvbiBhcnJheUluZGV4T2Yoc3RyLCBhcnIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXS50b0xvd2VyQ2FzZSgpID09PSBzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbG9nLndhcm4oXCJObyBpbnN0YW5jZSBvZiBcIitzdHIrXCIgaW4gYXJyYXkgXCIrYXJyKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ0FTRS1JTlNFTlNJVElWRVxuICBmdW5jdGlvbiBhcnJheUluZGljZXNPZihzdHIsIGFycikge1xuICAgIHZhciBpbmQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHR5cGVvZiBhcnJbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXS50b0xvd2VyQ2FzZSgpID09PSBzdHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBpbmQucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZhcnMoaW5wdXQsIHF1ZXJ5KSB7XG4gICAgbG9nLmluZm8oJ1NQQVJRTCB2YXJzOiAnICsgaW5wdXQpO1xuICAgIGZvciAodmFyIHggaW4gaW5wdXQpIHtcbiAgICAgIGlmIChpc1ZhcihpbnB1dFt4XSkpIHtcbiAgICAgICAgbG9nLmluZm8oJ0FkZGVkICcgKyBpbnB1dFt4XSArICcgdG8gcXVlcnkgdmFyaWFibGVzIGZyb20gU1BBUlFMJyk7XG4gICAgICAgIHZhciB2ID0gbWFrZVZhcihpbnB1dFt4XS5zbGljZSgxKSk7XG4gICAgICAgIHF1ZXJ5LnZhcnMucHVzaCh2KTtcbiAgICAgICAgdi5sYWJlbCA9IGlucHV0W3hdLnNsaWNlKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oJ0luY29ycmVjdCBTUEFSUUwgdmFyaWFibGUgaW4gU0VMRUNUOiAnICsgaW5wdXRbeF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZWZpeERlY2xhcmF0aW9ucyhpbnB1dCkge1xuICAgIHZhciBwcmVmSW5kID0gYXJyYXlJbmRpY2VzT2YoJ1BSRUZJWCcsIGlucHV0KTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBwcmVmSW5kKSB7XG4gICAgICB2YXIgYSA9IGlucHV0W3ByZWZJbmRbaV0gKyAxXTtcbiAgICAgIHZhciBiID0gaW5wdXRbcHJlZkluZFtpXSArIDJdO1xuICAgICAgaWYgKCFpc1ByZWZpeChhKSkge1xuICAgICAgICBsb2cuZXJyb3IoJ0ludmFsaWQgU1BBUlFMIHByZWZpeDogJyArIGEpO1xuICAgICAgfSBlbHNlIGlmICghaXNTeW1ib2woYikpIHtcbiAgICAgICAgbG9nLmVycm9yKCdJbnZhbGlkIFNQQVJRTCBzeW1ib2w6ICcgKyBiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5pbmZvKCdQcmVmaXggZm91bmQ6ICcgKyBhICsgJyAtPiAnICsgYik7XG4gICAgICAgIHZhciBwcmVmID0gZ2V0UHJlZml4KGEpO1xuICAgICAgICB2YXIgc3ltYm9sID0gcmVtb3ZlQnJhY2tldHMoYik7XG4gICAgICAgIHJlc1twcmVmXSA9IHN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1hdGNoaW5nQnJhY2tldChhcnIsIG9wZW4sIGNsb3NlKSB7XG4gICAgbG9nLmluZm8oJ0xvb2tpbmcgZm9yIGEgY2xvc2UgYnJhY2tldCBvZiB0eXBlICcgKyBjbG9zZSArICcgaW4gJyArIGFycik7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gb3Blbikge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKGFycltpXSA9PT0gY2xvc2UpIHtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5lcnJvcignU3RhdGVtZW50IGhhZCBubyBjbG9zZSBwYXJlbnRoZXNpcyBpbiBTUEFSUUwgcXVlcnknKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbnRHcmVhdGVyVGhhbih2YWx1ZSkge1xuICAgIHRoaXMuZGVzY3JpYmUgPSBmdW5jdGlvbiAodmFyc3RyKSB7XG4gICAgICByZXR1cm4gdmFyc3RyICsgJyA+ICcgKyB2YWx1ZS50b05UKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlc3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgICAgaWYgKHRlcm0udmFsdWUubWF0Y2goL1swLTldKyhcXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPy8pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRlcm0udmFsdWUpID4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGVybS50b05UKCkgPiB2YWx1ZS50b05UKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0cmFpbnRMZXNzVGhhbih2YWx1ZSkge1xuICAgIC8vIHRoaXMgaXMgbm90IHRoZSByZWNvbW1lbmRlZCB1c2FnZS4gU2hvdWxkIG9ubHkgd29yayBvbiBsaXRlcmFsLCBudW1lcmljLCBkYXRlVGltZVxuICAgIHRoaXMuZGVzY3JpYmUgPSBmdW5jdGlvbiAodmFyc3RyKSB7XG4gICAgICByZXR1cm4gdmFyc3RyICsgJyA8ICcgKyB2YWx1ZS50b05UKCk7XG4gICAgfTtcbiAgICB0aGlzLnRlc3QgPSBmdW5jdGlvbiAodGVybSkge1xuICAgICAgLy8gdGhpcy5kZXNjcmliZSA9IGZ1bmN0aW9uICh2YXJzdHIpIHsgcmV0dXJuIHZhcnN0ciArIFwiIDwgXCIrdmFsdWUgfVxuICAgICAgaWYgKHRlcm0udmFsdWUubWF0Y2goL1swLTldKyhcXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPy8pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRlcm0udmFsdWUpIDwgcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGVybS50b05UKCkgPCB2YWx1ZS50b05UKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBUaGlzIHNob3VsZCBvbmx5IHdvcmsgb24gbGl0ZXJhbHMgYnV0IGRvZXNuJ3QuXG4gIGZ1bmN0aW9uIENvbnN0cmFpbnRFcXVhbFRvKHZhbHVlKSB7XG4gICAgdGhpcy5kZXNjcmliZSA9IGZ1bmN0aW9uICh2YXJzdHIpIHtcbiAgICAgIHJldHVybiB2YXJzdHIgKyAnID0gJyArIHZhbHVlLnRvTlQoKTtcbiAgICB9O1xuICAgIHRoaXMudGVzdCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc2FtZVRlcm0odGVybSk7XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHZhbHVlIG11c3QgYmUgYSBsaXRlcmFsXG4gIGZ1bmN0aW9uIENvbnN0cmFpbnRSZWdleHAodmFsdWUpIHtcbiAgICB0aGlzLmRlc2NyaWJlID0gZnVuY3Rpb24gKHZhcnN0cikge1xuICAgICAgcmV0dXJuIFwiUkVHRVhQKCAnXCIgKyB2YWx1ZSArIFwiJyAsIFwiICsgdmFyc3RyICsgJyApJztcbiAgICB9O1xuICAgIHRoaXMudGVzdCA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgICB2YXIgc3RyID0gdmFsdWU7XG4gICAgICAvLyBzdHIgPSBzdHIucmVwbGFjZSgvXi8vLFwiXCIpLnJlcGxhY2UoLy8kLyxcIlwiKVxuICAgICAgdmFyIHJnID0gbmV3IFJlZ0V4cChzdHIpO1xuICAgICAgaWYgKHRlcm0udmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJnLnRlc3QodGVybS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENvbnN0cmFpbnQoaW5wdXQsIHBhdCkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDMgJiYgaW5wdXRbMF0udGVybVR5cGUgPT09ICdWYXJpYWJsZScgJiYgKGlucHV0WzJdLnRlcm1UeXBlID09PSAnTmFtZWROb2RlJyB8fCBpbnB1dFsyXS50ZXJtVHlwZSA9PT0gJ0xpdGVyYWwnKSkge1xuICAgICAgaWYgKGlucHV0WzFdID09PSAnPScpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdDb25zdHJhaW50IGFkZGVkOiAnICsgaW5wdXQpO1xuICAgICAgICBwYXQuY29uc3RyYWludHNbaW5wdXRbMF1dID0gbmV3IENvbnN0cmFpbnRFcXVhbFRvKGlucHV0WzJdKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXRbMV0gPT09ICc+Jykge1xuICAgICAgICBsb2cuZGVidWcoJ0NvbnN0cmFpbnQgYWRkZWQ6ICcgKyBpbnB1dCk7XG4gICAgICAgIHBhdC5jb25zdHJhaW50c1tpbnB1dFswXV0gPSBuZXcgQ29uc3RyYWludEVxdWFsVG8oaW5wdXRbMl0pO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dFsxXSA9PT0gJzwnKSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnQ29uc3RyYWludCBhZGRlZDogJyArIGlucHV0KTtcbiAgICAgICAgcGF0LmNvbnN0cmFpbnRzW2lucHV0WzBdXSA9IG5ldyBDb25zdHJhaW50RXF1YWxUbyhpbnB1dFsyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cud2FybihcIkkgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZSBjb25zdHJhaW50OiBcIiArIGlucHV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA9PT0gNiAmJiB0eXBlb2YgaW5wdXRbMF0gPT09ICdzdHJpbmcnICYmIGlucHV0WzBdLnRvTG93ZXJDYXNlKCkgPT09ICdyZWdleHAnICYmIGlucHV0WzFdID09PSAnKCcgJiYgaW5wdXRbNV0gPT09ICcpJyAmJiBpbnB1dFszXSA9PT0gJywnICYmIGlucHV0WzRdLnRlcm1UeXBlID09PSAnVmFyaWFibGUnICYmIGlucHV0WzJdLnRlcm1UeXBlID09PSAnTGl0ZXJhbCcpIHtcbiAgICAgIGxvZy5kZWJ1ZygnQ29uc3RyYWludCBhZGRlZDogJyArIGlucHV0KTtcbiAgICAgIHBhdC5jb25zdHJhaW50c1tpbnB1dFs0XV0gPSBuZXcgQ29uc3RyYWludFJlZ2V4cChpbnB1dFsyXS52YWx1ZSk7XG4gICAgfVxuICAgIC8vIGxvZy53YXJuKFwiSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIGNvbnN0cmFpbnQ6IFwiK2lucHV0KVxuICAgIC8vIGFsZXJ0KFwibGVuZ3RoOiBcIitpbnB1dC5sZW5ndGgrXCIgaW5wdXQgMCB0eXBlOiBcIitpbnB1dFswXS50ZXJtVHlwZStcIiBpbnB1dCAxOiBcIitpbnB1dFsxXStcIiBpbnB1dFsyXSB0eXBlOiBcIitpbnB1dFsyXS50ZXJtVHlwZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldE9wdGlvbmFsKHRlcm1zLCBwYXQpIHtcbiAgICBsb2cuZGVidWcoJ09wdGlvbmFsIHF1ZXJ5OiAnICsgdGVybXMgKyAnIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gICAgdmFyIG9wdCA9IGtiLmZvcm11bGEoKTtcbiAgICBzZXRXaGVyZSh0ZXJtcywgb3B0KTtcbiAgICBwYXQub3B0aW9uYWwucHVzaChvcHQpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0V2hlcmUoaW5wdXQsIHBhdCkge1xuICAgIHZhciB0ZXJtcyA9IHRvVGVybXMoaW5wdXQpO1xuICAgIHZhciBlbmQ7XG4gICAgbG9nLmRlYnVnKCdXSEVSRTogJyArIHRlcm1zKTtcbiAgICB2YXIgb3B0O1xuICAgIC8vIHZhciBvcHQgPSBhcnJheUluZGljZXNPZihcIk9QVElPTkFMXCIsdGVybXMpXG4gICAgd2hpbGUgKGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcykpIHtcbiAgICAgIG9wdCA9IGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcyk7XG4gICAgICBsb2cuZGVidWcoJ09QVDogJyArIG9wdCArICcgJyArIHRlcm1zW29wdF0gKyAnIGluICcgKyB0ZXJtcyk7XG4gICAgICBpZiAodGVybXNbb3B0ICsgMV0gIT09ICd7Jykge1xuICAgICAgICBsb2cud2FybignQmFkIG9wdGlvbmFsIG9wZW5pbmcgYnJhY2tldCBpbiB3b3JkICcgKyBvcHQpO1xuICAgICAgfVxuICAgICAgZW5kID0gZ2V0TWF0Y2hpbmdCcmFja2V0KHRlcm1zLnNsaWNlKG9wdCArIDIpLCAneycsICd9Jyk7XG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICBsb2cuZXJyb3IoJ05vIG1hdGNoaW5nIGJyYWNrZXQgaW4gd29yZCAnICsgb3B0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE9wdGlvbmFsKHRlcm1zLnNsaWNlKG9wdCArIDIsIG9wdCArIDIgKyBlbmQpLCBwYXQpO1xuICAgICAgICAvLyBhbGVydChwYXQuc3RhdGVtZW50c1swXS50b05UKCkpXG4gICAgICAgIG9wdCA9IGFycmF5SW5kZXhPZignT1BUSU9OQUwnLCB0ZXJtcyk7XG4gICAgICAgIGVuZCA9IGdldE1hdGNoaW5nQnJhY2tldCh0ZXJtcy5zbGljZShvcHQgKyAyKSwgJ3snLCAnfScpO1xuICAgICAgICB0ZXJtcy5zcGxpY2Uob3B0LCBlbmQgKyAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdXSEVSRSBhZnRlciBvcHRpb25hbHM6ICcgKyB0ZXJtcyk7XG4gICAgd2hpbGUgKGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpKSB7XG4gICAgICB2YXIgZmlsdCA9IGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpO1xuICAgICAgaWYgKHRlcm1zW2ZpbHQgKyAxXSAhPT0gJygnKSB7XG4gICAgICAgIGxvZy53YXJuKCdCYWQgZmlsdGVyIG9wZW5pbmcgYnJhY2tldCBpbiB3b3JkICcgKyBmaWx0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGdldE1hdGNoaW5nQnJhY2tldCh0ZXJtcy5zbGljZShmaWx0ICsgMiksICcoJywgJyknKTtcbiAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgIGxvZy5lcnJvcignTm8gbWF0Y2hpbmcgYnJhY2tldCBpbiB3b3JkICcgKyBmaWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldENvbnN0cmFpbnQodGVybXMuc2xpY2UoZmlsdCArIDIsIGZpbHQgKyAyICsgZW5kKSwgcGF0KTtcbiAgICAgICAgZmlsdCA9IGFycmF5SW5kZXhPZignRklMVEVSJywgdGVybXMpO1xuICAgICAgICBlbmQgPSBnZXRNYXRjaGluZ0JyYWNrZXQodGVybXMuc2xpY2UoZmlsdCArIDIpLCAnKCcsICcpJyk7XG4gICAgICAgIHRlcm1zLnNwbGljZShmaWx0LCBlbmQgKyAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLmRlYnVnKCdXSEVSRSBhZnRlciBmaWx0ZXJzIGFuZCBvcHRpb25hbHM6ICcgKyB0ZXJtcyk7XG4gICAgZXh0cmFjdFN0YXRlbWVudHModGVybXMsIHBhdCk7XG4gIH1cblxuICBmdW5jdGlvbiBleHRyYWN0U3RhdGVtZW50cyh0ZXJtcywgZm9ybXVsYSkge1xuICAgIHZhciBhcnJheVplcm8gPSBuZXcgQXJyYXkoMSk7XG4gICAgYXJyYXlaZXJvWzBdID0gLTE7IC8vIHRoaXMgaXMganVzdCB0byBhZGQgdGhlIGJlZ2lubmluZyBvZiB0aGUgd2hlcmUgdG8gdGhlIHBlcmlvZHMgaW5kZXguXG4gICAgdmFyIHBlciA9IGFycmF5WmVyby5jb25jYXQoYXJyYXlJbmRpY2VzT2YoJy4nLCB0ZXJtcykpO1xuICAgIHZhciBzdGF0ID0gW107XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBwZXIubGVuZ3RoIC0gMTsgeCsrKSB7XG4gICAgICBzdGF0W3hdID0gdGVybXMuc2xpY2UocGVyW3hdICsgMSwgcGVyW3ggKyAxXSk7XG4gICAgfVxuICAgIC8vIE5vdyBpdCdzIGluIGFuIGFycmF5IG9mIHN0YXRlbWVudHNcbiAgICBmb3IgKHggaW4gc3RhdCkge1xuICAgICAgLy8gVEhJUyBNVVNUIEJFIENIQU5HRUQgRk9SIENPTU1BLCBTRU1JQ09MT05cbiAgICAgIGxvZy5pbmZvKCdzK3ArbyAnICsgeCArICcgPSAnICsgc3RhdFt4XSk7XG4gICAgICB2YXIgc3ViaiA9IHN0YXRbeF1bMF07XG4gICAgICBzdGF0W3hdLnNwbGljZSgwLCAxKTtcbiAgICAgIHZhciBzZW0gPSBhcnJheVplcm8uY29uY2F0KGFycmF5SW5kaWNlc09mKCc7Jywgc3RhdFt4XSkpO1xuICAgICAgc2VtLnB1c2goc3RhdFt4XS5sZW5ndGgpO1xuICAgICAgdmFyIHN0YXQyID0gW107XG4gICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHNlbS5sZW5ndGggLSAxOyB5KyspIHtcbiAgICAgICAgc3RhdDJbeV0gPSBzdGF0W3hdLnNsaWNlKHNlbVt5XSArIDEsIHNlbVt5ICsgMV0pO1xuICAgICAgfVxuICAgICAgZm9yICh4IGluIHN0YXQyKSB7XG4gICAgICAgIGxvZy5pbmZvKCdwK28gJyArIHggKyAnID0gJyArIHN0YXRbeF0pO1xuICAgICAgICB2YXIgcHJlZCA9IHN0YXQyW3hdWzBdO1xuICAgICAgICBzdGF0Mlt4XS5zcGxpY2UoMCwgMSk7XG4gICAgICAgIHZhciBjb20gPSBhcnJheVplcm8uY29uY2F0KGFycmF5SW5kaWNlc09mKCcsJywgc3RhdDJbeF0pKTtcbiAgICAgICAgY29tLnB1c2goc3RhdDJbeF0ubGVuZ3RoKTtcbiAgICAgICAgdmFyIHN0YXQzID0gW107XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBjb20ubGVuZ3RoIC0gMTsgeSsrKSB7XG4gICAgICAgICAgc3RhdDNbeV0gPSBzdGF0Mlt4XS5zbGljZShjb21beV0gKyAxLCBjb21beSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHggaW4gc3RhdDMpIHtcbiAgICAgICAgICB2YXIgb2JqID0gc3RhdDNbeF1bMF07XG4gICAgICAgICAgbG9nLmluZm8oJ1N1Ymo9JyArIHN1YmogKyAnIFByZWQ9JyArIHByZWQgKyAnIE9iaj0nICsgb2JqKTtcbiAgICAgICAgICBmb3JtdWxhLmFkZChzdWJqLCBwcmVkLCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBCb2R5IG9mIFNQQVJRTFRvUXVlcnkgKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cbiAgbG9nLmluZm8oJ1NQQVJRTCBpbnB1dDogXFxuJyArIFNQQVJRTCk7XG4gIHZhciBxID0gbmV3IFF1ZXJ5KCk7XG4gIHZhciBzcCA9IHRva2VuaXplKFNQQVJRTCk7IC8vIGZpcnN0IHRva2VuaXplIGV2ZXJ5dGhpbmdcbiAgdmFyIHByZWZpeGVzID0gZ2V0UHJlZml4RGVjbGFyYXRpb25zKHNwKTtcbiAgaWYgKCFwcmVmaXhlcy5yZGYpIHtcbiAgICBwcmVmaXhlcy5yZGYgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc7XG4gIH1cbiAgaWYgKCFwcmVmaXhlcy5yZGZzKSB7XG4gICAgcHJlZml4ZXMucmRmcyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjJztcbiAgfVxuICB2YXIgc2VsZWN0TG9jID0gYXJyYXlJbmRleE9mKCdTRUxFQ1QnLCBzcCk7XG4gIHZhciB3aGVyZUxvYyA9IGFycmF5SW5kZXhPZignV0hFUkUnLCBzcCk7XG4gIGlmIChzZWxlY3RMb2MgPCAwIHx8IHdoZXJlTG9jIDwgMCB8fCBzZWxlY3RMb2MgPiB3aGVyZUxvYykge1xuICAgIGxvZy5lcnJvcignSW52YWxpZCBvciBub25leGlzdGVudCBTRUxFQ1QgYW5kIFdIRVJFIHRhZ3MgaW4gU1BBUlFMIHF1ZXJ5Jyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHNldFZhcnMoc3Auc2xpY2Uoc2VsZWN0TG9jICsgMSwgd2hlcmVMb2MpLCBxKTtcblxuICBzZXRXaGVyZShzcC5zbGljZSh3aGVyZUxvYyArIDIsIHNwLmxlbmd0aCAtIDEpLCBxLnBhdCk7XG5cbiAgaWYgKHRlc3RNb2RlKSB7XG4gICAgcmV0dXJuIHE7XG4gIH1cblxuICBmb3IgKHZhciB4IGluIHEucGF0LnN0YXRlbWVudHMpIHtcbiAgICB2YXIgc3QgPSBxLnBhdC5zdGF0ZW1lbnRzW3hdO1xuICAgIGlmIChzdC5zdWJqZWN0LnRlcm1UeXBlID09PSAnTmFtZWROb2RlJykge1xuICAgICAgLyogJiYgc2YuaXNQZW5kaW5nKHN0LnN1YmplY3QudXJpKSAqLyAvLyBUaGlzIGRvZXNuJ3Qgd29yay5cbiAgICAgIC8vIHNmLnJlcXVlc3RVUkkoc3Quc3ViamVjdC51cmksXCJzcGFycWw6XCIrc3Quc3ViamVjdCkgS2Vubnk6IEkgcmVtb3ZlIHRoZXNlIHR3b1xuICAgICAgaWYgKGtiLmZldGNoZXIpIHtcbiAgICAgICAga2IuZmV0Y2hlci5sb29rVXBUaGluZyhzdC5zdWJqZWN0LCAnc3BhcnFsOicgKyBzdC5zdWJqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0Lm9iamVjdC50ZXJtVHlwZSA9PT0gJ05hbWVkTm9kZScpIHtcbiAgICAgIC8qICYmIHNmLmlzUGVuZGluZyhzdC5vYmplY3QudXJpKSAqL1xuICAgICAgLy8gc2YucmVxdWVzdFVSSShzdC5vYmplY3QudXJpLFwic3BhcnFsOlwiK3N0Lm9iamVjdClcbiAgICAgIGlmIChrYi5mZXRjaGVyKSB7XG4gICAgICAgIGtiLmZldGNoZXIubG9va1VwVGhpbmcoc3Qub2JqZWN0LCAnc3BhcnFsOicgKyBzdC5vYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbGVydChxLnBhdClcbiAgcmV0dXJuIHE7XG4gIC8vIGNoZWNrVmFycygpXG4gIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNQQVJRTFRvUXVlcnk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuXG52YXIgU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdGF0ZW1lbnQoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlbWVudCk7XG5cbiAgICB0aGlzLnN1YmplY3QgPSBOb2RlLmZyb21WYWx1ZShzdWJqZWN0KTtcbiAgICB0aGlzLnByZWRpY2F0ZSA9IE5vZGUuZnJvbVZhbHVlKHByZWRpY2F0ZSk7XG4gICAgdGhpcy5vYmplY3QgPSBOb2RlLmZyb21WYWx1ZShvYmplY3QpO1xuICAgIHRoaXMud2h5ID0gZ3JhcGg7IC8vIHByb3BlcnR5IGN1cnJlbnRseSB1c2VkIGJ5IHJkZmxpYlxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFN0YXRlbWVudCwgW3tcbiAgICBrZXk6ICdlcXVhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICAgIHJldHVybiBvdGhlci5zdWJqZWN0LmVxdWFscyh0aGlzLnN1YmplY3QpICYmIG90aGVyLnByZWRpY2F0ZS5lcXVhbHModGhpcy5wcmVkaWNhdGUpICYmIG90aGVyLm9iamVjdC5lcXVhbHModGhpcy5vYmplY3QpICYmIG90aGVyLmdyYXBoLmVxdWFscyh0aGlzLmdyYXBoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHkgPSBuZXcgU3RhdGVtZW50KHRoaXMuc3ViamVjdC5zdWJzdGl0dXRlKGJpbmRpbmdzKSwgdGhpcy5wcmVkaWNhdGUuc3Vic3RpdHV0ZShiaW5kaW5ncyksIHRoaXMub2JqZWN0LnN1YnN0aXR1dGUoYmluZGluZ3MpLCB0aGlzLndoeS5zdWJzdGl0dXRlKGJpbmRpbmdzKSk7IC8vIDIwMTZcbiAgICAgIGNvbnNvbGUubG9nKCdAQEAgc3RhdGVtZW50IHN1YnN0aXR1dGU6JyArIHkpO1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9DYW5vbmljYWwnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0Nhbm9uaWNhbCgpIHtcbiAgICAgIHZhciB0ZXJtcyA9IFt0aGlzLnN1YmplY3QudG9DYW5vbmljYWwoKSwgdGhpcy5wcmVkaWNhdGUudG9DYW5vbmljYWwoKSwgdGhpcy5vYmplY3QudG9DYW5vbmljYWwoKV07XG4gICAgICBpZiAodGhpcy5ncmFwaCAmJiB0aGlzLmdyYXBoLnRlcm1UeXBlICE9PSAnRGVmYXVsdEdyYXBoJykge1xuICAgICAgICB0ZXJtcy5wdXNoKHRoaXMuZ3JhcGgudG9DYW5vbmljYWwoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybXMuam9pbignICcpICsgJyAuJztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b05UJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9OVCgpIHtcbiAgICAgIHJldHVybiBbdGhpcy5zdWJqZWN0LnRvTlQoKSwgdGhpcy5wcmVkaWNhdGUudG9OVCgpLCB0aGlzLm9iamVjdC50b05UKCldLmpvaW4oJyAnKSArICcgLic7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndG9TdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvTlQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdncmFwaCcsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy53aHk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChnKSB7XG4gICAgICB0aGlzLndoeSA9IGc7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0YXRlbWVudDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGF0ZW1lbnQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfaW5kZXhlZEZvcm11bGEgPSByZXF1aXJlKCcuL2luZGV4ZWQtZm9ybXVsYScpO1xuXG52YXIgX2luZGV4ZWRGb3JtdWxhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luZGV4ZWRGb3JtdWxhKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLy8gSm9lIFByZXNicmV5IDxwcmVzYnJleUBtaXQuZWR1PlxuLy8gMjAwNy0wNy0xNVxuLy8gMjAxMC0wOC0wOCBUaW1CTCBmb2xkZWQgaW4gS2VubnkncyBXRUJEQVZcbi8vIDIwMTAtMTItMDcgVGltQkwgYWRkcmVkIGxvY2FsIGZpbGUgd3JpdGUgY29kZVxudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG52YXIgRmV0Y2hlciA9IHJlcXVpcmUoJy4vZmV0Y2hlcicpO1xudmFyIGdyYXBoID0gcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKS5ncmFwaDtcblxudmFyIG5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vZGF0YS1mYWN0b3J5JykubmFtZWROb2RlO1xudmFyIE5hbWVzcGFjZSA9IHJlcXVpcmUoJy4vbmFtZXNwYWNlJyk7XG52YXIgU2VyaWFsaXplciA9IHJlcXVpcmUoJy4vc2VyaWFsaXplcicpO1xudmFyIHVyaUpvaW4gPSByZXF1aXJlKCcuL3VyaScpLmpvaW47XG52YXIgVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgVXBkYXRlTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNwYXJxbCA9IGZ1bmN0aW9uIHNwYXJxbChzdG9yZSkge1xuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICBpZiAoc3RvcmUudXBkYXRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IGhhdmUgdHdvIFVwZGF0ZU1hbmFnZXJzIGZvciB0aGUgc2FtZSBzdG9yZVwiKTtcbiAgICB9XG4gICAgaWYgKCFzdG9yZS5mZXRjaGVyKSB7XG4gICAgICAvLyBUaGUgc3RvcmUgbXVzdCBhbHNvL2FscmVhZHkgaGF2ZSBhIGZldGNoZXJcbiAgICAgIG5ldyBGZXRjaGVyKHN0b3JlKTtcbiAgICB9XG4gICAgc3RvcmUudXBkYXRlciA9IHRoaXM7XG4gICAgdGhpcy5pZnBzID0ge307XG4gICAgdGhpcy5mcHMgPSB7fTtcbiAgICB0aGlzLm5zID0ge307XG4gICAgdGhpcy5ucy5saW5rID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9saW5rIycpO1xuICAgIHRoaXMubnMuaHR0cCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvaHR0cCMnKTtcbiAgICB0aGlzLm5zLmh0dHBoID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDA3L29udC9odHRwaCMnKTtcbiAgICB0aGlzLm5zLmxkcCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvbnMvbGRwIycpO1xuICAgIHRoaXMubnMucmRmID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyk7XG4gICAgdGhpcy5ucy5yZGZzID0gTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjJyk7XG4gICAgdGhpcy5ucy5yZGYgPSBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnKTtcbiAgICB0aGlzLm5zLm93bCA9IE5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjJyk7XG5cbiAgICB0aGlzLnBhdGNoQ29udHJvbCA9IFtdOyAvLyBpbmRleCBvZiBvYmplY3RzIGZybyBjb29yZGluYXRpbmcgaW5jb21uZyBhbmQgb3V0Z29pbmcgcGF0Y2hlc1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUucGF0Y2hDb250cm9sRm9yID0gZnVuY3Rpb24gKGRvYykge1xuICAgIGlmICghdGhpcy5wYXRjaENvbnRyb2xbZG9jLnVyaV0pIHtcbiAgICAgIHRoaXMucGF0Y2hDb250cm9sW2RvYy51cmldID0gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhdGNoQ29udHJvbFtkb2MudXJpXTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIFRoZSBtZXRob2Qgc3RyaW5nIFNQQVJRTCBvciBEQVYgb3IgTE9DQUxGSUxFIG9yIGZhbHNlIGlmIGtub3duLCB1bmRlZmluZWQgaWYgbm90IGtub3duLlxuICAvL1xuICAvLyBGaWxlcyBoYXZlIHRvIGhhdmUgYSBzcGVjaWZpYyBhbm5vdGF0b24gdGhhdCB0aGV5IGFyZSBtYWNoaW5lIHdyaXR0ZW4sIGZvciBzYWZldHkuXG4gIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNoZWNrIGZvciB3cml0ZSBhY2Nlc3Mgb24gZmlsZXMuXG4gIC8vXG4gIHNwYXJxbC5wcm90b3R5cGUuZWRpdGFibGUgPSBmdW5jdGlvbiAodXJpLCBrYikge1xuICAgIGlmICghdXJpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIEVnIHN1YmplY3QgaXMgYm5vZGUsIG5vIGtub3duIGRvYyB0byB3cml0ZSB0b1xuICAgIH1cbiAgICBpZiAoIWtiKSB7XG4gICAgICBrYiA9IHRoaXMuc3RvcmU7XG4gICAgfVxuXG4gICAgaWYgKHVyaS5zbGljZSgwLCA4KSA9PT0gJ2ZpbGU6Ly8vJykge1xuICAgICAgaWYgKGtiLmhvbGRzKGtiLnN5bSh1cmkpLCBuYW1lZE5vZGUoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyN0eXBlJyksIG5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMjAwNy9vbnQvbGluayNNYWNoaW5lRWRpdGFibGVEb2N1bWVudCcpKSkge1xuICAgICAgICByZXR1cm4gJ0xPQ0FMRklMRSc7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcoa2Iuc3ltKHVyaSksIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm90IE1hY2hpbmVFZGl0YWJsZURvY3VtZW50IGZpbGUgJyArIHVyaSArICdcXG4nKTtcbiAgICAgIGNvbnNvbGUubG9nKHN0cy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHgudG9OVCgpO1xuICAgICAgfSkuam9pbignXFxuJykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gQEAgV291bGQgYmUgbmlmdHkgb2YgY291cnNlIHRvIHNlZSB3aGV0aGVyIHdlIGFjdHVhbGx5IGhhdmUgd3JpdGUgYWNlc3MgZmlyc3QuXG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGRlZmluaXRpdmUgPSBmYWxzZTtcbiAgICB2YXIgcmVxdWVzdHMgPSBrYi5lYWNoKHVuZGVmaW5lZCwgdGhpcy5ucy5saW5rKCdyZXF1ZXN0ZWRVUkknKSwgZG9jcGFydCh1cmkpKTtcblxuICAgIC8vIEhhY2sgZm9yIHRoZSBtb21lbnQgQEBAQCAyMDE2LTAyLTEyXG4gICAgaWYgKGtiLmhvbGRzKG5hbWVkTm9kZSh1cmkpLCB0aGlzLm5zLnJkZigndHlwZScpLCB0aGlzLm5zLmxkcCgnUmVzb3VyY2UnKSkpIHtcbiAgICAgIHJldHVybiAnU1BBUlFMJztcbiAgICB9XG4gICAgdmFyIGk7XG4gICAgdmFyIG1ldGhvZDtcbiAgICBmb3IgKHZhciByID0gMDsgciA8IHJlcXVlc3RzLmxlbmd0aDsgcisrKSB7XG4gICAgICByZXF1ZXN0ID0gcmVxdWVzdHNbcl07XG4gICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShyZXF1ZXN0LCB0aGlzLm5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIGFjY2VwdFBhdGNoID0ga2IuZWFjaChyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnYWNjZXB0LXBhdGNoJykpO1xuICAgICAgICAgIGlmIChhY2NlcHRQYXRjaC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2NlcHRQYXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBtZXRob2QgPSBhY2NlcHRQYXRjaFtpXS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgIGlmIChtZXRob2QuaW5kZXhPZignYXBwbGljYXRpb24vc3BhcnFsLXVwZGF0ZScpID49IDApIHJldHVybiAnU1BBUlFMJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF1dGhvcl92aWEgPSBrYi5lYWNoKHJlc3BvbnNlLCB0aGlzLm5zLmh0dHBoKCdtcy1hdXRob3ItdmlhJykpO1xuICAgICAgICAgIGlmIChhdXRob3JfdmlhLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF1dGhvcl92aWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgbWV0aG9kID0gYXV0aG9yX3ZpYVtpXS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgIGlmIChtZXRob2QuaW5kZXhPZignU1BBUlFMJykgPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnU1BBUlFMJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobWV0aG9kLmluZGV4T2YoJ0RBVicpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0RBVic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHN0YXR1cyA9IGtiLmVhY2gocmVzcG9uc2UsIHRoaXMubnMuaHR0cCgnc3RhdHVzJykpO1xuICAgICAgICAgIGlmIChzdGF0dXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXNbaV0gPT09IDIwMCB8fCBzdGF0dXNbaV0gPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIGRlZmluaXRpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSAvLyBBIGRlZmluaXRpdmUgYW5zd2VyXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm8gcmVzcG9uc2UgZm9yICcgKyB1cmkgKyAnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ3NwYXJxbC5lZGl0YWJsZTogTm8gcmVxdWVzdCBmb3IgJyArIHVyaSArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlZmluaXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBXZSBoYXZlIGdvdCBhIHJlcXVlc3QgYW5kIGl0IGRpZCBOT1Qgc2F5IGVkaXRhYmxlID0+IG5vdCBlZGl0YWJsZVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnc3BhcnFsLmVkaXRhYmxlOiBpbmNvbmNsdXNpdmUgZm9yICcgKyB1cmkgKyAnXFxuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gV2UgZG9uJ3Qga25vdyAoeWV0KSBhcyB3ZSBoYXZlbid0IGhhZCBhIHJlc3BvbnNlICh5ZXQpXG4gIH07XG5cbiAgLy8gLy8vLy8vLy8vICBUaGUgaWRlbnRpZmljYXRpb24gb2YgYm5vZGVzXG5cbiAgc3BhcnFsLnByb3RvdHlwZS5hbm9ueW1pemUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iai50b05UKCkuc3Vic3RyKDAsIDIpID09PSAnXzonICYmIHRoaXMuX21lbnRpb25lZChvYmopID8gJz8nICsgb2JqLnRvTlQoKS5zdWJzdHIoMikgOiBvYmoudG9OVCgpO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuYW5vbnltaXplTlQgPSBmdW5jdGlvbiAoc3RtdCkge1xuICAgIHJldHVybiB0aGlzLmFub255bWl6ZShzdG10LnN1YmplY3QpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3RtdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3RtdC5vYmplY3QpICsgJyAuJztcbiAgfTtcblxuICAvLyBBIGxpc3Qgb2YgYWxsIGJub2RlcyBvY2N1cmluZyBpbiBhIHN0YXRlbWVudFxuICBzcGFycWwucHJvdG90eXBlLl9zdGF0ZW1lbnRfYm5vZGVzID0gZnVuY3Rpb24gKHN0KSB7XG4gICAgcmV0dXJuIFtzdC5zdWJqZWN0LCBzdC5wcmVkaWNhdGUsIHN0Lm9iamVjdF0uZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4geC5pc0JsYW5rO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEEgbGlzdCBvZiBhbGwgYm5vZGVzIG9jY3VyaW5nIGluIGEgbGlzdCBvZiBzdGF0ZW1lbnRzXG4gIHNwYXJxbC5wcm90b3R5cGUuX3N0YXRlbWVudF9hcnJheV9ibm9kZXMgPSBmdW5jdGlvbiAoc3RzKSB7XG4gICAgdmFyIGJub2RlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBibm9kZXMgPSBibm9kZXMuY29uY2F0KHRoaXMuX3N0YXRlbWVudF9ibm9kZXMoc3RzW2ldKSk7XG4gICAgfVxuICAgIGJub2Rlcy5zb3J0KCk7IC8vIGluIHBsYWNlIHNvcnQgLSByZXN1bHQgbWF5IGhhdmUgZHVwbGljYXRlc1xuICAgIHZhciBibm9kZXMyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBibm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChqID09PSAwIHx8ICFibm9kZXNbal0uc2FtZVRlcm0oYm5vZGVzW2ogLSAxXSkpIHtcbiAgICAgICAgYm5vZGVzMi5wdXNoKGJub2Rlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBibm9kZXMyO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2NhY2hlX2lmcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTWFrZSBhIGNhY2hlZCBsaXN0IG9mIFtJbnZlcnNlLV1GdW5jdGlvbmFsIHByb3BlcnRpZXNcbiAgICAvLyBDYWxsIHRoaXMgb25jZSBiZWZvcmUgY2FsbGluZyBjb250ZXh0X3N0YXRlbWVudHNcbiAgICB0aGlzLmlmcHMgPSB7fTtcbiAgICB2YXIgYSA9IHRoaXMuc3RvcmUuZWFjaCh1bmRlZmluZWQsIHRoaXMubnMucmRmKCd0eXBlJyksIHRoaXMubnMub3dsKCdJbnZlcnNlRnVuY3Rpb25hbFByb3BlcnR5JykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pZnBzW2FbaV0udXJpXSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuZnBzID0ge307XG4gICAgYSA9IHRoaXMuc3RvcmUuZWFjaCh1bmRlZmluZWQsIHRoaXMubnMucmRmKCd0eXBlJyksIHRoaXMubnMub3dsKCdGdW5jdGlvbmFsUHJvcGVydHknKSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZnBzW2FbaV0udXJpXSA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHVybnMgYSBjb250ZXh0IHRvIGJpbmQgYSBnaXZlbiBub2RlLCB1cCB0byBhIGdpdmVuIGRlcHRoXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHQyID0gZnVuY3Rpb24gKHgsIHNvdXJjZSwgZGVwdGgpIHtcbiAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIHN0YXRlbWVudHMgd2hpY2ggaW5kaXJlY3RseSBpZGVudGlmeSBhIG5vZGVcbiAgICAvLyAgRGVwdGggPiAxIGlmIHRyeSBmdXJ0aGVyIGluZGlyZWN0aW9uLlxuICAgIC8vICBSZXR1cm4gYXJyYXkgb2Ygc3RhdGVtZW50cyAocG9zc2libHkgZW1wdHkpLCBvciBudWxsIGlmIGZhaWx1cmVcbiAgICB2YXIgc3RzID0gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHgsIHNvdXJjZSk7IC8vIGluY29taW5nIGxpbmtzXG4gICAgdmFyIHk7XG4gICAgdmFyIHJlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZnBzW3N0c1tpXS5wcmVkaWNhdGUudXJpXSkge1xuICAgICAgICB5ID0gc3RzW2ldLnN1YmplY3Q7XG4gICAgICAgIGlmICgheS5pc0JsYW5rKSB7XG4gICAgICAgICAgcmV0dXJuIFtzdHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuX2Jub2RlX2NvbnRleHQyKHksIHNvdXJjZSwgZGVwdGggLSAxKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChbc3RzW2ldXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG91dGdvaW5nIGxpbmtzXG4gICAgc3RzID0gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoeCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHNvdXJjZSk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaWZwc1tzdHNbaV0ucHJlZGljYXRlLnVyaV0pIHtcbiAgICAgICAgeSA9IHN0c1tpXS5vYmplY3Q7XG4gICAgICAgIGlmICgheS5pc0JsYW5rKSB7XG4gICAgICAgICAgcmV0dXJuIFtzdHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuX2Jub2RlX2NvbnRleHQyKHksIHNvdXJjZSwgZGVwdGggLSAxKTtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChbc3RzW2ldXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsOyAvLyBGYWlsdXJlXG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgY29udGV4dCB0byBiaW5kIGEgZ2l2ZW4gc2luZ2xlIGJub2RlXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHRfMSA9IGZ1bmN0aW9uICh4LCBzb3VyY2UpIHtcbiAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIHN0YXRlbWVudHMgd2hpY2ggaW5kaXJlY3RseSBpZGVudGlmeSBhIG5vZGVcbiAgICAvLyAgIEJyZWFkdGgtZmlyc3RcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yICh2YXIgZGVwdGggPSAwOyBkZXB0aCA8IDM7IGRlcHRoKyspIHtcbiAgICAgIC8vIFRyeSBzaW1wbGUgZmlyc3RcbiAgICAgIHZhciBjb24gPSB0aGlzLl9ibm9kZV9jb250ZXh0Mih4LCBzb3VyY2UsIGRlcHRoKTtcbiAgICAgIGlmIChjb24gIT09IG51bGwpIHJldHVybiBjb247XG4gICAgfVxuICAgIC8vIElmIHdlIGNhbid0IGd1YXJhbnRlZSB1bmlxdWUgd2l0aCBsb2dpYyBqdXN0IHNlbmQgYWxsIGluZm8gYWJvdXQgbm9kZVxuICAgIHJldHVybiB0aGlzLnN0b3JlLmNvbm5lY3RlZFN0YXRlbWVudHMoeCwgc291cmNlKTsgLy8gd2FzOlxuICAgIC8vIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGJub2RlOiAnICsgeC50b05UKCkpXG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5fbWVudGlvbmVkID0gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoeCkubGVuZ3RoICE9PSAwIHx8IC8vIERvbid0IHBpbiBmcmVzaCBibm9kZXNcbiAgICB0aGlzLnN0b3JlLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHgpLmxlbmd0aCAhPT0gMCB8fCB0aGlzLnN0b3JlLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgeCkubGVuZ3RoICE9PSAwO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2Jub2RlX2NvbnRleHQgPSBmdW5jdGlvbiAoYm5vZGVzLCBkb2MpIHtcbiAgICB2YXIgY29udGV4dCA9IFtdO1xuICAgIGlmIChibm9kZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9jYWNoZV9pZnBzKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBEb2VzIHRoaXMgb2NjdXIgaW4gb2xkIGdyYXBoP1xuICAgICAgICB2YXIgYm5vZGUgPSBibm9kZXNbaV07XG4gICAgICAgIGlmICghdGhpcy5fbWVudGlvbmVkKGJub2RlKSkgY29udGludWU7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvbmNhdCh0aGlzLl9ibm9kZV9jb250ZXh0XzEoYm5vZGUsIGRvYykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICAvKiAgV2VpcmQgY29kZSBkb2VzIG5vdCBtYWtlIHNlbnNlIC0tIHNvbWUgY29kZSBjb3JydXB0aW9uIGFsb25nIHRoZSBsaW5lIC0tIHN0IHVuZGVmaW5lZCAtLSB3ZWlyZFxuICAgICAgc3BhcnFsLnByb3RvdHlwZS5fYm5vZGVfY29udGV4dCA9IGZ1bmN0aW9uKGJub2Rlcykge1xuICAgICAgICAgIHZhciBjb250ZXh0ID0gW11cbiAgICAgICAgICBpZiAoYm5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yZS5zdGF0ZW1lbnRzTWF0Y2hpbmcoc3Quc3ViamVjdC5pc0JsYW5rP3VuZGVmaW5lZDpzdC5zdWJqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnByZWRpY2F0ZS5pc0JsYW5rP3VuZGVmaW5lZDpzdC5wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Qub2JqZWN0LmlzQmxhbms/dW5kZWZpbmVkOnN0Lm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC53aHkpLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb25jYXQoc3QpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZV9pZnBzKClcbiAgICAgICAgICAgICAgICAgIGZvciAoeCBpbiBibm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb25jYXQodGhpcy5fYm5vZGVfY29udGV4dF8xKGJub2Rlc1t4XSwgc3Qud2h5KSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgfVxuICAqL1xuICAvLyBSZXR1cm5zIHRoZSBiZXN0IGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YXRlbWVudFxuICBzcGFycWwucHJvdG90eXBlLl9zdGF0ZW1lbnRfY29udGV4dCA9IGZ1bmN0aW9uIChzdCkge1xuICAgIHZhciBibm9kZXMgPSB0aGlzLl9zdGF0ZW1lbnRfYm5vZGVzKHN0KTtcbiAgICByZXR1cm4gdGhpcy5fYm5vZGVfY29udGV4dChibm9kZXMsIHN0LndoeSk7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5fY29udGV4dF93aGVyZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIHNwYXJxbCA9IHRoaXM7XG4gICAgcmV0dXJuICFjb250ZXh0IHx8IGNvbnRleHQubGVuZ3RoID09PSAwID8gJycgOiAnV0hFUkUgeyAnICsgY29udGV4dC5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBzcGFycWwuYW5vbnltaXplTlQoeCk7XG4gICAgfSkuam9pbignXFxuJykgKyAnIH1cXG4nO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuX2ZpcmUgPSBmdW5jdGlvbiAodXJpLCBxdWVyeSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXVyaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBVUkkgZ2l2ZW4gZm9yIHJlbW90ZSBlZGl0aW5nIG9wZXJhdGlvbjogJyArIHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3NwYXJxbDogc2VuZGluZyB1cGRhdGUgdG8gPCcgKyB1cmkgKyAnPicpO1xuICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgeGhyLm9wdGlvbnMgPSB7fTtcblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBkdW1wKFwiU1BBUlFMIHVwZGF0ZSByZWFkeSBzdGF0ZSBmb3IgPFwiK3VyaStcIj4gcmVhZHlTdGF0ZT1cIit4aHIucmVhZHlTdGF0ZStcIlxcblwiK3F1ZXJ5K1wiXFxuXCIpXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgdmFyIHN1Y2Nlc3MgPSAheGhyLnN0YXR1cyB8fCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwO1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnc3BhcnFsOiB1cGRhdGUgZmFpbGVkIGZvciA8JyArIHVyaSArICc+IHN0YXR1cz0nICsgeGhyLnN0YXR1cyArICcsICcgKyB4aHIuc3RhdHVzVGV4dCArICcsIGJvZHkgbGVuZ3RoPScgKyB4aHIucmVzcG9uc2VUZXh0Lmxlbmd0aCArICdcXG4gICBmb3IgcXVlcnk6ICcgKyBxdWVyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3NwYXJxbDogdXBkYXRlIE9rIGZvciA8JyArIHVyaSArICc+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sodXJpLCBzdWNjZXNzLCB4aHIucmVzcG9uc2VUZXh0LCB4aHIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub3BlbignUEFUQ0gnLCB1cmksIHRydWUpOyAvLyBhc3luYz10cnVlXG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9zcGFycWwtdXBkYXRlJyk7XG4gICAgeGhyLnNlbmQocXVlcnkpO1xuICB9O1xuXG4gIC8vIFRoaXMgZG9lcyBOT1QgdXBkYXRlIHRoZSBzdGF0ZW1lbnQuXG4gIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdoY2loIGluY2x1ZGVzXG4gIC8vICBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG9iamVjdCBvZiB0aGUgc3RhdGVtZW50LlxuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnVwZGF0ZV9zdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudCAmJiAhc3RhdGVtZW50LndoeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc3BhcnFsID0gdGhpcztcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX3N0YXRlbWVudF9jb250ZXh0KHN0YXRlbWVudCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQgPyBbc3RhdGVtZW50LnN1YmplY3QsIHN0YXRlbWVudC5wcmVkaWNhdGUsIHN0YXRlbWVudC5vYmplY3QsIHN0YXRlbWVudC53aHldIDogdW5kZWZpbmVkLFxuICAgICAgc3RhdGVtZW50TlQ6IHN0YXRlbWVudCA/IHRoaXMuYW5vbnltaXplTlQoc3RhdGVtZW50KSA6IHVuZGVmaW5lZCxcbiAgICAgIHdoZXJlOiBzcGFycWwuX2NvbnRleHRfd2hlcmUoY29udGV4dCksXG5cbiAgICAgIHNldF9vYmplY3Q6IGZ1bmN0aW9uIHNldF9vYmplY3Qob2JqLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcXVlcnkgPSB0aGlzLndoZXJlO1xuICAgICAgICBxdWVyeSArPSAnREVMRVRFIERBVEEgeyAnICsgdGhpcy5zdGF0ZW1lbnROVCArICcgfSA7XFxuJztcbiAgICAgICAgcXVlcnkgKz0gJ0lOU0VSVCBEQVRBIHsgJyArIHRoaXMuYW5vbnltaXplKHRoaXMuc3RhdGVtZW50WzBdKSArICcgJyArIHRoaXMuYW5vbnltaXplKHRoaXMuc3RhdGVtZW50WzFdKSArICcgJyArIHRoaXMuYW5vbnltaXplKG9iaikgKyAnICcgKyAnIC4gfVxcbic7XG5cbiAgICAgICAgc3BhcnFsLl9maXJlKHRoaXMuc3RhdGVtZW50WzNdLnVyaSwgcXVlcnksIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuaW5zZXJ0X3N0YXRlbWVudCA9IGZ1bmN0aW9uIChzdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc3QwID0gc3QgaW5zdGFuY2VvZiBBcnJheSA/IHN0WzBdIDogc3Q7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fY29udGV4dF93aGVyZSh0aGlzLl9zdGF0ZW1lbnRfY29udGV4dChzdDApKTtcblxuICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgc3RUZXh0ID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0VGV4dCArPSBzdFtpXSArICdcXG4nO1xuICAgICAgfXF1ZXJ5ICs9ICdJTlNFUlQgREFUQSB7ICcgKyBzdFRleHQgKyAnIH1cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSArPSAnSU5TRVJUIERBVEEgeyAnICsgdGhpcy5hbm9ueW1pemUoc3Quc3ViamVjdCkgKyAnICcgKyB0aGlzLmFub255bWl6ZShzdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3Qub2JqZWN0KSArICcgJyArICcgLiB9XFxuJztcbiAgICB9XG5cbiAgICB0aGlzLl9maXJlKHN0MC53aHkudXJpLCBxdWVyeSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUuZGVsZXRlX3N0YXRlbWVudCA9IGZ1bmN0aW9uIChzdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgc3QwID0gc3QgaW5zdGFuY2VvZiBBcnJheSA/IHN0WzBdIDogc3Q7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5fY29udGV4dF93aGVyZSh0aGlzLl9zdGF0ZW1lbnRfY29udGV4dChzdDApKTtcblxuICAgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgc3RUZXh0ID0gJyc7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0VGV4dCArPSBzdFtpXSArICdcXG4nO1xuICAgICAgfXF1ZXJ5ICs9ICdERUxFVEUgREFUQSB7ICcgKyBzdFRleHQgKyAnIH1cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSArPSAnREVMRVRFIERBVEEgeyAnICsgdGhpcy5hbm9ueW1pemUoc3Quc3ViamVjdCkgKyAnICcgKyB0aGlzLmFub255bWl6ZShzdC5wcmVkaWNhdGUpICsgJyAnICsgdGhpcy5hbm9ueW1pemUoc3Qub2JqZWN0KSArICcgJyArICcgLiB9XFxuJztcbiAgICB9XG5cbiAgICB0aGlzLl9maXJlKHN0MC53aHkudXJpLCBxdWVyeSwgY2FsbGJhY2spO1xuICB9O1xuXG4gIC8vICBSZXF1ZXN0IGEgbm93IG9yIGZ1dHVyZSBhY3Rpb24gdG8gcmVmcmVzaCBjaGFuZ2VzIGNvbWluZyBkb3duc3RyZWFtXG4gIC8vXG4gIC8vIFRoaXMgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byByZS1yZXF1ZXN0IHRoZSBzZXJ2ZXIgdmVyc2lvbixcbiAgLy8gd2hlbiBhIHdlYnNvY2tldCBoYXMgcGluZ2VkIHRvIHNheSB0aGVyZSBhcmUgY2hhbmdlcy5cbiAgLy8gSWYgdGhld2Vic29ja2V0LCBieSBjb250cmFzdCwgaGFzIHNlbnQgYSBwYXRjaCwgdGhlbiB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LlxuICAvLyBUaGlzIG1heSBiZSBjYWxsZWQgb3V0IG9mIGNvbnRleHQgc28gKnRoaXMqIGNhbm5vdCBiZSB1c2VkLlxuXG4gIHNwYXJxbC5wcm90b3R5cGUucmVxdWVzdERvd25zdHJlYW1BY3Rpb24gPSBmdW5jdGlvbiAoZG9jLCBhY3Rpb24pIHtcbiAgICB2YXIgY29udHJvbCA9IHRoaXMucGF0Y2hDb250cm9sRm9yKGRvYyk7XG4gICAgaWYgKCFjb250cm9sLnBlbmRpbmdVcHN0cmVhbSkge1xuICAgICAgYWN0aW9uKGRvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250cm9sLmRvd25zdHJlYW1BY3Rpb24pIHtcbiAgICAgICAgaWYgKGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbiA9PT0gYWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHdhaXQgZm9yID4gMSBkaWZmZXJudCBkb3duc3RyZWFtIGFjdGlvbnNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbiA9IGFjdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gV2Ugd2FudCB0byBzdGFydCBjb3VudGluZyB3ZWJzb2NrdCBub3RpZmljYXRpb25zXG4gIC8vIHRvIGRpc3Rpbmd1aXNoIHRoZSBvbmVzIGZyb20gb3RoZXJzIGZyb20gb3VyIG93bi5cbiAgc3BhcnFsLnByb3RvdHlwZS5jbGVhclVwc3RyZWFtQ291bnQgPSBmdW5jdGlvbiAoZG9jKSB7XG4gICAgdmFyIGNvbnRyb2wgPSB0aGlzLnBhdGNoQ29udHJvbEZvcihkb2MpO1xuICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5nZXRVcGRhdGVzVmlhID0gZnVuY3Rpb24gKGRvYykge1xuICAgIHZhciBsaW5rSGVhZGVycyA9IHRoaXMuc3RvcmUuZmV0Y2hlci5nZXRIZWFkZXIoZG9jLCAndXBkYXRlcy12aWEnKTtcbiAgICBpZiAoIWxpbmtIZWFkZXJzIHx8ICFsaW5rSGVhZGVycy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBsaW5rSGVhZGVyc1swXS50cmltKCk7XG4gIH07XG5cbiAgc3BhcnFsLnByb3RvdHlwZS5hZGREb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZG9jLCBsaXN0ZW5lcikge1xuICAgIHZhciBjb250cm9sID0gdGhpcy5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICBpZiAoIWNvbnRyb2wuZG93bnN0cmVhbUNoYW5nZUxpc3RlbmVycykgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzID0gW107XG4gICAgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNldFJlZnJlc2hIYW5kbGVyKGRvYywgZnVuY3Rpb24gKGRvYykge1xuICAgICAgLy8gYSBmdW5jdGlvbiBub3QgYSBtZXRob2RcbiAgICAgIHNlbGYucmVsb2FkQW5kU3luYyhkb2MpO1xuICAgIH0pO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUucmVsb2FkQW5kU3luYyA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICB2YXIgY29udHJvbCA9IHRoaXMucGF0Y2hDb250cm9sRm9yKGRvYyk7XG4gICAgdmFyIHVwZGF0ZXIgPSB0aGlzO1xuXG4gICAgaWYgKGNvbnRyb2wucmVsb2FkaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAgQWxyZWFkeSByZWxvYWRpbmcgLSBzdG9wJyk7XG4gICAgICByZXR1cm47IC8vIG9uY2Ugb25seSBuZWVkZWRcbiAgICB9XG4gICAgY29udHJvbC5yZWxvYWRpbmcgPSB0cnVlO1xuICAgIHZhciByZXRyeVRpbWVvdXQgPSAxMDAwOyAvLyBtc1xuICAgIHZhciB0cnlSZWxvYWQgPSBmdW5jdGlvbiB0cnlSZWxvYWQoKSB7XG4gICAgICBjb25zb2xlLmxvZygndHJ5IHJlbG9hZCAtIHRpbWVvdXQgPSAnICsgcmV0cnlUaW1lb3V0KTtcbiAgICAgIHVwZGF0ZXIucmVsb2FkKHVwZGF0ZXIuc3RvcmUsIGRvYywgZnVuY3Rpb24gKG9rLCBtZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgY29udHJvbC5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgaWYgKGNvbnRyb2wuZG93bnN0cmVhbUNoYW5nZUxpc3RlbmVycykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250cm9sLmRvd25zdHJlYW1DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgICAgQ2FsbGluZyBkb3duc3RyZWFtIGxpc3RlbmVyICcgKyBpKTtcbiAgICAgICAgICAgICAgY29udHJvbC5kb3duc3RyZWFtQ2hhbmdlTGlzdGVuZXJzW2ldKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTmV0d29yayBlcnJvciByZWZyZXNoaW5nIHRoZSBkYXRhLiBSZXRyeWluZyBpbiAnICsgcmV0cnlUaW1lb3V0IC8gMTAwMCk7XG4gICAgICAgICAgICBjb250cm9sLnJlbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXRyeVRpbWVvdXQgPSByZXRyeVRpbWVvdXQgKiAyO1xuICAgICAgICAgICAgc2V0VGltZW91dCh0cnlSZWxvYWQsIHJldHJ5VGltZW91dCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciAnICsgeGhyLnN0YXR1cyArICdyZWZyZXNoaW5nIHRoZSBkYXRhOicgKyBtZXNzYWdlICsgJy4gU3RvcHBlZCcgKyBkb2MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0cnlSZWxvYWQoKTtcbiAgfTtcblxuICAvLyBTZXQgdXAgd2Vic29ja2V0IHRvIGxpc3RlbiBvblxuICAvL1xuICAvLyBUaGVyZSBpcyBjb29yZGluYXRpb24gYmV0d2VlbiB1cHN0cmVhbSBjaGFuZ2VzIGFuZCBkb3duc3RyZWFtIG9uZXNcbiAgLy8gc28gdGhhdCBhIHJlbG9hZCBpcyBub3QgZG9uZSBpbiB0aGUgbWlkZGxlIG9mIGFuIHVwc3RlZWFtIHBhdGNoLlxuICAvLyBJZiB5b3UgdXNpZSB0aGlzIEFQSSB0aGVuIHlvdSBnZXQgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgaGFwcGVucywgYW5kIHlvdVxuICAvLyBoYXZlIHRvIHJlbG9hZCB0aGUgZmlsZSB5b3Vyc2VsZiwgYW5kIHRoZW4gcmVmcmVzaCB0aGUgVUkuXG4gIC8vIEFsdGVybmF0aXZlIGlzIGFkZERvd25zdHJlYW1DaGFuZ2VMaXN0ZW5lcigpLCB3aGVyZSB5b3UgZG8gbm90XG4gIC8vIGhhdmUgdG8gZG8gdGhlIHJlbG9hZCB5b3Vyc2xmLiBEbyBtb3QgbWl4IHRoZW0uXG4gIC8vXG4gIC8vICBrYiBjb250YWlucyB0aGUgSFRUUCAgbWV0YWRhdGEgZnJvbSBwcmVmdmlvdXMgb3BlcmF0aW9uc1xuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGRvYywgaGFuZGxlcikge1xuICAgIHZhciB3c3NVUkkgPSB0aGlzLmdldFVwZGF0ZXNWaWEoZG9jKTsgLy8gcmVsYXRpdmVcbiAgICAvLyB2YXIga2IgPSB0aGlzLnN0b3JlXG4gICAgdmFyIHRoZUhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdXBkYXRlciA9IHRoaXM7XG4gICAgdmFyIHJldHJ5VGltZW91dCA9IDE1MDA7IC8vICoyIHdpbGwgYmUgMyBTZWNvbmRzLCA2LCAxMiwgZXRjXG4gICAgdmFyIHJldHJpZXMgPSAwO1xuXG4gICAgaWYgKCF3c3NVUkkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdTZXJ2ZXIgZG9pZXMgbm90IHN1cHBvcnQgbGl2ZSB1cGRhdGVzIHRob3VnaFVwZGF0ZXMtVmlhIDotKCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdzc1VSSSA9IHVyaUpvaW4od3NzVVJJLCBkb2MudXJpKTtcbiAgICB3c3NVUkkgPSB3c3NVUkkucmVwbGFjZSgvXmh0dHA6LywgJ3dzOicpLnJlcGxhY2UoL15odHRwczovLCAnd3NzOicpO1xuICAgIGNvbnNvbGUubG9nKCdXZWIgc29ja2V0IFVSSSAnICsgd3NzVVJJKTtcblxuICAgIHZhciBvcGVuV2Vic29ja2V0ID0gZnVuY3Rpb24gb3BlbldlYnNvY2tldCgpIHtcbiAgICAgIC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NvbGlkL3NvbGlkLXNwZWMjbGl2ZS11cGRhdGVzXG4gICAgICB2YXIgc29ja2V0O1xuICAgICAgaWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQod3NzVVJJKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIFNlcnZpY2VzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGaXJlZm94IGFkZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0MjQ0ODg2L2lzLXdlYnNvY2tldC1zdXBwb3J0ZWQtaW4tZmlyZWZveC1mb3ItYW5kcm9pZC1hZGRvbnNcbiAgICAgICAgc29ja2V0ID0gU2VydmljZXMud20uZ2V0TW9zdFJlY2VudFdpbmRvdygnbmF2aWdhdG9yOmJyb3dzZXInKS5XZWJTb2NrZXQod3NzVVJJKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LldlYlNvY2tldCkge1xuICAgICAgICBzb2NrZXQgPSB3aW5kb3cuV2ViU29ja2V0KHdzc1VSSSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnTGl2ZSB1cGRhdGUgZGlzYWJsZWQsIGFzIFdlYlNvY2tldCBub3Qgc3VwcG9ydGVkIGJ5IHBsYXRmb3JtIDotKCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIHdlYnNvY2tldCBvcGVuJyk7XG4gICAgICAgIHJldHJ5VGltZW91dCA9IDE1MDA7IC8vIHJlc2V0IHRpbWVvdXQgdG8gZmFzdCBvbiBzdWNjZXNzXG4gICAgICAgIHRoaXMuc2VuZCgnc3ViICcgKyBkb2MudXJpKTtcbiAgICAgICAgaWYgKHJldHJpZXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnV2ViIHNvY2tldCBoYXMgYmVlbiBkb3duLCBiZXR0ZXIgY2hlY2sgZm9yIGFueSBuZXdzLicpO1xuICAgICAgICAgIHVwZGF0ZXIucmVxdWVzdERvd25zdHJlYW1BY3Rpb24oZG9jLCB0aGVIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjb250cm9sID0gc2VsZi5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG5cbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50XG4gICAgICAvL1xuICAgICAgLy8gMTAwMFx0Q0xPU0VfTk9STUFMXHROb3JtYWwgY2xvc3VyZTsgdGhlIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB3aGF0ZXZlciBwdXJwb3NlIGZvciB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgICAgIC8vIDEwMDFcdENMT1NFX0dPSU5HX0FXQVlcdFRoZSBlbmRwb2ludCBpcyBnb2luZyBhd2F5LCBlaXRoZXJcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSBzZXJ2ZXIgZmFpbHVyZSBvciBiZWNhdXNlIHRoZSBicm93c2VyIGlzIG5hdmlnYXRpbmcgYXdheSBmcm9tIHRoZSBwYWdlIHRoYXQgb3BlbmVkIHRoZSBjb25uZWN0aW9uLlxuICAgICAgLy8gMTAwMlx0Q0xPU0VfUFJPVE9DT0xfRVJST1JcdFRoZSBlbmRwb2ludCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSBwcm90b2NvbCBlcnJvci5cbiAgICAgIC8vIDEwMDNcdENMT1NFX1VOU1VQUE9SVEVEXHRUaGUgY29ubmVjdGlvbiBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGVuZHBvaW50XG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBkYXRhIG9mIGEgdHlwZSBpdCBjYW5ub3QgYWNjZXB0IChmb3IgZXhhbXBsZSwgYSB0ZXh0LW9ubHkgZW5kcG9pbnQgcmVjZWl2ZWQgYmluYXJ5IGRhdGEpLlxuICAgICAgLy8gMTAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQuIEEgbWVhbmluZyBtaWdodCBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuXG4gICAgICAvLyAxMDA1XHRDTE9TRV9OT19TVEFUVVNcdFJlc2VydmVkLiAgSW5kaWNhdGVzIHRoYXQgbm8gc3RhdHVzIGNvZGUgd2FzIHByb3ZpZGVkIGV2ZW4gdGhvdWdoIG9uZSB3YXMgZXhwZWN0ZWQuXG4gICAgICAvLyAxMDA2XHRDTE9TRV9BQk5PUk1BTFx0UmVzZXJ2ZWQuIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhYm5vcm1hbGx5IChcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgc29ja2V0Lm9uY2xvc2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJyoqKiBXZWJzb2NrZXQgY2xvc2VkIHdpdGggY29kZSAnICsgZXZlbnQuY29kZSArIFwiLCByZWFzb24gJ1wiICsgZXZlbnQucmVhc29uICsgXCInIGNsZWFuID0gXCIgKyBldmVudC5jbGVhbik7XG4gICAgICAgIHJldHJ5VGltZW91dCAqPSAyO1xuICAgICAgICByZXRyaWVzICs9IDE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXRyeWluZyBpbiAnICsgcmV0cnlUaW1lb3V0ICsgJ21zJyk7IC8vIChhc2sgdXNlcj8pXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUcnlpbmcgd2Vic29ja2V0IGFnYWluJyk7XG4gICAgICAgICAgb3BlbldlYnNvY2tldCgpO1xuICAgICAgICB9LCByZXRyeVRpbWVvdXQpO1xuICAgICAgfTtcbiAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgIGlmIChtc2cuZGF0YSAmJiBtc2cuZGF0YS5zbGljZSgwLCAzKSA9PT0gJ3B1YicpIHtcbiAgICAgICAgICBpZiAoJ3Vwc3RyZWFtQ291bnQnIGluIGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCAtPSAxO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wudXBzdHJlYW1Db3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdqdXN0IGFuIGVjaG86ICcgKyBjb250cm9sLnVwc3RyZWFtQ291bnQpO1xuICAgICAgICAgICAgICByZXR1cm47IC8vIEp1c3QgYW4gZWNob1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZygnQXNzdW1lIGEgcmVhbCBkb3duc3RyZWFtIGNoYW5nZTogJyArIGNvbnRyb2wudXBzdHJlYW1Db3VudCArICcgLT4gMCcpO1xuICAgICAgICAgIGNvbnRyb2wudXBzdHJlYW1Db3VudCA9IDA7XG4gICAgICAgICAgc2VsZi5yZXF1ZXN0RG93bnN0cmVhbUFjdGlvbihkb2MsIHRoZUhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07IC8vIG9wZW5XZWJzb2NrZXRcbiAgICBvcGVuV2Vic29ja2V0KCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBUaGlzIGhpZ2gtbGV2ZWwgZnVuY3Rpb24gdXBkYXRlcyB0aGUgbG9jYWwgc3RvcmUgaWZmIHRoZSB3ZWIgaXMgY2hhbmdlZCBzdWNjZXNzZnVsbHkuXG4gIC8vXG4gIC8vICAtIGRlbGV0aW9ucywgaW5zZXJ0aW9ucyBtYXkgYmUgdW5kZWZpbmVkIG9yIHNpbmdsZSBzdGF0ZW1lbnRzIG9yIGxpc3RzIG9yIGZvcm11bGFlLlxuICAvLyAgICAgIChtYXkgY29udGFpbiBibm9kZXMgd2hpY2ggY2FuIGJlIGluZGlyZWN0bHkgaWRlbnRpZmllZCBieSBhIHdoZXJlIGNsYXVzZSlcbiAgLy9cbiAgLy8gIC0gY2FsbGJhY2sgaXMgY2FsbGVkIGFzIGNhbGxiYWNrKHVyaSwgc3VjY2VzcywgZXJyb3Jib2R5KVxuICAvL1xuICBzcGFycWwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChkZWxldGlvbnMsIGluc2VydGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG4gICAgICB2YXIgZHMgPSAhZGVsZXRpb25zID8gW10gOiBkZWxldGlvbnMgaW5zdGFuY2VvZiBfaW5kZXhlZEZvcm11bGEyLmRlZmF1bHQgPyBkZWxldGlvbnMuc3RhdGVtZW50cyA6IGRlbGV0aW9ucyBpbnN0YW5jZW9mIEFycmF5ID8gZGVsZXRpb25zIDogW2RlbGV0aW9uc107XG4gICAgICB2YXIgaXMgPSAhaW5zZXJ0aW9ucyA/IFtdIDogaW5zZXJ0aW9ucyBpbnN0YW5jZW9mIF9pbmRleGVkRm9ybXVsYTIuZGVmYXVsdCA/IGluc2VydGlvbnMuc3RhdGVtZW50cyA6IGluc2VydGlvbnMgaW5zdGFuY2VvZiBBcnJheSA/IGluc2VydGlvbnMgOiBbaW5zZXJ0aW9uc107XG4gICAgICBpZiAoIShkcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgRXJyb3IgJyArICh0eXBlb2YgZHMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGRzKSkgKyAnOiAnICsgZHMpO1xuICAgICAgfVxuICAgICAgaWYgKCEoaXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlIEVycm9yICcgKyAodHlwZW9mIGlzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihpcykpICsgJzogJyArIGlzKTtcbiAgICAgIH1cbiAgICAgIGlmIChkcy5sZW5ndGggPT09IDAgJiYgaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTsgLy8gc3VjY2VzcyAtLSBub3RoaW5nIG5lZWRlZCB0byBiZSBkb25lLlxuICAgICAgfVxuICAgICAgdmFyIGRvYyA9IGRzLmxlbmd0aCA/IGRzWzBdLndoeSA6IGlzWzBdLndoeTtcbiAgICAgIHZhciBjb250cm9sID0gdGhpcy5wYXRjaENvbnRyb2xGb3IoZG9jKTtcbiAgICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBbJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsICd3aHknXTtcbiAgICAgIHZhciB2ZXJicyA9IFsnaW5zZXJ0JywgJ2RlbGV0ZSddO1xuICAgICAgdmFyIGNsYXVzZXMgPSB7ICdkZWxldGUnOiBkcywgJ2luc2VydCc6IGlzIH07XG4gICAgICB2ZXJicy5tYXAoZnVuY3Rpb24gKHZlcmIpIHtcbiAgICAgICAgY2xhdXNlc1t2ZXJiXS5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICAgICAgaWYgKCFkb2Muc2FtZVRlcm0oc3Qud2h5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cGRhdGU6IGRlc3RpbmF0aW9uICcgKyBkb2MgKyAnIGluY29uc2lzdGVudCB3aXRoIGRlbGV0ZSBxdWFkICcgKyBzdC53aHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RbcHJvcF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXBkYXRlOiB1bmRlZmluZWQgJyArIHByb3AgKyAnIG9mIHN0YXRlbWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIHByb3RvY29sID0gdGhpcy5lZGl0YWJsZShkb2MudXJpLCBrYik7XG4gICAgICBpZiAoIXByb3RvY29sKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IG1ha2UgY2hhbmdlcyBpbiB1bmVkaXRhYmxlIFwiICsgZG9jKTtcbiAgICAgIH1cbiAgICAgIHZhciBpO1xuICAgICAgdmFyIG5ld1N0cztcbiAgICAgIHZhciBkb2N1bWVudFN0cmluZztcbiAgICAgIHZhciBzejtcbiAgICAgIGlmIChwcm90b2NvbC5pbmRleE9mKCdTUEFSUUwnKSA+PSAwKSB7XG4gICAgICAgIHZhciBibm9kZXMgPSBbXTtcbiAgICAgICAgaWYgKGRzLmxlbmd0aCkgYm5vZGVzID0gdGhpcy5fc3RhdGVtZW50X2FycmF5X2Jub2Rlcyhkcyk7XG4gICAgICAgIGlmIChpcy5sZW5ndGgpIGJub2RlcyA9IGJub2Rlcy5jb25jYXQodGhpcy5fc3RhdGVtZW50X2FycmF5X2Jub2RlcyhpcykpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX2Jub2RlX2NvbnRleHQoYm5vZGVzLCBkb2MpO1xuICAgICAgICB2YXIgd2hlcmVDbGF1c2UgPSB0aGlzLl9jb250ZXh0X3doZXJlKGNvbnRleHQpO1xuICAgICAgICB2YXIgcXVlcnkgPSAnJztcbiAgICAgICAgaWYgKHdoZXJlQ2xhdXNlLmxlbmd0aCkge1xuICAgICAgICAgIC8vIElzIHRoZXJlIGEgV0hFUkUgY2xhdXNlP1xuICAgICAgICAgIGlmIChkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9ICdERUxFVEUgeyAnO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5ICs9IHRoaXMuYW5vbnltaXplTlQoZHNbaV0pICsgJ1xcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeSArPSAnIH1cXG4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBxdWVyeSArPSAnSU5TRVJUIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGlzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9XFxuJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcnkgKz0gd2hlcmVDbGF1c2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm8gd2hlcmUgY2xhdXNlXG4gICAgICAgICAgaWYgKGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcXVlcnkgKz0gJ0RFTEVURSBEQVRBIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGRzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9IFxcbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChkcy5sZW5ndGgpIHF1ZXJ5ICs9ICcgOyAnO1xuICAgICAgICAgICAgcXVlcnkgKz0gJ0lOU0VSVCBEQVRBIHsgJztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBxdWVyeSArPSB0aGlzLmFub255bWl6ZU5UKGlzW2ldKSArICdcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnkgKz0gJyB9XFxuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgcGVuZGluZyB1cHN0cmVhbSBwYXRjaGVzIHVudGlsIHRoZXkgaGF2ZSBmbmlzaGVkIHRoZWlyIGNhbGxiYWNrXG4gICAgICAgIGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtID0gY29udHJvbC5wZW5kaW5nVXBzdHJlYW0gPyBjb250cm9sLnBlbmRpbmdVcHN0cmVhbSArIDEgOiAxO1xuICAgICAgICBpZiAoJ3Vwc3RyZWFtQ291bnQnIGluIGNvbnRyb2wpIHtcbiAgICAgICAgICBjb250cm9sLnVwc3RyZWFtQ291bnQgKz0gMTsgLy8gY291bnQgY2hhbmdlcyB3ZSBvcmlnaW5hdGVkIG91cnNlbHZlc1xuICAgICAgICAgIGNvbnNvbGUubG9nKCd1cHN0cmVhbSBjb3VudCB1cCB0byA6ICcgKyBjb250cm9sLnVwc3RyZWFtQ291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlyZShkb2MudXJpLCBxdWVyeSwgZnVuY3Rpb24gKHVyaSwgc3VjY2VzcywgYm9keSwgeGhyKSB7XG4gICAgICAgICAgeGhyLmVsYXBzZWRUaW1lX21zID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnICAgIHNwYXJxbDogUmV0dXJuICcgKyAoc3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdGQUlMVVJFICcgKyB4aHIuc3RhdHVzKSArICcgZWxhcHNlZCAnICsgeGhyLmVsYXBzZWRUaW1lX21zICsgJ21zJyk7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtiLnJlbW92ZShkcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYm9keSA9ICdSZW1vdGUgT2sgQlVUIGVycm9yIGRlbGV0aW5nICcgKyBkcy5sZW5ndGggKyAnIGZyb20gc3RvcmUhISEgJyArIGU7XG4gICAgICAgICAgICB9IC8vIEFkZCBpbiBhbnkgY2FzZSAtLSBoZWxwIHJlY292ZXIgZnJvbSB3ZWlyZG5lc3M/P1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBrYi5hZGQoaXNbaV0uc3ViamVjdCwgaXNbaV0ucHJlZGljYXRlLCBpc1tpXS5vYmplY3QsIGRvYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FsbGJhY2sodXJpLCBzdWNjZXNzLCBib2R5LCB4aHIpO1xuICAgICAgICAgIGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtIC09IDE7XG4gICAgICAgICAgLy8gV2hlbiB1cHN0cmVhbSBwYXRjaGVzIGhhdmUgYmVlbiBzZW50LCByZWxvYWQgc3RhdGUgaWYgZG93bnN0cmVhbSB3YWl0aW5nXG4gICAgICAgICAgaWYgKGNvbnRyb2wucGVuZGluZ1Vwc3RyZWFtID09PSAwICYmIGNvbnRyb2wuZG93bnN0cmVhbUFjdGlvbikge1xuICAgICAgICAgICAgdmFyIGRvd25zdHJlYW1BY3Rpb24gPSBjb250cm9sLmRvd25zdHJlYW1BY3Rpb247XG4gICAgICAgICAgICBkZWxldGUgY29udHJvbC5kb3duc3RyZWFtQWN0aW9uO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2RlbGF5ZWQgZG93bnN0cmVhbSBhY3Rpb246Jyk7XG4gICAgICAgICAgICBkb3duc3RyZWFtQWN0aW9uKGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuaW5kZXhPZignREFWJykgPj0gMCkge1xuICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBkZXJpdmVkIGZyb20gS2VubnkncyBVcGRhdGVDZW50ZXIuanNcbiAgICAgICAgZG9jdW1lbnRTdHJpbmc7XG4gICAgICAgIHZhciByZXF1ZXN0ID0ga2IuYW55KGRvYywgdGhpcy5ucy5saW5rKCdyZXF1ZXN0JykpO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlY29yZCBvZiBvdXIgSFRUUCBHRVQgcmVxdWVzdCBmb3IgZG9jdW1lbnQ6ICcgKyBkb2MpO1xuICAgICAgICB9IC8vIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICAgIHZhciByZXNwb25zZSA9IGtiLmFueShyZXF1ZXN0LCB0aGlzLm5zLmxpbmsoJ3Jlc3BvbnNlJykpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRocm93IFwiTm8gcmVjb3JkIEhUVFAgR0VUIHJlc3BvbnNlIGZvciBkb2N1bWVudDogXCIrZG9jXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRfdHlwZSA9IGtiLnRoZShyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnY29udGVudC10eXBlJykpLnZhbHVlO1xuXG4gICAgICAgIC8vIHByZXBhcmUgY29udGVudHMgb2YgcmV2aXNlZCBkb2N1bWVudFxuICAgICAgICBuZXdTdHMgPSBrYi5zdGF0ZW1lbnRzTWF0Y2hpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZG9jKS5zbGljZSgpOyAvLyBjb3B5IVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBVdGlsLlJERkFycmF5UmVtb3ZlKG5ld1N0cywgZHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG5ld1N0cy5wdXNoKGlzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlcmlhbGl6ZSB0byB0ZSBhcHByb3ByaWF0ZSBmb3JtYXRcbiAgICAgICAgc3ogPSBTZXJpYWxpemVyKGtiKTtcbiAgICAgICAgc3ouc3VnZ2VzdE5hbWVzcGFjZXMoa2IubmFtZXNwYWNlcyk7XG4gICAgICAgIHN6LnNldEJhc2UoZG9jLnVyaSk7IC8vID8/IGJld2FyZSBvZiB0aGlzIC0ga2VubnkgKHdoeT8gdGltKVxuICAgICAgICBzd2l0Y2ggKGNvbnRlbnRfdHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3JkZit4bWwnOlxuICAgICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9YTUwobmV3U3RzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgICAgIGNhc2UgJ3RleHQvdHVydGxlJzpcbiAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi94LXR1cnRsZSc6IC8vIExlZ2FjeVxuICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL24zJzpcbiAgICAgICAgICAgIC8vIExlZ2FjeVxuICAgICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9OMyhuZXdTdHMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudC10eXBlICcgKyBjb250ZW50X3R5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGEgd3JpdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBuZXcgdmVyc2lvbiBiYWNrXG5cbiAgICAgICAgdmFyIGNhbmRpZGF0ZVRhcmdldCA9IGtiLnRoZShyZXNwb25zZSwgdGhpcy5ucy5odHRwaCgnY29udGVudC1sb2NhdGlvbicpKTtcbiAgICAgICAgdmFyIHRhcmdldFVSSTtcbiAgICAgICAgaWYgKGNhbmRpZGF0ZVRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFVSSSA9IHVyaUpvaW4oY2FuZGlkYXRlVGFyZ2V0LnZhbHVlLCB0YXJnZXRVUkkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgICAgIHhoci5vcHRpb25zID0ge307XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICAvLyBmb3JtdWxhIGZyb20gc3BhcnFsVXBkYXRlLmpzLCB3aGF0IGFib3V0IHJlZGlyZWN0cz9cbiAgICAgICAgICAgIHZhciBzdWNjZXNzID0gIXhoci5zdGF0dXMgfHwgeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMDtcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBrYi5yZW1vdmUoZHNbaV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGtiLmFkZChpc1tpXS5zdWJqZWN0LCBpc1tpXS5wcmVkaWNhdGUsIGlzW2ldLm9iamVjdCwgZG9jKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soZG9jLnVyaSwgc3VjY2VzcywgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIub3BlbignUFVUJywgdGFyZ2V0VVJJLCB0cnVlKTtcbiAgICAgICAgLy8gYXNzdW1lIHRoZSBzZXJ2ZXIgZG9lcyBQVVQgY29udGVudC1uZWdvdGlhdGlvbi5cbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtdHlwZScsIGNvbnRlbnRfdHlwZSk7IC8vIE9LP1xuICAgICAgICB4aHIuc2VuZChkb2N1bWVudFN0cmluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvdG9jb2wuaW5kZXhPZignTE9DQUxGSUxFJykgPj0gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBiYWNrIHRvIGxvY2FsIGZpbGVcXG4nKTtcbiAgICAgICAgICAgIC8vIFNlZSBodHRwOi8vc2ltb24tanVuZy5ibG9nc3BvdC5jb20vMjAwNy8xMC9maXJlZm94LWV4dGVuc2lvbi1maWxlLWlvLmh0bWxcbiAgICAgICAgICAgIC8vIHByZXBhcmUgY29udGVudHMgb2YgcmV2aXNlZCBkb2N1bWVudFxuICAgICAgICAgICAgbmV3U3RzID0ga2Iuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRvYykuc2xpY2UoKTsgLy8gY29weSFcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBVdGlsLlJERkFycmF5UmVtb3ZlKG5ld1N0cywgZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIG5ld1N0cy5wdXNoKGlzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XG4gICAgICAgICAgICBkb2N1bWVudFN0cmluZztcbiAgICAgICAgICAgIHN6ID0gU2VyaWFsaXplcihrYik7XG4gICAgICAgICAgICBzei5zdWdnZXN0TmFtZXNwYWNlcyhrYi5uYW1lc3BhY2VzKTtcbiAgICAgICAgICAgIHN6LnNldEJhc2UoZG9jLnVyaSk7IC8vID8/IGJld2FyZSBvZiB0aGlzIC0ga2VubnkgKHdoeT8gdGltKVxuICAgICAgICAgICAgdmFyIGRvdCA9IGRvYy51cmkubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgIGlmIChkb3QgPCAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmV3cml0aW5nIGZpbGU6IE5vIGZpbGVuYW1lIGV4dGVuc2lvbjogJyArIGRvYy51cmkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4dCA9IGRvYy51cmkuc2xpY2UoZG90ICsgMSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGV4dCkge1xuICAgICAgICAgICAgICBjYXNlICdyZGYnOlxuICAgICAgICAgICAgICBjYXNlICdvd2wnOiAvLyBKdXN0IG15IGV4cGVyZW5jZSAgIC4uLkBAIHdlIHNob3VsZCBrZWVwIHRoZSBmb3JtYXQgaW4gd2hpY2ggaXQgd2FzIHBhcnNlZFxuICAgICAgICAgICAgICBjYXNlICd4bWwnOlxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvWE1MKG5ld1N0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ24zJzpcbiAgICAgICAgICAgICAgY2FzZSAnbnQnOlxuICAgICAgICAgICAgICBjYXNlICd0dGwnOlxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3RyaW5nID0gc3ouc3RhdGVtZW50c1RvTjMobmV3U3RzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgZXh0ZW5zaW9uIC4nICsgZXh0ICsgJyBub3Qgc3VwcG9ydGVkIGZvciBkYXRhIHdyaXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgbmV3IHZlcnNpb24gYmFja1xuICAgICAgICAgICAgLy8gY3JlYXRlIGNvbXBvbmVudCBmb3IgZmlsZSB3cml0aW5nXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBiYWNrOiA8PDwnICsgZG9jdW1lbnRTdHJpbmcgKyAnPj4+Jyk7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBkb2MudXJpLnNsaWNlKDcpOyAvLyBjaG9wIG9mZiAgIGZpbGU6Ly8gIGxlYXZpbmcgL3BhdGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiV3JpdGViYWNrOiBGaWxlbmFtZTogXCIrZmlsZW5hbWUrXCJcXG5cIilcbiAgICAgICAgICAgIHZhciBmaWxlID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcvZmlsZS9sb2NhbDsxJ10uY3JlYXRlSW5zdGFuY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUxvY2FsRmlsZSk7XG4gICAgICAgICAgICBmaWxlLmluaXRXaXRoUGF0aChmaWxlbmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXdyaXRpbmcgZmlsZSA8JyArIGRvYy51cmkgKyAnPiBidXQgaXQgZG9lcyBub3QgZXhpc3QhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyBmaWxlLmNyZWF0ZSggQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSUZpbGUuTk9STUFMX0ZJTEVfVFlQRSwgNDIwKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gY3JlYXRlIGZpbGUgb3V0cHV0IHN0cmVhbSBhbmQgdXNlIHdyaXRlL2NyZWF0ZS90cnVuY2F0ZSBtb2RlXG4gICAgICAgICAgICAvLyAweDAyIHdyaXRpbmcsIDB4MDggY3JlYXRlIGZpbGUsIDB4MjAgdHJ1bmNhdGUgbGVuZ3RoIGlmIGV4aXN0XG4gICAgICAgICAgICB2YXIgc3RyZWFtID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcvbmV0d29yay9maWxlLW91dHB1dC1zdHJlYW07MSddLmNyZWF0ZUluc3RhbmNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lGaWxlT3V0cHV0U3RyZWFtKTtcblxuICAgICAgICAgICAgLy8gVmFyaW91cyBKUyBzeXN0ZW1zIG9iamVjdCB0byAwNjY2IGluIHN0cnVjdCBtb2RlIGFzIGRhbmdlcm91c1xuICAgICAgICAgICAgc3RyZWFtLmluaXQoZmlsZSwgMHgwMiB8IDB4MDggfCAweDIwLCBwYXJzZUludCgnMDY2NicsIDgpLCAwKTtcblxuICAgICAgICAgICAgLy8gd3JpdGUgZGF0YSB0byBmaWxlIHRoZW4gY2xvc2Ugb3V0cHV0IHN0cmVhbVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGRvY3VtZW50U3RyaW5nLCBkb2N1bWVudFN0cmluZy5sZW5ndGgpO1xuICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBrYi5yZW1vdmUoZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGtiLmFkZChpc1tpXS5zdWJqZWN0LCBpc1tpXS5wcmVkaWNhdGUsIGlzW2ldLm9iamVjdCwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGRvYy51cmksIHRydWUsICcnKTsgLy8gc3VjY2VzcyFcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhkb2MudXJpLCBmYWxzZSwgJ0V4Y2VwdGlvbiB0cnlpbmcgdG8gd3JpdGUgYmFjayBmaWxlIDwnICsgZG9jLnVyaSArICc+XFxuJ1xuICAgICAgICAgICAgLy8gKyB0YWJ1bGF0b3IuVXRpbC5zdGFja1N0cmluZyhlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuaGFuZGxlZCBlZGl0IG1ldGhvZDogJ1wiICsgcHJvdG9jb2wgKyBcIicgZm9yIFwiICsgZG9jKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCwgZmFsc2UsICdFeGNlcHRpb24gaW4gdXBkYXRlOiAnICsgZSArICdcXG4nICsgJHJkZi5VdGlsLnN0YWNrU3RyaW5nKGUpKTtcbiAgICB9XG4gIH07IC8vIHduZCB1cGRhdGVcblxuICAvLyBUaGlzIHN1aXRhYmxlIGZvciBhbiBpbml0YWwgY3JlYXRpb24gb2YgYSBkb2N1bWVudFxuICAvL1xuICAvLyBkYXRhOiAgICBzdHJpbmcsIG9yIGFycmF5IG9mIHN0YXRlbWVudHNcbiAgLy9cbiAgc3BhcnFsLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAoZG9jLCBkYXRhLCBjb250ZW50X3R5cGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGRvY3VtZW50U3RyaW5nO1xuICAgIHZhciBrYiA9IHRoaXMuc3RvcmU7XG5cbiAgICBpZiAoKHR5cGVvZiBkYXRhID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihkYXRhKSkgPT09IF90eXBlb2YoJycpKSB7XG4gICAgICBkb2N1bWVudFN0cmluZyA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNlcmlhbGl6ZSB0byB0ZSBhcHByb3ByaWF0ZSBmb3JtYXRcbiAgICAgIHZhciBzeiA9IFNlcmlhbGl6ZXIoa2IpO1xuICAgICAgc3ouc3VnZ2VzdE5hbWVzcGFjZXMoa2IubmFtZXNwYWNlcyk7XG4gICAgICBzei5zZXRCYXNlKGRvYy51cmkpO1xuICAgICAgc3dpdGNoIChjb250ZW50X3R5cGUpIHtcbiAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vcmRmK3htbCc6XG4gICAgICAgICAgZG9jdW1lbnRTdHJpbmcgPSBzei5zdGF0ZW1lbnRzVG9YTUwoZGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHQvbjMnOlxuICAgICAgICBjYXNlICd0ZXh0L3R1cnRsZSc6XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtdHVydGxlJzogLy8gTGVnYWN5XG4gICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL24zJzpcbiAgICAgICAgICAvLyBMZWdhY3lcbiAgICAgICAgICBkb2N1bWVudFN0cmluZyA9IHN6LnN0YXRlbWVudHNUb04zKGRhdGEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGVudC10eXBlICcgKyBjb250ZW50X3R5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGEgUFVUJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB4aHIgPSBVdGlsLlhNTEhUVFBGYWN0b3J5KCk7XG4gICAgeGhyLm9wdGlvbnMgPSB7fTtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgIC8vIGZvcm11bGEgZnJvbSBzcGFycWxVcGRhdGUuanMsIHdoYXQgYWJvdXQgcmVkaXJlY3RzP1xuICAgICAgICB2YXIgc3VjY2VzcyA9ICF4aHIuc3RhdHVzIHx8IHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDA7XG4gICAgICAgIGlmIChzdWNjZXNzICYmIHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRhdGEubWFwKGZ1bmN0aW9uIChzdCkge1xuICAgICAgICAgICAga2IuYWRkU3RhdGVtZW50KHN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBrYi5mZXRjaGVyLnJlcXVlc3RlZFtkb2MudXJpXSA9IHRydWUgLy8gYXMgdGhvdWdoIGZldGNoZWRcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBrYi5mZXRjaGVyLm5vbmV4aXN0YW50W2RvYy51cmldO1xuICAgICAgICAgIGRlbGV0ZSBrYi5mZXRjaGVyLnJlcXVlc3RlZFtkb2MudXJpXTtcbiAgICAgICAgICAvLyBAQCBsYXRlciB3ZSBjYW4gZmFrZSBpdCBoYXMgYmVlbiByZXF1ZXN0ZCBpZiBwdXQgZ2l2ZXMgdXMgdGhlIGhlYWRlciBzYW5kIHdlIHNhdmUgdGhlbS5cbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhkb2MudXJpLCBzdWNjZXNzLCB4aHIucmVzcG9uc2VUZXh0LCB4aHIpO1xuICAgICAgfVxuICAgIH07XG4gICAgeGhyLm9wZW4oJ1BVVCcsIGRvYy51cmksIHRydWUpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LXR5cGUnLCBjb250ZW50X3R5cGUpO1xuICAgIHhoci5zZW5kKGRvY3VtZW50U3RyaW5nKTtcbiAgfTtcblxuICAvLyBSZWxvYWQgYSBkb2N1bWVudC5cbiAgLy9cbiAgLy8gRmFzdCBhbmQgY2hlYXAsIG5vIG1ldGFhdGFcbiAgLy8gTWVhc3VyZSB0aW1lcyBmb3IgdGhlIGRvY3VtZW50XG4gIC8vIExvYWQgaXQgcHJvdmlzaW9uYWxseVxuICAvLyBEb24ndCBkZWxldGUgdGhlIHN0YXRlbWVuc3QgYmVmb3JlIHRoZSBsb2FkLCBvciBpdCB3aWxsIGxlYXZlIGEgYnJva2VuIGRvY3VtZW50XG4gIC8vIGluIHRoZSBtZWFudGltZS5cblxuICBzcGFycWwucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uIChrYiwgZG9jLCBjYWxsYmFjaykge1xuICAgIHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIGZvcmNlIHNldHMgbm8tY2FjaGUgYW5kXG4gICAga2IuZmV0Y2hlci5ub3dPcldoZW5GZXRjaGVkKGRvYy51cmksIHsgZm9yY2U6IHRydWUsIG5vTWV0YTogdHJ1ZSwgY2xlYXJQcmV2aW91c0RhdGE6IHRydWUgfSwgZnVuY3Rpb24gKG9rLCBib2R5LCB4aHIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBFUlJPUiByZWxvYWRpbmcgZGF0YTogJyArIGJvZHkpO1xuICAgICAgICBjYWxsYmFjayhmYWxzZSwgJ0Vycm9yIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSwgeGhyKTtcbiAgICAgIH0gZWxzZSBpZiAoeGhyLm9uRXJyb3JXYXNDYWxsZWQgfHwgeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgTm9uLUhUVFAgZXJyb3IgcmVsb2FkaW5nIGRhdGEhIG9uRXJyb3JXYXNDYWxsZWQ9JyArIHhoci5vbkVycm9yV2FzQ2FsbGVkICsgJyBzdGF0dXM6ICcgKyB4aHIuc3RhdHVzKTtcbiAgICAgICAgY2FsbGJhY2soZmFsc2UsICdOb24tSFRUUCBlcnJvciByZWxvYWRpbmcgZGF0YTogJyArIGJvZHksIHhocik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZWxhcHNlZFRpbWVfbXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBpZiAoIWRvYy5yZWxvYWRUaW1lX3RvdGFsKSBkb2MucmVsb2FkVGltZV90b3RhbCA9IDA7XG4gICAgICAgIGlmICghZG9jLnJlbG9hZFRpbWVfY291bnQpIGRvYy5yZWxvYWRUaW1lX2NvdW50ID0gMDtcbiAgICAgICAgZG9jLnJlbG9hZFRpbWVfdG90YWwgKz0gZWxhcHNlZFRpbWVfbXM7XG4gICAgICAgIGRvYy5yZWxvYWRUaW1lX2NvdW50ICs9IDE7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgRmV0Y2ggdG9vayAnICsgZWxhcHNlZFRpbWVfbXMgKyAnbXMsIGF2LiBvZiAnICsgZG9jLnJlbG9hZFRpbWVfY291bnQgKyAnID0gJyArIGRvYy5yZWxvYWRUaW1lX3RvdGFsIC8gZG9jLnJlbG9hZFRpbWVfY291bnQgKyAnbXMuJyk7XG4gICAgICAgIGNhbGxiYWNrKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHNwYXJxbC5wcm90b3R5cGUub2xkUmVsb2FkID0gZnVuY3Rpb24gKGtiLCBkb2MsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGcyID0gZ3JhcGgoKTsgLy8gQSBzZXBhcmF0ZSBzdG9yZSB0byBob2xkIHRoZSBkYXRhIGFzIHdlIGxvYWQgaXRcbiAgICB2YXIgZjIgPSBmZXRjaGVyKGcyKTtcbiAgICB2YXIgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBmb3JjZSBzZXRzIG5vLWNhY2hlIGFuZFxuICAgIGYyLm5vd09yV2hlbkZldGNoZWQoZG9jLnVyaSwgeyBmb3JjZTogdHJ1ZSwgbm9NZXRhOiB0cnVlLCBjbGVhclByZXZpb3VzRGF0YTogdHJ1ZSB9LCBmdW5jdGlvbiAob2ssIGJvZHksIHhocikge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIEVSUk9SIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSk7XG4gICAgICAgIGNhbGxiYWNrKGZhbHNlLCAnRXJyb3IgcmVsb2FkaW5nIGRhdGE6ICcgKyBib2R5LCB4aHIpO1xuICAgICAgfSBlbHNlIGlmICh4aHIub25FcnJvcldhc0NhbGxlZCB8fCB4aHIuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBOb24tSFRUUCBlcnJvciByZWxvYWRpbmcgZGF0YSEgb25FcnJvcldhc0NhbGxlZD0nICsgeGhyLm9uRXJyb3JXYXNDYWxsZWQgKyAnIHN0YXR1czogJyArIHhoci5zdGF0dXMpO1xuICAgICAgICBjYWxsYmFjayhmYWxzZSwgJ05vbi1IVFRQIGVycm9yIHJlbG9hZGluZyBkYXRhOiAnICsgYm9keSwgeGhyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzdHMxID0ga2Iuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRvYykuc2xpY2UoKTsgLy8gVGFrZSBhIGNvcHkhIVxuICAgICAgICB2YXIgc3RzMiA9IGcyLnN0YXRlbWVudHNNYXRjaGluZyh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBkb2MpLnNsaWNlKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgcmVwbGFjaW5nICcgKyBzdHMxLmxlbmd0aCArICcgd2l0aCAnICsgc3RzMi5sZW5ndGggKyAnIG91dCBvZiB0b3RhbCBzdGF0ZW1lbnRzICcgKyBrYi5zdGF0ZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgIGtiLnJlbW92ZShzdHMxKTtcbiAgICAgICAga2IuYWRkKHN0czIpO1xuICAgICAgICB2YXIgZWxhcHNlZFRpbWVfbXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBpZiAoc3RzMi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPz8/Pz8/Pz8/Pz8/Pz8/Pz8gMDAwMDAwMCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9jLnJlbG9hZFRpbWVfdG90YWwpIGRvYy5yZWxvYWRUaW1lX3RvdGFsID0gMDtcbiAgICAgICAgaWYgKCFkb2MucmVsb2FkVGltZV9jb3VudCkgZG9jLnJlbG9hZFRpbWVfY291bnQgPSAwO1xuICAgICAgICBkb2MucmVsb2FkVGltZV90b3RhbCArPSBlbGFwc2VkVGltZV9tcztcbiAgICAgICAgZG9jLnJlbG9hZFRpbWVfY291bnQgKz0gMTtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICBmZXRjaCB0b29rICcgKyBlbGFwc2VkVGltZV9tcyArICdtcywgYXYuIG9mICcgKyBkb2MucmVsb2FkVGltZV9jb3VudCArICcgPSAnICsgZG9jLnJlbG9hZFRpbWVfdG90YWwgLyBkb2MucmVsb2FkVGltZV9jb3VudCArICdtcy4nKTtcbiAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBzcGFycWw7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gVXBkYXRlTWFuYWdlcjsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qXG4gKiBVcGRhdGVzLVZpYVxuICovXG52YXIgbmFtZWROb2RlID0gcmVxdWlyZSgnLi9kYXRhLWZhY3RvcnknKS5uYW1lZE5vZGU7XG5cbnZhciBVcGRhdGVzU29ja2V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVcGRhdGVzU29ja2V0KHBhcmVudCwgdmlhKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVwZGF0ZXNTb2NrZXQpO1xuXG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy52aWEgPSB2aWE7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmcgPSB7fTtcbiAgICB0aGlzLnN1YnNjcmliZWQgPSB7fTtcbiAgICB0aGlzLnNvY2tldCA9IHt9O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodmlhKTtcbiAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMub25PcGVuO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IHRoaXMub25DbG9zZTtcbiAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMub25NZXNzYWdlO1xuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMub25FcnJvcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVXBkYXRlc1NvY2tldCwgW3tcbiAgICBrZXk6ICdfZGVjb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlY29kZShxKSB7XG4gICAgICB2YXIgZWx0O1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgaztcbiAgICAgIHZhciByO1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHZhciByZWYxO1xuICAgICAgdmFyIHY7XG4gICAgICByID0ge307XG4gICAgICByZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBqLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgICAgcmVmID0gcS5zcGxpdCgnJicpO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGVsdCA9IHJlZltqXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2goZWx0LnNwbGl0KCc9JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSgpO1xuICAgICAgZm9yIChpIGluIHJlZikge1xuICAgICAgICBlbHQgPSByZWZbaV07XG4gICAgICAgIHJlZjEgPSBbZGVjb2RlVVJJQ29tcG9uZW50KGVsdFswXSksIGRlY29kZVVSSUNvbXBvbmVudChlbHRbMV0pXTtcbiAgICAgICAgayA9IHJlZjFbMF07XG4gICAgICAgIHYgPSByZWYxWzFdO1xuICAgICAgICBpZiAocltrXSA9PSBudWxsKSB7XG4gICAgICAgICAgcltrXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJba10ucHVzaCh2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19zZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3NlbmQobWV0aG9kLCB1cmksIGRhdGEpIHtcbiAgICAgIHZhciBiYXNlLCBtZXNzYWdlO1xuICAgICAgbWVzc2FnZSA9IFttZXRob2QsIHVyaSwgZGF0YV0uam9pbignICcpO1xuICAgICAgcmV0dXJuIHR5cGVvZiAoYmFzZSA9IHRoaXMuc29ja2V0KS5zZW5kID09PSAnZnVuY3Rpb24nID8gYmFzZS5zZW5kKG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19zdWJzY3JpYmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc3Vic2NyaWJlKHVyaSkge1xuICAgICAgdGhpcy5fc2VuZCgnc3ViJywgdXJpLCAnJyk7XG4gICAgICB0aGlzLnN1YnNjcmliZWRbdXJpXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkW3VyaV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25DbG9zZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xvc2UoZSkge1xuICAgICAgdmFyIHVyaTtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICBmb3IgKHVyaSBpbiB0aGlzLnN1YnNjcmliZWQpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nW3VyaV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5zdWJzY3JpYmVkID0ge307XG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ29uRXJyb3InLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVycm9yKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb25FcnJvcicgKyBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbk1lc3NhZ2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbk1lc3NhZ2UoZSkge1xuICAgICAgdmFyIGJhc2UsIG1lc3NhZ2U7XG4gICAgICBtZXNzYWdlID0gZS5kYXRhLnNwbGl0KCcgJyk7XG4gICAgICBpZiAobWVzc2FnZVswXSA9PT0gJ3BpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgKGJhc2UgPSB0aGlzLnNvY2tldCkuc2VuZCA9PT0gJ2Z1bmN0aW9uJyA/IGJhc2Uuc2VuZCgncG9uZyAnICsgbWVzc2FnZS5zbGljZSgxKS5qb2luKCcgJykpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlWzBdID09PSAncHViJykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQub25VcGRhdGUobWVzc2FnZVsxXSwgdGhpcy5fZGVjb2RlKG1lc3NhZ2VbMl0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvbk9wZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbk9wZW4oZSkge1xuICAgICAgdmFyIHJlc3VsdHMsIHVyaTtcbiAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAodXJpIGluIHRoaXMucGVuZGluZykge1xuICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nW3VyaV07XG4gICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLl9zdWJzY3JpYmUodXJpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzY3JpYmUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJzY3JpYmUodXJpKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZSh1cmkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nW3VyaV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nW3VyaV07XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFVwZGF0ZXNTb2NrZXQ7XG59KCk7XG5cbnZhciBVcGRhdGVzVmlhID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVcGRhdGVzVmlhKGZldGNoZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVXBkYXRlc1ZpYSk7XG5cbiAgICB0aGlzLmZldGNoZXIgPSBmZXRjaGVyO1xuICAgIHRoaXMuZ3JhcGggPSB7fTtcbiAgICB0aGlzLnZpYSA9IHt9O1xuICAgIHRoaXMuZmV0Y2hlci5hZGRDYWxsYmFjaygnaGVhZGVycycsIHRoaXMub25IZWFkZXJzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVcGRhdGVzVmlhLCBbe1xuICAgIGtleTogJ29uSGVhZGVycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uSGVhZGVycyhkKSB7XG4gICAgICB2YXIgZXRhZywgdXJpLCB2aWE7XG4gICAgICBpZiAoZC5oZWFkZXJzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIFdlYlNvY2tldCA9PT0gJ3VuZGVmaW5lZCcgfHwgV2ViU29ja2V0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZXRhZyA9IGQuaGVhZGVyc1snZXRhZyddO1xuICAgICAgdmlhID0gZC5oZWFkZXJzWyd1cGRhdGVzLXZpYSddO1xuICAgICAgdXJpID0gZC51cmk7XG4gICAgICBpZiAoZXRhZyAmJiB2aWEpIHtcbiAgICAgICAgdGhpcy5ncmFwaFt1cmldID0ge1xuICAgICAgICAgIGV0YWc6IGV0YWcsXG4gICAgICAgICAgdmlhOiB2aWFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZWdpc3Rlcih2aWEsIHVyaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdvblVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uVXBkYXRlKHVyaSwgZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hlci5yZWZyZXNoKG5hbWVkTm9kZSh1cmkpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZWdpc3RlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlZ2lzdGVyKHZpYSwgdXJpKSB7XG4gICAgICBpZiAodGhpcy52aWFbdmlhXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudmlhW3ZpYV0gPSBuZXcgVXBkYXRlc1NvY2tldCh0aGlzLCB2aWEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmlhW3ZpYV0uc3Vic2NyaWJlKHVyaSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFVwZGF0ZXNWaWE7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzLlVwZGF0ZXNTb2NrZXQgPSBVcGRhdGVzU29ja2V0O1xubW9kdWxlLmV4cG9ydHMuVXBkYXRlc1ZpYSA9IFVwZGF0ZXNWaWE7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKlxuICogSW1wbGVtZW50cyBVUkktc3BlY2lmaWMgZnVuY3Rpb25zXG4gKlxuICogU2VlIFJGQyAyMzg2XG4gKlxuICogU2VlIGFsc286XG4gKiAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMTAvYWphdy91cmkuanNcbiAqICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9zd2FwL3VyaXBhdGgucHlcbiAqXG4gKi9cbnZhciBhbGVydCA9IGFsZXJ0IHx8IGNvbnNvbGUubG9nO1xuXG5tb2R1bGUuZXhwb3J0cy5kb2NwYXJ0ID0gZG9jcGFydDtcbm1vZHVsZS5leHBvcnRzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cy5ob3N0cGFydCA9IGhvc3RwYXJ0O1xubW9kdWxlLmV4cG9ydHMuam9pbiA9IGpvaW47XG5tb2R1bGUuZXhwb3J0cy5wcm90b2NvbCA9IHByb3RvY29sO1xubW9kdWxlLmV4cG9ydHMucmVmVG8gPSByZWZUbztcblxudmFyIE5hbWVkTm9kZSA9IHJlcXVpcmUoJy4vbmFtZWQtbm9kZScpO1xuXG5mdW5jdGlvbiBkb2NwYXJ0KHVyaSkge1xuICB2YXIgaTtcbiAgaSA9IHVyaS5pbmRleE9mKCcjJyk7XG4gIGlmIChpIDwgMCkge1xuICAgIHJldHVybiB1cmk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZSgwLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkb2N1bWVudCh4KSB7XG4gIHJldHVybiBuZXcgTmFtZWROb2RlKGRvY3BhcnQoeC51cmkpKTtcbn1cblxuZnVuY3Rpb24gaG9zdHBhcnQodSkge1xuICB2YXIgbSA9IC9bXlxcL10qXFwvXFwvKFteXFwvXSopXFwvLy5leGVjKHUpO1xuICBpZiAobSkge1xuICAgIHJldHVybiBtWzFdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBqb2luKGdpdmVuLCBiYXNlKSB7XG4gIHZhciBiYXNlQ29sb24sIGJhc2VTY2hlbWUsIGJhc2VTaW5nbGU7XG4gIHZhciBjb2xvbiwgbGFzdFNsYXNoLCBwYXRoO1xuICB2YXIgYmFzZUhhc2ggPSBiYXNlLmluZGV4T2YoJyMnKTtcbiAgaWYgKGJhc2VIYXNoID4gMCkge1xuICAgIGJhc2UgPSBiYXNlLnNsaWNlKDAsIGJhc2VIYXNoKTtcbiAgfVxuICBpZiAoZ2l2ZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cbiAgaWYgKGdpdmVuLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgIHJldHVybiBiYXNlICsgZ2l2ZW47XG4gIH1cbiAgY29sb24gPSBnaXZlbi5pbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbiA+PSAwKSB7XG4gICAgcmV0dXJuIGdpdmVuO1xuICB9XG4gIGJhc2VDb2xvbiA9IGJhc2UuaW5kZXhPZignOicpO1xuICBpZiAoYmFzZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZ2l2ZW47XG4gIH1cbiAgaWYgKGJhc2VDb2xvbiA8IDApIHtcbiAgICBhbGVydCgnSW52YWxpZCBiYXNlOiAnICsgYmFzZSArICcgaW4gam9pbiB3aXRoIGdpdmVuOiAnICsgZ2l2ZW4pO1xuICAgIHJldHVybiBnaXZlbjtcbiAgfVxuICBiYXNlU2NoZW1lID0gYmFzZS5zbGljZSgwLCArYmFzZUNvbG9uICsgMSB8fCA5ZTkpO1xuICBpZiAoZ2l2ZW4uaW5kZXhPZignLy8nKSA9PT0gMCkge1xuICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gIH1cbiAgaWYgKGJhc2UuaW5kZXhPZignLy8nLCBiYXNlQ29sb24pID09PSBiYXNlQ29sb24gKyAxKSB7XG4gICAgYmFzZVNpbmdsZSA9IGJhc2UuaW5kZXhPZignLycsIGJhc2VDb2xvbiArIDMpO1xuICAgIGlmIChiYXNlU2luZ2xlIDwgMCkge1xuICAgICAgaWYgKGJhc2UubGVuZ3RoIC0gYmFzZUNvbG9uIC0gMyA+IDApIHtcbiAgICAgICAgcmV0dXJuIGJhc2UgKyAnLycgKyBnaXZlbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJhc2VTaW5nbGUgPSBiYXNlLmluZGV4T2YoJy8nLCBiYXNlQ29sb24gKyAxKTtcbiAgICBpZiAoYmFzZVNpbmdsZSA8IDApIHtcbiAgICAgIGlmIChiYXNlLmxlbmd0aCAtIGJhc2VDb2xvbiAtIDEgPiAwKSB7XG4gICAgICAgIHJldHVybiBiYXNlICsgJy8nICsgZ2l2ZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYmFzZVNjaGVtZSArIGdpdmVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZ2l2ZW4uaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgcmV0dXJuIGJhc2Uuc2xpY2UoMCwgYmFzZVNpbmdsZSkgKyBnaXZlbjtcbiAgfVxuICBwYXRoID0gYmFzZS5zbGljZShiYXNlU2luZ2xlKTtcbiAgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoIDwgMCkge1xuICAgIHJldHVybiBiYXNlU2NoZW1lICsgZ2l2ZW47XG4gIH1cbiAgaWYgKGxhc3RTbGFzaCA+PSAwICYmIGxhc3RTbGFzaCA8IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsICtsYXN0U2xhc2ggKyAxIHx8IDllOSk7XG4gIH1cbiAgcGF0aCArPSBnaXZlbjtcbiAgd2hpbGUgKHBhdGgubWF0Y2goL1teXFwvXSpcXC9cXC5cXC5cXC8vKSkge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1teXFwvXSpcXC9cXC5cXC5cXC8vLCAnJyk7XG4gIH1cbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuXFwvL2csICcnKTtcbiAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvXFwuJC8sICcvJyk7XG4gIHJldHVybiBiYXNlLnNsaWNlKDAsIGJhc2VTaW5nbGUpICsgcGF0aDtcbn1cblxuZnVuY3Rpb24gcHJvdG9jb2wodXJpKSB7XG4gIHZhciBpO1xuICBpID0gdXJpLmluZGV4T2YoJzonKTtcbiAgaWYgKGkgPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZSgwLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZUbyhiYXNlLCB1cmkpIHtcbiAgdmFyIGMsIGksIGssIGwsIGxlbiwgbGVuMSwgbiwgbywgcCwgcSwgcmVmLCByZWYxLCBzO1xuICB2YXIgY29tbW9uSG9zdCA9IG5ldyBSZWdFeHAoJ15bLV9hLXpBLVowLTkuXSs6KC8vW14vXSopPy9bXi9dKiQnKTtcbiAgaWYgKCFiYXNlKSB7XG4gICAgcmV0dXJuIHVyaTtcbiAgfVxuICBpZiAoYmFzZSA9PT0gdXJpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGZvciAoaSA9IG8gPSAwLCBsZW4gPSB1cmkubGVuZ3RoOyBvIDwgbGVuOyBpID0gKytvKSB7XG4gICAgYyA9IHVyaVtpXTtcbiAgICBpZiAoYyAhPT0gYmFzZVtpXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChiYXNlLnNsaWNlKDAsIGkpLm1hdGNoKGNvbW1vbkhvc3QpKSB7XG4gICAgayA9IHVyaS5pbmRleE9mKCcvLycpO1xuICAgIGlmIChrIDwgMCkge1xuICAgICAgayA9IC0yO1xuICAgIH1cbiAgICBsID0gdXJpLmluZGV4T2YoJy8nLCBrICsgMik7XG4gICAgaWYgKHVyaVtsICsgMV0gIT09ICcvJyAmJiBiYXNlW2wgKyAxXSAhPT0gJy8nICYmIHVyaS5zbGljZSgwLCBsKSA9PT0gYmFzZS5zbGljZSgwLCBsKSkge1xuICAgICAgcmV0dXJuIHVyaS5zbGljZShsKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVyaVtpXSA9PT0gJyMnICYmIGJhc2UubGVuZ3RoID09PSBpKSB7XG4gICAgcmV0dXJuIHVyaS5zbGljZShpKTtcbiAgfVxuICB3aGlsZSAoaSA+IDAgJiYgdXJpW2kgLSAxXSAhPT0gJy8nKSB7XG4gICAgaS0tO1xuICB9XG4gIGlmIChpIDwgMykge1xuICAgIHJldHVybiB1cmk7XG4gIH1cbiAgaWYgKGJhc2UuaW5kZXhPZignLy8nLCBpIC0gMikgPiAwIHx8IHVyaS5pbmRleE9mKCcvLycsIGkgLSAyKSA+IDApIHtcbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIGlmIChiYXNlLmluZGV4T2YoJzonLCBpKSA+IDApIHtcbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIG4gPSAwO1xuICByZWYgPSBiYXNlLnNsaWNlKGkpO1xuICBmb3IgKHAgPSAwLCBsZW4xID0gcmVmLmxlbmd0aDsgcCA8IGxlbjE7IHArKykge1xuICAgIGMgPSByZWZbcF07XG4gICAgaWYgKGMgPT09ICcvJykge1xuICAgICAgbisrO1xuICAgIH1cbiAgfVxuICBpZiAobiA9PT0gMCAmJiBpIDwgdXJpLmxlbmd0aCAmJiB1cmlbaV0gPT09ICcjJykge1xuICAgIHJldHVybiAnLi8nICsgdXJpLnNsaWNlKGkpO1xuICB9XG4gIGlmIChuID09PSAwICYmIGkgPT09IHVyaS5sZW5ndGgpIHtcbiAgICByZXR1cm4gJy4vJztcbiAgfVxuICBzID0gJyc7XG4gIGlmIChuID4gMCkge1xuICAgIGZvciAocSA9IDEsIHJlZjEgPSBuOyByZWYxID49IDEgPyBxIDw9IHJlZjEgOiBxID49IHJlZjE7IHJlZjEgPj0gMSA/ICsrcSA6IC0tcSkge1xuICAgICAgcyArPSAnLi4vJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHMgKyB1cmkuc2xpY2UoaSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciAkcmRmXG4gKiBAbW9kdWxlIHV0aWxcbiAqL1xudmFyIGRvY3BhcnQgPSByZXF1aXJlKCcuL3VyaScpLmRvY3BhcnQ7XG52YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTtcbnZhciBOYW1lZE5vZGUgPSByZXF1aXJlKCcuL25hbWVkLW5vZGUnKTtcblxubW9kdWxlLmV4cG9ydHMuQUpBUl9oYW5kbGVOZXdUZXJtID0gYWphckhhbmRsZU5ld1Rlcm07XG5tb2R1bGUuZXhwb3J0cy5BcnJheUluZGV4T2YgPSBhcnJheUluZGV4T2Y7XG5tb2R1bGUuZXhwb3J0cy5jYWxsYmFja2lmeSA9IGNhbGxiYWNraWZ5O1xubW9kdWxlLmV4cG9ydHMuZHRzdGFtcCA9IGR0c3RhbXA7XG5tb2R1bGUuZXhwb3J0cy5ET01QYXJzZXJGYWN0b3J5ID0gZG9tUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMuZG9tVG9TdHJpbmcgPSBkb21Ub1N0cmluZztcbm1vZHVsZS5leHBvcnRzLmR1bXBOb2RlID0gZHVtcE5vZGU7XG5tb2R1bGUuZXhwb3J0cy5nZXRIVFRQSGVhZGVycyA9IGdldEhUVFBIZWFkZXJzO1xubW9kdWxlLmV4cG9ydHMuaGVhdnlDb21wYXJlID0gaGVhdnlDb21wYXJlO1xubW9kdWxlLmV4cG9ydHMuaGVhdnlDb21wYXJlU1BPID0gaGVhdnlDb21wYXJlU1BPO1xubW9kdWxlLmV4cG9ydHMub3V0cHV0ID0gb3V0cHV0O1xubW9kdWxlLmV4cG9ydHMucGFyc2VYTUwgPSBwYXJzZVhNTDtcbm1vZHVsZS5leHBvcnRzLlJERkFycmF5UmVtb3ZlID0gcmRmQXJyYXlSZW1vdmU7XG5tb2R1bGUuZXhwb3J0cy5zdGFja1N0cmluZyA9IHN0YWNrU3RyaW5nO1xubW9kdWxlLmV4cG9ydHMuc3RyaW5nX3N0YXJ0c3dpdGggPSBzdHJpbmdTdGFydHNXaXRoO1xubW9kdWxlLmV4cG9ydHMuc3RyaW5nID0ge307XG5tb2R1bGUuZXhwb3J0cy5zdHJpbmcudGVtcGxhdGUgPSBzdHJpbmdUZW1wbGF0ZTtcbm1vZHVsZS5leHBvcnRzLnVyaSA9IHJlcXVpcmUoJy4vdXJpJyk7IC8vIFRPRE86IFJlbW92ZSB0aGlzIG1peGVkIHVzYWdlXG4vLyBtb2R1bGUuZXhwb3J0cy52YXJpYWJsZXNJbiA9IHZhcmlhYmxlc0luXG5tb2R1bGUuZXhwb3J0cy5YTUxIVFRQRmFjdG9yeSA9IHhocjtcbm1vZHVsZS5leHBvcnRzLmxvZyA9IGxvZztcblxubW9kdWxlLmV4cG9ydHMubWVkaWFUeXBlQ2xhc3MgPSBmdW5jdGlvbiAobWVkaWFUeXBlKSB7XG4gIG1lZGlhVHlwZSA9IG1lZGlhVHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKTsgLy8gcmVtb3ZlIG1lZGlhIHR5cGUgcGFyYW1ldGVyc1xuICByZXR1cm4gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvbnMvaWFuYS9tZWRpYS10eXBlcy8nICsgbWVkaWFUeXBlICsgJyNSZXNvdXJjZScpO1xufTtcblxuLyoqXG4gKiBMb2FkcyBvbnRvbG9naWVzIG9mIHRoZSBkYXRhIHdlIGxvYWQgKHRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gdGhlIGtiIHRvXG4gKiB0aGUgZmV0Y2hlcikuIEV4cG9ydHMgYXMgYEFKQVJfaGFuZGxlTmV3VGVybWBcbiAqL1xuZnVuY3Rpb24gYWphckhhbmRsZU5ld1Rlcm0oa2IsIHAsIHJlcXVlc3RlZEJ5KSB7XG4gIHZhciBzZiA9IG51bGw7XG4gIGlmICh0eXBlb2Yga2IuZmV0Y2hlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzZiA9IGtiLmZldGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwLnRlcm1UeXBlICE9PSAnTmFtZWROb2RlJykgcmV0dXJuO1xuICB2YXIgZG9jdXJpID0gZG9jcGFydChwLnVyaSk7XG4gIHZhciBmaXh1cmk7XG4gIGlmIChwLnVyaS5pbmRleE9mKCcjJykgPCAwKSB7XG4gICAgLy8gTm8gaGFzaFxuICAgIC8vIEBAIG1ham9yIGhhY2sgZm9yIGRicGVkaWEgQ2F0ZWdvcmllcywgd2hpY2ggc3ByZWFkIGluZGVmaW5pdGVseVxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoKHAudXJpLCAnaHR0cDovL2RicGVkaWEub3JnL3Jlc291cmNlL0NhdGVnb3J5OicpKSByZXR1cm47XG5cbiAgICAvKlxuICAgICAgaWYgKHN0cmluZ19zdGFydHN3aXRoKHAudXJpLCAnaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8nKSkge1xuICAgICAgZml4dXJpID0gXCJodHRwOi8vZGlnLmNzYWlsLm1pdC5lZHUvMjAwNS9hamFyL2FqYXcvdGVzdC9mb2FmXCJcbiAgICAgIC8vIHNob3VsZCBnaXZlIEhUVFAgMzAzIHRvIG9udG9sb2d5IC0tIG5vdyBpcyA6LSlcbiAgICAgIH0gZWxzZVxuICAgICovXG4gICAgaWYgKHN0cmluZ1N0YXJ0c1dpdGgocC51cmksICdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLycpIHx8IHN0cmluZ1N0YXJ0c1dpdGgocC51cmksICdodHRwOi8vcHVybC5vcmcvZGMvdGVybXMvJykpIHtcbiAgICAgIGZpeHVyaSA9ICdodHRwOi8vZHVibGluY29yZS5vcmcvMjAwNS8wNi8xMy9kY3EnO1xuICAgICAgLy8gZGMgZmV0Y2hlZCBtdWx0aXBsZSB0aW1lc1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nU3RhcnRzV2l0aChwLnVyaSwgJ2h0dHA6Ly94bWxucy5jb20vd290LzAuMS8nKSkge1xuICAgICAgZml4dXJpID0gJ2h0dHA6Ly94bWxucy5jb20vd290LzAuMS9pbmRleC5yZGYnO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nU3RhcnRzV2l0aChwLnVyaSwgJ2h0dHA6Ly93ZWIucmVzb3VyY2Uub3JnL2NjLycpKSB7XG4gICAgICAvLyAgICAgICAgICAgIGxvZy53YXJuKFwiY3JlYXRpdmUgY29tbW9ucyBsaW5rcyB0byBodG1sIGluc3RlYWQgb2YgcmRmLiBkb2Vzbid0IHNlZW0gdG8gY29udGVudC1uZWdvdGlhdGUuXCIpXG4gICAgICBmaXh1cmkgPSAnaHR0cDovL3dlYi5yZXNvdXJjZS5vcmcvY2Mvc2NoZW1hLnJkZic7XG4gICAgfVxuICB9XG4gIGlmIChmaXh1cmkpIHtcbiAgICBkb2N1cmkgPSBmaXh1cmk7XG4gIH1cbiAgaWYgKHNmICYmIHNmLmdldFN0YXRlKGRvY3VyaSkgIT09ICd1bnJlcXVlc3RlZCcpIHJldHVybjtcblxuICBpZiAoZml4dXJpKSB7XG4gICAgLy8gb25seSBnaXZlIHdhcm5pbmcgb25jZTogZWxzZSBoYXBwZW5zIHRvbyBvZnRlblxuICAgIGxvZy53YXJuKCdBc3N1bWluZyBzZXJ2ZXIgc3RpbGwgYnJva2VuLCBmYWtpbmcgcmVkaXJlY3Qgb2YgPCcgKyBwLnVyaSArICc+IHRvIDwnICsgZG9jdXJpICsgJz4nKTtcbiAgfVxuICBzZi5yZXF1ZXN0VVJJKGRvY3VyaSwgcmVxdWVzdGVkQnkpO1xufVxuXG4vKipcbiAqIEV4cG9ydHMgYXMgYEFycmF5SW5kZXhPZmAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZihhcnIsIGl0ZW0sIGkpIHtcbiAgaSB8fCAoaSA9IDApO1xuICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgaWYgKGkgPCAwKSBpID0gbGVuZ3RoICsgaTtcbiAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQWRkcyBjYWxsYmFjayBmdW5jdGlvbmFsaXR5IHRvIGFuIG9iamVjdC5cbiAqIENhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgaW5kZXhlZCBieSBhICdob29rJyBzdHJpbmcuXG4gKiBUaGV5IHJldHVybiB0cnVlIGlmIHRoZXkgd2FudCB0byBiZSBjYWxsZWQgYWdhaW4uXG4gKiBAbWV0aG9kIGNhbGxiYWNraWZ5XG4gKiBAcGFyYW0gb2JqIHtPYmplY3R9XG4gKiBAcGFyYW0gY2FsbGJhY2tzIHtBcnJheTxGdW5jdGlvbj59XG4gKi9cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5KG9iaiwgY2FsbGJhY2tzKSB7XG4gIG9iai5jYWxsYmFja3MgPSB7fTtcbiAgZm9yICh2YXIgeCA9IGNhbGxiYWNrcy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkge1xuICAgIG9iai5jYWxsYmFja3NbY2FsbGJhY2tzW3hdXSA9IFtdO1xuICB9XG5cbiAgb2JqLmFkZEhvb2sgPSBmdW5jdGlvbiAoaG9vaykge1xuICAgIGlmICghb2JqLmNhbGxiYWNrc1tob29rXSkge1xuICAgICAgb2JqLmNhbGxiYWNrc1tob29rXSA9IFtdO1xuICAgIH1cbiAgfTtcblxuICBvYmouYWRkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaG9vaywgZnVuYykge1xuICAgIG9iai5jYWxsYmFja3NbaG9va10ucHVzaChmdW5jKTtcbiAgfTtcblxuICBvYmoucmVtb3ZlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaG9vaywgZnVuY05hbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5jYWxsYmFja3NbaG9va10ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmouY2FsbGJhY2tzW2hvb2tdW2ldLm5hbWUgPT09IGZ1bmNOYW1lKSB7XG4gICAgICAgIG9iai5jYWxsYmFja3NbaG9va10uc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIG9iai5pbnNlcnRDYWxsYmFjayA9IGZ1bmN0aW9uIChob29rLCBmdW5jKSB7XG4gICAgb2JqLmNhbGxiYWNrc1tob29rXS51bnNoaWZ0KGZ1bmMpO1xuICB9O1xuXG4gIG9iai5maXJlQ2FsbGJhY2tzID0gZnVuY3Rpb24gKGhvb2ssIGFyZ3MpIHtcbiAgICB2YXIgbmV3Q2FsbGJhY2tzID0gW107XG4gICAgdmFyIHJlcGxhY2VDYWxsYmFja3MgPSBbXTtcbiAgICB2YXIgbGVuID0gb2JqLmNhbGxiYWNrc1tob29rXS5sZW5ndGg7XG4gICAgdmFyIHg7XG4gICAgLy8gbG9nLmluZm8oJyFAJCBGaXJpbmcgJytob29rKycgY2FsbCBiYWNrIHdpdGggbGVuZ3RoJytsZW4pXG4gICAgZm9yICh4ID0gbGVuIC0gMTsgeCA+PSAwOyB4LS0pIHtcbiAgICAgIC8vIGxvZy5pbmZvKCdAQCBGaXJpbmcgJytob29rKycgY2FsbGJhY2sgJysgb2JqLmNhbGxiYWNrc1tob29rXVt4XSlcbiAgICAgIGlmIChvYmouY2FsbGJhY2tzW2hvb2tdW3hdLmFwcGx5KG9iaiwgYXJncykpIHtcbiAgICAgICAgbmV3Q2FsbGJhY2tzLnB1c2gob2JqLmNhbGxiYWNrc1tob29rXVt4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh4ID0gbmV3Q2FsbGJhY2tzLmxlbmd0aCAtIDE7IHggPj0gMDsgeC0tKSB7XG4gICAgICByZXBsYWNlQ2FsbGJhY2tzLnB1c2gobmV3Q2FsbGJhY2tzW3hdKTtcbiAgICB9XG5cbiAgICBmb3IgKHggPSBsZW47IHggPCBvYmouY2FsbGJhY2tzW2hvb2tdLmxlbmd0aDsgeCsrKSB7XG4gICAgICByZXBsYWNlQ2FsbGJhY2tzLnB1c2gob2JqLmNhbGxiYWNrc1tob29rXVt4XSk7XG4gICAgfVxuXG4gICAgb2JqLmNhbGxiYWNrc1tob29rXSA9IHJlcGxhY2VDYWxsYmFja3M7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIERPTSBwYXJzZXIgYmFzZWQgb24gY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICogRXhwb3J0cyBhcyBgRE9NUGFyc2VyRmFjdG9yeWBcbiAqL1xuZnVuY3Rpb24gZG9tUGFyc2VyKCkge1xuICBpZiAodGFidWxhdG9yICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbikge1xuICAgIHJldHVybiBDb21wb25lbnRzLmNsYXNzZXNbJ0Btb3ppbGxhLm9yZy94bWxleHRyYXMvZG9tcGFyc2VyOzEnXS5nZXRTZXJ2aWNlKENvbXBvbmVudHMuaW50ZXJmYWNlcy5uc0lET01QYXJzZXIpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5ET01QYXJzZXIpIHtcbiAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpO1xuICB9IGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xpbmtlZGRhdGEvZG9raWVsaVxuZnVuY3Rpb24gZG9tVG9TdHJpbmcobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNlbGZDbG9zaW5nID0gW107XG4gIGlmICgnc2VsZkNsb3NpbmcnIGluIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnNlbGZDbG9zaW5nLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgc2VsZkNsb3Npbmdbbl0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIHZhciBza2lwQXR0cmlidXRlcyA9IFtdO1xuICBpZiAoJ3NraXBBdHRyaWJ1dGVzJyBpbiBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5za2lwQXR0cmlidXRlcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHNraXBBdHRyaWJ1dGVzW25dID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHVtcE5vZGUobm9kZSwgb3B0aW9ucywgc2VsZkNsb3NpbmcsIHNraXBBdHRyaWJ1dGVzKTtcbn1cblxuZnVuY3Rpb24gZHVtcE5vZGUobm9kZSwgb3B0aW9ucywgc2VsZkNsb3NpbmcsIHNraXBBdHRyaWJ1dGVzKSB7XG4gIHZhciBpO1xuICB2YXIgb3V0ID0gJyc7XG4gIHZhciBub0VzYyA9IFtmYWxzZV07XG4gIGlmICh0eXBlb2Ygbm9kZS5ub2RlVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBvdXQ7XG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCdjbGFzcycpICYmICdjbGFzc1dpdGhDaGlsZFRleHQnIGluIG9wdGlvbnMgJiYgbm9kZS5tYXRjaGVzKG9wdGlvbnMuY2xhc3NXaXRoQ2hpbGRUZXh0LmNsYXNzKSkge1xuICAgICAgb3V0ICs9IG5vZGUucXVlcnlTZWxlY3RvcihvcHRpb25zLmNsYXNzV2l0aENoaWxkVGV4dC5lbGVtZW50KS50ZXh0Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKCEoJ3NraXBOb2RlV2l0aENsYXNzJyBpbiBvcHRpb25zICYmIG5vZGUubWF0Y2hlcygnLicgKyBvcHRpb25zLnNraXBOb2RlV2l0aENsYXNzKSkpIHtcbiAgICAgIHZhciBlbmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIG91dCArPSAnPCcgKyBlbmFtZTtcblxuICAgICAgdmFyIGF0dHJMaXN0ID0gW107XG4gICAgICBmb3IgKGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGF0biA9IG5vZGUuYXR0cmlidXRlc1tpXTtcbiAgICAgICAgaWYgKHNraXBBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgc2tpcEF0dHJpYnV0ZXNbYXRuLm5hbWVdKSBjb250aW51ZTtcbiAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QoYXRuLm5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGF0bi5uYW1lID09PSAnY2xhc3MnICYmICdyZXBsYWNlQ2xhc3NJdGVtV2l0aCcgaW4gb3B0aW9ucyAmJiBhdG4udmFsdWUuc3BsaXQoJyAnKS5pbmRleE9mKG9wdGlvbnMucmVwbGFjZUNsYXNzSXRlbVdpdGguc291cmNlKSA+IC0xKSB7XG4gICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChvcHRpb25zLnJlcGxhY2VDbGFzc0l0ZW1XaXRoLnNvdXJjZSwgJ2cnKTtcbiAgICAgICAgICBhdG4udmFsdWUgPSBhdG4udmFsdWUucmVwbGFjZShyZSwgb3B0aW9ucy5yZXBsYWNlQ2xhc3NJdGVtV2l0aC50YXJnZXQpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhdG4ubmFtZSA9PT0gJ2NsYXNzJyAmJiAnc2tpcENsYXNzV2l0aFZhbHVlJyBpbiBvcHRpb25zICYmIG9wdGlvbnMuc2tpcENsYXNzV2l0aFZhbHVlID09PSBhdG4udmFsdWUpKSB7XG4gICAgICAgICAgYXR0ckxpc3QucHVzaChhdG4ubmFtZSArICc9XFwnJyArIGF0bi52YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvJy9nLCAnJnF1b3Q7JykgKyAnXFwnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICgnc29ydEF0dHJpYnV0ZXMnIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5zb3J0QXR0cmlidXRlcykge1xuICAgICAgICAgIGF0dHJMaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnICcgKyBhdHRyTGlzdC5qb2luKCcgJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZkNsb3NpbmdbZW5hbWVdKSB7XG4gICAgICAgIG91dCArPSAnIC8+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSAnPic7XG4gICAgICAgIG91dCArPSBlbmFtZSA9PT0gJ2h0bWwnID8gJ1xcbiAgJyA6ICcnO1xuICAgICAgICBub0VzYy5wdXNoKGVuYW1lID09PSAnc3R5bGUnIHx8IGVuYW1lID09PSAnc2NyaXB0Jyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBvdXQgKz0gZHVtcE5vZGUobm9kZS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgfW5vRXNjLnBvcCgpO1xuICAgICAgICBvdXQgKz0gZW5hbWUgPT09ICdib2R5JyA/ICc8LycgKyBlbmFtZSArICc+JyArICdcXG4nIDogJzwvJyArIGVuYW1lICsgJz4nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgLy8gRklYTUU6IElmIGNvbW1lbnRzIGFyZSBub3QgdGFiYmVkIGluIHNvdXJjZSwgYSBuZXcgbGluZSBpcyBub3QgcHJlcGVuZGVkXG4gICAgb3V0ICs9ICc8IS0tJyArIG5vZGUubm9kZVZhbHVlICsgJy0tPic7XG4gIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyB8fCBub2RlLm5vZGVUeXBlID09PSA0KSB7XG4gICAgLy8gWFhYOiBSZW1vdmUgbmV3IGxpbmVzIHdoaWNoIHdlcmUgYWRkZWQgYWZ0ZXIgRE9NIHJlYWR5XG4gICAgdmFyIG5sID0gbm9kZS5ub2RlVmFsdWUucmVwbGFjZSgvXFxuKyQvLCAnJyk7XG4gICAgb3V0ICs9IG5vRXNjW25vRXNjLmxlbmd0aCAtIDFdID8gbmwgOiBubC5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJ1dhcm5pbmc7IENhbm5vdCBoYW5kbGUgc2VyaWFsaXNpbmcgbm9kZXMgb2YgdHlwZTogJyArIG5vZGUubm9kZVR5cGUpO1xuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGR0c3RhbXAoKSB7XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICB2YXIgeWVhciA9IG5vdy5nZXRZZWFyKCkgKyAxOTAwO1xuICB2YXIgbW9udGggPSBub3cuZ2V0TW9udGgoKSArIDE7XG4gIHZhciBkYXkgPSBub3cuZ2V0RGF0ZSgpO1xuICB2YXIgaG91ciA9IG5vdy5nZXRVVENIb3VycygpO1xuICB2YXIgbWludXRlID0gbm93LmdldFVUQ01pbnV0ZXMoKTtcbiAgdmFyIHNlY29uZCA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gIGlmIChtb250aCA8IDEwKSBtb250aCA9ICcwJyArIG1vbnRoO1xuICBpZiAoZGF5IDwgMTApIGRheSA9ICcwJyArIGRheTtcbiAgaWYgKGhvdXIgPCAxMCkgaG91ciA9ICcwJyArIGhvdXI7XG4gIGlmIChtaW51dGUgPCAxMCkgbWludXRlID0gJzAnICsgbWludXRlO1xuICBpZiAoc2Vjb25kIDwgMTApIHNlY29uZCA9ICcwJyArIHNlY29uZDtcbiAgcmV0dXJuIHllYXIgKyAnLScgKyBtb250aCArICctJyArIGRheSArICdUJyArIGhvdXIgKyAnOicgKyBtaW51dGUgKyAnOicgKyBzZWNvbmQgKyAnWic7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGhhc2htYXAgb2YgSFRUUCBoZWFkZXJzIGFuZCB0aGVpciB2YWx1ZXMuXG4gKiBAQCBCdWc6IEFzc3VtZXMgdGhhdCBlYWNoIGhlYWRlciBvbmx5IG9jY3VycyBvbmNlLlxuICogQWxzbyBub3RlIHRoYXQgYSAsIGluIGEgaGVhZGVyIHZhbHVlIGlzIGp1c3QgdGhlIHNhbWUgYXMgaGF2aW5nIHR3byBoZWFkZXJzLlxuICovXG5mdW5jdGlvbiBnZXRIVFRQSGVhZGVycyh4aHIpIHtcbiAgdmFyIGxpbmVzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KCdcXG4nKTtcbiAgdmFyIGhlYWRlcnMgPSB7fTtcbiAgdmFyIGxhc3Q7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyB4KyspIHtcbiAgICBpZiAobGluZXNbeF0ubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHBhaXIgPSBsaW5lc1t4XS5zcGxpdCgnOiAnKTtcbiAgICAgIGlmICh0eXBlb2YgcGFpclsxXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gY29udGludWF0aW9uXG4gICAgICAgIGhlYWRlcnNbbGFzdF0gKz0gJ1xcbicgKyBwYWlyWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdCA9IHBhaXJbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaGVhZGVyc1tsYXN0XSA9IHBhaXJbMV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHN0YXRlbWVudHMgKGhlYXZ5IGNvbXBhcmlzb24gZm9yIHJlcGVhdGFibGUgY2Fub25pY2FsIG9yZGVyaW5nKVxuICovXG5mdW5jdGlvbiBoZWF2eUNvbXBhcmUoeCwgeSwgZywgdXJpTWFwKSB7XG4gIHZhciBub25CbGFuayA9IGZ1bmN0aW9uIG5vbkJsYW5rKHgpIHtcbiAgICByZXR1cm4geC50ZXJtVHlwZSA9PT0gJ0JsYW5rTm9kZScgPyBudWxsIDogeDtcbiAgfTtcbiAgdmFyIHNpZ25hdHVyZSA9IGZ1bmN0aW9uIHNpZ25hdHVyZSh4KSB7XG4gICAgdmFyIGxpcyA9IGcuc3RhdGVtZW50c01hdGNoaW5nKHgpLm1hcChmdW5jdGlvbiAoc3QpIHtcbiAgICAgIHJldHVybiAnJyArIG5vbkJsYW5rKHN0LnN1YmplY3QpICsgJyAnICsgbm9uQmxhbmsoc3QucHJlZGljYXRlKSArICcgJyArIG5vbkJsYW5rKHN0Lm9iamVjdCk7XG4gICAgfSkuY29uY2F0KGcuc3RhdGVtZW50c01hdGNoaW5nKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB4KS5tYXAoZnVuY3Rpb24gKHN0KSB7XG4gICAgICByZXR1cm4gJycgKyBub25CbGFuayhzdC5zdWJqZWN0KSArICcgJyArIG5vbkJsYW5rKHN0LnByZWRpY2F0ZSkgKyAnICcgKyBub25CbGFuayhzdC5vYmplY3QpO1xuICAgIH0pKTtcbiAgICBsaXMuc29ydCgpO1xuICAgIHJldHVybiBsaXMuam9pbignXFxuJyk7XG4gIH07XG4gIGlmICh4LnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJyAmJiB5LnRlcm1UeXBlID09PSAnQmxhbmtOb2RlJykge1xuICAgIGlmICh4LmNvbXBhcmVUZXJtKHkpID09PSAwKSByZXR1cm4gMDsgLy8gU2FtZVxuICAgIGlmIChzaWduYXR1cmUoeCkgPiBzaWduYXR1cmUoeSkpIHJldHVybiArMTtcbiAgICBpZiAoc2lnbmF0dXJlKHgpIDwgc2lnbmF0dXJlKHkpKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIHguY29tcGFyZVRlcm0oeSk7IC8vIFRvbyBiYWQgLS0gdGhpcyBvcmRlciBub3QgY2Fub25pY2FsLlxuICAgIC8vIHRocm93IFwiZGlmZmVyZW50IGJub2RlcyBpbmRpc3RpbnF1aXNoYWJsZSBmb3Igc29ydGluZ1wiXG4gIH0gZWxzZSB7XG4gICAgaWYgKHVyaU1hcCAmJiB4LnVyaSAmJiB5LnVyaSkge1xuICAgICAgcmV0dXJuICh1cmlNYXBbeC51cmldIHx8IHgudXJpKS5sb2NhbGVDb21wYXJlKHVyaU1hcFt5LnVyaV0gfHwgeS51cmkpO1xuICAgIH1cbiAgICByZXR1cm4geC5jb21wYXJlVGVybSh5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoZWF2eUNvbXBhcmVTUE8oeCwgeSwgZywgdXJpTWFwKSB7XG4gIHJldHVybiBoZWF2eUNvbXBhcmUoeC5zdWJqZWN0LCB5LnN1YmplY3QsIGcsIHVyaU1hcCkgfHwgaGVhdnlDb21wYXJlKHgucHJlZGljYXRlLCB5LnByZWRpY2F0ZSwgZywgdXJpTWFwKSB8fCBoZWF2eUNvbXBhcmUoeC5vYmplY3QsIHkub2JqZWN0LCBnLCB1cmlNYXApO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBzaW1wbGUgZGVidWdnaW5nIGZ1bmN0aW9uXG4gKiBAbWV0aG9kIG91dHB1dFxuICogQHBhcmFtIG8ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gb3V0cHV0KG8pIHtcbiAgdmFyIGsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgay50ZXh0Q29udGVudCA9IG87XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIERPTSBmcm9tIHBhcnNleCBYTUwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlWE1MKHN0ciwgb3B0aW9ucykge1xuICB2YXIgZHBhcnNlcjtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICh0eXBlb2YgdGFidWxhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0YWJ1bGF0b3IuaXNFeHRlbnNpb24pIHtcbiAgICBkcGFyc2VyID0gQ29tcG9uZW50cy5jbGFzc2VzWydAbW96aWxsYS5vcmcveG1sZXh0cmFzL2RvbXBhcnNlcjsxJ10uZ2V0U2VydmljZShDb21wb25lbnRzLmludGVyZmFjZXMubnNJRE9NUGFyc2VyKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAvLyBOb2RlLmpzXG4gICAgLy8gdmFyIGxpYnhtbGpzID0gcmVxdWlyZSgnbGlieG1sanMnKTsgLy8gV2FzIGpzZG9tIGJlZm9yZSAyMDEyLTAxIHRoZW4gbGlieG1sanMgYnV0IHRoYXQgbm9uc3RhbmRhcmRcbiAgICAvLyByZXR1cm4gbGlieG1sanMucGFyc2VYbWxTdHJpbmcoc3RyKVxuXG4gICAgLy8gdmFyIGpzZG9tID0gcmVxdWlyZSgnanNkb20nKTsgICAyMDEyLTAxIHRob3VnaCAyMDE1LTA4IG5vIHdvcmt5IHdpdGggbmV3IE5vZGVcbiAgICAvLyB2YXIgZG9tID0ganNkb20uanNkb20oc3RyLCB1bmRlZmluZWQsIHt9ICk7Ly8gaHRtbCwgbGV2ZWwsIG9wdGlvbnNcblxuICAgIHZhciBET01QYXJzZXIgPSByZXF1aXJlKCd4bWxkb20nKS5ET01QYXJzZXI7IC8vIDIwMTUtMDggb24gaHR0cHM6Ly9naXRodWIuY29tL2ppbmR3L3htbGRvbVxuICAgIHZhciBkb20gPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgb3B0aW9ucy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24veGh0bWwreG1sJyk7XG4gICAgcmV0dXJuIGRvbTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LkRPTVBhcnNlcikge1xuICAgICAgZHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7IC8vIHNlZW1zIHRvIGFjdHVhbGx5IHdvcmtcbiAgICB9IGVsc2Uge1xuICAgICAgZHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsgLy8gRG9jIHNheXMgdGhpcyB3b3Jrc1xuICAgIH1cbiAgfVxuICByZXR1cm4gZHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3RyLCAnYXBwbGljYXRpb24veG1sJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgc3RhdGVtZW50cyBlcXVhbCB0byB4IGZyb20gYVxuICogRXhwb3J0cyBhcyBgUkRGQXJyYXlSZW1vdmVgXG4gKi9cbmZ1bmN0aW9uIHJkZkFycmF5UmVtb3ZlKGEsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gVE9ETzogVGhpcyB1c2VkIHRvIGJlIHRoZSBmb2xsb3dpbmcsIHdoaWNoIGRpZG50IGFsd2F5cyB3b3JrLi53aHlcbiAgICAvLyBpZihhW2ldID09PSB4KVxuICAgIGlmIChhW2ldLnN1YmplY3Quc2FtZVRlcm0oeC5zdWJqZWN0KSAmJiBhW2ldLnByZWRpY2F0ZS5zYW1lVGVybSh4LnByZWRpY2F0ZSkgJiYgYVtpXS5vYmplY3Quc2FtZVRlcm0oeC5vYmplY3QpICYmIGFbaV0ud2h5LnNhbWVUZXJtKHgud2h5KSkge1xuICAgICAgYS5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignUkRGQXJyYXlSZW1vdmU6IEFycmF5IGRpZCBub3QgY29udGFpbiAnICsgeCArICcgJyArIHgud2h5KTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nU3RhcnRzV2l0aChzdHIsIHByZWYpIHtcbiAgLy8gbWlzc2luZyBsaWJyYXJ5IHJvdXRpbmVzXG4gIHJldHVybiBzdHIuc2xpY2UoMCwgcHJlZi5sZW5ndGgpID09PSBwcmVmO1xufVxuXG4vKipcbiAqIEMrKywgcHl0aG9uIHN0eWxlICVzIC0+IHN1YnNcbiAqL1xuZnVuY3Rpb24gc3RyaW5nVGVtcGxhdGUoYmFzZSwgc3Vicykge1xuICB2YXIgYmFzZUEgPSBiYXNlLnNwbGl0KCclcycpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykge1xuICAgIHN1YnNbaV0gKz0gJyc7XG4gICAgcmVzdWx0ICs9IGJhc2VBW2ldICsgc3Vic1tpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgYmFzZUEuc2xpY2Uoc3Vicy5sZW5ndGgpLmpvaW4oKTtcbn1cblxuLy8gU3RhY2sgZHVtcCBvbiBlcnJvcnMgLSB0byBwYXNzIGVycm9ycyBiYWNrXG5cbmZ1bmN0aW9uIHN0YWNrU3RyaW5nKGUpIHtcbiAgdmFyIHN0ciA9ICcnICsgZSArICdcXG4nO1xuICBpZiAoIWUuc3RhY2spIHtcbiAgICByZXR1cm4gc3RyICsgJ05vIHN0YWNrIGF2YWlsYWJsZS5cXG4nO1xuICB9XG4gIHZhciBsaW5lcyA9IGUuc3RhY2sudG9TdHJpbmcoKS5zcGxpdCgnXFxuJyk7XG4gIHZhciB0b3ByaW50ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuICAgIGlmIChsaW5lLmluZGV4T2YoJ2VjbWF1bml0LmpzJykgPiAtMSkge1xuICAgICAgLy8gcmVtb3ZlIHVzZWxlc3MgYml0IG9mIHRyYWNlYmFja1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PSAnKCcpIHtcbiAgICAgIGxpbmUgPSAnZnVuY3Rpb24nICsgbGluZTtcbiAgICB9XG4gICAgdmFyIGNodW5rcyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICB0b3ByaW50LnB1c2goY2h1bmtzKTtcbiAgfVxuICAvLyB0b3ByaW50LnJldmVyc2UoKTsgIE5vIC0gSSBwcmVmZXIgdGhlIGxhdGVzdCBhdCB0aGUgdG9wIGJ5IHRoZSBlcnJvciBtZXNzYWdlIC10YmxcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcHJpbnQubGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJyAgJyArIHRvcHJpbnRbaV1bMV0gKyAnXFxuICAgICcgKyB0b3ByaW50W2ldWzBdO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHZhcmlhYmxlcyBpbiBhIGdyYXBoIChzaGFsbG93KS5cbiAqIE5vdGU6IFVOVVNFRC5cbiAqL1xuLy8gZnVuY3Rpb24gdmFyaWFibGVzSW4gKGcpIHtcbi8vICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnLnN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICB2YXIgc3QgPSBnLnN0YXRhdGVtZW50c1tpXVxuLy8gICAgIHZhciB2YXJzID0ge31cbi8vICAgICBpZiAoc3Quc3ViamVjdCBpbnN0YW5jZW9mICRyZGYuVmFyaWFibGUpIHtcbi8vICAgICAgIHZhcnNbc3Quc3ViamVjdC50b05UKCldID0gdHJ1ZVxuLy8gICAgIH1cbi8vICAgICBpZiAoc3QucHJlZGljYXRlIGluc3RhbmNlb2YgJHJkZi5WYXJpYWJsZSkge1xuLy8gICAgICAgdmFyc1tzdC5wcmVkaWNhdGUudG9OVCgpXSA9IHRydWVcbi8vICAgICB9XG4vLyAgICAgaWYgKHN0Lm9iamVjdCBpbnN0YW5jZW9mICRyZGYuVmFyaWFibGUpIHtcbi8vICAgICAgIHZhcnNbc3Qub2JqZWN0LnRvTlQoKV0gPSB0cnVlXG4vLyAgICAgfVxuLy8gICB9XG4vLyAgIHJldHVybiB2YXJzXG4vLyB9XG5cbi8qKlxuICogUmV0dXJucyBhbiBYTUxIdHRwUmVxdWVzdCBvYmplY3QgZm9yIHRoZSBhcHByb3ByaWF0ZSBjdXJyZW50IHJ1bnRpbWVcbiAqIGVudmlyb25tZW50LiBFeHBvcnRzIGFzIGBYTUxIVFRQRmFjdG9yeWBcbiAqL1xuZnVuY3Rpb24geGhyKCkge1xuICB2YXIgWE1MSHR0cFJlcXVlc3Q7XG4gIC8vIFJ1bm5pbmcgaW5zaWRlIHRoZSBUYWJ1bGF0b3IgRmlyZWZveCBleHRlbnNpb25cbiAgaWYgKHR5cGVvZiB0YWJ1bGF0b3IgIT09ICd1bmRlZmluZWQnICYmIHRhYnVsYXRvci5pc0V4dGVuc2lvbikge1xuICAgIC8vIENhbm5vdCB1c2UgWE1MSHR0cFJlcXVlc3QgbmF0aXZlbHksIG11c3QgcmVxdWVzdCBpdCB0aHJvdWdoIFNES1xuICAgIHJldHVybiBDb21wb25lbnRzLmNsYXNzZXNbJ0Btb3ppbGxhLm9yZy94bWxleHRyYXMveG1saHR0cHJlcXVlc3Q7MSddLmNyZWF0ZUluc3RhbmNlKCkuUXVlcnlJbnRlcmZhY2UoQ29tcG9uZW50cy5pbnRlcmZhY2VzLm5zSVhNTEh0dHBSZXF1ZXN0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnWE1MSHR0cFJlcXVlc3QnIGluIHdpbmRvdykge1xuICAgIC8vIFJ1bm5pbmcgaW5zaWRlIHRoZSBicm93c2VyXG4gICAgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q7XG4gICAgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZSAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIC8vIFJ1bm5pbmcgaW4gTm9kZS5qc1xuICAgIFhNTEh0dHBSZXF1ZXN0ID0gcmVxdWlyZSgneG1saHR0cHJlcXVlc3QnKS5YTUxIdHRwUmVxdWVzdDtcbiAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIH0gZWxzZSBpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBDbGFzc09yZGVyID0gcmVxdWlyZSgnLi9jbGFzcy1vcmRlcicpO1xudmFyIE5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbnZhciBVcmkgPSByZXF1aXJlKCcuL3VyaScpO1xuXG4vKipcbiAqIFZhcmlhYmxlcyBhcmUgcGxhY2Vob2xkZXJzIHVzZWQgaW4gcGF0dGVybnMgdG8gYmUgbWF0Y2hlZC5cbiAqIEluIGN3bSB0aGV5IGFyZSBzeW1ib2xzIHdoaWNoIGFyZSB0aGUgZm9ybXVsYSdzIGxpc3Qgb2YgcXVhbnRpZmllZCB2YXJpYWJsZXMuXG4gKiBJbiBzcGFycWwgdGhleSBhcmUgbm90IHZpc2libHkgVVJJcy4gIEhlcmUgd2UgY29tcHJvbWlzZSwgYnkgaGF2aW5nXG4gKiBhIGNvbW1vbiBzcGVjaWFsIGJhc2UgVVJJIGZvciB2YXJpYWJsZXMuIFRoZWlyIG5hbWVzIGFyZSB1cmlzLFxuICogYnV0IHRoZSA/IG5vdGF0aW9uIGhhcyBhbiBpbXBsaWNpdCBiYXNlIHVyaSBvZiAndmFyaWQ6J1xuICogQGNsYXNzIFZhcmlhYmxlXG4gKi9cblxudmFyIFZhcmlhYmxlID0gZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhWYXJpYWJsZSwgX05vZGUpO1xuXG4gIGZ1bmN0aW9uIFZhcmlhYmxlKCkge1xuICAgIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWYXJpYWJsZSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVmFyaWFibGUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihWYXJpYWJsZSkpLmNhbGwodGhpcykpO1xuXG4gICAgX3RoaXMudGVybVR5cGUgPSBWYXJpYWJsZS50ZXJtVHlwZTtcbiAgICBfdGhpcy52YWx1ZSA9IG5hbWU7XG4gICAgX3RoaXMuYmFzZSA9ICd2YXJpZDonO1xuICAgIF90aGlzLnVyaSA9IFVyaS5qb2luKG5hbWUsIF90aGlzLmJhc2UpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWYXJpYWJsZSwgW3tcbiAgICBrZXk6ICdlcXVhbHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICAgIGlmICghb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGVybVR5cGUgPT09IG90aGVyLnRlcm1UeXBlICYmIHRoaXMudmFsdWUgPT09IG90aGVyLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2hhc2hTdHJpbmcnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNoU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzdWJzdGl0dXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic3RpdHV0ZShiaW5kaW5ncykge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIHJldHVybiAocmVmID0gYmluZGluZ3NbdGhpcy50b05UKCldKSAhPSBudWxsID8gcmVmIDogdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd0b1N0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgaWYgKHRoaXMudXJpLnNsaWNlKDAsIHRoaXMuYmFzZS5sZW5ndGgpID09PSB0aGlzLmJhc2UpIHtcbiAgICAgICAgcmV0dXJuICc/JyArIHRoaXMudXJpLnNsaWNlKHRoaXMuYmFzZS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc/JyArIHRoaXMudXJpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWYXJpYWJsZTtcbn0oTm9kZSk7XG5cblZhcmlhYmxlLnRlcm1UeXBlID0gJ1ZhcmlhYmxlJztcblZhcmlhYmxlLnByb3RvdHlwZS5jbGFzc09yZGVyID0gQ2xhc3NPcmRlclsnVmFyaWFibGUnXTtcblZhcmlhYmxlLnByb3RvdHlwZS5pc1ZhciA9IDE7XG5cbm1vZHVsZS5leHBvcnRzID0gVmFyaWFibGU7IiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgTmFtZWROb2RlID0gcmVxdWlyZSgnLi9uYW1lZC1ub2RlJyk7XG5cbnZhciBYU0QgPSBmdW5jdGlvbiBYU0QoKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBYU0QpO1xufTtcblxuWFNELmJvb2xlYW4gPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuJyk7XG5YU0QuZGF0ZVRpbWUgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZScpO1xuWFNELmRlY2ltYWwgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsJyk7XG5YU0QuZG91YmxlID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZG91YmxlJyk7XG5YU0QuaW50ZWdlciA9IG5ldyBOYW1lZE5vZGUoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludGVnZXInKTtcblhTRC5sYW5nU3RyaW5nID0gbmV3IE5hbWVkTm9kZSgnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnKTtcblhTRC5zdHJpbmcgPSBuZXcgTmFtZWROb2RlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBYU0Q7IiwiLy8gKipOM0xleGVyKiogdG9rZW5pemVzIE4zIGRvY3VtZW50cy5cbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIGltbWVkaWF0ZWx5ID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHNldEltbWVkaWF0ZSA6XG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZnVuYykgeyBzZXRUaW1lb3V0KGZ1bmMsIDApOyB9O1xuXG4vLyBSZWd1bGFyIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VtZW50IHN0cmluZyB0byBlc2NhcGUgTjMgc3RyaW5ncy5cbi8vIE5vdGUgaG93IHdlIGNhdGNoIGludmFsaWQgdW5pY29kZSBzZXF1ZW5jZXMgc2VwYXJhdGVseSAodGhleSB3aWxsIHRyaWdnZXIgYW4gZXJyb3IpLlxudmFyIGVzY2FwZVNlcXVlbmNlID0gL1xcXFx1KFthLWZBLUYwLTldezR9KXxcXFxcVShbYS1mQS1GMC05XXs4fSl8XFxcXFt1VV18XFxcXCguKS9nO1xudmFyIGVzY2FwZVJlcGxhY2VtZW50cyA9IHsgJ1xcXFwnOiAnXFxcXCcsIFwiJ1wiOiBcIidcIiwgJ1wiJzogJ1wiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICduJzogJ1xcbicsICdyJzogJ1xccicsICd0JzogJ1xcdCcsICdmJzogJ1xcZicsICdiJzogJ1xcYicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAnXyc6ICdfJywgJ34nOiAnficsICcuJzogJy4nLCAnLSc6ICctJywgJyEnOiAnIScsICckJzogJyQnLCAnJic6ICcmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJzogJygnLCAnKSc6ICcpJywgJyonOiAnKicsICcrJzogJysnLCAnLCc6ICcsJywgJzsnOiAnOycsICc9JzogJz0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nOiAnLycsICc/JzogJz8nLCAnIyc6ICcjJywgJ0AnOiAnQCcsICclJzogJyUnIH07XG52YXIgaWxsZWdhbElyaUNoYXJzID0gL1tcXHgwMC1cXHgyMDw+XFxcXFwiXFx7XFx9XFx8XFxeXFxgXS87XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM0xleGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zTGV4ZXIpKVxuICAgIHJldHVybiBuZXcgTjNMZXhlcihvcHRpb25zKTtcblxuICAvLyBJbiBsaW5lIG1vZGUgKE4tVHJpcGxlcyBvciBOLVF1YWRzKSwgb25seSBzaW1wbGUgZmVhdHVyZXMgbWF5IGJlIHBhcnNlZFxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxpbmVNb2RlKSB7XG4gICAgLy8gRG9uJ3QgdG9rZW5pemUgc3BlY2lhbCBsaXRlcmFsc1xuICAgIHRoaXMuX3RyaXBsZVF1b3RlZFN0cmluZyA9IHRoaXMuX251bWJlciA9IHRoaXMuX2Jvb2xlYW4gPSAvJDBeLztcbiAgICAvLyBTd2FwIHRoZSB0b2tlbml6ZSBtZXRob2QgZm9yIGEgcmVzdHJpY3RlZCB2ZXJzaW9uXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3Rva2VuaXplID0gdGhpcy50b2tlbml6ZTtcbiAgICB0aGlzLnRva2VuaXplID0gZnVuY3Rpb24gKGlucHV0LCBjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdG9rZW5pemUoaW5wdXQsIGZ1bmN0aW9uIChlcnJvciwgdG9rZW4pIHtcbiAgICAgICAgaWYgKCFlcnJvciAmJiAvXig/OklSSXxwcmVmaXhlZHxsaXRlcmFsfGxhbmdjb2RlfHR5cGV8XFwufGVvZikkLy50ZXN0KHRva2VuLnR5cGUpKVxuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGVycm9yLCB0b2tlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhlcnJvciB8fCBzZWxmLl9zeW50YXhFcnJvcih0b2tlbi50eXBlLCBjYWxsYmFjayA9IG51bGwpKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuTjNMZXhlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgLy8gSXQncyBzbGlnaHRseSBmYXN0ZXIgdG8gaGF2ZSB0aGVzZSBhcyBwcm9wZXJ0aWVzIHRoYW4gYXMgaW4tc2NvcGUgdmFyaWFibGVzLlxuXG4gIF9pcmk6IC9ePCgoPzpbXj5cXFxcXXxcXFxcW3VVXSkrKT4vLCAvLyBJUkkgd2l0aCBlc2NhcGUgc2VxdWVuY2VzOyBuZWVkcyBzYW5pdHkgY2hlY2sgYWZ0ZXIgdW5lc2NhcGluZ1xuICBfdW5lc2NhcGVkSXJpOiAvXjwoW15cXHgwMC1cXHgyMDw+XFxcXFwiXFx7XFx9XFx8XFxeXFxgXSopPi8sIC8vIElSSSB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXM7IG5vIHVuZXNjYXBpbmdcbiAgX3VuZXNjYXBlZFN0cmluZzogL15cIlteXCJcXFxcXStcIig/PVteXCJcXFxcXSkvLCAvLyBub24tZW1wdHkgc3RyaW5nIHdpdGhvdXQgZXNjYXBlIHNlcXVlbmNlc1xuICBfc2luZ2xlUXVvdGVkU3RyaW5nOiAvXlwiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIoPz1bXlwiXFxcXF0pfF4nW14nXFxcXF0qKD86XFxcXC5bXidcXFxcXSopKicoPz1bXidcXFxcXSkvLFxuICBfdHJpcGxlUXVvdGVkU3RyaW5nOiAvXlwiXCIoXCJbXlwiXFxcXF0qKD86KD86XFxcXC58XCIoPyFcIlwiKSlbXlwiXFxcXF0qKSpcIilcIlwifF4nJygnW14nXFxcXF0qKD86KD86XFxcXC58Jyg/IScnKSlbXidcXFxcXSopKicpJycvLFxuICBfbGFuZ2NvZGU6IC9eQChbYS16XSsoPzotW2EtejAtOV0rKSopKD89W15hLXowLTlcXC1dKS9pLFxuICBfcHJlZml4OiAvXigoPzpbQS1aYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpcXC4/W1xcLTAtOUEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkqKT86KD89WyNcXHM8XSkvLFxuICBfcHJlZml4ZWQ6IC9eKCg/OltBLVphLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSg/OlxcLj9bXFwtMC05QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdKSopPzooKD86KD86WzAtOkEtWl9hLXpcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx1MDJmZlxcdTAzNzAtXFx1MDM3ZFxcdTAzN2YtXFx1MWZmZlxcdTIwMGNcXHUyMDBkXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKD86KD86W1xcLlxcLTAtOkEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXXwlWzAtOWEtZkEtRl17Mn18XFxcXFshIy1cXC87PT9cXC1AX35dKSooPzpbXFwtMC06QS1aX2EtelxceGI3XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwM2ZcXHUyMDQwXFx1MjA3MC1cXHUyMThmXFx1MmMwMC1cXHUyZmVmXFx1MzAwMS1cXHVkN2ZmXFx1ZjkwMC1cXHVmZGNmXFx1ZmRmMC1cXHVmZmZkXXxbXFx1ZDgwMC1cXHVkYjdmXVtcXHVkYzAwLVxcdWRmZmZdfCVbMC05YS1mQS1GXXsyfXxcXFxcWyEjLVxcLzs9P1xcLUBffl0pKT8pPykoPz1cXC4/Wyw7XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX2JsYW5rOiAvXl86KCg/OlswLTlBLVpfYS16XFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxcdTAyZmZcXHUwMzcwLVxcdTAzN2RcXHUwMzdmLVxcdTFmZmZcXHUyMDBjXFx1MjAwZFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkoPzpcXC4/W1xcLTAtOUEtWl9hLXpcXHhiN1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMzdkXFx1MDM3Zi1cXHUxZmZmXFx1MjAwY1xcdTIwMGRcXHUyMDNmXFx1MjA0MFxcdTIwNzAtXFx1MjE4ZlxcdTJjMDAtXFx1MmZlZlxcdTMwMDEtXFx1ZDdmZlxcdWY5MDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmZmZF18W1xcdWQ4MDAtXFx1ZGI3Zl1bXFx1ZGMwMC1cXHVkZmZmXSkqKSg/PVxcLj9bLDs6XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX251bWJlcjogL15bXFwtK10/KD86XFxkK1xcLj9cXGQqKFtlRV0oPzpbXFwtXFwrXSk/XFxkKyl8XFxkKlxcLj9cXGQrKSg/PVsuLDs6XFxzIygpXFxbXFxdXFx7XFx9XCInPF0pLyxcbiAgX2Jvb2xlYW46IC9eKD86dHJ1ZXxmYWxzZSkoPz1bLiw7OlxccyMoKVxcW1xcXVxce1xcfVwiJzxdKS8sXG4gIF9rZXl3b3JkOiAvXkBbYS16XSsoPz1bXFxzIzw6XSkvLFxuICBfc3BhcnFsS2V5d29yZDogL14oPzpQUkVGSVh8QkFTRXxHUkFQSCkoPz1bXFxzIzw6XSkvaSxcbiAgX3Nob3J0UHJlZGljYXRlczogL15hKD89XFxzK3w8KS8sXG4gIF9uZXdsaW5lOiAvXlsgXFx0XSooPzojW15cXG5cXHJdKik/KD86XFxyXFxufFxcbnxcXHIpWyBcXHRdKi8sXG4gIF93aGl0ZXNwYWNlOiAvXlsgXFx0XSsvLFxuICBfZW5kT2ZGaWxlOiAvXig/OiNbXlxcblxccl0qKT8kLyxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF90b2tlbml6ZVRvRW5kYCB0b2tlbml6ZXMgYXMgZm9yIGFzIHBvc3NpYmxlLCBlbWl0dGluZyB0b2tlbnMgdGhyb3VnaCB0aGUgY2FsbGJhY2suXG4gIF90b2tlbml6ZVRvRW5kOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGlucHV0RmluaXNoZWQpIHtcbiAgICAvLyBDb250aW51ZSBwYXJzaW5nIGFzIGZhciBhcyBwb3NzaWJsZTsgdGhlIGxvb3Agd2lsbCByZXR1cm4gZXZlbnR1YWxseS5cbiAgICB2YXIgaW5wdXQgPSB0aGlzLl9pbnB1dDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ291bnQgYW5kIHNraXAgd2hpdGVzcGFjZSBsaW5lcy5cbiAgICAgIHZhciB3aGl0ZVNwYWNlTWF0Y2g7XG4gICAgICB3aGlsZSAod2hpdGVTcGFjZU1hdGNoID0gdGhpcy5fbmV3bGluZS5leGVjKGlucHV0KSlcbiAgICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHIod2hpdGVTcGFjZU1hdGNoWzBdLmxlbmd0aCwgaW5wdXQubGVuZ3RoKSwgdGhpcy5fbGluZSsrO1xuICAgICAgLy8gU2tpcCB3aGl0ZXNwYWNlIG9uIGN1cnJlbnQgbGluZS5cbiAgICAgIGlmICh3aGl0ZVNwYWNlTWF0Y2ggPSB0aGlzLl93aGl0ZXNwYWNlLmV4ZWMoaW5wdXQpKVxuICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cih3aGl0ZVNwYWNlTWF0Y2hbMF0ubGVuZ3RoLCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgICAvLyBTdG9wIGZvciBub3cgaWYgd2UncmUgYXQgdGhlIGVuZC5cbiAgICAgIGlmICh0aGlzLl9lbmRPZkZpbGUudGVzdChpbnB1dCkpIHtcbiAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGZpbmlzaGVkLCBlbWl0IEVPRi5cbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQpXG4gICAgICAgICAgY2FsbGJhY2soaW5wdXQgPSBudWxsLCB7IGxpbmU6IHRoaXMuX2xpbmUsIHR5cGU6ICdlb2YnLCB2YWx1ZTogJycsIHByZWZpeDogJycgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciBzcGVjaWZpYyB0b2tlbiB0eXBlcyBiYXNlZCBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyLlxuICAgICAgdmFyIGxpbmUgPSB0aGlzLl9saW5lLCB0eXBlID0gJycsIHZhbHVlID0gJycsIHByZWZpeCA9ICcnLFxuICAgICAgICAgIGZpcnN0Q2hhciA9IGlucHV0WzBdLCBtYXRjaCA9IG51bGwsIG1hdGNoTGVuZ3RoID0gMCwgdW5lc2NhcGVkLCBpbmNvbmNsdXNpdmUgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZmlyc3RDaGFyKSB7XG4gICAgICBjYXNlICdeJzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgdHlwZS5cbiAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMSkgYnJlYWs7XG4gICAgICAgIGVsc2UgaWYgKGlucHV0WzFdICE9PSAnXicpIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgdGhpcy5fcHJldlRva2VuVHlwZSA9ICdeJztcbiAgICAgICAgLy8gTW92ZSB0byB0eXBlIElSSSBvciBwcmVmaXhlZCBuYW1lLlxuICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cigyKTtcbiAgICAgICAgaWYgKGlucHV0WzBdICE9PSAnPCcpIHtcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCBpbiBjYXNlIHRoZSB0eXBlIGlzIGFuIElSSS5cblxuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZnVsbCBJUkkgd2l0aG91dCBlc2NhcGUgc2VxdWVuY2VzLlxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl91bmVzY2FwZWRJcmkuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9ICdJUkknLCB2YWx1ZSA9IG1hdGNoWzFdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGZ1bGwgSVJJIHdpdGggZXNjYXBlIHNlcXVlbmNlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9pcmkuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCB8fCBpbGxlZ2FsSXJpQ2hhcnMudGVzdCh1bmVzY2FwZWQpKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnSVJJJywgdmFsdWUgPSB1bmVzY2FwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ18nOlxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGJsYW5rIG5vZGUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgaWYgKChtYXRjaCA9IHRoaXMuX2JsYW5rLmV4ZWMoaW5wdXQpKSB8fFxuICAgICAgICAgICAgaW5wdXRGaW5pc2hlZCAmJiAobWF0Y2ggPSB0aGlzLl9ibGFuay5leGVjKGlucHV0ICsgJyAnKSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXhlZCcsIHByZWZpeCA9ICdfJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1wiJzpcbiAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbm9uLWVtcHR5IGRvdWJsZS1xdW90ZWQgbGl0ZXJhbCB3aXRob3V0IGVzY2FwZSBzZXF1ZW5jZXMuXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3VuZXNjYXBlZFN0cmluZy5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhbnkgb3RoZXIgbGl0ZXJhbCB3cmFwcGVkIGluIGEgcGFpciBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl9zaW5nbGVRdW90ZWRTdHJpbmcuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSB0aGlzLl91bmVzY2FwZShtYXRjaFswXSk7XG4gICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9IHVuZXNjYXBlZC5yZXBsYWNlKC9eJ3wnJC9nLCAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGxpdGVyYWwgd3JhcHBlZCBpbiB0aHJlZSBwYWlycyBvZiBzaW5nbGUgb3IgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSB0aGlzLl90cmlwbGVRdW90ZWRTdHJpbmcuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB1bmVzY2FwZWQgPSBtYXRjaFsxXSB8fCBtYXRjaFsyXTtcbiAgICAgICAgICAvLyBDb3VudCB0aGUgbmV3bGluZXMgYW5kIGFkdmFuY2UgbGluZSBjb3VudGVyLlxuICAgICAgICAgIHRoaXMuX2xpbmUgKz0gdW5lc2NhcGVkLnNwbGl0KC9cXHJcXG58XFxyfFxcbi8pLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdW5lc2NhcGVkID0gdGhpcy5fdW5lc2NhcGUodW5lc2NhcGVkKTtcbiAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFN5bnRheEVycm9yKHRoaXMpO1xuICAgICAgICAgIHR5cGUgPSAnbGl0ZXJhbCcsIHZhbHVlID0gdW5lc2NhcGVkLnJlcGxhY2UoL14nfCckL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdAJzpcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBsYW5ndWFnZSBjb2RlLlxuICAgICAgICBpZiAodGhpcy5fcHJldlRva2VuVHlwZSA9PT0gJ2xpdGVyYWwnICYmIChtYXRjaCA9IHRoaXMuX2xhbmdjb2RlLmV4ZWMoaW5wdXQpKSlcbiAgICAgICAgICB0eXBlID0gJ2xhbmdjb2RlJywgdmFsdWUgPSBtYXRjaFsxXTtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBrZXl3b3JkLlxuICAgICAgICBlbHNlIGlmIChtYXRjaCA9IHRoaXMuX2tleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnLic6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZG90IGFzIHB1bmN0dWF0aW9uLlxuICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAxID8gaW5wdXRGaW5pc2hlZCA6IChpbnB1dFsxXSA8ICcwJyB8fCBpbnB1dFsxXSA+ICc5JykpIHtcbiAgICAgICAgICB0eXBlID0gJy4nO1xuICAgICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gbnVtZXJpY2FsIGNhc2UgKGNvdWxkIGJlIGEgZGVjaW1hbCBkb3QpLlxuXG4gICAgICBjYXNlICcwJzpcbiAgICAgIGNhc2UgJzEnOlxuICAgICAgY2FzZSAnMic6XG4gICAgICBjYXNlICczJzpcbiAgICAgIGNhc2UgJzQnOlxuICAgICAgY2FzZSAnNSc6XG4gICAgICBjYXNlICc2JzpcbiAgICAgIGNhc2UgJzcnOlxuICAgICAgY2FzZSAnOCc6XG4gICAgICBjYXNlICc5JzpcbiAgICAgIGNhc2UgJysnOlxuICAgICAgY2FzZSAnLSc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgbnVtYmVyLlxuICAgICAgICBpZiAobWF0Y2ggPSB0aGlzLl9udW1iZXIuZXhlYyhpbnB1dCkpIHtcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnO1xuICAgICAgICAgIHZhbHVlID0gJ1wiJyArIG1hdGNoWzBdICsgJ1wiXl5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSMnICtcbiAgICAgICAgICAgICAgICAgIChtYXRjaFsxXSA/ICdkb3VibGUnIDogKC9eWytcXC1dP1xcZCskLy50ZXN0KG1hdGNoWzBdKSA/ICdpbnRlZ2VyJyA6ICdkZWNpbWFsJykpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdCJzpcbiAgICAgIGNhc2UgJ2InOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdQJzpcbiAgICAgIGNhc2UgJ0cnOlxuICAgICAgY2FzZSAnZyc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgU1BBUlFMLXN0eWxlIGtleXdvcmQuXG4gICAgICAgIGlmIChtYXRjaCA9IHRoaXMuX3NwYXJxbEtleXdvcmQuZXhlYyhpbnB1dCkpXG4gICAgICAgICAgdHlwZSA9IG1hdGNoWzBdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZic6XG4gICAgICBjYXNlICd0JzpcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgYm9vbGVhbi5cbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fYm9vbGVhbi5leGVjKGlucHV0KSlcbiAgICAgICAgICB0eXBlID0gJ2xpdGVyYWwnLCB2YWx1ZSA9ICdcIicgKyBtYXRjaFswXSArICdcIl5eaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhbic7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBpbmNvbmNsdXNpdmUgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGFiYnJldmlhdGVkIHByZWRpY2F0ZS5cbiAgICAgICAgaWYgKG1hdGNoID0gdGhpcy5fc2hvcnRQcmVkaWNhdGVzLmV4ZWMoaW5wdXQpKVxuICAgICAgICAgIHR5cGUgPSAnYWJicmV2aWF0aW9uJywgdmFsdWUgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGUnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaW5jb25jbHVzaXZlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJywnOlxuICAgICAgY2FzZSAnOyc6XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ10nOlxuICAgICAgY2FzZSAnKCc6XG4gICAgICBjYXNlICcpJzpcbiAgICAgIGNhc2UgJ3snOlxuICAgICAgY2FzZSAnfSc6XG4gICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIHB1bmN0dWF0aW9uXG4gICAgICAgIG1hdGNoTGVuZ3RoID0gMTtcbiAgICAgICAgdHlwZSA9IGZpcnN0Q2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluY29uY2x1c2l2ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvbWUgZmlyc3QgY2hhcmFjdGVycyBkbyBub3QgYWxsb3cgYW4gaW1tZWRpYXRlIGRlY2lzaW9uLCBzbyBpbnNwZWN0IG1vcmUuXG4gICAgICBpZiAoaW5jb25jbHVzaXZlKSB7XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgcHJlZml4LlxuICAgICAgICBpZiAoKHRoaXMuX3ByZXZUb2tlblR5cGUgPT09ICdAcHJlZml4JyB8fCB0aGlzLl9wcmV2VG9rZW5UeXBlID09PSAnUFJFRklYJykgJiZcbiAgICAgICAgICAgIChtYXRjaCA9IHRoaXMuX3ByZWZpeC5leGVjKGlucHV0KSkpXG4gICAgICAgICAgdHlwZSA9ICdwcmVmaXgnLCB2YWx1ZSA9IG1hdGNoWzFdIHx8ICcnO1xuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIHByZWZpeGVkIG5hbWUuIFNpbmNlIGl0IGNhbiBjb250YWluIChidXQgbm90IGVuZCB3aXRoKSBhIGRvdCxcbiAgICAgICAgLy8gd2UgYWx3YXlzIG5lZWQgYSBub24tZG90IGNoYXJhY3RlciBiZWZvcmUgZGVjaWRpbmcgaXQgaXMgYSBwcmVmaXhlZCBuYW1lLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHRyeSBpbnNlcnRpbmcgYSBzcGFjZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgIGlucHV0RmluaXNoZWQgJiYgKG1hdGNoID0gdGhpcy5fcHJlZml4ZWQuZXhlYyhpbnB1dCArICcgJykpKVxuICAgICAgICAgIHR5cGUgPSAncHJlZml4ZWQnLCBwcmVmaXggPSBtYXRjaFsxXSB8fCAnJywgdmFsdWUgPSB0aGlzLl91bmVzY2FwZShtYXRjaFsyXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHlwZSB0b2tlbiBpcyBzcGVjaWFsOiBpdCBjYW4gb25seSBiZSBlbWl0dGVkIGFmdGVyIGFuIElSSSBvciBwcmVmaXhlZCBuYW1lIGlzIHJlYWQuXG4gICAgICBpZiAodGhpcy5fcHJldlRva2VuVHlwZSA9PT0gJ14nKVxuICAgICAgICB0eXBlID0gKHR5cGUgPT09ICdJUkknIHx8IHR5cGUgPT09ICdwcmVmaXhlZCcpID8gJ3R5cGUnIDogJyc7XG5cbiAgICAgIC8vIFdoYXQgaWYgbm90aGluZyBvZiB0aGUgYWJvdmUgd2FzIGZvdW5kP1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIC8vIFdlIGNvdWxkIGJlIGluIHN0cmVhbWluZyBtb2RlLCBhbmQgdGhlbiB3ZSBqdXN0IHdhaXQgZm9yIG1vcmUgaW5wdXQgdG8gYXJyaXZlLlxuICAgICAgICAvLyBPdGhlcndpc2UsIGEgc3ludGF4IGVycm9yIGhhcyBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuXG4gICAgICAgIC8vIE9uZSBleGNlcHRpb246IGVycm9yIG9uIGFuIHVuYWNjb3VudGVkIGxpbmVicmVhayAoPSBub3QgaW5zaWRlIGEgdHJpcGxlLXF1b3RlZCBsaXRlcmFsKS5cbiAgICAgICAgaWYgKGlucHV0RmluaXNoZWQgfHwgKCEvXicnJ3xeXCJcIlwiLy50ZXN0KGlucHV0KSAmJiAvXFxufFxcci8udGVzdChpbnB1dCkpKVxuICAgICAgICAgIHJldHVybiByZXBvcnRTeW50YXhFcnJvcih0aGlzKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiB0aGlzLl9pbnB1dCA9IGlucHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHRoZSBwYXJzZWQgdG9rZW4uXG4gICAgICBjYWxsYmFjayhudWxsLCB7IGxpbmU6IGxpbmUsIHR5cGU6IHR5cGUsIHZhbHVlOiB2YWx1ZSwgcHJlZml4OiBwcmVmaXggfSk7XG4gICAgICB0aGlzLl9wcmV2VG9rZW5UeXBlID0gdHlwZTtcblxuICAgICAgLy8gQWR2YW5jZSB0byBuZXh0IHBhcnQgdG8gdG9rZW5pemUuXG4gICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cihtYXRjaExlbmd0aCB8fCBtYXRjaFswXS5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gU2lnbmFscyB0aGUgc3ludGF4IGVycm9yIHRocm91Z2ggdGhlIGNhbGxiYWNrXG4gICAgZnVuY3Rpb24gcmVwb3J0U3ludGF4RXJyb3Ioc2VsZikgeyBjYWxsYmFjayhzZWxmLl9zeW50YXhFcnJvcigvXlxcUyovLmV4ZWMoaW5wdXQpWzBdKSk7IH1cbiAgfSxcblxuICAvLyAjIyMgYF91bmVzY2FwZWAgcmVwbGFjZXMgTjMgZXNjYXBlIGNvZGVzIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy5cbiAgX3VuZXNjYXBlOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gaXRlbS5yZXBsYWNlKGVzY2FwZVNlcXVlbmNlLCBmdW5jdGlvbiAoc2VxdWVuY2UsIHVuaWNvZGU0LCB1bmljb2RlOCwgZXNjYXBlZENoYXIpIHtcbiAgICAgICAgdmFyIGNoYXJDb2RlO1xuICAgICAgICBpZiAodW5pY29kZTQpIHtcbiAgICAgICAgICBjaGFyQ29kZSA9IHBhcnNlSW50KHVuaWNvZGU0LCAxNik7XG4gICAgICAgICAgaWYgKGlzTmFOKGNoYXJDb2RlKSkgdGhyb3cgbmV3IEVycm9yKCk7IC8vIGNhbiBuZXZlciBoYXBwZW4gKHJlZ2V4KSwgYnV0IGhlbHBzIHBlcmZvcm1hbmNlXG4gICAgICAgICAgcmV0dXJuIGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5pY29kZTgpIHtcbiAgICAgICAgICBjaGFyQ29kZSA9IHBhcnNlSW50KHVuaWNvZGU4LCAxNik7XG4gICAgICAgICAgaWYgKGlzTmFOKGNoYXJDb2RlKSkgdGhyb3cgbmV3IEVycm9yKCk7IC8vIGNhbiBuZXZlciBoYXBwZW4gKHJlZ2V4KSwgYnV0IGhlbHBzIHBlcmZvcm1hbmNlXG4gICAgICAgICAgaWYgKGNoYXJDb2RlIDw9IDB4RkZGRikgcmV0dXJuIGZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICAgICAgcmV0dXJuIGZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKGNoYXJDb2RlIC09IDB4MTAwMDApIC8gMHg0MDApLCAweERDMDAgKyAoY2hhckNvZGUgJiAweDNGRikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVzY2FwZVJlcGxhY2VtZW50c1tlc2NhcGVkQ2hhcl07XG4gICAgICAgICAgaWYgKCFyZXBsYWNlbWVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyByZXR1cm4gbnVsbDsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3N5bnRheEVycm9yYCBjcmVhdGVzIGEgc3ludGF4IGVycm9yIGZvciB0aGUgZ2l2ZW4gaXNzdWVcbiAgX3N5bnRheEVycm9yOiBmdW5jdGlvbiAoaXNzdWUpIHtcbiAgICB0aGlzLl9pbnB1dCA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignU3ludGF4IGVycm9yOiB1bmV4cGVjdGVkIFwiJyArIGlzc3VlICsgJ1wiIG9uIGxpbmUgJyArIHRoaXMuX2xpbmUgKyAnLicpO1xuICB9LFxuXG5cbiAgLy8gIyMgUHVibGljIG1ldGhvZHNcblxuICAvLyAjIyMgYHRva2VuaXplYCBzdGFydHMgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIGFuIE4zIGRvY3VtZW50IGludG8gYW4gYXJyYXkgb2YgdG9rZW5zLlxuICAvLyBUaGUgaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgc3RyZWFtLlxuICB0b2tlbml6ZTogZnVuY3Rpb24gKGlucHV0LCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9saW5lID0gMTtcblxuICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIHN0cmluZywgY29udGludW91c2x5IGVtaXQgdG9rZW5zIHRocm91Z2ggdGhlIGNhbGxiYWNrIHVudGlsIHRoZSBlbmQuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7XG4gICAgICBpbW1lZGlhdGVseShmdW5jdGlvbiAoKSB7IHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIHRydWUpOyB9KTtcbiAgICB9XG4gICAgLy8gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgd2lsbCBiZSBzdHJlYW1lZC5cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2lucHV0ID0gJyc7XG5cbiAgICAgIC8vIElmIG5vIGlucHV0IHdhcyBnaXZlbiwgaXQgd2lsbCBiZSBzdHJlYW1lZCB0aHJvdWdoIGBhZGRDaHVua2AgYW5kIGVuZGVkIHdpdGggYGVuZGBcbiAgICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2h1bmsgPSBhZGRDaHVuaztcbiAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgICAgIGlmICghY2FsbGJhY2spXG4gICAgICAgICAgY2FsbGJhY2sgPSBpbnB1dDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGlucHV0IGl0c2VsZiBtdXN0IGJlIGEgc3RyZWFtXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5zZXRFbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICBpbnB1dC5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBpbnB1dC5vbignZGF0YScsIGFkZENodW5rKTtcbiAgICAgICAgaW5wdXQub24oJ2VuZCcsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkcyB0aGUgZGF0YSBjaHVuayB0byB0aGUgYnVmZmVyIGFuZCBwYXJzZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgZnVuY3Rpb24gYWRkQ2h1bmsoZGF0YSkge1xuICAgICAgaWYgKHNlbGYuX2lucHV0ICE9PSBudWxsKSB7XG4gICAgICAgIHNlbGYuX2lucHV0ICs9IGRhdGE7XG4gICAgICAgIHNlbGYuX3Rva2VuaXplVG9FbmQoY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXJzZXMgdW50aWwgdGhlIGVuZFxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgIGlmIChzZWxmLl9pbnB1dCAhPT0gbnVsbClcbiAgICAgICAgc2VsZi5fdG9rZW5pemVUb0VuZChjYWxsYmFjaywgdHJ1ZSk7XG4gICAgfVxuICB9LFxufTtcblxuLy8gIyMgRXhwb3J0c1xuXG4vLyBFeHBvcnQgdGhlIGBOM0xleGVyYCBjbGFzcyBhcyBhIHdob2xlLlxubW9kdWxlLmV4cG9ydHMgPSBOM0xleGVyO1xuIiwiLy8gKipOM1BhcnNlcioqIHBhcnNlcyBOMyBkb2N1bWVudHMuXG52YXIgTjNMZXhlciA9IHJlcXVpcmUoJy4vTjNMZXhlcicpO1xuXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfTklMICAgID0gUkRGX1BSRUZJWCArICduaWwnLFxuICAgIFJERl9GSVJTVCAgPSBSREZfUFJFRklYICsgJ2ZpcnN0JyxcbiAgICBSREZfUkVTVCAgID0gUkRGX1BSRUZJWCArICdyZXN0JztcblxudmFyIGFic29sdXRlSVJJID0gL15bYS16XVthLXowLTkrLi1dKjovaSxcbiAgICBzY2hlbWVBdXRob3JpdHkgPSAvXig/OihbYS16XVthLXowLTkrLi1dKjopKT8oPzpcXC9cXC9bXlxcL10qKT8vaSxcbiAgICBkb3RTZWdtZW50cyA9IC8oPzpefFxcLylcXC5cXC4/KD86JHxbXFwvIz9dKS87XG5cbi8vIFRoZSBuZXh0IElEIGZvciBuZXcgYmxhbmsgbm9kZXNcbnZhciBibGFua05vZGVQcmVmaXggPSAwLCBibGFua05vZGVDb3VudCA9IDA7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1BhcnNlcihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOM1BhcnNlcikpXG4gICAgcmV0dXJuIG5ldyBOM1BhcnNlcihvcHRpb25zKTtcbiAgdGhpcy5fdHJpcGxlU3RhY2sgPSBbXTtcbiAgdGhpcy5fZ3JhcGggPSBudWxsO1xuXG4gIC8vIFNldCB0aGUgZG9jdW1lbnQgSVJJLlxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5fc2V0QmFzZShvcHRpb25zLmRvY3VtZW50SVJJKTtcblxuICAvLyBTZXQgc3VwcG9ydGVkIGZlYXR1cmVzIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LlxuICB2YXIgZm9ybWF0ID0gKHR5cGVvZiBvcHRpb25zLmZvcm1hdCA9PT0gJ3N0cmluZycpICYmIG9wdGlvbnMuZm9ybWF0Lm1hdGNoKC9cXHcqJC8pWzBdLnRvTG93ZXJDYXNlKCksXG4gICAgICBpc1R1cnRsZSA9IGZvcm1hdCA9PT0gJ3R1cnRsZScsIGlzVHJpRyA9IGZvcm1hdCA9PT0gJ3RyaWcnLFxuICAgICAgaXNOVHJpcGxlcyA9IC90cmlwbGUvLnRlc3QoZm9ybWF0KSwgaXNOUXVhZHMgPSAvcXVhZC8udGVzdChmb3JtYXQpLFxuICAgICAgaXNMaW5lTW9kZSA9IGlzTlRyaXBsZXMgfHwgaXNOUXVhZHM7XG4gIGlmICghKHRoaXMuX3N1cHBvcnRzTmFtZWRHcmFwaHMgPSAhaXNUdXJ0bGUpKVxuICAgIHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGggPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICB0aGlzLl9zdXBwb3J0c1F1YWRzID0gIShpc1R1cnRsZSB8fCBpc1RyaUcgfHwgaXNOVHJpcGxlcyk7XG4gIC8vIERpc2FibGUgcmVsYXRpdmUgSVJJcyBpbiBOLVRyaXBsZXMgb3IgTi1RdWFkcyBtb2RlXG4gIGlmIChpc0xpbmVNb2RlKSB7XG4gICAgdGhpcy5fYmFzZSA9ICcnO1xuICAgIHRoaXMuX3Jlc29sdmVJUkkgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgIHRoaXMuX2Vycm9yKCdEaXNhbGxvd2VkIHJlbGF0aXZlIElSSScsIHRva2VuKTtcbiAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFjayA9IG5vb3AsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgdGhpcy5fYmxhbmtOb2RlUHJlZml4ID0gdHlwZW9mIG9wdGlvbnMuYmxhbmtOb2RlUHJlZml4ICE9PSAnc3RyaW5nJyA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXzonICsgb3B0aW9ucy5ibGFua05vZGVQcmVmaXgucmVwbGFjZSgvXl86LywgJycpO1xuICB0aGlzLl9sZXhlciA9IG9wdGlvbnMubGV4ZXIgfHwgbmV3IE4zTGV4ZXIoeyBsaW5lTW9kZTogaXNMaW5lTW9kZSB9KTtcbn1cblxuLy8gIyMgUHJpdmF0ZSBjbGFzcyBtZXRob2RzXG5cbi8vICMjIyBgX3Jlc2V0QmxhbmtOb2RlSWRzYCByZXN0YXJ0cyBibGFuayBub2RlIGlkZW50aWZpY2F0aW9uLlxuTjNQYXJzZXIuX3Jlc2V0QmxhbmtOb2RlSWRzID0gZnVuY3Rpb24gKCkge1xuICBibGFua05vZGVQcmVmaXggPSBibGFua05vZGVDb3VudCA9IDA7XG59O1xuXG5OM1BhcnNlci5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFByaXZhdGUgbWV0aG9kc1xuXG4gIC8vICMjIyBgX3NldEJhc2VgIHNldHMgdGhlIGJhc2UgSVJJIHRvIHJlc29sdmUgcmVsYXRpdmUgSVJJcy5cbiAgX3NldEJhc2U6IGZ1bmN0aW9uIChiYXNlSVJJKSB7XG4gICAgaWYgKCFiYXNlSVJJKVxuICAgICAgYmFzZUlSSSA9IG51bGw7XG4gICAgZWxzZSBpZiAoYmFzZUlSSS5pbmRleE9mKCcjJykgPj0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiYXNlIElSSSAnICsgYmFzZUlSSSk7XG4gICAgLy8gU2V0IGJhc2UgSVJJIGFuZCBpdHMgY29tcG9uZW50c1xuICAgIGlmICh0aGlzLl9iYXNlID0gYmFzZUlSSSkge1xuICAgICAgdGhpcy5fYmFzZVBhdGggICA9IGJhc2VJUkkucmVwbGFjZSgvW15cXC8/XSooPzpcXD8uKik/JC8sICcnKTtcbiAgICAgIGJhc2VJUkkgPSBiYXNlSVJJLm1hdGNoKHNjaGVtZUF1dGhvcml0eSk7XG4gICAgICB0aGlzLl9iYXNlUm9vdCAgID0gYmFzZUlSSVswXTtcbiAgICAgIHRoaXMuX2Jhc2VTY2hlbWUgPSBiYXNlSVJJWzFdO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkSW5Ub3BDb250ZXh0YCByZWFkcyBhIHRva2VuIHdoZW4gaW4gdGhlIHRvcCBjb250ZXh0LlxuICBfcmVhZEluVG9wQ29udGV4dDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gSWYgYW4gRU9GIHRva2VuIGFycml2ZXMgaW4gdGhlIHRvcCBjb250ZXh0LCBzaWduYWwgdGhhdCB3ZSdyZSBkb25lLlxuICAgIGNhc2UgJ2VvZic6XG4gICAgICBpZiAodGhpcy5fZ3JhcGggIT09IG51bGwpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5jbG9zZWQgZ3JhcGgnLCB0b2tlbik7XG4gICAgICBkZWxldGUgdGhpcy5fcHJlZml4ZXMuXztcbiAgICAgIHJldHVybiB0aGlzLl9jYWxsYmFjayhudWxsLCBudWxsLCB0aGlzLl9wcmVmaXhlcyk7XG4gICAgLy8gSXQgY291bGQgYmUgYSBwcmVmaXggZGVjbGFyYXRpb24uXG4gICAgY2FzZSAnQHByZWZpeCc6XG4gICAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVmaXg7XG4gICAgY2FzZSAnUFJFRklYJzpcbiAgICAgIHRoaXMuX3NwYXJxbFN0eWxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4O1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAgICBjYXNlICdAYmFzZSc6XG4gICAgICB0aGlzLl9zcGFycWxTdHlsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCYXNlSVJJO1xuICAgIGNhc2UgJ0JBU0UnOlxuICAgICAgdGhpcy5fc3BhcnFsU3R5bGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCYXNlSVJJO1xuICAgIC8vIEl0IGNvdWxkIGJlIGEgZ3JhcGguXG4gICAgY2FzZSAneyc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNOYW1lZEdyYXBocykge1xuICAgICAgICB0aGlzLl9ncmFwaCA9ICcnO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRTdWJqZWN0O1xuICAgICAgfVxuICAgIGNhc2UgJ0dSQVBIJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c05hbWVkR3JhcGhzKVxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhMYWJlbDtcbiAgICAvLyBPdGhlcndpc2UsIHRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBzdWJqZWN0LlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3QodG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkU3ViamVjdGAgcmVhZHMgYSB0cmlwbGUncyBzdWJqZWN0LlxuICBfcmVhZFN1YmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHRoaXMuX3ByZWRpY2F0ZSA9IG51bGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICAgIGlmICh0aGlzLl9iYXNlID09PSBudWxsIHx8IGFic29sdXRlSVJJLnRlc3QodG9rZW4udmFsdWUpKVxuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIHZhciBwcmVmaXggPSB0aGlzLl9wcmVmaXhlc1t0b2tlbi5wcmVmaXhdO1xuICAgICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZGVmaW5lZCBwcmVmaXggXCInICsgdG9rZW4ucHJlZml4ICsgJzpcIicsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1snOlxuICAgICAgLy8gU3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBuZXcgYmxhbmsgbm9kZSBhcyBzdWJqZWN0LlxuICAgICAgdGhpcy5fc3ViamVjdCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IG51bGwsIG9iamVjdDogbnVsbCwgdHlwZTogJ2JsYW5rJyB9KTtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlSGVhZDtcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGxpc3RcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiBSREZfTklMLCBwcmVkaWNhdGU6IG51bGwsIG9iamVjdDogbnVsbCwgdHlwZTogJ2xpc3QnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZExpc3RJdGVtO1xuICAgIGNhc2UgJ30nOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgc3ViamVjdCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgfVxuICAgIC8vIFRoZSBuZXh0IHRva2VuIG11c3QgYmUgYSBwcmVkaWNhdGUsXG4gICAgLy8gb3IsIGlmIHRoZSBzdWJqZWN0IHdhcyBhY3R1YWxseSBhIGdyYXBoIElSSSwgYSBuYW1lZCBncmFwaC5cbiAgICByZXR1cm4gdGhpcy5fcmVhZFByZWRpY2F0ZU9yTmFtZWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHJlZGljYXRlYCByZWFkcyBhIHRyaXBsZSdzIHByZWRpY2F0ZS5cbiAgX3JlYWRQcmVkaWNhdGU6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHZhciB0eXBlID0gdG9rZW4udHlwZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgIGNhc2UgJ2FiYnJldmlhdGlvbic6XG4gICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgaWYgKHRva2VuLnByZWZpeCA9PT0gJ18nKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0Rpc2FsbG93ZWQgYmxhbmsgbm9kZSBhcyBwcmVkaWNhdGUnLCB0b2tlbik7XG4gICAgICB2YXIgcHJlZml4ID0gdGhpcy5fcHJlZml4ZXNbdG9rZW4ucHJlZml4XTtcbiAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmRlZmluZWQgcHJlZml4IFwiJyArIHRva2VuLnByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSBwcmVmaXggKyB0b2tlbi52YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJy4nOlxuICAgIGNhc2UgJ10nOlxuICAgIGNhc2UgJ30nOlxuICAgICAgLy8gRXhwZWN0ZWQgcHJlZGljYXRlIGRpZG4ndCBjb21lLCBtdXN0IGhhdmUgYmVlbiB0cmFpbGluZyBzZW1pY29sb24uXG4gICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBudWxsKVxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ1VuZXhwZWN0ZWQgJyArIHR5cGUsIHRva2VuKTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICddJyA/IHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKSA6IHRoaXMuX3JlYWRQdW5jdHVhdGlvbih0b2tlbik7XG4gICAgY2FzZSAnOyc6XG4gICAgICAvLyBFeHRyYSBzZW1pY29sb25zIGNhbiBiZSBzYWZlbHkgaWdub3JlZFxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHJlZGljYXRlIHRvIGZvbGxvdyBcIicgKyB0aGlzLl9zdWJqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBUaGUgbmV4dCB0b2tlbiBtdXN0IGJlIGFuIG9iamVjdC5cbiAgICByZXR1cm4gdGhpcy5fcmVhZE9iamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkT2JqZWN0YCByZWFkcyBhIHRyaXBsZSdzIG9iamVjdC5cbiAgX3JlYWRPYmplY3Q6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgIGNhc2UgJ0lSSSc6XG4gICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgdGhpcy5fb2JqZWN0ID0gdG9rZW4udmFsdWU7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuX29iamVjdCA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgdGhpcy5fb2JqZWN0ID0gcHJlZml4ICsgdG9rZW4udmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsaXRlcmFsJzpcbiAgICAgIHRoaXMuX29iamVjdCA9IHRva2VuLnZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWREYXRhVHlwZU9yTGFuZztcbiAgICBjYXNlICdbJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IHRyaXBsZSB3aXRoIGEgbmV3IGJsYW5rIG5vZGUgYXMgc3ViamVjdC5cbiAgICAgIHZhciBibGFuayA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSwgb2JqZWN0OiBibGFuaywgdHlwZTogJ2JsYW5rJyB9KTtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBibGFuaztcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlSGVhZDtcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YXJ0IGEgbmV3IGxpc3RcbiAgICAgIHRoaXMuX3RyaXBsZVN0YWNrLnB1c2goeyBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LCBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSwgb2JqZWN0OiBSREZfTklMLCB0eXBlOiAnbGlzdCcgfSk7XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkTGlzdEl0ZW07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgb2JqZWN0IHRvIGZvbGxvdyBcIicgKyB0aGlzLl9wcmVkaWNhdGUgKyAnXCInLCB0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUHJlZGljYXRlT3JOYW1lZEdyYXBoYCByZWFkcyBhIHRyaXBsZSdzIHByZWRpY2F0ZSwgb3IgYSBuYW1lZCBncmFwaC5cbiAgX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlbi50eXBlID09PSAneycgPyB0aGlzLl9yZWFkR3JhcGgodG9rZW4pIDogdGhpcy5fcmVhZFByZWRpY2F0ZSh0b2tlbik7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZEdyYXBoYCByZWFkcyBhIGdyYXBoLlxuICBfcmVhZEdyYXBoOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3snKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBncmFwaCBidXQgZ290ICcgKyB0b2tlbi50eXBlLCB0b2tlbik7XG4gICAgLy8gVGhlIFwic3ViamVjdFwiIHdlIHJlYWQgaXMgYWN0dWFsbHkgdGhlIEdSQVBIJ3MgbGFiZWxcbiAgICB0aGlzLl9ncmFwaCA9IHRoaXMuX3N1YmplY3QsIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLl9yZWFkU3ViamVjdDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlSGVhZGAgcmVhZHMgdGhlIGhlYWQgb2YgYSBibGFuayBub2RlLlxuICBfcmVhZEJsYW5rTm9kZUhlYWQ6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnXScpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsKHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl9wcmVkaWNhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRQcmVkaWNhdGUodG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmxhbmtOb2RlVGFpbGAgcmVhZHMgdGhlIGVuZCBvZiBhIGJsYW5rIG5vZGUuXG4gIF9yZWFkQmxhbmtOb2RlVGFpbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICddJylcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkQmxhbmtOb2RlUHVuY3R1YXRpb24odG9rZW4pO1xuXG4gICAgLy8gU3RvcmUgYmxhbmsgbm9kZSB0cmlwbGUuXG4gICAgaWYgKHRoaXMuX3N1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgdGhpcy5fc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBwYXJlbnQgdHJpcGxlIHRoYXQgY29udGFpbnMgdGhlIGJsYW5rIG5vZGUuXG4gICAgdmFyIHRyaXBsZSA9IHRoaXMuX3RyaXBsZVN0YWNrLnBvcCgpO1xuICAgIHRoaXMuX3N1YmplY3QgPSB0cmlwbGUuc3ViamVjdDtcbiAgICAvLyBXYXMgdGhlIGJsYW5rIG5vZGUgdGhlIG9iamVjdD9cbiAgICBpZiAodHJpcGxlLm9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgLy8gUmVzdG9yZSBwcmVkaWNhdGUgYW5kIG9iamVjdCBhcyB3ZWxsLCBhbmQgY29udGludWUgYnkgcmVhZGluZyBwdW5jdHVhdGlvbi5cbiAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHRyaXBsZS5wcmVkaWNhdGU7XG4gICAgICB0aGlzLl9vYmplY3QgPSB0cmlwbGUub2JqZWN0O1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFRyaXBsZUVuZFJlYWRlcigpO1xuICAgIH1cbiAgICAvLyBUaGUgYmxhbmsgbm9kZSB3YXMgdGhlIHN1YmplY3QsIHNvIGNvbnRpbnVlIHJlYWRpbmcgdGhlIHByZWRpY2F0ZS5cbiAgICAvLyBJZiB0aGUgYmxhbmsgbm9kZSBkaWRuJ3QgY29udGFpbiBhbnkgcHJlZGljYXRlcywgaXQgY291bGQgYWxzbyBiZSB0aGUgbGFiZWwgb2YgYSBuYW1lZCBncmFwaC5cbiAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlICE9PSBudWxsID8gdGhpcy5fcmVhZFByZWRpY2F0ZSA6IHRoaXMuX3JlYWRQcmVkaWNhdGVPck5hbWVkR3JhcGg7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZERhdGFUeXBlT3JMYW5nYCByZWFkcyBhbiBfb3B0aW9uYWxfIGRhdGEgdHlwZSBvciBsYW5ndWFnZS5cbiAgX3JlYWREYXRhVHlwZU9yTGFuZzogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAodG9rZW4ucHJlZml4ID09PSAnJykge1xuICAgICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5fcHJlZml4ZXNbdG9rZW4ucHJlZml4XTtcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgICB2YWx1ZSA9IHByZWZpeCArIHRva2VuLnZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fb2JqZWN0ICs9ICdeXicgKyB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICBjYXNlICdsYW5nY29kZSc6XG4gICAgICB0aGlzLl9vYmplY3QgKz0gJ0AnICsgdG9rZW4udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2dldFRyaXBsZUVuZFJlYWRlcigpLmNhbGwodGhpcywgdG9rZW4pO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkTGlzdEl0ZW1gIHJlYWRzIGl0ZW1zIGZyb20gYSBsaXN0LlxuICBfcmVhZExpc3RJdGVtOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICB2YXIgaXRlbSA9IG51bGwsICAgICAgICAgICAgICAgICAgLy8gVGhlIGFjdHVhbCBsaXN0IGl0ZW0uXG4gICAgICAgIGl0ZW1IZWFkID0gbnVsbCwgICAgICAgICAgICAgIC8vIFRoZSBoZWFkIG9mIHRoZSByZGY6Zmlyc3QgcHJlZGljYXRlLlxuICAgICAgICBwcmV2SXRlbUhlYWQgPSB0aGlzLl9zdWJqZWN0LCAvLyBUaGUgaGVhZCBvZiB0aGUgcHJldmlvdXMgcmRmOmZpcnN0IHByZWRpY2F0ZS5cbiAgICAgICAgc3RhY2sgPSB0aGlzLl90cmlwbGVTdGFjaywgICAgLy8gVGhlIHN0YWNrIG9mIHRyaXBsZXMgcGFydCBvZiByZWN1cnNpb24gKGxpc3RzLCBibGFua3MsIGV0Yy4pLlxuICAgICAgICBwYXJlbnRUcmlwbGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXSwgLy8gVGhlIHRyaXBsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QuXG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkTGlzdEl0ZW07ICAgIC8vIFRoZSBuZXh0IGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG5cbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICBjYXNlICdJUkknOlxuICAgICAgaWYgKHRoaXMuX2Jhc2UgPT09IG51bGwgfHwgYWJzb2x1dGVJUkkudGVzdCh0b2tlbi52YWx1ZSkpXG4gICAgICAgIGl0ZW0gPSB0b2tlbi52YWx1ZTtcbiAgICAgIGVsc2VcbiAgICAgICAgaXRlbSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncHJlZml4ZWQnOlxuICAgICAgdmFyIHByZWZpeCA9IHRoaXMuX3ByZWZpeGVzW3Rva2VuLnByZWZpeF07XG4gICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcignVW5kZWZpbmVkIHByZWZpeCBcIicgKyB0b2tlbi5wcmVmaXggKyAnOlwiJywgdG9rZW4pO1xuICAgICAgaXRlbSA9IHByZWZpeCArIHRva2VuLnZhbHVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGl0ZXJhbCc6XG4gICAgICBpdGVtID0gdG9rZW4udmFsdWU7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZERhdGFUeXBlT3JMYW5nO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnWyc6XG4gICAgICAvLyBTdGFjayB0aGUgY3VycmVudCBsaXN0IHRyaXBsZSBhbmQgc3RhcnQgYSBuZXcgdHJpcGxlIHdpdGggYSBibGFuayBub2RlIGFzIHN1YmplY3QuXG4gICAgICBpdGVtSGVhZCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIGl0ZW0gICAgID0gJ186YicgKyBibGFua05vZGVDb3VudCsrO1xuICAgICAgc3RhY2sucHVzaCh7IHN1YmplY3Q6IGl0ZW1IZWFkLCBwcmVkaWNhdGU6IFJERl9GSVJTVCwgb2JqZWN0OiBpdGVtLCB0eXBlOiAnYmxhbmsnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IGl0ZW07XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEJsYW5rTm9kZUhlYWQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICcoJzpcbiAgICAgIC8vIFN0YWNrIHRoZSBjdXJyZW50IGxpc3QgdHJpcGxlIGFuZCBzdGFydCBhIG5ldyBsaXN0XG4gICAgICBpdGVtSGVhZCA9ICdfOmInICsgYmxhbmtOb2RlQ291bnQrKztcbiAgICAgIHN0YWNrLnB1c2goeyBzdWJqZWN0OiBpdGVtSGVhZCwgcHJlZGljYXRlOiBSREZfRklSU1QsIG9iamVjdDogUkRGX05JTCwgdHlwZTogJ2xpc3QnIH0pO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZExpc3RJdGVtO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnKSc6XG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJlbnQgdHJpcGxlLlxuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAvLyBJZiB0aGlzIGxpc3QgaXMgY29udGFpbmVkIHdpdGhpbiBhIHBhcmVudCBsaXN0LCByZXR1cm4gdGhlIG1lbWJlcnNoaXAgdHJpcGxlIGhlcmUuXG4gICAgICAvLyBUaGlzIHdpbGwgYmUgYDxwYXJlbnQgbGlzdCBlbGVtZW50PiByZGY6Zmlyc3QgPHRoaXMgbGlzdD4uYC5cbiAgICAgIGlmIChzdGFjay5sZW5ndGggIT09IDAgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0udHlwZSA9PT0gJ2xpc3QnKVxuICAgICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgcGFyZW50VHJpcGxlLnN1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiBwYXJlbnRUcmlwbGUucHJlZGljYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgcGFyZW50VHJpcGxlLm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuICAgICAgLy8gUmVzdG9yZSB0aGUgcGFyZW50IHRyaXBsZSdzIHN1YmplY3QuXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gcGFyZW50VHJpcGxlLnN1YmplY3Q7XG4gICAgICAvLyBXYXMgdGhpcyBsaXN0IGluIHRoZSBwYXJlbnQgdHJpcGxlJ3Mgc3ViamVjdD9cbiAgICAgIGlmIChwYXJlbnRUcmlwbGUucHJlZGljYXRlID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIHRoZSBwcmVkaWNhdGUuXG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgICAvLyBTa2lwIHdyaXRpbmcgdGhlIGxpc3QgdGFpbCBpZiB0aGlzIHdhcyBhbiBlbXB0eSBsaXN0LlxuICAgICAgICBpZiAocGFyZW50VHJpcGxlLnN1YmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBUaGUgbGlzdCB3YXMgaW4gdGhlIHBhcmVudCB0cmlwbGUncyBvYmplY3QuXG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcGFyZW50IHRyaXBsZSdzIHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFzIHdlbGwuXG4gICAgICAgIHRoaXMuX3ByZWRpY2F0ZSA9IHBhcmVudFRyaXBsZS5wcmVkaWNhdGU7XG4gICAgICAgIHRoaXMuX29iamVjdCA9IHBhcmVudFRyaXBsZS5vYmplY3Q7XG4gICAgICAgIG5leHQgPSB0aGlzLl9nZXRUcmlwbGVFbmRSZWFkZXIoKTtcbiAgICAgICAgLy8gU2tpcCB3cml0aW5nIHRoZSBsaXN0IHRhaWwgaWYgdGhpcyB3YXMgYW4gZW1wdHkgbGlzdC5cbiAgICAgICAgaWYgKHBhcmVudFRyaXBsZS5vYmplY3QgPT09IFJERl9OSUwpXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICB9XG4gICAgICAvLyBDbG9zZSB0aGUgbGlzdCBieSBtYWtpbmcgdGhlIGl0ZW0gaGVhZCBuaWwuXG4gICAgICBpdGVtSGVhZCA9IFJERl9OSUw7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBsaXN0IGl0ZW0gaW5zdGVhZCBvZiBcIicgKyB0b2tlbi50eXBlICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cblxuICAgICAvLyBDcmVhdGUgYSBuZXcgYmxhbmsgbm9kZSBpZiBubyBpdGVtIGhlYWQgd2FzIGFzc2lnbmVkIHlldC5cbiAgICBpZiAoaXRlbUhlYWQgPT09IG51bGwpXG4gICAgICB0aGlzLl9zdWJqZWN0ID0gaXRlbUhlYWQgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG5cbiAgICAvLyBJcyB0aGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0P1xuICAgIGlmIChwcmV2SXRlbUhlYWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbGlzdCBpcyBlaXRoZXIgdGhlIG9iamVjdCBvciB0aGUgc3ViamVjdC5cbiAgICAgIGlmIChwYXJlbnRUcmlwbGUub2JqZWN0ID09PSBSREZfTklMKVxuICAgICAgICBwYXJlbnRUcmlwbGUub2JqZWN0ID0gaXRlbUhlYWQ7XG4gICAgICBlbHNlXG4gICAgICAgIHBhcmVudFRyaXBsZS5zdWJqZWN0ID0gaXRlbUhlYWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGxpc3QgaXMgaW4gdGhlIGN1cnJlbnQgaGVhZC5cbiAgICAgIHRoaXMuX2NhbGxiYWNrKG51bGwsIHsgc3ViamVjdDogICBwcmV2SXRlbUhlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogUkRGX1JFU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgaXRlbUhlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoOiAgICAgdGhpcy5fZ3JhcGggfHwgJycgfSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgaXRlbSdzIHZhbHVlLlxuICAgIGlmIChpdGVtICE9PSBudWxsKVxuICAgICAgdGhpcy5fY2FsbGJhY2sobnVsbCwgeyBzdWJqZWN0OiAgIGl0ZW1IZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IFJERl9GSVJTVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIHRoaXMuX2dyYXBoIHx8ICcnIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQdW5jdHVhdGlvbmAgcmVhZHMgcHVuY3R1YXRpb24gYmV0d2VlbiB0cmlwbGVzIG9yIHRyaXBsZSBwYXJ0cy5cbiAgX3JlYWRQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQsIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0LCBncmFwaCA9IHRoaXMuX2dyYXBoO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgIC8vIEEgY2xvc2luZyBicmFjZSBlbmRzIGEgZ3JhcGhcbiAgICBjYXNlICd9JzpcbiAgICAgIGlmICh0aGlzLl9ncmFwaCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmV4cGVjdGVkIGdyYXBoIGNsb3NpbmcnLCB0b2tlbik7XG4gICAgICB0aGlzLl9ncmFwaCA9IG51bGw7XG4gICAgLy8gQSBkb3QganVzdCBlbmRzIHRoZSBzdGF0ZW1lbnQsIHdpdGhvdXQgc2hhcmluZyBhbnl0aGluZyB3aXRoIHRoZSBuZXh0LlxuICAgIGNhc2UgJy4nOlxuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZEluVG9wQ29udGV4dDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIFNlbWljb2xvbiBtZWFucyB0aGUgc3ViamVjdCBpcyBzaGFyZWQ7IHByZWRpY2F0ZSBhbmQgb2JqZWN0IGFyZSBkaWZmZXJlbnQuXG4gICAgY2FzZSAnOyc6XG4gICAgICBuZXh0ID0gdGhpcy5fcmVhZFByZWRpY2F0ZTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENvbW1hIG1lYW5zIGJvdGggdGhlIHN1YmplY3QgYW5kIHByZWRpY2F0ZSBhcmUgc2hhcmVkOyB0aGUgb2JqZWN0IGlzIGRpZmZlcmVudC5cbiAgICBjYXNlICcsJzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkT2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgLy8gQW4gSVJJIG1lYW5zIHRoaXMgaXMgYSBxdWFkIChvbmx5IGFsbG93ZWQgaWYgbm90IGFscmVhZHkgaW5zaWRlIGEgZ3JhcGgpLlxuICAgIGNhc2UgJ0lSSSc6XG4gICAgICBpZiAodGhpcy5fc3VwcG9ydHNRdWFkcyAmJiB0aGlzLl9ncmFwaCA9PT0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgICAgICBncmFwaCA9IHRva2VuLnZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgZ3JhcGggPSB0aGlzLl9yZXNvbHZlSVJJKHRva2VuKTtcbiAgICAgICAgc3ViamVjdCA9IHRoaXMuX3N1YmplY3Q7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBBbiBwcmVmaXhlZCBuYW1lIG1lYW5zIHRoaXMgaXMgYSBxdWFkIChvbmx5IGFsbG93ZWQgaWYgbm90IGFscmVhZHkgaW5zaWRlIGEgZ3JhcGgpLlxuICAgIGNhc2UgJ3ByZWZpeGVkJzpcbiAgICAgIGlmICh0aGlzLl9zdXBwb3J0c1F1YWRzICYmIHRoaXMuX2dyYXBoID09PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmVmaXggPSB0aGlzLl9wcmVmaXhlc1t0b2tlbi5wcmVmaXhdO1xuICAgICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdVbmRlZmluZWQgcHJlZml4IFwiJyArIHRva2VuLnByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgICAgIGdyYXBoID0gcHJlZml4ICsgdG9rZW4udmFsdWU7XG4gICAgICAgIG5leHQgPSB0aGlzLl9yZWFkUXVhZFB1bmN0dWF0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwdW5jdHVhdGlvbiB0byBmb2xsb3cgXCInICsgdGhpcy5fb2JqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBBIHRyaXBsZSBoYXMgYmVlbiBjb21wbGV0ZWQgbm93LCBzbyByZXR1cm4gaXQuXG4gICAgaWYgKHN1YmplY3QgIT09IG51bGwpXG4gICAgICB0aGlzLl9jYWxsYmFjayhudWxsLCB7IHN1YmplY3Q6ICAgc3ViamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiB0aGlzLl9wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaDogICAgIGdyYXBoIHx8ICcnIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9LFxuXG4gICAgLy8gIyMjIGBfcmVhZEJsYW5rTm9kZVB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBpbiBhIGJsYW5rIG5vZGVcbiAgX3JlYWRCbGFua05vZGVQdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIG5leHQ7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgLy8gU2VtaWNvbG9uIG1lYW5zIHRoZSBzdWJqZWN0IGlzIHNoYXJlZDsgcHJlZGljYXRlIGFuZCBvYmplY3QgYXJlIGRpZmZlcmVudC5cbiAgICBjYXNlICc7JzpcbiAgICAgIG5leHQgPSB0aGlzLl9yZWFkUHJlZGljYXRlO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ29tbWEgbWVhbnMgYm90aCB0aGUgc3ViamVjdCBhbmQgcHJlZGljYXRlIGFyZSBzaGFyZWQ7IHRoZSBvYmplY3QgaXMgZGlmZmVyZW50LlxuICAgIGNhc2UgJywnOlxuICAgICAgbmV4dCA9IHRoaXMuX3JlYWRPYmplY3Q7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBwdW5jdHVhdGlvbiB0byBmb2xsb3cgXCInICsgdGhpcy5fb2JqZWN0ICsgJ1wiJywgdG9rZW4pO1xuICAgIH1cbiAgICAvLyBBIHRyaXBsZSBoYXMgYmVlbiBjb21wbGV0ZWQgbm93LCBzbyByZXR1cm4gaXQuXG4gICAgdGhpcy5fY2FsbGJhY2sobnVsbCwgeyBzdWJqZWN0OiAgIHRoaXMuX3N1YmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IHRoaXMuX3ByZWRpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGg6ICAgICB0aGlzLl9ncmFwaCB8fCAnJyB9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkUXVhZFB1bmN0dWF0aW9uYCByZWFkcyBwdW5jdHVhdGlvbiBhZnRlciBhIHF1YWQuXG4gIF9yZWFkUXVhZFB1bmN0dWF0aW9uOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJy4nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBkb3QgdG8gZm9sbG93IHF1YWQnLCB0b2tlbik7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRJblRvcENvbnRleHQ7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVhZFByZWZpeGAgcmVhZHMgdGhlIHByZWZpeCBvZiBhIHByZWZpeCBkZWNsYXJhdGlvbi5cbiAgX3JlYWRQcmVmaXg6IGZ1bmN0aW9uICh0b2tlbikge1xuICAgIGlmICh0b2tlbi50eXBlICE9PSAncHJlZml4JylcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvcignRXhwZWN0ZWQgcHJlZml4IHRvIGZvbGxvdyBAcHJlZml4JywgdG9rZW4pO1xuICAgIHRoaXMuX3ByZWZpeCA9IHRva2VuLnZhbHVlO1xuICAgIHJldHVybiB0aGlzLl9yZWFkUHJlZml4SVJJO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWRQcmVmaXhJUklgIHJlYWRzIHRoZSBJUkkgb2YgYSBwcmVmaXggZGVjbGFyYXRpb24uXG4gIF9yZWFkUHJlZml4SVJJOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ0lSSScpXG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0V4cGVjdGVkIElSSSB0byBmb2xsb3cgcHJlZml4IFwiJyArIHRoaXMuX3ByZWZpeCArICc6XCInLCB0b2tlbik7XG4gICAgdmFyIHByZWZpeElSSTtcbiAgICBpZiAodGhpcy5fYmFzZSA9PT0gbnVsbCB8fCBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSlcbiAgICAgIHByZWZpeElSSSA9IHRva2VuLnZhbHVlO1xuICAgIGVsc2VcbiAgICAgIHByZWZpeElSSSA9IHRoaXMuX3Jlc29sdmVJUkkodG9rZW4pO1xuICAgIHRoaXMuX3ByZWZpeGVzW3RoaXMuX3ByZWZpeF0gPSBwcmVmaXhJUkk7XG4gICAgdGhpcy5fcHJlZml4Q2FsbGJhY2sodGhpcy5fcHJlZml4LCBwcmVmaXhJUkkpO1xuICAgIHJldHVybiB0aGlzLl9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkQmFzZUlSSWAgcmVhZHMgdGhlIElSSSBvZiBhIGJhc2UgZGVjbGFyYXRpb24uXG4gIF9yZWFkQmFzZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICdJUkknKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdFeHBlY3RlZCBJUkkgdG8gZm9sbG93IGJhc2UgZGVjbGFyYXRpb24nLCB0b2tlbik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3NldEJhc2UodGhpcy5fYmFzZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUlSSS50ZXN0KHRva2VuLnZhbHVlKSA/IHRva2VuLnZhbHVlIDogdGhpcy5fcmVzb2x2ZUlSSSh0b2tlbikpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgdGhpcy5fZXJyb3IoZXJyb3IubWVzc2FnZSwgdG9rZW4pOyB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWREZWNsYXJhdGlvblB1bmN0dWF0aW9uO1xuICB9LFxuXG4gIC8vICMjIyBgX3JlYWROYW1lZEdyYXBoTGFiZWxgIHJlYWRzIHRoZSBsYWJlbCBvZiBhIG5hbWVkIGdyYXBoLlxuICBfcmVhZE5hbWVkR3JhcGhMYWJlbDogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgY2FzZSAnSVJJJzpcbiAgICBjYXNlICdwcmVmaXhlZCc6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFN1YmplY3QodG9rZW4pLCB0aGlzLl9yZWFkR3JhcGg7XG4gICAgY2FzZSAnWyc6XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0ludmFsaWQgZ3JhcGggbGFiZWwnLCB0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlYWROYW1lZEdyYXBoTGFiZWxgIHJlYWRzIGEgYmxhbmsgbm9kZSBsYWJlbCBvZiBhIG5hbWVkIGdyYXBoLlxuICBfcmVhZE5hbWVkR3JhcGhCbGFua0xhYmVsOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ10nKVxuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yKCdJbnZhbGlkIGdyYXBoIGxhYmVsJywgdG9rZW4pO1xuICAgIHRoaXMuX3N1YmplY3QgPSAnXzpiJyArIGJsYW5rTm9kZUNvdW50Kys7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRHcmFwaDtcbiAgfSxcblxuICAvLyAjIyMgYF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbmAgcmVhZHMgdGhlIHB1bmN0dWF0aW9uIG9mIGEgZGVjbGFyYXRpb24uXG4gIF9yZWFkRGVjbGFyYXRpb25QdW5jdHVhdGlvbjogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgLy8gU1BBUlFMLXN0eWxlIGRlY2xhcmF0aW9ucyBkb24ndCBoYXZlIHB1bmN0dWF0aW9uLlxuICAgIGlmICh0aGlzLl9zcGFycWxTdHlsZSlcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0KHRva2VuKTtcblxuICAgIGlmICh0b2tlbi50eXBlICE9PSAnLicpXG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3IoJ0V4cGVjdGVkIGRlY2xhcmF0aW9uIHRvIGVuZCB3aXRoIGEgZG90JywgdG9rZW4pO1xuICAgIHJldHVybiB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICB9LFxuXG4gIC8vICMjIyBgX2dldFRyaXBsZUVuZFJlYWRlcmAgZ2V0cyB0aGUgbmV4dCByZWFkZXIgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiBhIHRyaXBsZS5cbiAgX2dldFRyaXBsZUVuZFJlYWRlcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9IHRoaXMuX3RyaXBsZVN0YWNrO1xuICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5fcmVhZFB1bmN0dWF0aW9uO1xuXG4gICAgc3dpdGNoIChzdGFja1tzdGFjay5sZW5ndGggLSAxXS50eXBlKSB7XG4gICAgY2FzZSAnYmxhbmsnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRCbGFua05vZGVUYWlsO1xuICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRMaXN0SXRlbTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gIyMjIGBfZXJyb3JgIGVtaXRzIGFuIGVycm9yIG1lc3NhZ2UgdGhyb3VnaCB0aGUgY2FsbGJhY2suXG4gIF9lcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UsIHRva2VuKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sobmV3IEVycm9yKG1lc3NhZ2UgKyAnIGF0IGxpbmUgJyArIHRva2VuLmxpbmUgKyAnLicpKTtcbiAgfSxcblxuICAvLyAjIyMgYF9yZXNvbHZlSVJJYCByZXNvbHZlcyBhIHJlbGF0aXZlIElSSSB0b2tlbiBhZ2FpbnN0IHRoZSBiYXNlIHBhdGgsXG4gIC8vIGFzc3VtaW5nIHRoYXQgYSBiYXNlIHBhdGggaGFzIGJlZW4gc2V0IGFuZCB0aGF0IHRoZSBJUkkgaXMgaW5kZWVkIHJlbGF0aXZlLlxuICBfcmVzb2x2ZUlSSTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgdmFyIGlyaSA9IHRva2VuLnZhbHVlO1xuICAgIHN3aXRjaCAoaXJpWzBdKSB7XG4gICAgLy8gQW4gZW1wdHkgcmVsYXRpdmUgSVJJIGluZGljYXRlcyB0aGUgYmFzZSBJUklcbiAgICBjYXNlIHVuZGVmaW5lZDogcmV0dXJuIHRoaXMuX2Jhc2U7XG4gICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBmcmFnbWVudCBJUklzIGFnYWluc3QgdGhlIGJhc2UgSVJJXG4gICAgY2FzZSAnIyc6IHJldHVybiB0aGlzLl9iYXNlICsgaXJpO1xuICAgIC8vIFJlc29sdmUgcmVsYXRpdmUgcXVlcnkgc3RyaW5nIElSSXMgYnkgcmVwbGFjaW5nIHRoZSBxdWVyeSBzdHJpbmdcbiAgICBjYXNlICc/JzogcmV0dXJuIHRoaXMuX2Jhc2UucmVwbGFjZSgvKD86XFw/LiopPyQvLCBpcmkpO1xuICAgIC8vIFJlc29sdmUgcm9vdC1yZWxhdGl2ZSBJUklzIGF0IHRoZSByb290IG9mIHRoZSBiYXNlIElSSVxuICAgIGNhc2UgJy8nOlxuICAgICAgLy8gUmVzb2x2ZSBzY2hlbWUtcmVsYXRpdmUgSVJJcyB0byB0aGUgc2NoZW1lXG4gICAgICByZXR1cm4gKGlyaVsxXSA9PT0gJy8nID8gdGhpcy5fYmFzZVNjaGVtZSA6IHRoaXMuX2Jhc2VSb290KSArIHRoaXMuX3JlbW92ZURvdFNlZ21lbnRzKGlyaSk7XG4gICAgLy8gUmVzb2x2ZSBhbGwgb3RoZXIgSVJJcyBhdCB0aGUgYmFzZSBJUkkncyBwYXRoXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0aGlzLl9yZW1vdmVEb3RTZWdtZW50cyh0aGlzLl9iYXNlUGF0aCArIGlyaSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgX3JlbW92ZURvdFNlZ21lbnRzYCByZXNvbHZlcyAnLi8nIGFuZCAnLi4vJyBwYXRoIHNlZ21lbnRzIGluIGFuIElSSSBhcyBwZXIgUkZDMzk4Ni5cbiAgX3JlbW92ZURvdFNlZ21lbnRzOiBmdW5jdGlvbiAoaXJpKSB7XG4gICAgLy8gRG9uJ3QgbW9kaWZ5IHRoZSBJUkkgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgZG90IHNlZ21lbnRzXG4gICAgaWYgKCFkb3RTZWdtZW50cy50ZXN0KGlyaSkpXG4gICAgICByZXR1cm4gaXJpO1xuXG4gICAgLy8gU3RhcnQgd2l0aCBhbiBpbWFnaW5hcnkgc2xhc2ggYmVmb3JlIHRoZSBJUkkgaW4gb3JkZXIgdG8gcmVzb2x2ZSB0cmFpbGluZyAnLi8nIGFuZCAnLi4vJ1xuICAgIHZhciByZXN1bHQgPSAnJywgbGVuZ3RoID0gaXJpLmxlbmd0aCwgaSA9IC0xLCBwYXRoU3RhcnQgPSAtMSwgc2VnbWVudFN0YXJ0ID0gMCwgbmV4dCA9ICcvJztcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKG5leHQpIHtcbiAgICAgIC8vIFRoZSBwYXRoIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdCBzbGFzaCBhZnRlciB0aGUgYXV0aG9yaXR5XG4gICAgICBjYXNlICc6JzpcbiAgICAgICAgaWYgKHBhdGhTdGFydCA8IDApIHtcbiAgICAgICAgICAvLyBTa2lwIHR3byBzbGFzaGVzIGJlZm9yZSB0aGUgYXV0aG9yaXR5XG4gICAgICAgICAgaWYgKGlyaVsrK2ldID09PSAnLycgJiYgaXJpWysraV0gPT09ICcvJylcbiAgICAgICAgICAgIC8vIFNraXAgdG8gc2xhc2ggYWZ0ZXIgdGhlIGF1dGhvcml0eVxuICAgICAgICAgICAgd2hpbGUgKChwYXRoU3RhcnQgPSBpICsgMSkgPCBsZW5ndGggJiYgaXJpW3BhdGhTdGFydF0gIT09ICcvJylcbiAgICAgICAgICAgICAgaSA9IHBhdGhTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvbid0IG1vZGlmeSBhIHF1ZXJ5IHN0cmluZyBvciBmcmFnbWVudFxuICAgICAgY2FzZSAnPyc6XG4gICAgICBjYXNlICcjJzpcbiAgICAgICAgaSA9IGxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBIYW5kbGUgJy8uJyBvciAnLy4uJyBwYXRoIHNlZ21lbnRzXG4gICAgICBjYXNlICcvJzpcbiAgICAgICAgaWYgKGlyaVtpICsgMV0gPT09ICcuJykge1xuICAgICAgICAgIG5leHQgPSBpcmlbKytpICsgMV07XG4gICAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgJy8uJyBzZWdtZW50XG4gICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICByZXN1bHQgKz0gaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkgLSAxKTtcbiAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgdHJhaWxpbmcgJy8uJyBzZWdtZW50XG4gICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQsIGkpICsgaXJpLnN1YnN0cihpICsgMSk7XG4gICAgICAgICAgLy8gUmVtb3ZlIGEgJy8uLicgc2VnbWVudFxuICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgICAgbmV4dCA9IGlyaVsrK2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQgfHwgbmV4dCA9PT0gJy8nIHx8IG5leHQgPT09ICc/JyB8fCBuZXh0ID09PSAnIycpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ICs9IGlyaS5zdWJzdHJpbmcoc2VnbWVudFN0YXJ0LCBpIC0gMik7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byByZW1vdmUgdGhlIHBhcmVudCBwYXRoIGZyb20gcmVzdWx0XG4gICAgICAgICAgICAgIGlmICgoc2VnbWVudFN0YXJ0ID0gcmVzdWx0Lmxhc3RJbmRleE9mKCcvJykpID49IHBhdGhTdGFydClcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIHNlZ21lbnRTdGFydCk7XG4gICAgICAgICAgICAgIC8vIFJlbW92ZSBhIHRyYWlsaW5nICcvLi4nIHNlZ21lbnRcbiAgICAgICAgICAgICAgaWYgKG5leHQgIT09ICcvJylcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJy8nICsgaXJpLnN1YnN0cihpICsgMSk7XG4gICAgICAgICAgICAgIHNlZ21lbnRTdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dCA9IGlyaVsrK2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgaXJpLnN1YnN0cmluZyhzZWdtZW50U3RhcnQpO1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBwYXJzZWAgcGFyc2VzIHRoZSBOMyBpbnB1dCBhbmQgZW1pdHMgZWFjaCBwYXJzZWQgdHJpcGxlIHRocm91Z2ggdGhlIGNhbGxiYWNrLlxuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCB0cmlwbGVDYWxsYmFjaywgcHJlZml4Q2FsbGJhY2spIHtcbiAgICAvLyBUaGUgcmVhZCBjYWxsYmFjayBpcyB0aGUgbmV4dCBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIGEgdG9rZW4gYXJyaXZlcy5cbiAgICAvLyBXZSBzdGFydCByZWFkaW5nIGluIHRoZSB0b3AgY29udGV4dC5cbiAgICB0aGlzLl9yZWFkQ2FsbGJhY2sgPSB0aGlzLl9yZWFkSW5Ub3BDb250ZXh0O1xuICAgIHRoaXMuX3ByZWZpeGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9wcmVmaXhlcy5fID0gdGhpcy5fYmxhbmtOb2RlUHJlZml4IHx8ICdfOmInICsgYmxhbmtOb2RlUHJlZml4KysgKyAnXyc7XG5cbiAgICAvLyBJZiB0aGUgaW5wdXQgYXJndW1lbnQgaXMgbm90IGdpdmVuLCBzaGlmdCBwYXJhbWV0ZXJzXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHByZWZpeENhbGxiYWNrID0gdHJpcGxlQ2FsbGJhY2ssIHRyaXBsZUNhbGxiYWNrID0gaW5wdXQsIGlucHV0ID0gbnVsbDtcblxuICAgIC8vIFNldCB0aGUgdHJpcGxlIGFuZCBwcmVmaXggY2FsbGJhY2tzLlxuICAgIHRoaXMuX2NhbGxiYWNrID0gdHJpcGxlQ2FsbGJhY2sgfHwgbm9vcDtcbiAgICB0aGlzLl9wcmVmaXhDYWxsYmFjayA9IHByZWZpeENhbGxiYWNrIHx8IG5vb3A7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSByZWFkIGNhbGxiYWNrIHdoZW4gYSB0b2tlbiBhcnJpdmVzLlxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9sZXhlci50b2tlbml6ZShpbnB1dCwgZnVuY3Rpb24gKGVycm9yLCB0b2tlbikge1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsKVxuICAgICAgICBzZWxmLl9jYWxsYmFjayhlcnJvciksIHNlbGYuX2NhbGxiYWNrID0gbm9vcDtcbiAgICAgIGVsc2UgaWYgKHNlbGYuX3JlYWRDYWxsYmFjayAhPT0gdW5kZWZpbmVkKVxuICAgICAgICBzZWxmLl9yZWFkQ2FsbGJhY2sgPSBzZWxmLl9yZWFkQ2FsbGJhY2sodG9rZW4pO1xuICAgIH0pO1xuXG4gICAgLy8gSWYgbm8gaW5wdXQgd2FzIGdpdmVuLCBpdCBjYW4gYmUgYWRkZWQgd2l0aCBgYWRkQ2h1bmtgIGFuZCBlbmRlZCB3aXRoIGBlbmRgXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgdGhpcy5hZGRDaHVuayA9IHRoaXMuX2xleGVyLmFkZENodW5rO1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLl9sZXhlci5lbmQ7XG4gICAgfVxuICB9LFxufTtcblxuLy8gVGhlIGVtcHR5IGZ1bmN0aW9uXG5mdW5jdGlvbiBub29wKCkge31cblxuLy8gIyMgRXhwb3J0c1xuXG4vLyBFeHBvcnQgdGhlIGBOM1BhcnNlcmAgY2xhc3MgYXMgYSB3aG9sZS5cbm1vZHVsZS5leHBvcnRzID0gTjNQYXJzZXI7XG4iLCIvLyAqKk4zU3RvcmUqKiBvYmplY3RzIHN0b3JlIE4zIHRyaXBsZXMgYnkgZ3JhcGggaW4gbWVtb3J5LlxuXG52YXIgZXhwYW5kUHJlZml4ZWROYW1lID0gcmVxdWlyZSgnLi9OM1V0aWwnKS5leHBhbmRQcmVmaXhlZE5hbWU7XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1N0b3JlKHRyaXBsZXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RvcmUpKVxuICAgIHJldHVybiBuZXcgTjNTdG9yZSh0cmlwbGVzLCBvcHRpb25zKTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHRyaXBsZXMgaXMgaW5pdGlhbGx5IHplcm8uXG4gIHRoaXMuX3NpemUgPSAwO1xuICAvLyBgX2dyYXBoc2AgY29udGFpbnMgc3ViamVjdCwgcHJlZGljYXRlLCBhbmQgb2JqZWN0IGluZGV4ZXMgcGVyIGdyYXBoLlxuICB0aGlzLl9ncmFwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBgX2VudGl0aWVzYCBtYXBzIGVudGl0aWVzIHN1Y2ggYXMgYGh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvbmFtZWAgdG8gbnVtYmVycy5cbiAgLy8gVGhpcyBzYXZlcyBtZW1vcnksIHNpbmNlIG9ubHkgdGhlIG51bWJlcnMgaGF2ZSB0byBiZSBzdG9yZWQgaW4gYF9ncmFwaHNgLlxuICB0aGlzLl9lbnRpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRoaXMuX2VudGl0aWVzWyc+PCddID0gMDsgLy8gRHVtbXkgZW50cnksIHNvIHRoZSBmaXJzdCBhY3R1YWwga2V5IGlzIG5vbi16ZXJvXG4gIHRoaXMuX2VudGl0eUNvdW50ID0gMDtcbiAgLy8gYF9ibGFua05vZGVJbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNyZWF0ZWQgYmxhbmsgbm9kZSB0aGF0IHdhcyBhdXRvbWF0aWNhbGx5IG5hbWVkXG4gIHRoaXMuX2JsYW5rTm9kZUluZGV4ID0gMDtcblxuICAvLyBTaGlmdCBwYXJhbWV0ZXJzIGlmIGB0cmlwbGVzYCBpcyBub3QgZ2l2ZW5cbiAgaWYgKCFvcHRpb25zICYmIHRyaXBsZXMgJiYgIXRyaXBsZXNbMF0pXG4gICAgb3B0aW9ucyA9IHRyaXBsZXMsIHRyaXBsZXMgPSBudWxsO1xuXG4gIC8vIEFkZCB0cmlwbGVzIGFuZCBwcmVmaXhlcyBpZiBwYXNzZWRcbiAgdGhpcy5fcHJlZml4ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnByZWZpeGVzKVxuICAgIHRoaXMuYWRkUHJlZml4ZXMob3B0aW9ucy5wcmVmaXhlcyk7XG4gIGlmICh0cmlwbGVzKVxuICAgIHRoaXMuYWRkVHJpcGxlcyh0cmlwbGVzKTtcbn1cblxuTjNTdG9yZS5wcm90b3R5cGUgPSB7XG4gIC8vICMjIFB1YmxpYyBwcm9wZXJ0aWVzXG5cbiAgLy8gIyMjIGBzaXplYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBpbiB0aGUgc3RvcmUuXG4gIGdldCBzaXplKCkge1xuICAgIC8vIFJldHVybiB0aGUgdHJpcGxlIGNvdW50IGlmIGlmIHdhcyBjYWNoZWQuXG4gICAgdmFyIHNpemUgPSB0aGlzLl9zaXplO1xuICAgIGlmIChzaXplICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHNpemU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0cmlwbGVzIGJ5IGNvdW50aW5nIHRvIHRoZSBkZWVwZXN0IGxldmVsLlxuICAgIHZhciBncmFwaHMgPSB0aGlzLl9ncmFwaHMsIHN1YmplY3RzLCBzdWJqZWN0O1xuICAgIGZvciAodmFyIGdyYXBoS2V5IGluIGdyYXBocylcbiAgICAgIGZvciAodmFyIHN1YmplY3RLZXkgaW4gKHN1YmplY3RzID0gZ3JhcGhzW2dyYXBoS2V5XS5zdWJqZWN0cykpXG4gICAgICAgIGZvciAodmFyIHByZWRpY2F0ZUtleSBpbiAoc3ViamVjdCA9IHN1YmplY3RzW3N1YmplY3RLZXldKSlcbiAgICAgICAgICBzaXplICs9IE9iamVjdC5rZXlzKHN1YmplY3RbcHJlZGljYXRlS2V5XSkubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9zaXplID0gc2l6ZTtcbiAgfSxcblxuICAvLyAjIyBQcml2YXRlIG1ldGhvZHNcblxuICAvLyAjIyMgYF9hZGRUb0luZGV4YCBhZGRzIGEgdHJpcGxlIHRvIGEgdGhyZWUtbGF5ZXJlZCBpbmRleC5cbiAgX2FkZFRvSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICAvLyBDcmVhdGUgbGF5ZXJzIGFzIG5lY2Vzc2FyeS5cbiAgICB2YXIgaW5kZXgxID0gaW5kZXgwW2tleTBdIHx8IChpbmRleDBba2V5MF0gPSB7fSk7XG4gICAgdmFyIGluZGV4MiA9IGluZGV4MVtrZXkxXSB8fCAoaW5kZXgxW2tleTFdID0ge30pO1xuICAgIC8vIFNldHRpbmcgdGhlIGtleSB0byBfYW55XyB2YWx1ZSBzaWduYWxpemVzIHRoZSBwcmVzZW5jZSBvZiB0aGUgdHJpcGxlLlxuICAgIGluZGV4MltrZXkyXSA9IG51bGw7XG4gIH0sXG5cbiAgLy8gIyMjIGBfcmVtb3ZlRnJvbUluZGV4YCByZW1vdmVzIGEgdHJpcGxlIGZyb20gYSB0aHJlZS1sYXllcmVkIGluZGV4LlxuICBfcmVtb3ZlRnJvbUluZGV4OiBmdW5jdGlvbiAoaW5kZXgwLCBrZXkwLCBrZXkxLCBrZXkyKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSB0cmlwbGUgZnJvbSB0aGUgaW5kZXguXG4gICAgdmFyIGluZGV4MSA9IGluZGV4MFtrZXkwXSwgaW5kZXgyID0gaW5kZXgxW2tleTFdLCBrZXk7XG4gICAgZGVsZXRlIGluZGV4MltrZXkyXTtcblxuICAgIC8vIFJlbW92ZSBpbnRlcm1lZGlhcnkgaW5kZXggbGF5ZXJzIGlmIHRoZXkgYXJlIGVtcHR5LlxuICAgIGZvciAoa2V5IGluIGluZGV4MikgcmV0dXJuO1xuICAgIGRlbGV0ZSBpbmRleDFba2V5MV07XG4gICAgZm9yIChrZXkgaW4gaW5kZXgxKSByZXR1cm47XG4gICAgZGVsZXRlIGluZGV4MFtrZXkwXTtcbiAgfSxcblxuICAvLyAjIyMgYF9maW5kSW5JbmRleGAgZmluZHMgYSBzZXQgb2YgdHJpcGxlcyBpbiBhIHRocmVlLWxheWVyZWQgaW5kZXguXG4gIC8vIFRoZSBpbmRleCBiYXNlIGlzIGBpbmRleDBgIGFuZCB0aGUga2V5cyBhdCBlYWNoIGxldmVsIGFyZSBga2V5MGAsIGBrZXkxYCwgYW5kIGBrZXkyYC5cbiAgLy8gQW55IG9mIHRoZXNlIGtleXMgY2FuIGJlIGBudWxsYCwgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgLy8gYG5hbWUwYCwgYG5hbWUxYCwgYW5kIGBuYW1lMmAgYXJlIHRoZSBuYW1lcyBvZiB0aGUga2V5cyBhdCBlYWNoIGxldmVsLFxuICAvLyB1c2VkIHdoZW4gcmVjb25zdHJ1Y3RpbmcgdGhlIHJlc3VsdGluZyB0cmlwbGVcbiAgLy8gKGZvciBpbnN0YW5jZTogX3N1YmplY3RfLCBfcHJlZGljYXRlXywgYW5kIF9vYmplY3RfKS5cbiAgLy8gRmluYWxseSwgYGdyYXBoYCB3aWxsIGJlIHRoZSBncmFwaCBvZiB0aGUgY3JlYXRlZCB0cmlwbGVzLlxuICBfZmluZEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIsIG5hbWUwLCBuYW1lMSwgbmFtZTIsIGdyYXBoKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSwgZW50aXR5S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuX2VudGl0aWVzKSwgdG1wLCBpbmRleDEsIGluZGV4MjtcblxuICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDAuXG4gICAgaWYgKGtleTApICh0bXAgPSBpbmRleDAsIGluZGV4MCA9IHt9KVtrZXkwXSA9IHRtcFtrZXkwXTtcbiAgICBmb3IgKHZhciB2YWx1ZTAgaW4gaW5kZXgwKSB7XG4gICAgICB2YXIgZW50aXR5MCA9IGVudGl0eUtleXNbdmFsdWUwXTtcblxuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgdXNlIG9ubHkgdGhhdCBwYXJ0IG9mIGluZGV4IDEuXG4gICAgICAgIGlmIChrZXkxKSAodG1wID0gaW5kZXgxLCBpbmRleDEgPSB7fSlba2V5MV0gPSB0bXBba2V5MV07XG4gICAgICAgIGZvciAodmFyIHZhbHVlMSBpbiBpbmRleDEpIHtcbiAgICAgICAgICB2YXIgZW50aXR5MSA9IGVudGl0eUtleXNbdmFsdWUxXTtcblxuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCB1c2Ugb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMiwgaWYgaXQgZXhpc3RzLlxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IGtleTIgPyAoa2V5MiBpbiBpbmRleDIgPyBba2V5Ml0gOiBbXSkgOiBPYmplY3Qua2V5cyhpbmRleDIpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRyaXBsZXMgZm9yIGFsbCBpdGVtcyBmb3VuZCBpbiBpbmRleCAyLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IHZhbHVlcy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0geyBzdWJqZWN0OiAnJywgcHJlZGljYXRlOiAnJywgb2JqZWN0OiAnJywgZ3JhcGg6IGdyYXBoIH07XG4gICAgICAgICAgICAgIHJlc3VsdFtuYW1lMF0gPSBlbnRpdHkwO1xuICAgICAgICAgICAgICByZXN1bHRbbmFtZTFdID0gZW50aXR5MTtcbiAgICAgICAgICAgICAgcmVzdWx0W25hbWUyXSA9IGVudGl0eUtleXNbdmFsdWVzW2xdXTtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9LFxuXG4gIC8vICMjIyBgX2NvdW50SW5JbmRleGAgY291bnRzIG1hdGNoaW5nIHRyaXBsZXMgaW4gYSB0aHJlZS1sYXllcmVkIGluZGV4LlxuICAvLyBUaGUgaW5kZXggYmFzZSBpcyBgaW5kZXgwYCBhbmQgdGhlIGtleXMgYXQgZWFjaCBsZXZlbCBhcmUgYGtleTBgLCBga2V5MWAsIGFuZCBga2V5MmAuXG4gIC8vIEFueSBvZiB0aGVzZSBrZXlzIGNhbiBiZSBgbnVsbGAsIHdoaWNoIGlzIGludGVycHJldGVkIGFzIGEgd2lsZGNhcmQuXG4gIF9jb3VudEluSW5kZXg6IGZ1bmN0aW9uIChpbmRleDAsIGtleTAsIGtleTEsIGtleTIpIHtcbiAgICB2YXIgY291bnQgPSAwLCB0bXAsIGluZGV4MSwgaW5kZXgyO1xuXG4gICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCBvbmx5IHRoYXQgcGFydCBvZiBpbmRleCAwLlxuICAgIGlmIChrZXkwKSAodG1wID0gaW5kZXgwLCBpbmRleDAgPSB7fSlba2V5MF0gPSB0bXBba2V5MF07XG4gICAgZm9yICh2YXIgdmFsdWUwIGluIGluZGV4MCkge1xuICAgICAgaWYgKGluZGV4MSA9IGluZGV4MFt2YWx1ZTBdKSB7XG4gICAgICAgIC8vIElmIGEga2V5IGlzIHNwZWNpZmllZCwgY291bnQgb25seSB0aGF0IHBhcnQgb2YgaW5kZXggMS5cbiAgICAgICAgaWYgKGtleTEpICh0bXAgPSBpbmRleDEsIGluZGV4MSA9IHt9KVtrZXkxXSA9IHRtcFtrZXkxXTtcbiAgICAgICAgZm9yICh2YXIgdmFsdWUxIGluIGluZGV4MSkge1xuICAgICAgICAgIGlmIChpbmRleDIgPSBpbmRleDFbdmFsdWUxXSkge1xuICAgICAgICAgICAgLy8gSWYgYSBrZXkgaXMgc3BlY2lmaWVkLCBjb3VudCB0aGUgdHJpcGxlIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgICAgIGlmIChrZXkyKSAoa2V5MiBpbiBpbmRleDIpICYmIGNvdW50Kys7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvdW50IGFsbCB0cmlwbGVzLlxuICAgICAgICAgICAgZWxzZSBjb3VudCArPSBPYmplY3Qua2V5cyhpbmRleDIpLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9LFxuXG4gIC8vICMjIFB1YmxpYyBtZXRob2RzXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgYSBuZXcgTjMgdHJpcGxlIHRvIHRoZSBzdG9yZS5cbiAgYWRkVHJpcGxlOiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIGEgdHJpcGxlIG9iamVjdCBpcyBnaXZlbiBpbnN0ZWFkIG9mIGNvbXBvbmVudHNcbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuXG4gICAgLy8gRmluZCB0aGUgZ3JhcGggdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHRyaXBsZS5cbiAgICBncmFwaCA9IGdyYXBoIHx8ICcnO1xuICAgIHZhciBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdO1xuICAgIC8vIENyZWF0ZSB0aGUgZ3JhcGggaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuXG4gICAgaWYgKCFncmFwaEl0ZW0pIHtcbiAgICAgIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF0gPSB7IHN1YmplY3RzOiB7fSwgcHJlZGljYXRlczoge30sIG9iamVjdHM6IHt9IH07XG4gICAgICAvLyBGcmVlemluZyBhIGdyYXBoIGhlbHBzIHN1YnNlcXVlbnQgYGFkZGAgcGVyZm9ybWFuY2UsXG4gICAgICAvLyBhbmQgcHJvcGVydGllcyB3aWxsIG5ldmVyIGJlIG1vZGlmaWVkIGFueXdheS5cbiAgICAgIE9iamVjdC5mcmVlemUoZ3JhcGhJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBlbnRpdGllcyBjYW4gb2Z0ZW4gYmUgbG9uZyBJUklzLCB3ZSBhdm9pZCBzdG9yaW5nIHRoZW0gaW4gZXZlcnkgaW5kZXguXG4gICAgLy8gSW5zdGVhZCwgd2UgaGF2ZSBhIHNlcGFyYXRlIGluZGV4IHRoYXQgbWFwcyBlbnRpdGllcyB0byBudW1iZXJzLFxuICAgIC8vIHdoaWNoIGFyZSB0aGVuIHVzZWQgYXMga2V5cyBpbiB0aGUgb3RoZXIgaW5kZXhlcy5cbiAgICB2YXIgZW50aXRpZXMgPSB0aGlzLl9lbnRpdGllcztcbiAgICBzdWJqZWN0ICAgPSBlbnRpdGllc1tzdWJqZWN0XSAgIHx8IChlbnRpdGllc1tzdWJqZWN0XSAgID0gKyt0aGlzLl9lbnRpdHlDb3VudCk7XG4gICAgcHJlZGljYXRlID0gZW50aXRpZXNbcHJlZGljYXRlXSB8fCAoZW50aXRpZXNbcHJlZGljYXRlXSA9ICsrdGhpcy5fZW50aXR5Q291bnQpO1xuICAgIG9iamVjdCAgICA9IGVudGl0aWVzW29iamVjdF0gICAgfHwgKGVudGl0aWVzW29iamVjdF0gICAgPSArK3RoaXMuX2VudGl0eUNvdW50KTtcblxuICAgIHRoaXMuX2FkZFRvSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCAgIHN1YmplY3QsICAgcHJlZGljYXRlLCBvYmplY3QpO1xuICAgIHRoaXMuX2FkZFRvSW5kZXgoZ3JhcGhJdGVtLnByZWRpY2F0ZXMsIHByZWRpY2F0ZSwgb2JqZWN0LCAgICBzdWJqZWN0KTtcbiAgICB0aGlzLl9hZGRUb0luZGV4KGdyYXBoSXRlbS5vYmplY3RzLCAgICBvYmplY3QsICAgIHN1YmplY3QsICAgcHJlZGljYXRlKTtcblxuICAgIC8vIFRoZSBjYWNoZWQgdHJpcGxlIGNvdW50IGlzIG5vdyBpbnZhbGlkLlxuICAgIHRoaXMuX3NpemUgPSBudWxsO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkVHJpcGxlc2AgYWRkcyBtdWx0aXBsZSBOMyB0cmlwbGVzIHRvIHRoZSBzdG9yZS5cbiAgYWRkVHJpcGxlczogZnVuY3Rpb24gKHRyaXBsZXMpIHtcbiAgICBmb3IgKHZhciBpID0gdHJpcGxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgIHRoaXMuYWRkVHJpcGxlKHRyaXBsZXNbaV0pO1xuICB9LFxuXG4gIC8vICMjIyBgYWRkUHJlZml4YCBhZGRzIHN1cHBvcnQgZm9yIHF1ZXJ5aW5nIHdpdGggdGhlIGdpdmVuIHByZWZpeFxuICBhZGRQcmVmaXg6IGZ1bmN0aW9uIChwcmVmaXgsIGlyaSkge1xuICAgIHRoaXMuX3ByZWZpeGVzW3ByZWZpeF0gPSBpcmk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhlc2AgYWRkcyBzdXBwb3J0IGZvciBxdWVyeWluZyB3aXRoIHRoZSBnaXZlbiBwcmVmaXhlc1xuICBhZGRQcmVmaXhlczogZnVuY3Rpb24gKHByZWZpeGVzKSB7XG4gICAgZm9yICh2YXIgcHJlZml4IGluIHByZWZpeGVzKVxuICAgICAgdGhpcy5hZGRQcmVmaXgocHJlZml4LCBwcmVmaXhlc1twcmVmaXhdKTtcbiAgfSxcblxuICAvLyAjIyMgYHJlbW92ZVRyaXBsZWAgcmVtb3ZlcyBhbiBOMyB0cmlwbGUgZnJvbSB0aGUgc3RvcmUgaWYgaXQgZXhpc3RzLlxuICByZW1vdmVUcmlwbGU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICAvLyBTaGlmdCBhcmd1bWVudHMgaWYgYSB0cmlwbGUgb2JqZWN0IGlzIGdpdmVuIGluc3RlYWQgb2YgY29tcG9uZW50cy5cbiAgICBpZiAoIXByZWRpY2F0ZSlcbiAgICAgIGdyYXBoID0gc3ViamVjdC5ncmFwaCwgb2JqZWN0ID0gc3ViamVjdC5vYmplY3QsXG4gICAgICAgIHByZWRpY2F0ZSA9IHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0ID0gc3ViamVjdC5zdWJqZWN0O1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG5cbiAgICAvLyBGaW5kIGludGVybmFsIGlkZW50aWZpZXJzIGZvciBhbGwgY29tcG9uZW50cy5cbiAgICB2YXIgZ3JhcGhJdGVtLCBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzLCBncmFwaHMgPSB0aGlzLl9ncmFwaHM7XG4gICAgaWYgKCEoc3ViamVjdCAgICAgPSBlbnRpdGllc1tzdWJqZWN0XSkpICAgcmV0dXJuO1xuICAgIGlmICghKHByZWRpY2F0ZSAgID0gZW50aXRpZXNbcHJlZGljYXRlXSkpIHJldHVybjtcbiAgICBpZiAoIShvYmplY3QgICAgICA9IGVudGl0aWVzW29iamVjdF0pKSAgICByZXR1cm47XG4gICAgaWYgKCEoZ3JhcGhJdGVtICAgPSBncmFwaHNbZ3JhcGhdKSkgICAgICAgcmV0dXJuO1xuXG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRyaXBsZSBleGlzdHMuXG4gICAgdmFyIHN1YmplY3RzLCBwcmVkaWNhdGVzO1xuICAgIGlmICghKHN1YmplY3RzICAgPSBncmFwaEl0ZW0uc3ViamVjdHNbc3ViamVjdF0pKSByZXR1cm47XG4gICAgaWYgKCEocHJlZGljYXRlcyA9IHN1YmplY3RzW3ByZWRpY2F0ZV0pKSByZXR1cm47XG4gICAgaWYgKCEob2JqZWN0IGluIHByZWRpY2F0ZXMpKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgaXQgZnJvbSBhbGwgaW5kZXhlcy5cbiAgICB0aGlzLl9yZW1vdmVGcm9tSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCAgIHN1YmplY3QsICAgcHJlZGljYXRlLCBvYmplY3QpO1xuICAgIHRoaXMuX3JlbW92ZUZyb21JbmRleChncmFwaEl0ZW0ucHJlZGljYXRlcywgcHJlZGljYXRlLCBvYmplY3QsICAgIHN1YmplY3QpO1xuICAgIHRoaXMuX3JlbW92ZUZyb21JbmRleChncmFwaEl0ZW0ub2JqZWN0cywgICAgb2JqZWN0LCAgICBzdWJqZWN0LCAgIHByZWRpY2F0ZSk7XG4gICAgaWYgKHRoaXMuX3NpemUgIT09IG51bGwpIHRoaXMuX3NpemUtLTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZ3JhcGggaWYgaXQgaXMgZW1wdHkuXG4gICAgZm9yIChzdWJqZWN0IGluIGdyYXBoSXRlbS5zdWJqZWN0cykgcmV0dXJuO1xuICAgIGRlbGV0ZSBncmFwaHNbZ3JhcGhdO1xuICB9LFxuXG4gIC8vICMjIyBgcmVtb3ZlVHJpcGxlc2AgcmVtb3ZlcyBtdWx0aXBsZSBOMyB0cmlwbGVzIGZyb20gdGhlIHN0b3JlLlxuICByZW1vdmVUcmlwbGVzOiBmdW5jdGlvbiAodHJpcGxlcykge1xuICAgIGZvciAodmFyIGkgPSB0cmlwbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgdGhpcy5yZW1vdmVUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmaW5kYCBmaW5kcyBhIHNldCBvZiB0cmlwbGVzIG1hdGNoaW5nIGEgcGF0dGVybiwgZXhwYW5kaW5nIHByZWZpeGVzIGFzIG5lY2Vzc2FyeS5cbiAgLy8gU2V0dGluZyBgc3ViamVjdGAsIGBwcmVkaWNhdGVgLCBvciBgb2JqZWN0YCB0byBgbnVsbGAgbWVhbnMgYW4gX2FueXRoaW5nXyB3aWxkY2FyZC5cbiAgLy8gU2V0dGluZyBgZ3JhcGhgIHRvIGBudWxsYCBtZWFucyB0aGUgZGVmYXVsdCBncmFwaC5cbiAgZmluZDogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIHZhciBwcmVmaXhlcyA9IHRoaXMuX3ByZWZpeGVzO1xuICAgIHJldHVybiB0aGlzLmZpbmRCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShvYmplY3QsICAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBmaW5kQnlJUklgIGZpbmRzIGEgc2V0IG9mIHRyaXBsZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuLlxuICAvLyBTZXR0aW5nIGBzdWJqZWN0YCwgYHByZWRpY2F0ZWAsIG9yIGBvYmplY3RgIHRvIGEgZmFsc3kgdmFsdWUgbWVhbnMgYW4gX2FueXRoaW5nXyB3aWxkY2FyZC5cbiAgLy8gU2V0dGluZyBgZ3JhcGhgIHRvIGEgZmFsc3kgdmFsdWUgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGZpbmRCeUlSSTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCkge1xuICAgIGdyYXBoID0gZ3JhcGggfHwgJyc7XG4gICAgdmFyIGdyYXBoSXRlbSA9IHRoaXMuX2dyYXBoc1tncmFwaF0sIGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXM7XG5cbiAgICAvLyBJZiB0aGUgc3BlY2lmaWVkIGdyYXBoIGNvbnRhaW4gbm8gdHJpcGxlcywgdGhlcmUgYXJlIG5vIHJlc3VsdHMuXG4gICAgaWYgKCFncmFwaEl0ZW0pIHJldHVybiBbXTtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgLy8gT3B0aW1pemF0aW9uOiBpZiB0aGUgZW50aXR5IGRvZXNuJ3QgZXhpc3QsIG5vIHRyaXBsZXMgd2l0aCBpdCBleGlzdC5cbiAgICBpZiAoc3ViamVjdCAgICYmICEoc3ViamVjdCAgID0gZW50aXRpZXNbc3ViamVjdF0pKSAgIHJldHVybiBbXTtcbiAgICBpZiAocHJlZGljYXRlICYmICEocHJlZGljYXRlID0gZW50aXRpZXNbcHJlZGljYXRlXSkpIHJldHVybiBbXTtcbiAgICBpZiAob2JqZWN0ICAgICYmICEob2JqZWN0ICAgID0gZW50aXRpZXNbb2JqZWN0XSkpICAgIHJldHVybiBbXTtcblxuICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgaWYgKG9iamVjdClcbiAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsIG9iamVjdCwgc3ViamVjdCwgcHJlZGljYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcsICdzdWJqZWN0JywgJ3ByZWRpY2F0ZScsIGdyYXBoKTtcbiAgICAgIGVsc2VcbiAgICAgICAgLy8gSWYgb25seSBzdWJqZWN0IGFuZCBwb3NzaWJseSBwcmVkaWNhdGUgYXJlIGdpdmVuLCB0aGUgc3ViamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLnN1YmplY3RzLCBzdWJqZWN0LCBwcmVkaWNhdGUsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsICdwcmVkaWNhdGUnLCAnb2JqZWN0JywgZ3JhcGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcmVkaWNhdGUpXG4gICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRJbkluZGV4KGdyYXBoSXRlbS5wcmVkaWNhdGVzLCBwcmVkaWNhdGUsIG9iamVjdCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZGljYXRlJywgJ29iamVjdCcsICdzdWJqZWN0JywgZ3JhcGgpO1xuICAgIGVsc2UgaWYgKG9iamVjdClcbiAgICAgIC8vIElmIG9ubHkgb2JqZWN0IGlzIGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3QuXG4gICAgICByZXR1cm4gdGhpcy5fZmluZEluSW5kZXgoZ3JhcGhJdGVtLm9iamVjdHMsIG9iamVjdCwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JywgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgZ3JhcGgpO1xuICAgIGVsc2VcbiAgICAgIC8vIElmIG5vdGhpbmcgaXMgZ2l2ZW4sIGl0ZXJhdGUgc3ViamVjdHMgYW5kIHByZWRpY2F0ZXMgZmlyc3RcbiAgICAgIHJldHVybiB0aGlzLl9maW5kSW5JbmRleChncmFwaEl0ZW0uc3ViamVjdHMsIG51bGwsIG51bGwsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmplY3QnLCAncHJlZGljYXRlJywgJ29iamVjdCcsIGdyYXBoKTtcbiAgfSxcblxuICAvLyAjIyMgYGNvdW50YCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4sIGV4cGFuZGluZyBwcmVmaXhlcyBhcyBuZWNlc3NhcnkuXG4gIC8vIFNldHRpbmcgYHN1YmplY3RgLCBgcHJlZGljYXRlYCwgb3IgYG9iamVjdGAgdG8gYG51bGxgIG1lYW5zIGFuIF9hbnl0aGluZ18gd2lsZGNhcmQuXG4gIC8vIFNldHRpbmcgYGdyYXBoYCB0byBgbnVsbGAgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGNvdW50OiBmdW5jdGlvbiAoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsIGdyYXBoKSB7XG4gICAgdmFyIHByZWZpeGVzID0gdGhpcy5fcHJlZml4ZXM7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCeUlSSShcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShzdWJqZWN0LCAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShwcmVkaWNhdGUsIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShvYmplY3QsICAgIHByZWZpeGVzKSxcbiAgICAgIGV4cGFuZFByZWZpeGVkTmFtZShncmFwaCwgICAgIHByZWZpeGVzKVxuICAgICk7XG4gIH0sXG5cbiAgLy8gIyMjIGBjb3VudEJ5SVJJYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJpcGxlcyBtYXRjaGluZyBhIHBhdHRlcm4uXG4gIC8vIFNldHRpbmcgYHN1YmplY3RgLCBgcHJlZGljYXRlYCwgb3IgYG9iamVjdGAgdG8gYG51bGxgIG1lYW5zIGFuIF9hbnl0aGluZ18gd2lsZGNhcmQuXG4gIC8vIFNldHRpbmcgYGdyYXBoYCB0byBgbnVsbGAgbWVhbnMgdGhlIGRlZmF1bHQgZ3JhcGguXG4gIGNvdW50QnlJUkk6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgpIHtcbiAgICBncmFwaCA9IGdyYXBoIHx8ICcnO1xuICAgIHZhciBncmFwaEl0ZW0gPSB0aGlzLl9ncmFwaHNbZ3JhcGhdLCBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzO1xuXG4gICAgLy8gSWYgdGhlIHNwZWNpZmllZCBncmFwaCBjb250YWluIG5vIHRyaXBsZXMsIHRoZXJlIGFyZSBubyByZXN1bHRzLlxuICAgIGlmICghZ3JhcGhJdGVtKSByZXR1cm4gMDtcblxuICAgIC8vIFRyYW5zbGF0ZSBJUklzIHRvIGludGVybmFsIGluZGV4IGtleXMuXG4gICAgLy8gT3B0aW1pemF0aW9uOiBpZiB0aGUgZW50aXR5IGRvZXNuJ3QgZXhpc3QsIG5vIHRyaXBsZXMgd2l0aCBpdCBleGlzdC5cbiAgICBpZiAoc3ViamVjdCAgICYmICEoc3ViamVjdCAgID0gZW50aXRpZXNbc3ViamVjdF0pKSAgIHJldHVybiAwO1xuICAgIGlmIChwcmVkaWNhdGUgJiYgIShwcmVkaWNhdGUgPSBlbnRpdGllc1twcmVkaWNhdGVdKSkgcmV0dXJuIDA7XG4gICAgaWYgKG9iamVjdCAgICAmJiAhKG9iamVjdCAgICA9IGVudGl0aWVzW29iamVjdF0pKSAgICByZXR1cm4gMDtcblxuICAgIC8vIENob29zZSB0aGUgb3B0aW1hbCBpbmRleCwgYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIHByZXNlbnRcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgaWYgKG9iamVjdClcbiAgICAgICAgLy8gSWYgc3ViamVjdCBhbmQgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIG9iamVjdCBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRJbkluZGV4KGdyYXBoSXRlbS5vYmplY3RzLCBvYmplY3QsIHN1YmplY3QsIHByZWRpY2F0ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIC8vIElmIG9ubHkgc3ViamVjdCBhbmQgcG9zc2libHkgcHJlZGljYXRlIGFyZSBnaXZlbiwgdGhlIHN1YmplY3QgaW5kZXggd2lsbCBiZSB0aGUgZmFzdGVzdC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50SW5JbmRleChncmFwaEl0ZW0uc3ViamVjdHMsIHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gICAgICAvLyBJZiBvbmx5IHByZWRpY2F0ZSBhbmQgcG9zc2libHkgb2JqZWN0IGFyZSBnaXZlbiwgdGhlIHByZWRpY2F0ZSBpbmRleCB3aWxsIGJlIHRoZSBmYXN0ZXN0LlxuICAgICAgcmV0dXJuIHRoaXMuX2NvdW50SW5JbmRleChncmFwaEl0ZW0ucHJlZGljYXRlcywgcHJlZGljYXRlLCBvYmplY3QsIHN1YmplY3QpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIElmIG9ubHkgb2JqZWN0IGlzIHBvc3NpYmx5IGdpdmVuLCB0aGUgb2JqZWN0IGluZGV4IHdpbGwgYmUgdGhlIGZhc3Rlc3QuXG4gICAgICByZXR1cm4gdGhpcy5fY291bnRJbkluZGV4KGdyYXBoSXRlbS5vYmplY3RzLCBvYmplY3QsIHN1YmplY3QsIHByZWRpY2F0ZSk7XG4gICAgfVxuICB9LFxuXG4gIC8vICMjIyBgY3JlYXRlQmxhbmtOb2RlYCBjcmVhdGVzIGEgbmV3IGJsYW5rIG5vZGUsIHJldHVybmluZyBpdHMgbmFtZS5cbiAgY3JlYXRlQmxhbmtOb2RlOiBmdW5jdGlvbiAoc3VnZ2VzdGVkTmFtZSkge1xuICAgIHZhciBuYW1lLCBpbmRleDtcbiAgICAvLyBHZW5lcmF0ZSBhIG5hbWUgYmFzZWQgb24gdGhlIHN1Z2dlc3RlZCBuYW1lXG4gICAgaWYgKHN1Z2dlc3RlZE5hbWUpIHtcbiAgICAgIG5hbWUgPSBzdWdnZXN0ZWROYW1lID0gJ186JyArIHN1Z2dlc3RlZE5hbWUsIGluZGV4ID0gMTtcbiAgICAgIHdoaWxlICh0aGlzLl9lbnRpdGllc1tuYW1lXSlcbiAgICAgICAgbmFtZSA9IHN1Z2dlc3RlZE5hbWUgKyBpbmRleCsrO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSBhIGdlbmVyaWMgYmxhbmsgbm9kZSBuYW1lXG4gICAgZWxzZSB7XG4gICAgICBkbyB7IG5hbWUgPSAnXzpiJyArIHRoaXMuX2JsYW5rTm9kZUluZGV4Kys7IH1cbiAgICAgIHdoaWxlICh0aGlzLl9lbnRpdGllc1tuYW1lXSk7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgYmxhbmsgbm9kZSB0byB0aGUgZW50aXRpZXMsIGF2b2lkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9lbnRpdGllc1tuYW1lXSA9ICsrdGhpcy5fZW50aXR5Q291bnQ7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0sXG59O1xuXG4vLyAjIyBFeHBvcnRzXG5cbi8vIEV4cG9ydCB0aGUgYE4zU3RvcmVgIGNsYXNzIGFzIGEgd2hvbGUuXG5tb2R1bGUuZXhwb3J0cyA9IE4zU3RvcmU7XG4iLCIvLyAqKk4zU3RyZWFtUGFyc2VyKiogcGFyc2VzIGFuIE4zIHN0cmVhbSBpbnRvIGEgdHJpcGxlIHN0cmVhbVxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybSxcbiAgICB1dGlsID0gcmVxdWlyZSgndXRpbCcpLFxuICAgIE4zUGFyc2VyID0gcmVxdWlyZSgnLi9OM1BhcnNlci5qcycpO1xuXG4vLyAjIyBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gTjNTdHJlYW1QYXJzZXIob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTjNTdHJlYW1QYXJzZXIpKVxuICAgIHJldHVybiBuZXcgTjNTdHJlYW1QYXJzZXIob3B0aW9ucyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBUcmFuc2Zvcm0gYmFzZSBjbGFzc1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCB7IGRlY29kZVN0cmluZ3M6IHRydWUgfSk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA9IHRydWU7XG5cbiAgLy8gU2V0IHVwIHBhcnNlclxuICB2YXIgc2VsZiA9IHRoaXMsIHBhcnNlciA9IG5ldyBOM1BhcnNlcihvcHRpb25zKTtcbiAgcGFyc2VyLnBhcnNlKFxuICAgIC8vIEhhbmRsZSB0cmlwbGVzIGJ5IHB1c2hpbmcgdGhlbSBkb3duIHRoZSBwaXBlbGluZVxuICAgIGZ1bmN0aW9uIChlcnJvciwgdHJpcGxlKSB7XG4gICAgICB0cmlwbGUgJiYgc2VsZi5wdXNoKHRyaXBsZSkgfHxcbiAgICAgIGVycm9yICAmJiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH0sXG4gICAgLy8gRW1pdCBwcmVmaXhlcyB0aHJvdWdoIHRoZSBgcHJlZml4YCBldmVudFxuICAgIHRoaXMuZW1pdC5iaW5kKHRoaXMsICdwcmVmaXgnKSk7XG5cbiAgLy8gSW1wbGVtZW50IFRyYW5zZm9ybSBtZXRob2RzIG9uIHRvcCBvZiBwYXJzZXJcbiAgdGhpcy5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkgeyBwYXJzZXIuYWRkQ2h1bmsoY2h1bmspOyBkb25lKCk7IH07XG4gIHRoaXMuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHsgcGFyc2VyLmVuZCgpOyBkb25lKCk7IH07XG59XG51dGlsLmluaGVyaXRzKE4zU3RyZWFtUGFyc2VyLCBUcmFuc2Zvcm0pO1xuXG4vLyAjIyBFeHBvcnRzXG4vLyBFeHBvcnQgdGhlIGBOM1N0cmVhbVBhcnNlcmAgY2xhc3MgYXMgYSB3aG9sZS5cbm1vZHVsZS5leHBvcnRzID0gTjNTdHJlYW1QYXJzZXI7XG4iLCIvLyAqKk4zU3RyZWFtV3JpdGVyKiogc2VyaWFsaXplcyBhIHRyaXBsZSBzdHJlYW0gaW50byBhbiBOMyBzdHJlYW1cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm0sXG4gICAgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKSxcbiAgICBOM1dyaXRlciA9IHJlcXVpcmUoJy4vTjNXcml0ZXIuanMnKTtcblxuLy8gIyMgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zU3RyZWFtV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zU3RyZWFtV3JpdGVyKG9wdGlvbnMpO1xuXG4gIC8vIEluaXRpYWxpemUgVHJhbnNmb3JtIGJhc2UgY2xhc3NcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLm9iamVjdE1vZGUgPSB0cnVlO1xuXG4gIC8vIFNldCB1cCB3cml0ZXIgd2l0aCBhIGR1bW15IHN0cmVhbSBvYmplY3RcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgd3JpdGVyID0gbmV3IE4zV3JpdGVyKHtcbiAgICB3cml0ZTogZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHsgc2VsZi5wdXNoKGNodW5rKTsgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTsgfSxcbiAgICBlbmQ6IGZ1bmN0aW9uIChjYWxsYmFjaykgeyBzZWxmLnB1c2gobnVsbCk7IGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7IH0sXG4gIH0sIG9wdGlvbnMpO1xuXG4gIC8vIEltcGxlbWVudCBUcmFuc2Zvcm0gbWV0aG9kcyBvbiB0b3Agb2Ygd3JpdGVyXG4gIHRoaXMuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uICh0cmlwbGUsIGVuY29kaW5nLCBkb25lKSB7IHdyaXRlci5hZGRUcmlwbGUodHJpcGxlLCBkb25lKTsgfTtcbiAgdGhpcy5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkgeyB3cml0ZXIuZW5kKGRvbmUpOyB9O1xufVxudXRpbC5pbmhlcml0cyhOM1N0cmVhbVdyaXRlciwgVHJhbnNmb3JtKTtcblxuLy8gIyMgRXhwb3J0c1xuLy8gRXhwb3J0IHRoZSBgTjNTdHJlYW1Xcml0ZXJgIGNsYXNzIGFzIGEgd2hvbGUuXG5tb2R1bGUuZXhwb3J0cyA9IE4zU3RyZWFtV3JpdGVyO1xuIiwiLy8gKipOM1V0aWwqKiBwcm92aWRlcyBOMyB1dGlsaXR5IGZ1bmN0aW9uc1xuXG52YXIgWHNkID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIyc7XG52YXIgWHNkU3RyaW5nICA9IFhzZCArICdzdHJpbmcnO1xudmFyIFhzZEludGVnZXIgPSBYc2QgKyAnaW50ZWdlcic7XG52YXIgWHNkRGVjaW1hbCA9IFhzZCArICdkZWNpbWFsJztcbnZhciBYc2RCb29sZWFuID0gWHNkICsgJ2Jvb2xlYW4nO1xudmFyIFJkZkxhbmdTdHJpbmcgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI2xhbmdTdHJpbmcnO1xuXG52YXIgTjNVdGlsID0ge1xuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYW4gSVJJIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzSVJJOiBmdW5jdGlvbiAoZW50aXR5KSB7XG4gICAgaWYgKCFlbnRpdHkpXG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIHZhciBmaXJzdENoYXIgPSBlbnRpdHlbMF07XG4gICAgcmV0dXJuIGZpcnN0Q2hhciAhPT0gJ1wiJyAmJiBmaXJzdENoYXIgIT09ICdfJztcbiAgfSxcblxuICAvLyBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRpdHkgKHRyaXBsZSBvYmplY3QpIHJlcHJlc2VudHMgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGlzTGl0ZXJhbDogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5WzBdID09PSAnXCInO1xuICB9LFxuXG4gIC8vIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIGVudGl0eSAodHJpcGxlIG9iamVjdCkgcmVwcmVzZW50cyBhIGJsYW5rIG5vZGUgaW4gdGhlIE4zIGxpYnJhcnlcbiAgaXNCbGFuazogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5LnN1YnN0cigwLCAyKSA9PT0gJ186JztcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxWYWx1ZTogZnVuY3Rpb24gKGxpdGVyYWwpIHtcbiAgICB2YXIgbWF0Y2ggPSAvXlwiKFteXSopXCIvLmV4ZWMobGl0ZXJhbCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgIHRocm93IG5ldyBFcnJvcihsaXRlcmFsICsgJyBpcyBub3QgYSBsaXRlcmFsJyk7XG4gICAgcmV0dXJuIG1hdGNoWzFdO1xuICB9LFxuXG4gIC8vIEdldHMgdGhlIHR5cGUgb2YgYSBsaXRlcmFsIGluIHRoZSBOMyBsaWJyYXJ5XG4gIGdldExpdGVyYWxUeXBlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpcXF5cXF4oW15cIl0rKXwoQClbXkBcIl0rKT8kLy5leGVjKGxpdGVyYWwpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobGl0ZXJhbCArICcgaXMgbm90IGEgbGl0ZXJhbCcpO1xuICAgIHJldHVybiBtYXRjaFsxXSB8fCAobWF0Y2hbMl0gPyBSZGZMYW5nU3RyaW5nIDogWHNkU3RyaW5nKTtcbiAgfSxcblxuICAvLyBHZXRzIHRoZSBsYW5ndWFnZSBvZiBhIGxpdGVyYWwgaW4gdGhlIE4zIGxpYnJhcnlcbiAgZ2V0TGl0ZXJhbExhbmd1YWdlOiBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgIHZhciBtYXRjaCA9IC9eXCJbXl0qXCIoPzpAKFteQFwiXSspfFxcXlxcXlteXCJdKyk/JC8uZXhlYyhsaXRlcmFsKTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxpdGVyYWwgKyAnIGlzIG5vdCBhIGxpdGVyYWwnKTtcbiAgICByZXR1cm4gbWF0Y2hbMV0gPyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gIH0sXG5cbiAgLy8gVGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gZW50aXR5ICh0cmlwbGUgb2JqZWN0KSByZXByZXNlbnRzIGEgcHJlZml4ZWQgbmFtZVxuICBpc1ByZWZpeGVkTmFtZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgL15bXjpcXC9cIiddKjpbXjpcXC9cIiddKyQvLnRlc3QoZW50aXR5KTtcbiAgfSxcblxuICAvLyBFeHBhbmRzIHRoZSBwcmVmaXhlZCBuYW1lIHRvIGEgZnVsbCBJUkkgKGFsc28gd2hlbiBpdCBvY2N1cnMgYXMgYSBsaXRlcmFsJ3MgdHlwZSlcbiAgZXhwYW5kUHJlZml4ZWROYW1lOiBmdW5jdGlvbiAocHJlZml4ZWROYW1lLCBwcmVmaXhlcykge1xuICAgIHZhciBtYXRjaCA9IC8oPzpefFwiXFxeXFxeKShbXjpcXC8jXCInXFxeX10qKTpbXlxcL10qJC8uZXhlYyhwcmVmaXhlZE5hbWUpLCBwcmVmaXgsIGJhc2UsIGluZGV4O1xuICAgIGlmIChtYXRjaClcbiAgICAgIHByZWZpeCA9IG1hdGNoWzFdLCBiYXNlID0gcHJlZml4ZXNbcHJlZml4XSwgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHByZWZpeGVkTmFtZTtcblxuICAgIC8vIFRoZSBtYXRjaCBpbmRleCBpcyBub24temVybyB3aGVuIGV4cGFuZGluZyBhIGxpdGVyYWwncyB0eXBlLlxuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IGJhc2UgKyBwcmVmaXhlZE5hbWUuc3Vic3RyKHByZWZpeC5sZW5ndGggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICA6IHByZWZpeGVkTmFtZS5zdWJzdHIoMCwgaW5kZXggKyAzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHByZWZpeGVkTmFtZS5zdWJzdHIoaW5kZXggKyBwcmVmaXgubGVuZ3RoICsgNCk7XG4gIH0sXG5cbiAgLy8gQ3JlYXRlcyBhbiBJUkkgaW4gTjMuanMgcmVwcmVzZW50YXRpb25cbiAgY3JlYXRlSVJJOiBmdW5jdGlvbiAoaXJpKSB7XG4gICAgcmV0dXJuIGlyaSAmJiBpcmlbMF0gPT09ICdcIicgPyBOM1V0aWwuZ2V0TGl0ZXJhbFZhbHVlKGlyaSkgOiBpcmk7XG4gIH0sXG5cbiAgLy8gQ3JlYXRlcyBhIGxpdGVyYWwgaW4gTjMuanMgcmVwcmVzZW50YXRpb25cbiAgY3JlYXRlTGl0ZXJhbDogZnVuY3Rpb24gKHZhbHVlLCBtb2RpZmllcikge1xuICAgIGlmICghbW9kaWZpZXIpIHtcbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgbW9kaWZpZXIgPSBYc2RCb29sZWFuO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGlmIChpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBtb2RpZmllciA9IHZhbHVlICUgMSA9PT0gMCA/IFhzZEludGVnZXIgOiBYc2REZWNpbWFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdcIicgKyB2YWx1ZSArXG4gICAgICAgICAgICgvXlthLXpdKygtW2EtejAtOV0rKSokL2kudGVzdChtb2RpZmllcikgPyAnXCJAJyAgKyBtb2RpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnXCJeXicgKyBtb2RpZmllcik7XG4gIH0sXG59O1xuXG4vLyBBZGQgdGhlIE4zVXRpbCBmdW5jdGlvbnMgdG8gdGhlIGdpdmVuIG9iamVjdCBvciBpdHMgcHJvdG90eXBlXG5mdW5jdGlvbiBhZGROM1V0aWwocGFyZW50LCB0b1Byb3RvdHlwZSkge1xuICBmb3IgKHZhciBuYW1lIGluIE4zVXRpbClcbiAgICBpZiAoIXRvUHJvdG90eXBlKVxuICAgICAgcGFyZW50W25hbWVdID0gTjNVdGlsW25hbWVdO1xuICAgIGVsc2VcbiAgICAgIHBhcmVudC5wcm90b3R5cGVbbmFtZV0gPSBhcHBseVRvVGhpcyhOM1V0aWxbbmFtZV0pO1xuXG4gIHJldHVybiBwYXJlbnQ7XG59XG5cbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYGZgIHRvIHRoZSBgdGhpc2Agb2JqZWN0XG5mdW5jdGlvbiBhcHBseVRvVGhpcyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkgeyByZXR1cm4gZih0aGlzLCBhKTsgfTtcbn1cblxuLy8gRXhwb3NlIE4zVXRpbCwgYXR0YWNoaW5nIGFsbCBmdW5jdGlvbnMgdG8gaXRcbm1vZHVsZS5leHBvcnRzID0gYWRkTjNVdGlsKGFkZE4zVXRpbCk7XG4iLCIvLyAqKk4zV3JpdGVyKiogd3JpdGVzIE4zIGRvY3VtZW50cy5cblxuLy8gTWF0Y2hlcyBhIGxpdGVyYWwgYXMgcmVwcmVzZW50ZWQgaW4gbWVtb3J5IGJ5IHRoZSBOMyBsaWJyYXJ5XG52YXIgTjNMaXRlcmFsTWF0Y2hlciA9IC9eXCIoW15dKilcIig/OlxcXlxcXiguKyl8QChbXFwtYS16XSspKT8kL2k7XG5cbi8vIHJkZjp0eXBlIHByZWRpY2F0ZSAoZm9yICdhJyBhYmJyZXZpYXRpb24pXG52YXIgUkRGX1BSRUZJWCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyxcbiAgICBSREZfVFlQRSAgID0gUkRGX1BSRUZJWCArICd0eXBlJztcblxuLy8gQ2hhcmFjdGVycyBpbiBsaXRlcmFscyB0aGF0IHJlcXVpcmUgZXNjYXBpbmdcbnZhciBlc2NhcGUgICAgPSAvW1wiXFxcXFxcdFxcblxcclxcYlxcZlxcdTAwMDAtXFx1MDAxOVxcdWQ4MDAtXFx1ZGJmZl0vLFxuICAgIGVzY2FwZUFsbCA9IC9bXCJcXFxcXFx0XFxuXFxyXFxiXFxmXFx1MDAwMC1cXHUwMDE5XXxbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdL2csXG4gICAgZXNjYXBlUmVwbGFjZW1lbnRzID0geyAnXFxcXCc6ICdcXFxcXFxcXCcsICdcIic6ICdcXFxcXCInLCAnXFx0JzogJ1xcXFx0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nOiAnXFxcXG4nLCAnXFxyJzogJ1xcXFxyJywgJ1xcYic6ICdcXFxcYicsICdcXGYnOiAnXFxcXGYnIH07XG5cbi8vICMjIENvbnN0cnVjdG9yXG5mdW5jdGlvbiBOM1dyaXRlcihvdXRwdXRTdHJlYW0sIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE4zV3JpdGVyKSlcbiAgICByZXR1cm4gbmV3IE4zV3JpdGVyKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7XG5cbiAgLy8gU2hpZnQgYXJndW1lbnRzIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYSBzdHJlYW1cbiAgaWYgKG91dHB1dFN0cmVhbSAmJiB0eXBlb2Ygb3V0cHV0U3RyZWFtLndyaXRlICE9PSAnZnVuY3Rpb24nKVxuICAgIG9wdGlvbnMgPSBvdXRwdXRTdHJlYW0sIG91dHB1dFN0cmVhbSA9IG51bGw7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIElmIG5vIG91dHB1dCBzdHJlYW0gZ2l2ZW4sIHNlbmQgdGhlIG91dHB1dCBhcyBzdHJpbmcgdGhyb3VnaCB0aGUgZW5kIGNhbGxiYWNrXG4gIGlmICghb3V0cHV0U3RyZWFtKSB7XG4gICAgdmFyIG91dHB1dCA9ICcnO1xuICAgIHRoaXMuX291dHB1dFN0cmVhbSA9IHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBkb25lKSB7IG91dHB1dCArPSBjaHVuazsgZG9uZSAmJiBkb25lKCk7IH0sXG4gICAgICBlbmQ6ICAgZnVuY3Rpb24gKGRvbmUpIHsgZG9uZSAmJiBkb25lKG51bGwsIG91dHB1dCk7IH0sXG4gICAgfTtcbiAgICB0aGlzLl9lbmRTdHJlYW0gPSB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuX291dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTtcbiAgICB0aGlzLl9lbmRTdHJlYW0gPSBvcHRpb25zLmVuZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhb3B0aW9ucy5lbmQ7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdyaXRlciwgZGVwZW5kaW5nIG9uIHRoZSBmb3JtYXRcbiAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gIGlmICghKC90cmlwbGV8cXVhZC9pKS50ZXN0KG9wdGlvbnMuZm9ybWF0KSkge1xuICAgIHRoaXMuX2dyYXBoID0gJyc7XG4gICAgdGhpcy5fcHJlZml4SVJJcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgb3B0aW9ucy5wcmVmaXhlcyAmJiB0aGlzLmFkZFByZWZpeGVzKG9wdGlvbnMucHJlZml4ZXMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuX3dyaXRlVHJpcGxlID0gdGhpcy5fd3JpdGVUcmlwbGVMaW5lO1xuICB9XG59XG5cbk4zV3JpdGVyLnByb3RvdHlwZSA9IHtcbiAgLy8gIyMgUHJpdmF0ZSBtZXRob2RzXG5cbiAgLy8gIyMjIGBfd3JpdGVgIHdyaXRlcyB0aGUgYXJndW1lbnQgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgX3dyaXRlOiBmdW5jdGlvbiAoc3RyaW5nLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX291dHB1dFN0cmVhbS53cml0ZShzdHJpbmcsICd1dGY4JywgY2FsbGJhY2spO1xuICB9LFxuXG4gICAgLy8gIyMjIGBfd3JpdGVUcmlwbGVgIHdyaXRlcyB0aGUgdHJpcGxlIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIF93cml0ZVRyaXBsZTogZnVuY3Rpb24gKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBXcml0ZSB0aGUgZ3JhcGgncyBsYWJlbCBpZiBpdCBoYXMgY2hhbmdlZFxuICAgICAgaWYgKHRoaXMuX2dyYXBoICE9PSBncmFwaCkge1xuICAgICAgICAvLyBDbG9zZSB0aGUgcHJldmlvdXMgZ3JhcGggYW5kIHN0YXJ0IHRoZSBuZXcgb25lXG4gICAgICAgIHRoaXMuX3dyaXRlKCh0aGlzLl9zdWJqZWN0ID09PSBudWxsID8gJycgOiAodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpKSArXG4gICAgICAgICAgICAgICAgICAgIChncmFwaCA/IHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcge1xcbicgOiAnJykpO1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJlYXQgaWRlbnRpY2FsIGJsYW5rIG5vZGVzIGFzIHJlcGVhdGluZyBncmFwaHNcbiAgICAgICAgdGhpcy5fZ3JhcGggPSBncmFwaFswXSAhPT0gJ1snID8gZ3JhcGggOiAnXSc7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCByZXBlYXQgdGhlIHN1YmplY3QgaWYgaXQncyB0aGUgc2FtZVxuICAgICAgaWYgKHRoaXMuX3N1YmplY3QgPT09IHN1YmplY3QpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwZWF0IHRoZSBwcmVkaWNhdGUgaWYgaXQncyB0aGUgc2FtZVxuICAgICAgICBpZiAodGhpcy5fcHJlZGljYXRlID09PSBwcmVkaWNhdGUpXG4gICAgICAgICAgdGhpcy5fd3JpdGUoJywgJyArIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpLCBkb25lKTtcbiAgICAgICAgLy8gU2FtZSBzdWJqZWN0LCBkaWZmZXJlbnQgcHJlZGljYXRlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl93cml0ZSgnO1xcbiAgICAnICtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVQcmVkaWNhdGUodGhpcy5fcHJlZGljYXRlID0gcHJlZGljYXRlKSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgICAgfVxuICAgICAgLy8gRGlmZmVyZW50IHN1YmplY3Q7IHdyaXRlIHRoZSB3aG9sZSB0cmlwbGVcbiAgICAgIGVsc2VcbiAgICAgICAgdGhpcy5fd3JpdGUoKHRoaXMuX3N1YmplY3QgPT09IG51bGwgPyAnJyA6ICcuXFxuJykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVTdWJqZWN0KHRoaXMuX3N1YmplY3QgPSBzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZVByZWRpY2F0ZSh0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlT2JqZWN0KG9iamVjdCksIGRvbmUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZG9uZSAmJiBkb25lKGVycm9yKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX3dyaXRlVHJpcGxlTGluZWAgd3JpdGVzIHRoZSB0cmlwbGUgb3IgcXVhZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBhcyBhIHNpbmdsZSBsaW5lXG4gIF93cml0ZVRyaXBsZUxpbmU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgsIGRvbmUpIHtcbiAgICAvLyBEb24ndCB1c2UgcHJlZml4ZXNcbiAgICBkZWxldGUgdGhpcy5fcHJlZml4TWF0Y2g7XG4gICAgLy8gV3JpdGUgdGhlIHRyaXBsZVxuICAgIHRyeSB7XG4gICAgICB0aGlzLl93cml0ZSh0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShzdWJqZWN0KSArICcgJyArXG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpICsgJyAnICtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChvYmplY3QpICtcbiAgICAgICAgICAgICAgICAgIChncmFwaCA/ICcgJyArIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKGdyYXBoKSArICcuXFxuJyA6ICcuXFxuJyksIGRvbmUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZG9uZSAmJiBkb25lKGVycm9yKTsgfVxuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZUlyaU9yQmxhbmtOb2RlYCByZXByZXNlbnRzIGFuIElSSSBvciBibGFuayBub2RlXG4gIF9lbmNvZGVJcmlPckJsYW5rTm9kZTogZnVuY3Rpb24gKGVudGl0eSkge1xuICAgIC8vIEEgYmxhbmsgbm9kZSBvciBsaXN0IGlzIHJlcHJlc2VudGVkIGFzLWlzXG4gICAgdmFyIGZpcnN0Q2hhciA9IGVudGl0eVswXTtcbiAgICBpZiAoZmlyc3RDaGFyID09PSAnWycgfHwgZmlyc3RDaGFyID09PSAnKCcgfHwgZmlyc3RDaGFyID09PSAnXycgJiYgZW50aXR5WzFdID09PSAnOicpXG4gICAgICByZXR1cm4gZW50aXR5O1xuICAgIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZXNjYXBlLnRlc3QoZW50aXR5KSlcbiAgICAgIGVudGl0eSA9IGVudGl0eS5yZXBsYWNlKGVzY2FwZUFsbCwgY2hhcmFjdGVyUmVwbGFjZXIpO1xuICAgIC8vIFRyeSB0byByZXByZXNlbnQgdGhlIElSSSBhcyBwcmVmaXhlZCBuYW1lXG4gICAgdmFyIHByZWZpeE1hdGNoID0gdGhpcy5fcHJlZml4UmVnZXguZXhlYyhlbnRpdHkpO1xuICAgIHJldHVybiAhcHJlZml4TWF0Y2ggPyAnPCcgKyBlbnRpdHkgKyAnPicgOlxuICAgICAgICAgICAoIXByZWZpeE1hdGNoWzFdID8gZW50aXR5IDogdGhpcy5fcHJlZml4SVJJc1twcmVmaXhNYXRjaFsxXV0gKyBwcmVmaXhNYXRjaFsyXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBfZW5jb2RlTGl0ZXJhbGAgcmVwcmVzZW50cyBhIGxpdGVyYWxcbiAgX2VuY29kZUxpdGVyYWw6IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSwgbGFuZ3VhZ2UpIHtcbiAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGVzY2FwZS50ZXN0KHZhbHVlKSlcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShlc2NhcGVBbGwsIGNoYXJhY3RlclJlcGxhY2VyKTtcbiAgICAvLyBXcml0ZSB0aGUgbGl0ZXJhbCwgcG9zc2libHkgd2l0aCB0eXBlIG9yIGxhbmd1YWdlXG4gICAgaWYgKGxhbmd1YWdlKVxuICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIkAnICsgbGFuZ3VhZ2U7XG4gICAgZWxzZSBpZiAodHlwZSlcbiAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCJeXicgKyB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZSh0eXBlKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgfSxcblxuICAvLyAjIyMgYF9lbmNvZGVTdWJqZWN0YCByZXByZXNlbnRzIGEgc3ViamVjdFxuICBfZW5jb2RlU3ViamVjdDogZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICBpZiAoc3ViamVjdFswXSA9PT0gJ1wiJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBsaXRlcmFsIGFzIHN1YmplY3QgaXMgbm90IGFsbG93ZWQ6ICcgKyBzdWJqZWN0KTtcbiAgICAvLyBEb24ndCB0cmVhdCBpZGVudGljYWwgYmxhbmsgbm9kZXMgYXMgcmVwZWF0aW5nIHN1YmplY3RzXG4gICAgaWYgKHN1YmplY3RbMF0gPT09ICdbJylcbiAgICAgIHRoaXMuX3N1YmplY3QgPSAnXSc7XG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUlyaU9yQmxhbmtOb2RlKHN1YmplY3QpO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZVByZWRpY2F0ZWAgcmVwcmVzZW50cyBhIHByZWRpY2F0ZVxuICBfZW5jb2RlUHJlZGljYXRlOiBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgaWYgKHByZWRpY2F0ZVswXSA9PT0gJ1wiJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBsaXRlcmFsIGFzIHByZWRpY2F0ZSBpcyBub3QgYWxsb3dlZDogJyArIHByZWRpY2F0ZSk7XG4gICAgcmV0dXJuIHByZWRpY2F0ZSA9PT0gUkRGX1RZUEUgPyAnYScgOiB0aGlzLl9lbmNvZGVJcmlPckJsYW5rTm9kZShwcmVkaWNhdGUpO1xuICB9LFxuXG4gIC8vICMjIyBgX2VuY29kZU9iamVjdGAgcmVwcmVzZW50cyBhbiBvYmplY3RcbiAgX2VuY29kZU9iamVjdDogZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIC8vIFJlcHJlc2VudCBhbiBJUkkgb3IgYmxhbmsgbm9kZVxuICAgIGlmIChvYmplY3RbMF0gIT09ICdcIicpXG4gICAgICByZXR1cm4gdGhpcy5fZW5jb2RlSXJpT3JCbGFua05vZGUob2JqZWN0KTtcbiAgICAvLyBSZXByZXNlbnQgYSBsaXRlcmFsXG4gICAgdmFyIG1hdGNoID0gTjNMaXRlcmFsTWF0Y2hlci5leGVjKG9iamVjdCk7XG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpdGVyYWw6ICcgKyBvYmplY3QpO1xuICAgIHJldHVybiB0aGlzLl9lbmNvZGVMaXRlcmFsKG1hdGNoWzFdLCBtYXRjaFsyXSwgbWF0Y2hbM10pO1xuICB9LFxuXG4gIC8vICMjIyBgX2Jsb2NrZWRXcml0ZWAgcmVwbGFjZXMgYF93cml0ZWAgYWZ0ZXIgdGhlIHdyaXRlciBoYXMgYmVlbiBjbG9zZWRcbiAgX2Jsb2NrZWRXcml0ZTogZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHdyaXRlIGJlY2F1c2UgdGhlIHdyaXRlciBoYXMgYmVlbiBjbG9zZWQuJyk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVgIGFkZHMgdGhlIHRyaXBsZSB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRUcmlwbGU6IGZ1bmN0aW9uIChzdWJqZWN0LCBwcmVkaWNhdGUsIG9iamVjdCwgZ3JhcGgsIGRvbmUpIHtcbiAgICAvLyBUaGUgdHJpcGxlIHdhcyBnaXZlbiBhcyBhIHRyaXBsZSBvYmplY3QsIHNvIHNoaWZ0IHBhcmFtZXRlcnNcbiAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLl93cml0ZVRyaXBsZShzdWJqZWN0LnN1YmplY3QsIHN1YmplY3QucHJlZGljYXRlLCBzdWJqZWN0Lm9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZ3JhcGggfHwgJycsIHByZWRpY2F0ZSk7XG4gICAgLy8gVGhlIG9wdGlvbmFsIGBncmFwaGAgcGFyYW1ldGVyIHdhcyBub3QgcHJvdmlkZWRcbiAgICBlbHNlIGlmICh0eXBlb2YgZ3JhcGggIT09ICdzdHJpbmcnKVxuICAgICAgdGhpcy5fd3JpdGVUcmlwbGUoc3ViamVjdCwgcHJlZGljYXRlLCBvYmplY3QsICcnLCBncmFwaCk7XG4gICAgLy8gVGhlIGBncmFwaGAgcGFyYW1ldGVyIHdhcyBwcm92aWRlZFxuICAgIGVsc2VcbiAgICAgIHRoaXMuX3dyaXRlVHJpcGxlKHN1YmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0LCBncmFwaCwgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRUcmlwbGVzYCBhZGRzIHRoZSB0cmlwbGVzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gIGFkZFRyaXBsZXM6IGZ1bmN0aW9uICh0cmlwbGVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlwbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5hZGRUcmlwbGUodHJpcGxlc1tpXSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhgIGFkZHMgdGhlIHByZWZpeCB0byB0aGUgb3V0cHV0IHN0cmVhbVxuICBhZGRQcmVmaXg6IGZ1bmN0aW9uIChwcmVmaXgsIGlyaSwgZG9uZSkge1xuICAgIHZhciBwcmVmaXhlcyA9IHt9O1xuICAgIHByZWZpeGVzW3ByZWZpeF0gPSBpcmk7XG4gICAgdGhpcy5hZGRQcmVmaXhlcyhwcmVmaXhlcywgZG9uZSk7XG4gIH0sXG5cbiAgLy8gIyMjIGBhZGRQcmVmaXhlc2AgYWRkcyB0aGUgcHJlZml4ZXMgdG8gdGhlIG91dHB1dCBzdHJlYW1cbiAgYWRkUHJlZml4ZXM6IGZ1bmN0aW9uIChwcmVmaXhlcywgZG9uZSkge1xuICAgIC8vIEFkZCBhbGwgdXNlZnVsIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeElSSXMgPSB0aGlzLl9wcmVmaXhJUklzLCBoYXNQcmVmaXhlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIHByZWZpeCBpbiBwcmVmaXhlcykge1xuICAgICAgLy8gVmVyaWZ5IHdoZXRoZXIgdGhlIHByZWZpeCBjYW4gYmUgdXNlZCBhbmQgZG9lcyBub3QgZXhpc3QgeWV0XG4gICAgICB2YXIgaXJpID0gcHJlZml4ZXNbcHJlZml4XTtcbiAgICAgIGlmICgvWyNcXC9dJC8udGVzdChpcmkpICYmIHByZWZpeElSSXNbaXJpXSAhPT0gKHByZWZpeCArPSAnOicpKSB7XG4gICAgICAgIGhhc1ByZWZpeGVzID0gdHJ1ZTtcbiAgICAgICAgcHJlZml4SVJJc1tpcmldID0gcHJlZml4O1xuICAgICAgICAvLyBGaW5pc2ggYSBwb3NzaWJsZSBwZW5kaW5nIHRyaXBsZVxuICAgICAgICBpZiAodGhpcy5fc3ViamVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3dyaXRlKHRoaXMuX2dyYXBoID8gJ1xcbn1cXG4nIDogJy5cXG4nKTtcbiAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbnVsbCwgdGhpcy5fZ3JhcGggPSAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBwcmVmaXhcbiAgICAgICAgdGhpcy5fd3JpdGUoJ0BwcmVmaXggJyArIHByZWZpeCArICcgPCcgKyBpcmkgKyAnPi5cXG4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVjcmVhdGUgdGhlIHByZWZpeCBtYXRjaGVyXG4gICAgaWYgKGhhc1ByZWZpeGVzKSB7XG4gICAgICB2YXIgSVJJbGlzdCA9ICcnLCBwcmVmaXhMaXN0ID0gJyc7XG4gICAgICBmb3IgKHZhciBwcmVmaXhJUkkgaW4gcHJlZml4SVJJcykge1xuICAgICAgICBJUklsaXN0ICs9IElSSWxpc3QgPyAnfCcgKyBwcmVmaXhJUkkgOiBwcmVmaXhJUkk7XG4gICAgICAgIHByZWZpeExpc3QgKz0gKHByZWZpeExpc3QgPyAnfCcgOiAnJykgKyBwcmVmaXhJUklzW3ByZWZpeElSSV07XG4gICAgICB9XG4gICAgICBJUklsaXN0ID0gSVJJbGlzdC5yZXBsYWNlKC9bXFxdXFwvXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcJF0vZywgJ1xcXFwkJicpO1xuICAgICAgdGhpcy5fcHJlZml4UmVnZXggPSBuZXcgUmVnRXhwKCdeKD86JyArIHByZWZpeExpc3QgKyAnKVteXFwvXSokfCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeKCcgKyBJUklsaXN0ICsgJykoW2EtekEtWl1bXFxcXC1fYS16QS1aMC05XSopJCcpO1xuICAgIH1cbiAgICAvLyBFbmQgYSBwcmVmaXggYmxvY2sgd2l0aCBhIG5ld2xpbmVcbiAgICB0aGlzLl93cml0ZShoYXNQcmVmaXhlcyA/ICdcXG4nIDogJycsIGRvbmUpO1xuICB9LFxuXG4gIC8vICMjIyBgYmxhbmtgIGNyZWF0ZXMgYSBibGFuayBub2RlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRcbiAgYmxhbms6IGZ1bmN0aW9uIChwcmVkaWNhdGUsIG9iamVjdCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByZWRpY2F0ZSwgY2hpbGQsIGxlbmd0aDtcbiAgICAvLyBFbXB0eSBibGFuayBub2RlXG4gICAgaWYgKHByZWRpY2F0ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgY2hpbGRyZW4gPSBbXTtcbiAgICAvLyBCbGFuayBub2RlIHBhc3NlZCBhcyBibGFuayhcInByZWRpY2F0ZVwiLCBcIm9iamVjdFwiKVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgY2hpbGRyZW4gPSBbeyBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QgfV07XG4gICAgLy8gQmxhbmsgbm9kZSBwYXNzZWQgYXMgYmxhbmsoeyBwcmVkaWNhdGU6IHByZWRpY2F0ZSwgb2JqZWN0OiBvYmplY3QgfSlcbiAgICBlbHNlIGlmICghKCdsZW5ndGgnIGluIHByZWRpY2F0ZSkpXG4gICAgICBjaGlsZHJlbiA9IFtwcmVkaWNhdGVdO1xuXG4gICAgc3dpdGNoIChsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAvLyBHZW5lcmF0ZSBhbiBlbXB0eSBibGFuayBub2RlXG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdbXSc7XG4gICAgLy8gR2VuZXJhdGUgYSBub24tbmVzdGVkIG9uZS10cmlwbGUgYmxhbmsgbm9kZVxuICAgIGNhc2UgMTpcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5bMF07XG4gICAgICBpZiAoY2hpbGQub2JqZWN0WzBdICE9PSAnWycpXG4gICAgICAgIHJldHVybiAnWyAnICsgdGhpcy5fZW5jb2RlUHJlZGljYXRlKGNoaWxkLnByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpICsgJyBdJztcbiAgICAvLyBHZW5lcmF0ZSBhIG11bHRpLXRyaXBsZSBvciBuZXN0ZWQgYmxhbmsgbm9kZVxuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgY29udGVudHMgPSAnWyc7XG4gICAgICAvLyBXcml0ZSBhbGwgdHJpcGxlcyBpbiBvcmRlclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBXcml0ZSBvbmx5IHRoZSBvYmplY3QgaXMgdGhlIHByZWRpY2F0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXNcbiAgICAgICAgaWYgKGNoaWxkLnByZWRpY2F0ZSA9PT0gcHJlZGljYXRlKVxuICAgICAgICAgIGNvbnRlbnRzICs9ICcsICcgKyB0aGlzLl9lbmNvZGVPYmplY3QoY2hpbGQub2JqZWN0KTtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3cml0ZSB0aGUgcHJlZGljYXRlIGFuZCB0aGUgb2JqZWN0XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRlbnRzICs9IChpID8gJztcXG4gICcgOiAnXFxuICAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RlUHJlZGljYXRlKGNoaWxkLnByZWRpY2F0ZSkgKyAnICcgK1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kZU9iamVjdChjaGlsZC5vYmplY3QpO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGNoaWxkLnByZWRpY2F0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnRzICsgJ1xcbl0nO1xuICAgIH1cbiAgfSxcblxuICAvLyAjIyMgYGxpc3RgIGNyZWF0ZXMgYSBsaXN0IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudFxuICBsaXN0OiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICB2YXIgbGVuZ3RoID0gZWxlbWVudHMgJiYgZWxlbWVudHMubGVuZ3RoIHx8IDAsIGNvbnRlbnRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgIGNvbnRlbnRzW2ldID0gdGhpcy5fZW5jb2RlT2JqZWN0KGVsZW1lbnRzW2ldKTtcbiAgICByZXR1cm4gJygnICsgY29udGVudHMuam9pbignICcpICsgJyknO1xuICB9LFxuXG4gIC8vICMjIyBgX3ByZWZpeFJlZ2V4YCBtYXRjaGVzIGEgcHJlZml4ZWQgbmFtZSBvciBJUkkgdGhhdCBiZWdpbnMgd2l0aCBvbmUgb2YgdGhlIGFkZGVkIHByZWZpeGVzXG4gIF9wcmVmaXhSZWdleDogLyQwXi8sXG5cbiAgLy8gIyMjIGBlbmRgIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHN0cmVhbVxuICBlbmQ6IGZ1bmN0aW9uIChkb25lKSB7XG4gICAgLy8gRmluaXNoIGEgcG9zc2libGUgcGVuZGluZyB0cmlwbGVcbiAgICBpZiAodGhpcy5fc3ViamVjdCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fd3JpdGUodGhpcy5fZ3JhcGggPyAnXFxufVxcbicgOiAnLlxcbicpO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG51bGw7XG4gICAgfVxuICAgIC8vIERpc2FsbG93IGZ1cnRoZXIgd3JpdGluZ1xuICAgIHRoaXMuX3dyaXRlID0gdGhpcy5fYmxvY2tlZFdyaXRlO1xuXG4gICAgLy8gVHJ5IHRvIGVuZCB0aGUgdW5kZXJseWluZyBzdHJlYW0sIGVuc3VyaW5nIGRvbmUgaXMgY2FsbGVkIGV4YWN0bHkgb25lIHRpbWVcbiAgICB2YXIgc2luZ2xlRG9uZSA9IGRvbmUgJiYgZnVuY3Rpb24gKGVycm9yLCByZXN1bHQpIHsgc2luZ2xlRG9uZSA9IG51bGwsIGRvbmUoZXJyb3IsIHJlc3VsdCk7IH07XG4gICAgaWYgKHRoaXMuX2VuZFN0cmVhbSkge1xuICAgICAgdHJ5IHsgcmV0dXJuIHRoaXMuX291dHB1dFN0cmVhbS5lbmQoc2luZ2xlRG9uZSk7IH1cbiAgICAgIGNhdGNoIChlcnJvcikgeyAvKiBlcnJvciBjbG9zaW5nIHN0cmVhbSAqLyB9XG4gICAgfVxuICAgIHNpbmdsZURvbmUgJiYgc2luZ2xlRG9uZSgpO1xuICB9LFxufTtcblxuLy8gUmVwbGFjZXMgYSBjaGFyYWN0ZXIgYnkgaXRzIGVzY2FwZWQgdmVyc2lvblxuZnVuY3Rpb24gY2hhcmFjdGVyUmVwbGFjZXIoY2hhcmFjdGVyKSB7XG4gIC8vIFJlcGxhY2UgYSBzaW5nbGUgY2hhcmFjdGVyIGJ5IGl0cyBlc2NhcGVkIHZlcnNpb25cbiAgdmFyIHJlc3VsdCA9IGVzY2FwZVJlcGxhY2VtZW50c1tjaGFyYWN0ZXJdO1xuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBSZXBsYWNlIGEgc2luZ2xlIGNoYXJhY3RlciB3aXRoIGl0cyA0LWJpdCB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZVxuICAgIGlmIChjaGFyYWN0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXN1bHQgPSBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICByZXN1bHQgPSAnXFxcXHUwMDAwJy5zdWJzdHIoMCwgNiAtIHJlc3VsdC5sZW5ndGgpICsgcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXBsYWNlIGEgc3Vycm9nYXRlIHBhaXIgd2l0aCBpdHMgOC1iaXQgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VcbiAgICBlbHNlIHtcbiAgICAgIHJlc3VsdCA9ICgoY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgLSAweEQ4MDApICogMHg0MDAgK1xuICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgxKSArIDB4MjQwMCkudG9TdHJpbmcoMTYpO1xuICAgICAgcmVzdWx0ID0gJ1xcXFxVMDAwMDAwMDAnLnN1YnN0cigwLCAxMCAtIHJlc3VsdC5sZW5ndGgpICsgcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyAjIyBFeHBvcnRzXG5cbi8vIEV4cG9ydCB0aGUgYE4zV3JpdGVyYCBjbGFzcyBhcyBhIHdob2xlLlxubW9kdWxlLmV4cG9ydHMgPSBOM1dyaXRlcjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbnZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuZnVuY3Rpb24gb25lbmQoKSB7XG4gIC8vIGlmIHdlIGFsbG93IGhhbGYtb3BlbiBzdGF0ZSwgb3IgaWYgdGhlIHdyaXRhYmxlIHNpZGUgZW5kZWQsXG4gIC8vIHRoZW4gd2UncmUgb2suXG4gIGlmICh0aGlzLmFsbG93SGFsZk9wZW4gfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG4gIHByb2Nlc3NOZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgJiYgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbkR1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIHRoaXMuZW5kKCk7XG5cbiAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcnIpO1xufTtcblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gVE9ETyhibWV1cmVyKTogQ2hhbmdlIHRoaXMgYmFjayB0byBjb25zdCBvbmNlIGhvbGUgY2hlY2tzIGFyZVxuLy8gcHJvcGVybHkgb3B0aW1pemVkIGF3YXkgZWFybHkgaW4gSWduaXRpb24rVHVyYm9GYW4uXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCwgZm4pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gICAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICAgIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwcm9jZXNzTmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKEVFbGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBFRWxpc3RlbmVyQ291bnQoc3JjLCAnZGF0YScpKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgdW5waXBlSW5mbyA9IHsgaGFzVW5waXBlZDogZmFsc2UgfTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0c1tpXS5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHByb2Nlc3NOZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgc2VsZi5lbWl0LmJpbmQoc2VsZiwga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignd3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJykpO1xuICB9XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIHZhciBzdHJlYW0gPSB0aGlzO1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShzdHJlYW0sIGVyLCBkYXRhKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ190cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyogPHJlcGxhY2VtZW50PiAqL1xuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBvbkNvcmtlZEZpbmlzaChfdGhpcywgc3RhdGUpO1xuICB9O1xufVxuLyogPC9yZXBsYWNlbWVudD4gKi9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBhc3luY1dyaXRlID0gIXByb2Nlc3MuYnJvd3NlciAmJiBbJ3YwLjEwJywgJ3YwLjkuJ10uaW5kZXhPZihwcm9jZXNzLnZlcnNpb24uc2xpY2UoMCwgNSkpID4gLTEgPyBzZXRJbW1lZGlhdGUgOiBwcm9jZXNzTmV4dFRpY2s7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBEdXBsZXg7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpbnRlcm5hbFV0aWwgPSB7XG4gIGRlcHJlY2F0ZTogcmVxdWlyZSgndXRpbC1kZXByZWNhdGUnKVxufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0nKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIGlmIF9maW5hbCBoYXMgYmVlbiBjYWxsZWRcbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlO1xuXG4gIC8vIGRyYWluIGV2ZW50IGZsYWcuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIGhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nLCAnREVQMDAwMycpXG4gICAgfSk7XG4gIH0gY2F0Y2ggKF8pIHt9XG59KSgpO1xuXG4vLyBUZXN0IF93cml0YWJsZVN0YXRlIGZvciBpbmhlcml0YW5jZSB0byBhY2NvdW50IGZvciBEdXBsZXggc3RyZWFtcyxcbi8vIHdob3NlIHByb3RvdHlwZSBjaGFpbiBvbmx5IHBvaW50cyB0byBSZWFkYWJsZS5cbnZhciByZWFsSGFzSW5zdGFuY2U7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaGFzSW5zdGFuY2UgJiYgdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICBpZiAocmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0b28uXG4gIC8vIGByZWFsSGFzSW5zdGFuY2VgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHVzaW5nIHBsYWluIGBpbnN0YW5jZW9mYFxuICAvLyB3b3VsZCByZXR1cm4gZmFsc2UsIGFzIG5vIGBfd3JpdGFibGVTdGF0ZWAgcHJvcGVydHkgaXMgYXR0YWNoZWQuXG5cbiAgLy8gVHJ5aW5nIHRvIHVzZSB0aGUgY3VzdG9tIGBpbnN0YW5jZW9mYCBmb3IgV3JpdGFibGUgaGVyZSB3aWxsIGFsc28gYnJlYWsgdGhlXG4gIC8vIE5vZGUuanMgTGF6eVRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaGFzIGEgbm9uLXRyaXZpYWwgZ2V0dGVyIGZvclxuICAvLyBgX3dyaXRhYmxlU3RhdGVgIHRoYXQgd291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uXG4gIGlmICghcmVhbEhhc0luc3RhbmNlLmNhbGwoV3JpdGFibGUsIHRoaXMpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHtcbiAgICByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmluYWwgPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZpbmFsID0gb3B0aW9ucy5maW5hbDtcbiAgfVxuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBDaGVja3MgdGhhdCBhIHVzZXItc3VwcGxpZWQgY2h1bmsgaXMgdmFsaWQsIGVzcGVjaWFsbHkgZm9yIHRoZSBwYXJ0aWN1bGFyXG4vLyBtb2RlIHRoZSBzdHJlYW0gaXMgaW4uIEN1cnJlbnRseSB0aGlzIG1lYW5zIHRoYXQgYG51bGxgIGlzIG5ldmVyIGFjY2VwdGVkXG4vLyBhbmQgdW5kZWZpbmVkL25vbi1zdHJpbmcgdmFsdWVzIGFyZSBvbmx5IGFsbG93ZWQgaW4gb2JqZWN0IG1vZGUuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG4gIHZhciBpc0J1ZiA9IF9pc1VpbnQ4QXJyYXkoY2h1bmspICYmICFzdGF0ZS5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0J1ZiAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoaXNCdWYpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKGlzQnVmIHx8IHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIHZhciBuZXdDaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuICAgIGlmIChjaHVuayAhPT0gbmV3Q2h1bmspIHtcbiAgICAgIGlzQnVmID0gdHJ1ZTtcbiAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gICAgICBjaHVuayA9IG5ld0NodW5rO1xuICAgIH1cbiAgfVxuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0ge1xuICAgICAgY2h1bms6IGNodW5rLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgaXNCdWY6IGlzQnVmLFxuICAgICAgY2FsbGJhY2s6IGNiLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcblxuICBpZiAoc3luYykge1xuICAgIC8vIGRlZmVyIHRoZSBjYWxsYmFjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyB0byBhdm9pZCBwaWxpbmcgdXAgdGhpbmdzIG9uIHRoZSBzdGFja1xuICAgIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBhbmQgaXQgd2lsbCBhbHdheXMgaGFwcGVuXG4gICAgLy8gYWZ0ZXIgZXJyb3JcbiAgICBwcm9jZXNzTmV4dFRpY2soZmluaXNoTWF5YmUsIHN0cmVhbSwgc3RhdGUpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY2FsbGVyIGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBiZWZvcmUgaWZcbiAgICAvLyBpdCBpcyBhc3luY1xuICAgIGNiKGVyKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGJ1dCBmaW5pc2ggbXVzdFxuICAgIC8vIGFsd2F5cyBmb2xsb3cgZXJyb3JcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgYXN5bmNXcml0ZShhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgYWxsQnVmZmVycyA9IHRydWU7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBpZiAoIWVudHJ5LmlzQnVmKSBhbGxCdWZmZXJzID0gZmFsc2U7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cbiAgICBidWZmZXIuYWxsQnVmZmVycyA9IGFsbEJ1ZmZlcnM7XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ193cml0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG4gIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IGNvcmtSZXE7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gY29ya1JlcTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vLyB1bmRvY3VtZW50ZWQgY2IoKSBBUEksIG5lZWRlZCBmb3IgY29yZSwgbm90IGZvciBwdWJsaWMgQVBJXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgcmVhZGFibGVEZXN0cm95ZWQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB2YXIgd3JpdGFibGVEZXN0cm95ZWQgPSB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuXG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVyciAmJiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUgfHwgIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSkge1xuICAgICAgcHJvY2Vzc05leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwcm9jZXNzTmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIC0xO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSkgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpKSByZXR1cm4gMDtcbiAgbmIgPSB1dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7XG4gIGlmIChuYiA+PSAwKSB7XG4gICAgaWYgKG5iID4gMCkge1xuICAgICAgaWYgKG5iID09PSAyKSBuYiA9IDA7ZWxzZSBzZWxmLmxhc3ROZWVkID0gbmIgLSAzO1xuICAgIH1cbiAgICByZXR1cm4gbmI7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIFZhbGlkYXRlcyBhcyBtYW55IGNvbnRpbnVhdGlvbiBieXRlcyBmb3IgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciBhc1xuLy8gbmVlZGVkIG9yIGFyZSBhdmFpbGFibGUuIElmIHdlIHNlZSBhIG5vbi1jb250aW51YXRpb24gYnl0ZSB3aGVyZSB3ZSBleHBlY3Rcbi8vIG9uZSwgd2UgXCJyZXBsYWNlXCIgdGhlIHZhbGlkYXRlZCBjb250aW51YXRpb24gYnl0ZXMgd2UndmUgc2VlbiBzbyBmYXIgd2l0aFxuLy8gVVRGLTggcmVwbGFjZW1lbnQgY2hhcmFjdGVycyAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCk7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnLnJlcGVhdChwICsgMSk7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJy5yZXBlYXQocCArIDIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBBdHRlbXB0cyB0byBjb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXIuXG5mdW5jdGlvbiB1dGY4RmlsbExhc3QoYnVmKSB7XG4gIHZhciBwID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICB2YXIgciA9IHV0ZjhDaGVja0V4dHJhQnl0ZXModGhpcywgYnVmLCBwKTtcbiAgaWYgKHIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHI7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgYnVmLmxlbmd0aCk7XG4gIHRoaXMubGFzdE5lZWQgLT0gYnVmLmxlbmd0aDtcbn1cblxuLy8gUmV0dXJucyBhbGwgY29tcGxldGUgVVRGLTggY2hhcmFjdGVycyBpbiBhIEJ1ZmZlci4gSWYgdGhlIEJ1ZmZlciBlbmRlZCBvbiBhXG4vLyBwYXJ0aWFsIGNoYXJhY3RlciwgdGhlIGNoYXJhY3RlcidzIGJ5dGVzIGFyZSBidWZmZXJlZCB1bnRpbCB0aGUgcmVxdWlyZWRcbi8vIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlLlxuZnVuY3Rpb24gdXRmOFRleHQoYnVmLCBpKSB7XG4gIHZhciB0b3RhbCA9IHV0ZjhDaGVja0luY29tcGxldGUodGhpcywgYnVmLCBpKTtcbiAgaWYgKCF0aGlzLmxhc3ROZWVkKSByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSk7XG4gIHRoaXMubGFzdFRvdGFsID0gdG90YWw7XG4gIHZhciBlbmQgPSBidWYubGVuZ3RoIC0gKHRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIDAsIGVuZCk7XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpLCBlbmQpO1xufVxuXG4vLyBGb3IgVVRGLTgsIGEgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGZvciBlYWNoIGJ1ZmZlcmVkIGJ5dGUgb2YgYSAocGFydGlhbClcbi8vIGNoYXJhY3RlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgb3V0cHV0LlxuZnVuY3Rpb24gdXRmOEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyAnXFx1ZmZmZCcucmVwZWF0KHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBVVEYtMTZMRSB0eXBpY2FsbHkgbmVlZHMgdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXIsIGJ1dCBldmVuIGlmIHdlIGhhdmUgYW4gZXZlblxuLy8gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBlbmQgb24gYSBsZWFkaW5nL2hpZ2hcbi8vIHN1cnJvZ2F0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0IHR3byBieXRlcyBpbiBvcmRlciB0b1xuLy8gZGVjb2RlIHRoZSBsYXN0IGNoYXJhY3RlciBwcm9wZXJseS5cbmZ1bmN0aW9uIHV0ZjE2VGV4dChidWYsIGkpIHtcbiAgaWYgKChidWYubGVuZ3RoIC0gaSkgJSAyID09PSAwKSB7XG4gICAgdmFyIHIgPSBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpKTtcbiAgICBpZiAocikge1xuICAgICAgdmFyIGMgPSByLmNoYXJDb2RlQXQoci5sZW5ndGggLSAxKTtcbiAgICAgIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmxhc3ROZWVkID0gMjtcbiAgICAgICAgdGhpcy5sYXN0VG90YWwgPSA0O1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiByLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDE7XG4gIHRoaXMubGFzdFRvdGFsID0gMjtcbiAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnLCBpLCBidWYubGVuZ3RoIC0gMSk7XG59XG5cbi8vIEZvciBVVEYtMTZMRSB3ZSBkbyBub3QgZXhwbGljaXRseSBhcHBlbmQgc3BlY2lhbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJzIGlmIHdlXG4vLyBlbmQgb24gYSBwYXJ0aWFsIGNoYXJhY3Rlciwgd2Ugc2ltcGx5IGxldCB2OCBoYW5kbGUgdGhhdC5cbmZ1bmN0aW9uIHV0ZjE2RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgdmFyIGVuZCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgICByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ3V0ZjE2bGUnLCAwLCBlbmQpO1xuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRUZXh0KGJ1ZiwgaSkge1xuICB2YXIgbiA9IChidWYubGVuZ3RoIC0gaSkgJSAzO1xuICBpZiAobiA9PT0gMCkgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSk7XG4gIHRoaXMubGFzdE5lZWQgPSAzIC0gbjtcbiAgdGhpcy5sYXN0VG90YWwgPSAzO1xuICBpZiAobiA9PT0gMSkge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICB9XG4gIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGksIGJ1Zi5sZW5ndGggLSBuKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArIHRoaXMubGFzdENoYXIudG9TdHJpbmcoJ2Jhc2U2NCcsIDAsIDMgLSB0aGlzLmxhc3ROZWVkKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFBhc3MgYnl0ZXMgb24gdGhyb3VnaCBmb3Igc2luZ2xlLWJ5dGUgZW5jb2RpbmdzIChlLmcuIGFzY2lpLCBsYXRpbjEsIGhleClcbmZ1bmN0aW9uIHNpbXBsZVdyaXRlKGJ1Zikge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiBzaW1wbGVFbmQoYnVmKSB7XG4gIHJldHVybiBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xufSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlBhc3NUaHJvdWdoXG4iLCJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuVHJhbnNmb3JtXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCI7KGZ1bmN0aW9uIChzYXgpIHsgLy8gd3JhcHBlciBmb3Igbm9uLW5vZGUgZW52c1xuICBzYXgucGFyc2VyID0gZnVuY3Rpb24gKHN0cmljdCwgb3B0KSB7IHJldHVybiBuZXcgU0FYUGFyc2VyKHN0cmljdCwgb3B0KSB9XG4gIHNheC5TQVhQYXJzZXIgPSBTQVhQYXJzZXJcbiAgc2F4LlNBWFN0cmVhbSA9IFNBWFN0cmVhbVxuICBzYXguY3JlYXRlU3RyZWFtID0gY3JlYXRlU3RyZWFtXG5cbiAgLy8gV2hlbiB3ZSBwYXNzIHRoZSBNQVhfQlVGRkVSX0xFTkdUSCBwb3NpdGlvbiwgc3RhcnQgY2hlY2tpbmcgZm9yIGJ1ZmZlciBvdmVycnVucy5cbiAgLy8gV2hlbiB3ZSBjaGVjaywgc2NoZWR1bGUgdGhlIG5leHQgY2hlY2sgZm9yIE1BWF9CVUZGRVJfTEVOR1RIIC0gKG1heChidWZmZXIgbGVuZ3RocykpLFxuICAvLyBzaW5jZSB0aGF0J3MgdGhlIGVhcmxpZXN0IHRoYXQgYSBidWZmZXIgb3ZlcnJ1biBjb3VsZCBvY2N1ci4gIFRoaXMgd2F5LCBjaGVja3MgYXJlXG4gIC8vIGFzIHJhcmUgYXMgcmVxdWlyZWQsIGJ1dCBhcyBvZnRlbiBhcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5ldmVyIGNyb3NzaW5nIHRoaXMgYm91bmQuXG4gIC8vIEZ1cnRoZXJtb3JlLCBidWZmZXJzIGFyZSBvbmx5IHRlc3RlZCBhdCBtb3N0IG9uY2UgcGVyIHdyaXRlKCksIHNvIHBhc3NpbmcgYSB2ZXJ5XG4gIC8vIGxhcmdlIHN0cmluZyBpbnRvIHdyaXRlKCkgbWlnaHQgaGF2ZSB1bmRlc2lyYWJsZSBlZmZlY3RzLCBidXQgdGhpcyBpcyBtYW5hZ2VhYmxlIGJ5XG4gIC8vIHRoZSBjYWxsZXIsIHNvIGl0IGlzIGFzc3VtZWQgdG8gYmUgc2FmZS4gIFRodXMsIGEgY2FsbCB0byB3cml0ZSgpIG1heSwgaW4gdGhlIGV4dHJlbWVcbiAgLy8gZWRnZSBjYXNlLCByZXN1bHQgaW4gY3JlYXRpbmcgYXQgbW9zdCBvbmUgY29tcGxldGUgY29weSBvZiB0aGUgc3RyaW5nIHBhc3NlZCBpbi5cbiAgLy8gU2V0IHRvIEluZmluaXR5IHRvIGhhdmUgdW5saW1pdGVkIGJ1ZmZlcnMuXG4gIHNheC5NQVhfQlVGRkVSX0xFTkdUSCA9IDY0ICogMTAyNFxuXG4gIHZhciBidWZmZXJzID0gW1xuICAgICdjb21tZW50JywgJ3NnbWxEZWNsJywgJ3RleHROb2RlJywgJ3RhZ05hbWUnLCAnZG9jdHlwZScsXG4gICAgJ3Byb2NJbnN0TmFtZScsICdwcm9jSW5zdEJvZHknLCAnZW50aXR5JywgJ2F0dHJpYk5hbWUnLFxuICAgICdhdHRyaWJWYWx1ZScsICdjZGF0YScsICdzY3JpcHQnXG4gIF1cblxuICBzYXguRVZFTlRTID0gW1xuICAgICd0ZXh0JyxcbiAgICAncHJvY2Vzc2luZ2luc3RydWN0aW9uJyxcbiAgICAnc2dtbGRlY2xhcmF0aW9uJyxcbiAgICAnZG9jdHlwZScsXG4gICAgJ2NvbW1lbnQnLFxuICAgICdvcGVudGFnc3RhcnQnLFxuICAgICdhdHRyaWJ1dGUnLFxuICAgICdvcGVudGFnJyxcbiAgICAnY2xvc2V0YWcnLFxuICAgICdvcGVuY2RhdGEnLFxuICAgICdjZGF0YScsXG4gICAgJ2Nsb3NlY2RhdGEnLFxuICAgICdlcnJvcicsXG4gICAgJ2VuZCcsXG4gICAgJ3JlYWR5JyxcbiAgICAnc2NyaXB0JyxcbiAgICAnb3Blbm5hbWVzcGFjZScsXG4gICAgJ2Nsb3NlbmFtZXNwYWNlJ1xuICBdXG5cbiAgZnVuY3Rpb24gU0FYUGFyc2VyIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhQYXJzZXIpKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFBhcnNlcihzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICB2YXIgcGFyc2VyID0gdGhpc1xuICAgIGNsZWFyQnVmZmVycyhwYXJzZXIpXG4gICAgcGFyc2VyLnEgPSBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEhcbiAgICBwYXJzZXIub3B0ID0gb3B0IHx8IHt9XG4gICAgcGFyc2VyLm9wdC5sb3dlcmNhc2UgPSBwYXJzZXIub3B0Lmxvd2VyY2FzZSB8fCBwYXJzZXIub3B0Lmxvd2VyY2FzZXRhZ3NcbiAgICBwYXJzZXIubG9vc2VDYXNlID0gcGFyc2VyLm9wdC5sb3dlcmNhc2UgPyAndG9Mb3dlckNhc2UnIDogJ3RvVXBwZXJDYXNlJ1xuICAgIHBhcnNlci50YWdzID0gW11cbiAgICBwYXJzZXIuY2xvc2VkID0gcGFyc2VyLmNsb3NlZFJvb3QgPSBwYXJzZXIuc2F3Um9vdCA9IGZhbHNlXG4gICAgcGFyc2VyLnRhZyA9IHBhcnNlci5lcnJvciA9IG51bGxcbiAgICBwYXJzZXIuc3RyaWN0ID0gISFzdHJpY3RcbiAgICBwYXJzZXIubm9zY3JpcHQgPSAhIShzdHJpY3QgfHwgcGFyc2VyLm9wdC5ub3NjcmlwdClcbiAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOXG4gICAgcGFyc2VyLnN0cmljdEVudGl0aWVzID0gcGFyc2VyLm9wdC5zdHJpY3RFbnRpdGllc1xuICAgIHBhcnNlci5FTlRJVElFUyA9IHBhcnNlci5zdHJpY3RFbnRpdGllcyA/IE9iamVjdC5jcmVhdGUoc2F4LlhNTF9FTlRJVElFUykgOiBPYmplY3QuY3JlYXRlKHNheC5FTlRJVElFUylcbiAgICBwYXJzZXIuYXR0cmliTGlzdCA9IFtdXG5cbiAgICAvLyBuYW1lc3BhY2VzIGZvcm0gYSBwcm90b3R5cGUgY2hhaW4uXG4gICAgLy8gaXQgYWx3YXlzIHBvaW50cyBhdCB0aGUgY3VycmVudCB0YWcsXG4gICAgLy8gd2hpY2ggcHJvdG9zIHRvIGl0cyBwYXJlbnQgdGFnLlxuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICBwYXJzZXIubnMgPSBPYmplY3QuY3JlYXRlKHJvb3ROUylcbiAgICB9XG5cbiAgICAvLyBtb3N0bHkganVzdCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAgcGFyc2VyLnRyYWNrUG9zaXRpb24gPSBwYXJzZXIub3B0LnBvc2l0aW9uICE9PSBmYWxzZVxuICAgIGlmIChwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gcGFyc2VyLmxpbmUgPSBwYXJzZXIuY29sdW1uID0gMFxuICAgIH1cbiAgICBlbWl0KHBhcnNlciwgJ29ucmVhZHknKVxuICB9XG5cbiAgaWYgKCFPYmplY3QuY3JlYXRlKSB7XG4gICAgT2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICBmdW5jdGlvbiBGICgpIHt9XG4gICAgICBGLnByb3RvdHlwZSA9IG9cbiAgICAgIHZhciBuZXdmID0gbmV3IEYoKVxuICAgICAgcmV0dXJuIG5ld2ZcbiAgICB9XG4gIH1cblxuICBpZiAoIU9iamVjdC5rZXlzKSB7XG4gICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiAobykge1xuICAgICAgdmFyIGEgPSBbXVxuICAgICAgZm9yICh2YXIgaSBpbiBvKSBpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkgYS5wdXNoKGkpXG4gICAgICByZXR1cm4gYVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoZWNrQnVmZmVyTGVuZ3RoIChwYXJzZXIpIHtcbiAgICB2YXIgbWF4QWxsb3dlZCA9IE1hdGgubWF4KHNheC5NQVhfQlVGRkVSX0xFTkdUSCwgMTApXG4gICAgdmFyIG1heEFjdHVhbCA9IDBcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGJ1ZmZlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgbGVuID0gcGFyc2VyW2J1ZmZlcnNbaV1dLmxlbmd0aFxuICAgICAgaWYgKGxlbiA+IG1heEFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGV4dC9jZGF0YSBub2RlcyBjYW4gZ2V0IGJpZywgYW5kIHNpbmNlIHRoZXkncmUgYnVmZmVyZWQsXG4gICAgICAgIC8vIHdlIGNhbiBnZXQgaGVyZSB1bmRlciBub3JtYWwgY29uZGl0aW9ucy5cbiAgICAgICAgLy8gQXZvaWQgaXNzdWVzIGJ5IGVtaXR0aW5nIHRoZSB0ZXh0IG5vZGUgbm93LFxuICAgICAgICAvLyBzbyBhdCBsZWFzdCBpdCB3b24ndCBnZXQgYW55IGJpZ2dlci5cbiAgICAgICAgc3dpdGNoIChidWZmZXJzW2ldKSB7XG4gICAgICAgICAgY2FzZSAndGV4dE5vZGUnOlxuICAgICAgICAgICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdjZGF0YSc6XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNkYXRhJywgcGFyc2VyLmNkYXRhKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICBjYXNlICdzY3JpcHQnOlxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25zY3JpcHQnLCBwYXJzZXIuc2NyaXB0KVxuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCA9ICcnXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKHBhcnNlciwgJ01heCBidWZmZXIgbGVuZ3RoIGV4Y2VlZGVkOiAnICsgYnVmZmVyc1tpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWF4QWN0dWFsID0gTWF0aC5tYXgobWF4QWN0dWFsLCBsZW4pXG4gICAgfVxuICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IGNoZWNrIGZvciB0aGUgZWFybGllc3QgcG9zc2libGUgYnVmZmVyIG92ZXJydW4uXG4gICAgdmFyIG0gPSBzYXguTUFYX0JVRkZFUl9MRU5HVEggLSBtYXhBY3R1YWxcbiAgICBwYXJzZXIuYnVmZmVyQ2hlY2tQb3NpdGlvbiA9IG0gKyBwYXJzZXIucG9zaXRpb25cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQnVmZmVycyAocGFyc2VyKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBidWZmZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcGFyc2VyW2J1ZmZlcnNbaV1dID0gJydcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaEJ1ZmZlcnMgKHBhcnNlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci5jZGF0YSAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgIH1cbiAgICBpZiAocGFyc2VyLnNjcmlwdCAhPT0gJycpIHtcbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIFNBWFBhcnNlci5wcm90b3R5cGUgPSB7XG4gICAgZW5kOiBmdW5jdGlvbiAoKSB7IGVuZCh0aGlzKSB9LFxuICAgIHdyaXRlOiB3cml0ZSxcbiAgICByZXN1bWU6IGZ1bmN0aW9uICgpIHsgdGhpcy5lcnJvciA9IG51bGw7IHJldHVybiB0aGlzIH0sXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMud3JpdGUobnVsbCkgfSxcbiAgICBmbHVzaDogZnVuY3Rpb24gKCkgeyBmbHVzaEJ1ZmZlcnModGhpcykgfVxuICB9XG5cbiAgdmFyIFN0cmVhbVxuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuICB9IGNhdGNoIChleCkge1xuICAgIFN0cmVhbSA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICB2YXIgc3RyZWFtV3JhcHMgPSBzYXguRVZFTlRTLmZpbHRlcihmdW5jdGlvbiAoZXYpIHtcbiAgICByZXR1cm4gZXYgIT09ICdlcnJvcicgJiYgZXYgIT09ICdlbmQnXG4gIH0pXG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIHJldHVybiBuZXcgU0FYU3RyZWFtKHN0cmljdCwgb3B0KVxuICB9XG5cbiAgZnVuY3Rpb24gU0FYU3RyZWFtIChzdHJpY3QsIG9wdCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTQVhTdHJlYW0pKSB7XG4gICAgICByZXR1cm4gbmV3IFNBWFN0cmVhbShzdHJpY3QsIG9wdClcbiAgICB9XG5cbiAgICBTdHJlYW0uYXBwbHkodGhpcylcblxuICAgIHRoaXMuX3BhcnNlciA9IG5ldyBTQVhQYXJzZXIoc3RyaWN0LCBvcHQpXG4gICAgdGhpcy53cml0YWJsZSA9IHRydWVcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZVxuXG4gICAgdmFyIG1lID0gdGhpc1xuXG4gICAgdGhpcy5fcGFyc2VyLm9uZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuZW1pdCgnZW5kJylcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIub25lcnJvciA9IGZ1bmN0aW9uIChlcikge1xuICAgICAgbWUuZW1pdCgnZXJyb3InLCBlcilcblxuICAgICAgLy8gaWYgZGlkbid0IHRocm93LCB0aGVuIG1lYW5zIGVycm9yIHdhcyBoYW5kbGVkLlxuICAgICAgLy8gZ28gYWhlYWQgYW5kIGNsZWFyIGVycm9yLCBzbyB3ZSBjYW4gd3JpdGUgYWdhaW4uXG4gICAgICBtZS5fcGFyc2VyLmVycm9yID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuX2RlY29kZXIgPSBudWxsXG5cbiAgICBzdHJlYW1XcmFwcy5mb3JFYWNoKGZ1bmN0aW9uIChldikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCAnb24nICsgZXYsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lLl9wYXJzZXJbJ29uJyArIGV2XVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChoKSB7XG4gICAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgICBtZS5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpXG4gICAgICAgICAgICBtZS5fcGFyc2VyWydvbicgKyBldl0gPSBoXG4gICAgICAgICAgICByZXR1cm4gaFxuICAgICAgICAgIH1cbiAgICAgICAgICBtZS5vbihldiwgaClcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RyZWFtLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogU0FYU3RyZWFtXG4gICAgfVxuICB9KVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2YgQnVmZmVyLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHtcbiAgICAgIGlmICghdGhpcy5fZGVjb2Rlcikge1xuICAgICAgICB2YXIgU0QgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcbiAgICAgICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTRCgndXRmOCcpXG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy5fZGVjb2Rlci53cml0ZShkYXRhKVxuICAgIH1cblxuICAgIHRoaXMuX3BhcnNlci53cml0ZShkYXRhLnRvU3RyaW5nKCkpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICB0aGlzLndyaXRlKGNodW5rKVxuICAgIH1cbiAgICB0aGlzLl9wYXJzZXIuZW5kKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgU0FYU3RyZWFtLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgaGFuZGxlcikge1xuICAgIHZhciBtZSA9IHRoaXNcbiAgICBpZiAoIW1lLl9wYXJzZXJbJ29uJyArIGV2XSAmJiBzdHJlYW1XcmFwcy5pbmRleE9mKGV2KSAhPT0gLTEpIHtcbiAgICAgIG1lLl9wYXJzZXJbJ29uJyArIGV2XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gW2FyZ3VtZW50c1swXV0gOiBBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgICAgIGFyZ3Muc3BsaWNlKDAsIDAsIGV2KVxuICAgICAgICBtZS5lbWl0LmFwcGx5KG1lLCBhcmdzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwobWUsIGV2LCBoYW5kbGVyKVxuICB9XG5cbiAgLy8gdGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBjaGFyYWN0ZXIgY2xhc3Nlcy5cbiAgLy8gWE1MIGFsbG93cyBhbGwgbWFubmVyIG9mIHJpZGljdWxvdXMgbnVtYmVycyBhbmQgZGlnaXRzLlxuICB2YXIgQ0RBVEEgPSAnW0NEQVRBWydcbiAgdmFyIERPQ1RZUEUgPSAnRE9DVFlQRSdcbiAgdmFyIFhNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJ1xuICB2YXIgWE1MTlNfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJ1xuICB2YXIgcm9vdE5TID0geyB4bWw6IFhNTF9OQU1FU1BBQ0UsIHhtbG5zOiBYTUxOU19OQU1FU1BBQ0UgfVxuXG4gIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI05ULU5hbWVTdGFydENoYXJcbiAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBvbiBzdHJpbmdzLCBhIHNpbmdsZSBjaGFyYWN0ZXIgYXQgYSB0aW1lXG4gIC8vIGFzIHN1Y2gsIGl0IGNhbm5vdCBldmVyIHN1cHBvcnQgYXN0cmFsLXBsYW5lIGNoYXJhY3RlcnMgKDEwMDAwLUVGRkZGKVxuICAvLyB3aXRob3V0IGEgc2lnbmlmaWNhbnQgYnJlYWtpbmcgY2hhbmdlIHRvIGVpdGhlciB0aGlzICBwYXJzZXIsIG9yIHRoZVxuICAvLyBKYXZhU2NyaXB0IGxhbmd1YWdlLiAgSW1wbGVtZW50YXRpb24gb2YgYW4gZW1vamktY2FwYWJsZSB4bWwgcGFyc2VyXG4gIC8vIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuXG4gIHZhciBuYW1lU3RhcnQgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS9cblxuICB2YXIgbmFtZUJvZHkgPSAvWzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MC5cXGQtXS9cblxuICB2YXIgZW50aXR5U3RhcnQgPSAvWyM6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF0vXG4gIHZhciBlbnRpdHlCb2R5ID0gL1sjOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwLlxcZC1dL1xuXG4gIGZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAoYykge1xuICAgIHJldHVybiBjID09PSAnICcgfHwgYyA9PT0gJ1xcbicgfHwgYyA9PT0gJ1xccicgfHwgYyA9PT0gJ1xcdCdcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUXVvdGUgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJ1wiJyB8fCBjID09PSAnXFwnJ1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBdHRyaWJFbmQgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJz4nIHx8IGlzV2hpdGVzcGFjZShjKVxuICB9XG5cbiAgZnVuY3Rpb24gaXNNYXRjaCAocmVnZXgsIGMpIHtcbiAgICByZXR1cm4gcmVnZXgudGVzdChjKVxuICB9XG5cbiAgZnVuY3Rpb24gbm90TWF0Y2ggKHJlZ2V4LCBjKSB7XG4gICAgcmV0dXJuICFpc01hdGNoKHJlZ2V4LCBjKVxuICB9XG5cbiAgdmFyIFMgPSAwXG4gIHNheC5TVEFURSA9IHtcbiAgICBCRUdJTjogUysrLCAvLyBsZWFkaW5nIGJ5dGUgb3JkZXIgbWFyayBvciB3aGl0ZXNwYWNlXG4gICAgQkVHSU5fV0hJVEVTUEFDRTogUysrLCAvLyBsZWFkaW5nIHdoaXRlc3BhY2VcbiAgICBURVhUOiBTKyssIC8vIGdlbmVyYWwgc3R1ZmZcbiAgICBURVhUX0VOVElUWTogUysrLCAvLyAmYW1wIGFuZCBzdWNoLlxuICAgIE9QRU5fV0FLQTogUysrLCAvLyA8XG4gICAgU0dNTF9ERUNMOiBTKyssIC8vIDwhQkxBUkdcbiAgICBTR01MX0RFQ0xfUVVPVEVEOiBTKyssIC8vIDwhQkxBUkcgZm9vIFwiYmFyXG4gICAgRE9DVFlQRTogUysrLCAvLyA8IURPQ1RZUEVcbiAgICBET0NUWVBFX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcbiAgICBET0NUWVBFX0RURDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIC4uLlxuICAgIERPQ1RZUEVfRFREX1FVT1RFRDogUysrLCAvLyA8IURPQ1RZUEUgXCIvL2JsYWhcIiBbIFwiZm9vXG4gICAgQ09NTUVOVF9TVEFSVElORzogUysrLCAvLyA8IS1cbiAgICBDT01NRU5UOiBTKyssIC8vIDwhLS1cbiAgICBDT01NRU5UX0VORElORzogUysrLCAvLyA8IS0tIGJsYWggLVxuICAgIENPTU1FTlRfRU5ERUQ6IFMrKywgLy8gPCEtLSBibGFoIC0tXG4gICAgQ0RBVEE6IFMrKywgLy8gPCFbQ0RBVEFbIHNvbWV0aGluZ1xuICAgIENEQVRBX0VORElORzogUysrLCAvLyBdXG4gICAgQ0RBVEFfRU5ESU5HXzI6IFMrKywgLy8gXV1cbiAgICBQUk9DX0lOU1Q6IFMrKywgLy8gPD9oaVxuICAgIFBST0NfSU5TVF9CT0RZOiBTKyssIC8vIDw/aGkgdGhlcmVcbiAgICBQUk9DX0lOU1RfRU5ESU5HOiBTKyssIC8vIDw/aGkgXCJ0aGVyZVwiID9cbiAgICBPUEVOX1RBRzogUysrLCAvLyA8c3Ryb25nXG4gICAgT1BFTl9UQUdfU0xBU0g6IFMrKywgLy8gPHN0cm9uZyAvXG4gICAgQVRUUklCOiBTKyssIC8vIDxhXG4gICAgQVRUUklCX05BTUU6IFMrKywgLy8gPGEgZm9vXG4gICAgQVRUUklCX05BTUVfU0FXX1dISVRFOiBTKyssIC8vIDxhIGZvbyBfXG4gICAgQVRUUklCX1ZBTFVFOiBTKyssIC8vIDxhIGZvbz1cbiAgICBBVFRSSUJfVkFMVUVfUVVPVEVEOiBTKyssIC8vIDxhIGZvbz1cImJhclxuICAgIEFUVFJJQl9WQUxVRV9DTE9TRUQ6IFMrKywgLy8gPGEgZm9vPVwiYmFyXCJcbiAgICBBVFRSSUJfVkFMVUVfVU5RVU9URUQ6IFMrKywgLy8gPGEgZm9vPWJhclxuICAgIEFUVFJJQl9WQUxVRV9FTlRJVFlfUTogUysrLCAvLyA8Zm9vIGJhcj1cIiZxdW90O1wiXG4gICAgQVRUUklCX1ZBTFVFX0VOVElUWV9VOiBTKyssIC8vIDxmb28gYmFyPSZxdW90XG4gICAgQ0xPU0VfVEFHOiBTKyssIC8vIDwvYVxuICAgIENMT1NFX1RBR19TQVdfV0hJVEU6IFMrKywgLy8gPC9hICAgPlxuICAgIFNDUklQVDogUysrLCAvLyA8c2NyaXB0PiAuLi5cbiAgICBTQ1JJUFRfRU5ESU5HOiBTKysgLy8gPHNjcmlwdD4gLi4uIDxcbiAgfVxuXG4gIHNheC5YTUxfRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiXG4gIH1cblxuICBzYXguRU5USVRJRVMgPSB7XG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2x0JzogJzwnLFxuICAgICdxdW90JzogJ1wiJyxcbiAgICAnYXBvcyc6IFwiJ1wiLFxuICAgICdBRWxpZyc6IDE5OCxcbiAgICAnQWFjdXRlJzogMTkzLFxuICAgICdBY2lyYyc6IDE5NCxcbiAgICAnQWdyYXZlJzogMTkyLFxuICAgICdBcmluZyc6IDE5NyxcbiAgICAnQXRpbGRlJzogMTk1LFxuICAgICdBdW1sJzogMTk2LFxuICAgICdDY2VkaWwnOiAxOTksXG4gICAgJ0VUSCc6IDIwOCxcbiAgICAnRWFjdXRlJzogMjAxLFxuICAgICdFY2lyYyc6IDIwMixcbiAgICAnRWdyYXZlJzogMjAwLFxuICAgICdFdW1sJzogMjAzLFxuICAgICdJYWN1dGUnOiAyMDUsXG4gICAgJ0ljaXJjJzogMjA2LFxuICAgICdJZ3JhdmUnOiAyMDQsXG4gICAgJ0l1bWwnOiAyMDcsXG4gICAgJ050aWxkZSc6IDIwOSxcbiAgICAnT2FjdXRlJzogMjExLFxuICAgICdPY2lyYyc6IDIxMixcbiAgICAnT2dyYXZlJzogMjEwLFxuICAgICdPc2xhc2gnOiAyMTYsXG4gICAgJ090aWxkZSc6IDIxMyxcbiAgICAnT3VtbCc6IDIxNCxcbiAgICAnVEhPUk4nOiAyMjIsXG4gICAgJ1VhY3V0ZSc6IDIxOCxcbiAgICAnVWNpcmMnOiAyMTksXG4gICAgJ1VncmF2ZSc6IDIxNyxcbiAgICAnVXVtbCc6IDIyMCxcbiAgICAnWWFjdXRlJzogMjIxLFxuICAgICdhYWN1dGUnOiAyMjUsXG4gICAgJ2FjaXJjJzogMjI2LFxuICAgICdhZWxpZyc6IDIzMCxcbiAgICAnYWdyYXZlJzogMjI0LFxuICAgICdhcmluZyc6IDIyOSxcbiAgICAnYXRpbGRlJzogMjI3LFxuICAgICdhdW1sJzogMjI4LFxuICAgICdjY2VkaWwnOiAyMzEsXG4gICAgJ2VhY3V0ZSc6IDIzMyxcbiAgICAnZWNpcmMnOiAyMzQsXG4gICAgJ2VncmF2ZSc6IDIzMixcbiAgICAnZXRoJzogMjQwLFxuICAgICdldW1sJzogMjM1LFxuICAgICdpYWN1dGUnOiAyMzcsXG4gICAgJ2ljaXJjJzogMjM4LFxuICAgICdpZ3JhdmUnOiAyMzYsXG4gICAgJ2l1bWwnOiAyMzksXG4gICAgJ250aWxkZSc6IDI0MSxcbiAgICAnb2FjdXRlJzogMjQzLFxuICAgICdvY2lyYyc6IDI0NCxcbiAgICAnb2dyYXZlJzogMjQyLFxuICAgICdvc2xhc2gnOiAyNDgsXG4gICAgJ290aWxkZSc6IDI0NSxcbiAgICAnb3VtbCc6IDI0NixcbiAgICAnc3psaWcnOiAyMjMsXG4gICAgJ3Rob3JuJzogMjU0LFxuICAgICd1YWN1dGUnOiAyNTAsXG4gICAgJ3VjaXJjJzogMjUxLFxuICAgICd1Z3JhdmUnOiAyNDksXG4gICAgJ3V1bWwnOiAyNTIsXG4gICAgJ3lhY3V0ZSc6IDI1MyxcbiAgICAneXVtbCc6IDI1NSxcbiAgICAnY29weSc6IDE2OSxcbiAgICAncmVnJzogMTc0LFxuICAgICduYnNwJzogMTYwLFxuICAgICdpZXhjbCc6IDE2MSxcbiAgICAnY2VudCc6IDE2MixcbiAgICAncG91bmQnOiAxNjMsXG4gICAgJ2N1cnJlbic6IDE2NCxcbiAgICAneWVuJzogMTY1LFxuICAgICdicnZiYXInOiAxNjYsXG4gICAgJ3NlY3QnOiAxNjcsXG4gICAgJ3VtbCc6IDE2OCxcbiAgICAnb3JkZic6IDE3MCxcbiAgICAnbGFxdW8nOiAxNzEsXG4gICAgJ25vdCc6IDE3MixcbiAgICAnc2h5JzogMTczLFxuICAgICdtYWNyJzogMTc1LFxuICAgICdkZWcnOiAxNzYsXG4gICAgJ3BsdXNtbic6IDE3NyxcbiAgICAnc3VwMSc6IDE4NSxcbiAgICAnc3VwMic6IDE3OCxcbiAgICAnc3VwMyc6IDE3OSxcbiAgICAnYWN1dGUnOiAxODAsXG4gICAgJ21pY3JvJzogMTgxLFxuICAgICdwYXJhJzogMTgyLFxuICAgICdtaWRkb3QnOiAxODMsXG4gICAgJ2NlZGlsJzogMTg0LFxuICAgICdvcmRtJzogMTg2LFxuICAgICdyYXF1byc6IDE4NyxcbiAgICAnZnJhYzE0JzogMTg4LFxuICAgICdmcmFjMTInOiAxODksXG4gICAgJ2ZyYWMzNCc6IDE5MCxcbiAgICAnaXF1ZXN0JzogMTkxLFxuICAgICd0aW1lcyc6IDIxNSxcbiAgICAnZGl2aWRlJzogMjQ3LFxuICAgICdPRWxpZyc6IDMzOCxcbiAgICAnb2VsaWcnOiAzMzksXG4gICAgJ1NjYXJvbic6IDM1MixcbiAgICAnc2Nhcm9uJzogMzUzLFxuICAgICdZdW1sJzogMzc2LFxuICAgICdmbm9mJzogNDAyLFxuICAgICdjaXJjJzogNzEwLFxuICAgICd0aWxkZSc6IDczMixcbiAgICAnQWxwaGEnOiA5MTMsXG4gICAgJ0JldGEnOiA5MTQsXG4gICAgJ0dhbW1hJzogOTE1LFxuICAgICdEZWx0YSc6IDkxNixcbiAgICAnRXBzaWxvbic6IDkxNyxcbiAgICAnWmV0YSc6IDkxOCxcbiAgICAnRXRhJzogOTE5LFxuICAgICdUaGV0YSc6IDkyMCxcbiAgICAnSW90YSc6IDkyMSxcbiAgICAnS2FwcGEnOiA5MjIsXG4gICAgJ0xhbWJkYSc6IDkyMyxcbiAgICAnTXUnOiA5MjQsXG4gICAgJ051JzogOTI1LFxuICAgICdYaSc6IDkyNixcbiAgICAnT21pY3Jvbic6IDkyNyxcbiAgICAnUGknOiA5MjgsXG4gICAgJ1Jobyc6IDkyOSxcbiAgICAnU2lnbWEnOiA5MzEsXG4gICAgJ1RhdSc6IDkzMixcbiAgICAnVXBzaWxvbic6IDkzMyxcbiAgICAnUGhpJzogOTM0LFxuICAgICdDaGknOiA5MzUsXG4gICAgJ1BzaSc6IDkzNixcbiAgICAnT21lZ2EnOiA5MzcsXG4gICAgJ2FscGhhJzogOTQ1LFxuICAgICdiZXRhJzogOTQ2LFxuICAgICdnYW1tYSc6IDk0NyxcbiAgICAnZGVsdGEnOiA5NDgsXG4gICAgJ2Vwc2lsb24nOiA5NDksXG4gICAgJ3pldGEnOiA5NTAsXG4gICAgJ2V0YSc6IDk1MSxcbiAgICAndGhldGEnOiA5NTIsXG4gICAgJ2lvdGEnOiA5NTMsXG4gICAgJ2thcHBhJzogOTU0LFxuICAgICdsYW1iZGEnOiA5NTUsXG4gICAgJ211JzogOTU2LFxuICAgICdudSc6IDk1NyxcbiAgICAneGknOiA5NTgsXG4gICAgJ29taWNyb24nOiA5NTksXG4gICAgJ3BpJzogOTYwLFxuICAgICdyaG8nOiA5NjEsXG4gICAgJ3NpZ21hZic6IDk2MixcbiAgICAnc2lnbWEnOiA5NjMsXG4gICAgJ3RhdSc6IDk2NCxcbiAgICAndXBzaWxvbic6IDk2NSxcbiAgICAncGhpJzogOTY2LFxuICAgICdjaGknOiA5NjcsXG4gICAgJ3BzaSc6IDk2OCxcbiAgICAnb21lZ2EnOiA5NjksXG4gICAgJ3RoZXRhc3ltJzogOTc3LFxuICAgICd1cHNpaCc6IDk3OCxcbiAgICAncGl2JzogOTgyLFxuICAgICdlbnNwJzogODE5NCxcbiAgICAnZW1zcCc6IDgxOTUsXG4gICAgJ3RoaW5zcCc6IDgyMDEsXG4gICAgJ3p3bmonOiA4MjA0LFxuICAgICd6d2onOiA4MjA1LFxuICAgICdscm0nOiA4MjA2LFxuICAgICdybG0nOiA4MjA3LFxuICAgICduZGFzaCc6IDgyMTEsXG4gICAgJ21kYXNoJzogODIxMixcbiAgICAnbHNxdW8nOiA4MjE2LFxuICAgICdyc3F1byc6IDgyMTcsXG4gICAgJ3NicXVvJzogODIxOCxcbiAgICAnbGRxdW8nOiA4MjIwLFxuICAgICdyZHF1byc6IDgyMjEsXG4gICAgJ2JkcXVvJzogODIyMixcbiAgICAnZGFnZ2VyJzogODIyNCxcbiAgICAnRGFnZ2VyJzogODIyNSxcbiAgICAnYnVsbCc6IDgyMjYsXG4gICAgJ2hlbGxpcCc6IDgyMzAsXG4gICAgJ3Blcm1pbCc6IDgyNDAsXG4gICAgJ3ByaW1lJzogODI0MixcbiAgICAnUHJpbWUnOiA4MjQzLFxuICAgICdsc2FxdW8nOiA4MjQ5LFxuICAgICdyc2FxdW8nOiA4MjUwLFxuICAgICdvbGluZSc6IDgyNTQsXG4gICAgJ2ZyYXNsJzogODI2MCxcbiAgICAnZXVybyc6IDgzNjQsXG4gICAgJ2ltYWdlJzogODQ2NSxcbiAgICAnd2VpZXJwJzogODQ3MixcbiAgICAncmVhbCc6IDg0NzYsXG4gICAgJ3RyYWRlJzogODQ4MixcbiAgICAnYWxlZnN5bSc6IDg1MDEsXG4gICAgJ2xhcnInOiA4NTkyLFxuICAgICd1YXJyJzogODU5MyxcbiAgICAncmFycic6IDg1OTQsXG4gICAgJ2RhcnInOiA4NTk1LFxuICAgICdoYXJyJzogODU5NixcbiAgICAnY3JhcnInOiA4NjI5LFxuICAgICdsQXJyJzogODY1NixcbiAgICAndUFycic6IDg2NTcsXG4gICAgJ3JBcnInOiA4NjU4LFxuICAgICdkQXJyJzogODY1OSxcbiAgICAnaEFycic6IDg2NjAsXG4gICAgJ2ZvcmFsbCc6IDg3MDQsXG4gICAgJ3BhcnQnOiA4NzA2LFxuICAgICdleGlzdCc6IDg3MDcsXG4gICAgJ2VtcHR5JzogODcwOSxcbiAgICAnbmFibGEnOiA4NzExLFxuICAgICdpc2luJzogODcxMixcbiAgICAnbm90aW4nOiA4NzEzLFxuICAgICduaSc6IDg3MTUsXG4gICAgJ3Byb2QnOiA4NzE5LFxuICAgICdzdW0nOiA4NzIxLFxuICAgICdtaW51cyc6IDg3MjIsXG4gICAgJ2xvd2FzdCc6IDg3MjcsXG4gICAgJ3JhZGljJzogODczMCxcbiAgICAncHJvcCc6IDg3MzMsXG4gICAgJ2luZmluJzogODczNCxcbiAgICAnYW5nJzogODczNixcbiAgICAnYW5kJzogODc0MyxcbiAgICAnb3InOiA4NzQ0LFxuICAgICdjYXAnOiA4NzQ1LFxuICAgICdjdXAnOiA4NzQ2LFxuICAgICdpbnQnOiA4NzQ3LFxuICAgICd0aGVyZTQnOiA4NzU2LFxuICAgICdzaW0nOiA4NzY0LFxuICAgICdjb25nJzogODc3MyxcbiAgICAnYXN5bXAnOiA4Nzc2LFxuICAgICduZSc6IDg4MDAsXG4gICAgJ2VxdWl2JzogODgwMSxcbiAgICAnbGUnOiA4ODA0LFxuICAgICdnZSc6IDg4MDUsXG4gICAgJ3N1Yic6IDg4MzQsXG4gICAgJ3N1cCc6IDg4MzUsXG4gICAgJ25zdWInOiA4ODM2LFxuICAgICdzdWJlJzogODgzOCxcbiAgICAnc3VwZSc6IDg4MzksXG4gICAgJ29wbHVzJzogODg1MyxcbiAgICAnb3RpbWVzJzogODg1NSxcbiAgICAncGVycCc6IDg4NjksXG4gICAgJ3Nkb3QnOiA4OTAxLFxuICAgICdsY2VpbCc6IDg5NjgsXG4gICAgJ3JjZWlsJzogODk2OSxcbiAgICAnbGZsb29yJzogODk3MCxcbiAgICAncmZsb29yJzogODk3MSxcbiAgICAnbGFuZyc6IDkwMDEsXG4gICAgJ3JhbmcnOiA5MDAyLFxuICAgICdsb3onOiA5Njc0LFxuICAgICdzcGFkZXMnOiA5ODI0LFxuICAgICdjbHVicyc6IDk4MjcsXG4gICAgJ2hlYXJ0cyc6IDk4MjksXG4gICAgJ2RpYW1zJzogOTgzMFxuICB9XG5cbiAgT2JqZWN0LmtleXMoc2F4LkVOVElUSUVTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZSA9IHNheC5FTlRJVElFU1trZXldXG4gICAgdmFyIHMgPSB0eXBlb2YgZSA9PT0gJ251bWJlcicgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpIDogZVxuICAgIHNheC5FTlRJVElFU1trZXldID0gc1xuICB9KVxuXG4gIGZvciAodmFyIHMgaW4gc2F4LlNUQVRFKSB7XG4gICAgc2F4LlNUQVRFW3NheC5TVEFURVtzXV0gPSBzXG4gIH1cblxuICAvLyBzaG9ydGhhbmRcbiAgUyA9IHNheC5TVEFURVxuXG4gIGZ1bmN0aW9uIGVtaXQgKHBhcnNlciwgZXZlbnQsIGRhdGEpIHtcbiAgICBwYXJzZXJbZXZlbnRdICYmIHBhcnNlcltldmVudF0oZGF0YSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXROb2RlIChwYXJzZXIsIG5vZGVUeXBlLCBkYXRhKSB7XG4gICAgaWYgKHBhcnNlci50ZXh0Tm9kZSkgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBlbWl0KHBhcnNlciwgbm9kZVR5cGUsIGRhdGEpXG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVRleHQgKHBhcnNlcikge1xuICAgIHBhcnNlci50ZXh0Tm9kZSA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBpZiAocGFyc2VyLnRleHROb2RlKSBlbWl0KHBhcnNlciwgJ29udGV4dCcsIHBhcnNlci50ZXh0Tm9kZSlcbiAgICBwYXJzZXIudGV4dE5vZGUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dG9wdHMgKG9wdCwgdGV4dCkge1xuICAgIGlmIChvcHQudHJpbSkgdGV4dCA9IHRleHQudHJpbSgpXG4gICAgaWYgKG9wdC5ub3JtYWxpemUpIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgIHJldHVybiB0ZXh0XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvciAocGFyc2VyLCBlcikge1xuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICBlciArPSAnXFxuTGluZTogJyArIHBhcnNlci5saW5lICtcbiAgICAgICAgJ1xcbkNvbHVtbjogJyArIHBhcnNlci5jb2x1bW4gK1xuICAgICAgICAnXFxuQ2hhcjogJyArIHBhcnNlci5jXG4gICAgfVxuICAgIGVyID0gbmV3IEVycm9yKGVyKVxuICAgIHBhcnNlci5lcnJvciA9IGVyXG4gICAgZW1pdChwYXJzZXIsICdvbmVycm9yJywgZXIpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gZW5kIChwYXJzZXIpIHtcbiAgICBpZiAocGFyc2VyLnNhd1Jvb3QgJiYgIXBhcnNlci5jbG9zZWRSb290KSBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuY2xvc2VkIHJvb3QgdGFnJylcbiAgICBpZiAoKHBhcnNlci5zdGF0ZSAhPT0gUy5CRUdJTikgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuQkVHSU5fV0hJVEVTUEFDRSkgJiZcbiAgICAgIChwYXJzZXIuc3RhdGUgIT09IFMuVEVYVCkpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgJ1VuZXhwZWN0ZWQgZW5kJylcbiAgICB9XG4gICAgY2xvc2VUZXh0KHBhcnNlcilcbiAgICBwYXJzZXIuYyA9ICcnXG4gICAgcGFyc2VyLmNsb3NlZCA9IHRydWVcbiAgICBlbWl0KHBhcnNlciwgJ29uZW5kJylcbiAgICBTQVhQYXJzZXIuY2FsbChwYXJzZXIsIHBhcnNlci5zdHJpY3QsIHBhcnNlci5vcHQpXG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgZnVuY3Rpb24gc3RyaWN0RmFpbCAocGFyc2VyLCBtZXNzYWdlKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJzZXIgIT09ICdvYmplY3QnIHx8ICEocGFyc2VyIGluc3RhbmNlb2YgU0FYUGFyc2VyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2FsbCB0byBzdHJpY3RGYWlsJylcbiAgICB9XG4gICAgaWYgKHBhcnNlci5zdHJpY3QpIHtcbiAgICAgIGVycm9yKHBhcnNlciwgbWVzc2FnZSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBuZXdUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnN0cmljdCkgcGFyc2VyLnRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVtwYXJzZXIubG9vc2VDYXNlXSgpXG4gICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0geyBuYW1lOiBwYXJzZXIudGFnTmFtZSwgYXR0cmlidXRlczoge30gfVxuXG4gICAgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGlmIHRhZyBjb250YWlscyBhbiB4bWxucz1cImZvb1wiIG9yIHhtbG5zOmZvbz1cImJhclwiXG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIHRhZy5ucyA9IHBhcmVudC5uc1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVudGFnc3RhcnQnLCB0YWcpXG4gIH1cblxuICBmdW5jdGlvbiBxbmFtZSAobmFtZSwgYXR0cmlidXRlKSB7XG4gICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoJzonKVxuICAgIHZhciBxdWFsTmFtZSA9IGkgPCAwID8gWyAnJywgbmFtZSBdIDogbmFtZS5zcGxpdCgnOicpXG4gICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lWzBdXG4gICAgdmFyIGxvY2FsID0gcXVhbE5hbWVbMV1cblxuICAgIC8vIDx4IFwieG1sbnNcIj1cImh0dHA6Ly9mb29cIj5cbiAgICBpZiAoYXR0cmlidXRlICYmIG5hbWUgPT09ICd4bWxucycpIHtcbiAgICAgIHByZWZpeCA9ICd4bWxucydcbiAgICAgIGxvY2FsID0gJydcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcmVmaXg6IHByZWZpeCwgbG9jYWw6IGxvY2FsIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJpYiAocGFyc2VyKSB7XG4gICAgaWYgKCFwYXJzZXIuc3RyaWN0KSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJOYW1lW3BhcnNlci5sb29zZUNhc2VdKClcbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLmF0dHJpYkxpc3QuaW5kZXhPZihwYXJzZXIuYXR0cmliTmFtZSkgIT09IC0xIHx8XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkocGFyc2VyLmF0dHJpYk5hbWUpKSB7XG4gICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLmF0dHJpYk5hbWUsIHRydWUpXG4gICAgICB2YXIgcHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB2YXIgbG9jYWwgPSBxbi5sb2NhbFxuXG4gICAgICBpZiAocHJlZml4ID09PSAneG1sbnMnKSB7XG4gICAgICAgIC8vIG5hbWVzcGFjZSBiaW5kaW5nIGF0dHJpYnV0ZS4gcHVzaCB0aGUgYmluZGluZyBpbnRvIHNjb3BlXG4gICAgICAgIGlmIChsb2NhbCA9PT0gJ3htbCcgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsXG4gICAgICAgICAgICAneG1sOiBwcmVmaXggbXVzdCBiZSBib3VuZCB0byAnICsgWE1MX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWwgPT09ICd4bWxucycgJiYgcGFyc2VyLmF0dHJpYlZhbHVlICE9PSBYTUxOU19OQU1FU1BBQ0UpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlcixcbiAgICAgICAgICAgICd4bWxuczogcHJlZml4IG11c3QgYmUgYm91bmQgdG8gJyArIFhNTE5TX05BTUVTUEFDRSArICdcXG4nICtcbiAgICAgICAgICAgICdBY3R1YWw6ICcgKyBwYXJzZXIuYXR0cmliVmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcbiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyc2VyLnRhZ3NbcGFyc2VyLnRhZ3MubGVuZ3RoIC0gMV0gfHwgcGFyc2VyXG4gICAgICAgICAgaWYgKHRhZy5ucyA9PT0gcGFyZW50Lm5zKSB7XG4gICAgICAgICAgICB0YWcubnMgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5ucylcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFnLm5zW2xvY2FsXSA9IHBhcnNlci5hdHRyaWJWYWx1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRlZmVyIG9uYXR0cmlidXRlIGV2ZW50cyB1bnRpbCBhbGwgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2VlblxuICAgICAgLy8gc28gYW55IG5ldyBiaW5kaW5ncyBjYW4gdGFrZSBlZmZlY3QuIHByZXNlcnZlIGF0dHJpYnV0ZSBvcmRlclxuICAgICAgLy8gc28gZGVmZXJyZWQgZXZlbnRzIGNhbiBiZSBlbWl0dGVkIGluIGRvY3VtZW50IG9yZGVyXG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5wdXNoKFtwYXJzZXIuYXR0cmliTmFtZSwgcGFyc2VyLmF0dHJpYlZhbHVlXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gbm9uLXhtbG5zIG1vZGUsIHdlIGNhbiBlbWl0IHRoZSBldmVudCByaWdodCBhd2F5XG4gICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXNbcGFyc2VyLmF0dHJpYk5hbWVdID0gcGFyc2VyLmF0dHJpYlZhbHVlXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIHtcbiAgICAgICAgbmFtZTogcGFyc2VyLmF0dHJpYk5hbWUsXG4gICAgICAgIHZhbHVlOiBwYXJzZXIuYXR0cmliVmFsdWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICB9XG5cbiAgZnVuY3Rpb24gb3BlblRhZyAocGFyc2VyLCBzZWxmQ2xvc2luZykge1xuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICAvLyBlbWl0IG5hbWVzcGFjZSBiaW5kaW5nIGV2ZW50c1xuICAgICAgdmFyIHRhZyA9IHBhcnNlci50YWdcblxuICAgICAgLy8gYWRkIG5hbWVzcGFjZSBpbmZvIHRvIHRhZ1xuICAgICAgdmFyIHFuID0gcW5hbWUocGFyc2VyLnRhZ05hbWUpXG4gICAgICB0YWcucHJlZml4ID0gcW4ucHJlZml4XG4gICAgICB0YWcubG9jYWwgPSBxbi5sb2NhbFxuICAgICAgdGFnLnVyaSA9IHRhZy5uc1txbi5wcmVmaXhdIHx8ICcnXG5cbiAgICAgIGlmICh0YWcucHJlZml4ICYmICF0YWcudXJpKSB7XG4gICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5ib3VuZCBuYW1lc3BhY2UgcHJlZml4OiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJzZXIudGFnTmFtZSkpXG4gICAgICAgIHRhZy51cmkgPSBxbi5wcmVmaXhcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHRhZy5ucyAmJiBwYXJlbnQubnMgIT09IHRhZy5ucykge1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW5uYW1lc3BhY2UnLCB7XG4gICAgICAgICAgICBwcmVmaXg6IHAsXG4gICAgICAgICAgICB1cmk6IHRhZy5uc1twXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIGhhbmRsZSBkZWZlcnJlZCBvbmF0dHJpYnV0ZSBldmVudHNcbiAgICAgIC8vIE5vdGU6IGRvIG5vdCBhcHBseSBkZWZhdWx0IG5zIHRvIGF0dHJpYnV0ZXM6XG4gICAgICAvLyAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvI2RlZmF1bHRpbmdcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBudiA9IHBhcnNlci5hdHRyaWJMaXN0W2ldXG4gICAgICAgIHZhciBuYW1lID0gbnZbMF1cbiAgICAgICAgdmFyIHZhbHVlID0gbnZbMV1cbiAgICAgICAgdmFyIHF1YWxOYW1lID0gcW5hbWUobmFtZSwgdHJ1ZSlcbiAgICAgICAgdmFyIHByZWZpeCA9IHF1YWxOYW1lLnByZWZpeFxuICAgICAgICB2YXIgbG9jYWwgPSBxdWFsTmFtZS5sb2NhbFxuICAgICAgICB2YXIgdXJpID0gcHJlZml4ID09PSAnJyA/ICcnIDogKHRhZy5uc1twcmVmaXhdIHx8ICcnKVxuICAgICAgICB2YXIgYSA9IHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmVmaXg6IHByZWZpeCxcbiAgICAgICAgICBsb2NhbDogbG9jYWwsXG4gICAgICAgICAgdXJpOiB1cmlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGF0dHJpYnV0ZXMgd2l0aCBhbiB1bmRlZmluZWQgbmFtZXNwYWNlLFxuICAgICAgICAvLyB0aGVuIGZhaWwgb24gdGhlbSBub3cuXG4gICAgICAgIGlmIChwcmVmaXggJiYgcHJlZml4ICE9PSAneG1sbnMnICYmICF1cmkpIHtcbiAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuYm91bmQgbmFtZXNwYWNlIHByZWZpeDogJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcmVmaXgpKVxuICAgICAgICAgIGEudXJpID0gcHJlZml4XG4gICAgICAgIH1cbiAgICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzW25hbWVdID0gYVxuICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIGEpXG4gICAgICB9XG4gICAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgfVxuXG4gICAgcGFyc2VyLnRhZy5pc1NlbGZDbG9zaW5nID0gISFzZWxmQ2xvc2luZ1xuXG4gICAgLy8gcHJvY2VzcyB0aGUgdGFnXG4gICAgcGFyc2VyLnNhd1Jvb3QgPSB0cnVlXG4gICAgcGFyc2VyLnRhZ3MucHVzaChwYXJzZXIudGFnKVxuICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbnRhZycsIHBhcnNlci50YWcpXG4gICAgaWYgKCFzZWxmQ2xvc2luZykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciA8c2NyaXB0PiBpbiBub24tc3RyaWN0IG1vZGUuXG4gICAgICBpZiAoIXBhcnNlci5ub3NjcmlwdCAmJiBwYXJzZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc2NyaXB0Jykge1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICB9XG4gICAgICBwYXJzZXIudGFnID0gbnVsbFxuICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgIH1cbiAgICBwYXJzZXIuYXR0cmliTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VUYWcgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnRhZ05hbWUpIHtcbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnV2VpcmQgZW1wdHkgY2xvc2UgdGFnLicpXG4gICAgICBwYXJzZXIudGV4dE5vZGUgKz0gJzwvPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcnNlci5zY3JpcHQpIHtcbiAgICAgIGlmIChwYXJzZXIudGFnTmFtZSAhPT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBjbG9zaW5nIHRhZyBhY3R1YWxseSBleGlzdHMuXG4gICAgLy8gPGE+PGI+PC9jPjwvYj48L2E+IHdpbGwgY2xvc2UgZXZlcnl0aGluZywgb3RoZXJ3aXNlLlxuICAgIHZhciB0ID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgdmFyIHRhZ05hbWUgPSBwYXJzZXIudGFnTmFtZVxuICAgIGlmICghcGFyc2VyLnN0cmljdCkge1xuICAgICAgdGFnTmFtZSA9IHRhZ05hbWVbcGFyc2VyLmxvb3NlQ2FzZV0oKVxuICAgIH1cbiAgICB2YXIgY2xvc2VUbyA9IHRhZ05hbWVcbiAgICB3aGlsZSAodC0tKSB7XG4gICAgICB2YXIgY2xvc2UgPSBwYXJzZXIudGFnc1t0XVxuICAgICAgaWYgKGNsb3NlLm5hbWUgIT09IGNsb3NlVG8pIHtcbiAgICAgICAgLy8gZmFpbCB0aGUgZmlyc3QgdGltZSBpbiBzdHJpY3QgbW9kZVxuICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuZXhwZWN0ZWQgY2xvc2UgdGFnJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGlkbid0IGZpbmQgaXQuICB3ZSBhbHJlYWR5IGZhaWxlZCBmb3Igc3RyaWN0LCBzbyBqdXN0IGFib3J0LlxuICAgIGlmICh0IDwgMCkge1xuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbm1hdGNoZWQgY2xvc2luZyB0YWc6ICcgKyBwYXJzZXIudGFnTmFtZSlcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWUgKyAnPidcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHBhcnNlci50YWdOYW1lID0gdGFnTmFtZVxuICAgIHZhciBzID0gcGFyc2VyLnRhZ3MubGVuZ3RoXG4gICAgd2hpbGUgKHMtLSA+IHQpIHtcbiAgICAgIHZhciB0YWcgPSBwYXJzZXIudGFnID0gcGFyc2VyLnRhZ3MucG9wKClcbiAgICAgIHBhcnNlci50YWdOYW1lID0gcGFyc2VyLnRhZy5uYW1lXG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NldGFnJywgcGFyc2VyLnRhZ05hbWUpXG5cbiAgICAgIHZhciB4ID0ge31cbiAgICAgIGZvciAodmFyIGkgaW4gdGFnLm5zKSB7XG4gICAgICAgIHhbaV0gPSB0YWcubnNbaV1cbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgaWYgKHBhcnNlci5vcHQueG1sbnMgJiYgdGFnLm5zICE9PSBwYXJlbnQubnMpIHtcbiAgICAgICAgLy8gcmVtb3ZlIG5hbWVzcGFjZSBiaW5kaW5ncyBpbnRyb2R1Y2VkIGJ5IHRhZ1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcubnMpLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgbiA9IHRhZy5uc1twXVxuICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2xvc2VuYW1lc3BhY2UnLCB7IHByZWZpeDogcCwgdXJpOiBuIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ID09PSAwKSBwYXJzZXIuY2xvc2VkUm9vdCA9IHRydWVcbiAgICBwYXJzZXIudGFnTmFtZSA9IHBhcnNlci5hdHRyaWJWYWx1ZSA9IHBhcnNlci5hdHRyaWJOYW1lID0gJydcbiAgICBwYXJzZXIuYXR0cmliTGlzdC5sZW5ndGggPSAwXG4gICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUVudGl0eSAocGFyc2VyKSB7XG4gICAgdmFyIGVudGl0eSA9IHBhcnNlci5lbnRpdHlcbiAgICB2YXIgZW50aXR5TEMgPSBlbnRpdHkudG9Mb3dlckNhc2UoKVxuICAgIHZhciBudW1cbiAgICB2YXIgbnVtU3RyID0gJydcblxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5XSkge1xuICAgICAgcmV0dXJuIHBhcnNlci5FTlRJVElFU1tlbnRpdHldXG4gICAgfVxuICAgIGlmIChwYXJzZXIuRU5USVRJRVNbZW50aXR5TENdKSB7XG4gICAgICByZXR1cm4gcGFyc2VyLkVOVElUSUVTW2VudGl0eUxDXVxuICAgIH1cbiAgICBlbnRpdHkgPSBlbnRpdHlMQ1xuICAgIGlmIChlbnRpdHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGlmIChlbnRpdHkuY2hhckF0KDEpID09PSAneCcpIHtcbiAgICAgICAgZW50aXR5ID0gZW50aXR5LnNsaWNlKDIpXG4gICAgICAgIG51bSA9IHBhcnNlSW50KGVudGl0eSwgMTYpXG4gICAgICAgIG51bVN0ciA9IG51bS50b1N0cmluZygxNilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudGl0eSA9IGVudGl0eS5zbGljZSgxKVxuICAgICAgICBudW0gPSBwYXJzZUludChlbnRpdHksIDEwKVxuICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoMTApXG4gICAgICB9XG4gICAgfVxuICAgIGVudGl0eSA9IGVudGl0eS5yZXBsYWNlKC9eMCsvLCAnJylcbiAgICBpZiAoaXNOYU4obnVtKSB8fCBudW1TdHIudG9Mb3dlckNhc2UoKSAhPT0gZW50aXR5KSB7XG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGVudGl0eScpXG4gICAgICByZXR1cm4gJyYnICsgcGFyc2VyLmVudGl0eSArICc7J1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChudW0pXG4gIH1cblxuICBmdW5jdGlvbiBiZWdpbldoaXRlU3BhY2UgKHBhcnNlciwgYykge1xuICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9XQUtBXG4gICAgICBwYXJzZXIuc3RhcnRUYWdQb3NpdGlvbiA9IHBhcnNlci5wb3NpdGlvblxuICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgLy8gaGF2ZSB0byBwcm9jZXNzIHRoaXMgYXMgYSB0ZXh0IG5vZGUuXG4gICAgICAvLyB3ZWlyZCwgYnV0IGhhcHBlbnMuXG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vbi13aGl0ZXNwYWNlIGJlZm9yZSBmaXJzdCB0YWcuJylcbiAgICAgIHBhcnNlci50ZXh0Tm9kZSA9IGNcbiAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNoYXJBdCAoY2h1bmssIGkpIHtcbiAgICB2YXIgcmVzdWx0ID0gJydcbiAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gY2h1bmsuY2hhckF0KGkpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlIChjaHVuaykge1xuICAgIHZhciBwYXJzZXIgPSB0aGlzXG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuZXJyb3JcbiAgICB9XG4gICAgaWYgKHBhcnNlci5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBlcnJvcihwYXJzZXIsXG4gICAgICAgICdDYW5ub3Qgd3JpdGUgYWZ0ZXIgY2xvc2UuIEFzc2lnbiBhbiBvbnJlYWR5IGhhbmRsZXIuJylcbiAgICB9XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5kKHBhcnNlcilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNodW5rID0gY2h1bmsudG9TdHJpbmcoKVxuICAgIH1cbiAgICB2YXIgaSA9IDBcbiAgICB2YXIgYyA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGMgPSBjaGFyQXQoY2h1bmssIGkrKylcbiAgICAgIHBhcnNlci5jID0gY1xuXG4gICAgICBpZiAoIWMpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbisrXG4gICAgICAgIGlmIChjID09PSAnXFxuJykge1xuICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICBwYXJzZXIuY29sdW1uID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocGFyc2VyLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgUy5CRUdJTjpcbiAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkJFR0lOX1dISVRFU1BBQ0VcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcdUZFRkYnKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBiZWdpbldoaXRlU3BhY2UocGFyc2VyLCBjKVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkJFR0lOX1dISVRFU1BBQ0U6XG4gICAgICAgICAgYmVnaW5XaGl0ZVNwYWNlKHBhcnNlciwgYylcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5URVhUOlxuICAgICAgICAgIGlmIChwYXJzZXIuc2F3Um9vdCAmJiAhcGFyc2VyLmNsb3NlZFJvb3QpIHtcbiAgICAgICAgICAgIHZhciBzdGFydGkgPSBpIC0gMVxuICAgICAgICAgICAgd2hpbGUgKGMgJiYgYyAhPT0gJzwnICYmIGMgIT09ICcmJykge1xuICAgICAgICAgICAgICBjID0gY2hhckF0KGNodW5rLCBpKyspXG4gICAgICAgICAgICAgIGlmIChjICYmIHBhcnNlci50cmFja1Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnBvc2l0aW9uKytcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5saW5lKytcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4gPSAwXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBhcnNlci5jb2x1bW4rK1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNodW5rLnN1YnN0cmluZyhzdGFydGksIGkgLSAxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gJzwnICYmICEocGFyc2VyLnNhd1Jvb3QgJiYgcGFyc2VyLmNsb3NlZFJvb3QgJiYgIXBhcnNlci5zdHJpY3QpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fV0FLQVxuICAgICAgICAgICAgcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb24gPSBwYXJzZXIucG9zaXRpb25cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykgJiYgKCFwYXJzZXIuc2F3Um9vdCB8fCBwYXJzZXIuY2xvc2VkUm9vdCkpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdUZXh0IGRhdGEgb3V0c2lkZSBvZiByb290IG5vZGUuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUX0VOVElUWVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRleHROb2RlICs9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUOlxuICAgICAgICAgIC8vIG9ubHkgbm9uLXN0cmljdFxuICAgICAgICAgIGlmIChjID09PSAnPCcpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0NSSVBUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNMT1NFX1RBR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLk9QRU5fV0FLQTpcbiAgICAgICAgICAvLyBlaXRoZXIgYSAvLCA/LCAhLCBvciB0ZXh0IGlzIGNvbWluZyBuZXh0LlxuICAgICAgICAgIGlmIChjID09PSAnIScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0dNTF9ERUNMXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciBpdC4uLlxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fVEFHXG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9IGNcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmVuY29kZWQgPCcpXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgc29tZSB3aGl0ZXNwYWNlLCB0aGVuIGFkZCB0aGF0IGluLlxuICAgICAgICAgICAgaWYgKHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uICsgMSA8IHBhcnNlci5wb3NpdGlvbikge1xuICAgICAgICAgICAgICB2YXIgcGFkID0gcGFyc2VyLnBvc2l0aW9uIC0gcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb25cbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheShwYWQpLmpvaW4oJyAnKSArIGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSAnPCcgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0dNTF9ERUNMOlxuICAgICAgICAgIGlmICgocGFyc2VyLnNnbWxEZWNsICsgYykudG9VcHBlckNhc2UoKSA9PT0gQ0RBVEEpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbmNkYXRhJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLnNnbWxEZWNsICsgYyA9PT0gJy0tJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcnNlci5zZ21sRGVjbCArIGMpLnRvVXBwZXJDYXNlKCkgPT09IERPQ1RZUEUpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRVxuICAgICAgICAgICAgaWYgKHBhcnNlci5kb2N0eXBlIHx8IHBhcnNlci5zYXdSb290KSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLFxuICAgICAgICAgICAgICAgICdJbmFwcHJvcHJpYXRlbHkgbG9jYXRlZCBkb2N0eXBlIGRlY2xhcmF0aW9uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci5kb2N0eXBlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2dtbGRlY2xhcmF0aW9uJywgcGFyc2VyLnNnbWxEZWNsKVxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNRdW90ZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5TR01MX0RFQ0xfUVVPVEVEOlxuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TR01MX0RFQ0xcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyc2VyLnNnbWxEZWNsICs9IGNcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFOlxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25kb2N0eXBlJywgcGFyc2VyLmRvY3R5cGUpXG4gICAgICAgICAgICBwYXJzZXIuZG9jdHlwZSA9IHRydWUgLy8ganVzdCByZW1lbWJlciB0aGF0IHdlIHNhdyBpdC5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgICAgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfRFREXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX1FVT1RFRFxuICAgICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9RVU9URUQ6XG4gICAgICAgICAgcGFyc2VyLmRvY3R5cGUgKz0gY1xuICAgICAgICAgIGlmIChjID09PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEVfRFREOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERfUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRV9EVERfUVVPVEVEOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9EVERcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVDpcbiAgICAgICAgICBpZiAoYyA9PT0gJy0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICctJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UX0VOREVEXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCA9IHRleHRvcHRzKHBhcnNlci5vcHQsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgaWYgKHBhcnNlci5jb21tZW50KSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY29tbWVudCcsIHBhcnNlci5jb21tZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgPSAnJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLScgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNPTU1FTlRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ09NTUVOVF9FTkRFRDpcbiAgICAgICAgICBpZiAoYyAhPT0gJz4nKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ01hbGZvcm1lZCBjb21tZW50JylcbiAgICAgICAgICAgIC8vIGFsbG93IDwhLS0gYmxhaCAtLSBibG9vIC0tPiBpbiBub24tc3RyaWN0IG1vZGUsXG4gICAgICAgICAgICAvLyB3aGljaCBpcyBhIGNvbW1lbnQgb2YgXCIgYmxhaCAtLSBibG9vIFwiXG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSAnLS0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQTpcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQV9FTkRJTkdfMlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DREFUQV9FTkRJTkdfMjpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VyLmNkYXRhKSB7XG4gICAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uY2RhdGEnLCBwYXJzZXIuY2RhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NlY2RhdGEnKVxuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ10nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSArPSAnXV0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5QUk9DX0lOU1Q6XG4gICAgICAgICAgaWYgKGMgPT09ICc/Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5QUk9DX0lOU1RfRU5ESU5HXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0TmFtZSArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlBST0NfSU5TVF9CT0RZOlxuICAgICAgICAgIGlmICghcGFyc2VyLnByb2NJbnN0Qm9keSAmJiBpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuUFJPQ19JTlNUX0VORElORzpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnByb2Nlc3NpbmdpbnN0cnVjdGlvbicsIHtcbiAgICAgICAgICAgICAgbmFtZTogcGFyc2VyLnByb2NJbnN0TmFtZSxcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VyLnByb2NJbnN0Qm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgPSBwYXJzZXIucHJvY0luc3RCb2R5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3RCb2R5ICs9ICc/JyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0JPRFlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuT1BFTl9UQUc6XG4gICAgICAgICAgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1RhZyhwYXJzZXIpXG4gICAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIHRhZyBuYW1lJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5PUEVOX1RBR19TTEFTSDpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlciwgdHJ1ZSlcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdGb3J3YXJkLXNsYXNoIGluIG9wZW5pbmcgdGFnIG5vdCBmb2xsb3dlZCBieSA+JylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQjpcbiAgICAgICAgICAvLyBoYXZlbid0IHJlYWQgdGhlIGF0dHJpYnV0ZSBuYW1lIHlldC5cbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IGNcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FOlxuICAgICAgICAgIGlmIChjID09PSAnPScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnQXR0cmlidXRlIHdpdGhvdXQgdmFsdWUnKVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gcGFyc2VyLmF0dHJpYk5hbWVcbiAgICAgICAgICAgIGF0dHJpYihwYXJzZXIpXG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRV9TQVdfV0hJVEVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9OQU1FX1NBV19XSElURTpcbiAgICAgICAgICBpZiAoYyA9PT0gJz0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0F0dHJpYnV0ZSB3aXRob3V0IHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlc1twYXJzZXIuYXR0cmliTmFtZV0gPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uYXR0cmlidXRlJywge1xuICAgICAgICAgICAgICBuYW1lOiBwYXJzZXIuYXR0cmliTmFtZSxcbiAgICAgICAgICAgICAgdmFsdWU6ICcnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSAnJ1xuICAgICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5xID0gY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9RVU9URUQ6XG4gICAgICAgICAgaWYgKGMgIT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX0VOVElUWV9RXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgKz0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgYXR0cmliKHBhcnNlcilcbiAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfQ0xPU0VEXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0NMT1NFRDpcbiAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR19TTEFTSFxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ05vIHdoaXRlc3BhY2UgYmV0d2VlbiBhdHRyaWJ1dGVzJylcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gY1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX1VOUVVPVEVEOlxuICAgICAgICAgIGlmICghaXNBdHRyaWJFbmQoYykpIHtcbiAgICAgICAgICAgIGlmIChjID09PSAnJicpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVfRU5USVRZX1VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSArPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhdHRyaWIocGFyc2VyKVxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIG9wZW5UYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DTE9TRV9UQUc6XG4gICAgICAgICAgaWYgKCFwYXJzZXIudGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChub3RNYXRjaChuYW1lU3RhcnQsIGMpKSB7XG4gICAgICAgICAgICAgIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgY1xuICAgICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcuJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZUJvZHksIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSArPSBjXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICAgICAgICBwYXJzZXIuc2NyaXB0ICs9ICc8LycgKyBwYXJzZXIudGFnTmFtZVxuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIHRhZ25hbWUgaW4gY2xvc2luZyB0YWcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdfU0FXX1dISVRFXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNMT1NFX1RBR19TQVdfV0hJVEU6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgY2xvc2VUYWcocGFyc2VyKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjbG9zaW5nIHRhZycpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9ROlxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9VOlxuICAgICAgICAgIHZhciByZXR1cm5TdGF0ZVxuICAgICAgICAgIHZhciBidWZmZXJcbiAgICAgICAgICBzd2l0Y2ggKHBhcnNlci5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBTLlRFWFRfRU5USVRZOlxuICAgICAgICAgICAgICByZXR1cm5TdGF0ZSA9IFMuVEVYVFxuICAgICAgICAgICAgICBidWZmZXIgPSAndGV4dE5vZGUnXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1E6XG4gICAgICAgICAgICAgIHJldHVyblN0YXRlID0gUy5BVFRSSUJfVkFMVUVfUVVPVEVEXG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICdhdHRyaWJWYWx1ZSdcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfVTpcbiAgICAgICAgICAgICAgcmV0dXJuU3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9VTlFVT1RFRFxuICAgICAgICAgICAgICBidWZmZXIgPSAnYXR0cmliVmFsdWUnXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGMgPT09ICc7Jykge1xuICAgICAgICAgICAgcGFyc2VyW2J1ZmZlcl0gKz0gcGFyc2VFbnRpdHkocGFyc2VyKVxuICAgICAgICAgICAgcGFyc2VyLmVudGl0eSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSByZXR1cm5TdGF0ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYXRjaChwYXJzZXIuZW50aXR5Lmxlbmd0aCA/IGVudGl0eUJvZHkgOiBlbnRpdHlTdGFydCwgYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5lbnRpdHkgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgY2hhcmFjdGVyIGluIGVudGl0eSBuYW1lJylcbiAgICAgICAgICAgIHBhcnNlcltidWZmZXJdICs9ICcmJyArIHBhcnNlci5lbnRpdHkgKyBjXG4gICAgICAgICAgICBwYXJzZXIuZW50aXR5ID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IHJldHVyblN0YXRlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwYXJzZXIsICdVbmtub3duIHN0YXRlOiAnICsgcGFyc2VyLnN0YXRlKVxuICAgICAgfVxuICAgIH0gLy8gd2hpbGVcblxuICAgIGlmIChwYXJzZXIucG9zaXRpb24gPj0gcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24pIHtcbiAgICAgIGNoZWNrQnVmZmVyTGVuZ3RoKHBhcnNlcilcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLyohIGh0dHA6Ly9tdGhzLmJlL2Zyb21jb2RlcG9pbnQgdjAuMS4wIGJ5IEBtYXRoaWFzICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghU3RyaW5nLmZyb21Db2RlUG9pbnQpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgICAgIHZhciBmbG9vciA9IE1hdGguZmxvb3JcbiAgICAgIHZhciBmcm9tQ29kZVBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUFYX1NJWkUgPSAweDQwMDBcbiAgICAgICAgdmFyIGNvZGVVbml0cyA9IFtdXG4gICAgICAgIHZhciBoaWdoU3Vycm9nYXRlXG4gICAgICAgIHZhciBsb3dTdXJyb2dhdGVcbiAgICAgICAgdmFyIGluZGV4ID0gLTFcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gJydcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgY29kZVBvaW50ID0gTnVtYmVyKGFyZ3VtZW50c1tpbmRleF0pXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRmluaXRlKGNvZGVQb2ludCkgfHwgLy8gYE5hTmAsIGArSW5maW5pdHlgLCBvciBgLUluZmluaXR5YFxuICAgICAgICAgICAgY29kZVBvaW50IDwgMCB8fCAvLyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGNvZGVQb2ludCA+IDB4MTBGRkZGIHx8IC8vIG5vdCBhIHZhbGlkIFVuaWNvZGUgY29kZSBwb2ludFxuICAgICAgICAgICAgZmxvb3IoY29kZVBvaW50KSAhPT0gY29kZVBvaW50IC8vIG5vdCBhbiBpbnRlZ2VyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQ6ICcgKyBjb2RlUG9pbnQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhGRkZGKSB7IC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChjb2RlUG9pbnQpXG4gICAgICAgICAgfSBlbHNlIHsgLy8gQXN0cmFsIGNvZGUgcG9pbnQ7IHNwbGl0IGluIHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgICAgIC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwXG4gICAgICAgICAgICBsb3dTdXJyb2dhdGUgPSAoY29kZVBvaW50ICUgMHg0MDApICsgMHhEQzAwXG4gICAgICAgICAgICBjb2RlVW5pdHMucHVzaChoaWdoU3Vycm9nYXRlLCBsb3dTdXJyb2dhdGUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGxlbmd0aCB8fCBjb2RlVW5pdHMubGVuZ3RoID4gTUFYX1NJWkUpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmdGcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY29kZVVuaXRzKVxuICAgICAgICAgICAgY29kZVVuaXRzLmxlbmd0aCA9IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZywgJ2Zyb21Db2RlUG9pbnQnLCB7XG4gICAgICAgICAgdmFsdWU6IGZyb21Db2RlUG9pbnQsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdHJpbmcuZnJvbUNvZGVQb2ludCA9IGZyb21Db2RlUG9pbnRcbiAgICAgIH1cbiAgICB9KCkpXG4gIH1cbn0pKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJyA/IHRoaXMuc2F4ID0ge30gOiBleHBvcnRzKVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuXG52YXIgRUUgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5pbmhlcml0cyhTdHJlYW0sIEVFKTtcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcycpO1xuU3RyZWFtLldyaXRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3dyaXRhYmxlLmpzJyk7XG5TdHJlYW0uRHVwbGV4ID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcycpO1xuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMnKTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcycpO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuXG5cbi8vIG9sZC1zdHlsZSBzdHJlYW1zLiAgTm90ZSB0aGF0IHRoZSBwaXBlIG1ldGhvZCAodGhlIG9ubHkgcmVsZXZhbnRcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRUUuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG4iLCJ2YXIgQ2xpZW50UmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL3JlcXVlc3QnKVxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJylcbnZhciBzdGF0dXNDb2RlcyA9IHJlcXVpcmUoJ2J1aWx0aW4tc3RhdHVzLWNvZGVzJylcbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKVxuXG52YXIgaHR0cCA9IGV4cG9ydHNcblxuaHR0cC5yZXF1ZXN0ID0gZnVuY3Rpb24gKG9wdHMsIGNiKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpXG5cdFx0b3B0cyA9IHVybC5wYXJzZShvcHRzKVxuXHRlbHNlXG5cdFx0b3B0cyA9IGV4dGVuZChvcHRzKVxuXG5cdHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgJydcblx0dmFyIGhvc3QgPSBvcHRzLmhvc3RuYW1lIHx8IG9wdHMuaG9zdFxuXHR2YXIgcG9ydCA9IG9wdHMucG9ydFxuXHR2YXIgcGF0aCA9IG9wdHMucGF0aCB8fCAnLydcblxuXHQvLyBOZWNlc3NhcnkgZm9yIElQdjYgYWRkcmVzc2VzXG5cdGlmIChob3N0ICYmIGhvc3QuaW5kZXhPZignOicpICE9PSAtMSlcblx0XHRob3N0ID0gJ1snICsgaG9zdCArICddJ1xuXG5cdC8vIFRoaXMgbWF5IGJlIGEgcmVsYXRpdmUgdXJsLiBUaGUgYnJvd3NlciBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gaW50ZXJwcmV0IGl0IGNvcnJlY3RseS5cblx0b3B0cy51cmwgPSAoaG9zdCA/IChwcm90b2NvbCArICcvLycgKyBob3N0KSA6ICcnKSArIChwb3J0ID8gJzonICsgcG9ydCA6ICcnKSArIHBhdGhcblx0b3B0cy5tZXRob2QgPSAob3B0cy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKClcblx0b3B0cy5oZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cblx0Ly8gQWxzbyB2YWxpZCBvcHRzLmF1dGgsIG9wdHMubW9kZVxuXG5cdHZhciByZXEgPSBuZXcgQ2xpZW50UmVxdWVzdChvcHRzKVxuXHRpZiAoY2IpXG5cdFx0cmVxLm9uKCdyZXNwb25zZScsIGNiKVxuXHRyZXR1cm4gcmVxXG59XG5cbmh0dHAuZ2V0ID0gZnVuY3Rpb24gZ2V0IChvcHRzLCBjYikge1xuXHR2YXIgcmVxID0gaHR0cC5yZXF1ZXN0KG9wdHMsIGNiKVxuXHRyZXEuZW5kKClcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLkFnZW50ID0gZnVuY3Rpb24gKCkge31cbmh0dHAuQWdlbnQuZGVmYXVsdE1heFNvY2tldHMgPSA0XG5cbmh0dHAuU1RBVFVTX0NPREVTID0gc3RhdHVzQ29kZXNcblxuaHR0cC5NRVRIT0RTID0gW1xuXHQnQ0hFQ0tPVVQnLFxuXHQnQ09OTkVDVCcsXG5cdCdDT1BZJyxcblx0J0RFTEVURScsXG5cdCdHRVQnLFxuXHQnSEVBRCcsXG5cdCdMT0NLJyxcblx0J00tU0VBUkNIJyxcblx0J01FUkdFJyxcblx0J01LQUNUSVZJVFknLFxuXHQnTUtDT0wnLFxuXHQnTU9WRScsXG5cdCdOT1RJRlknLFxuXHQnT1BUSU9OUycsXG5cdCdQQVRDSCcsXG5cdCdQT1NUJyxcblx0J1BST1BGSU5EJyxcblx0J1BST1BQQVRDSCcsXG5cdCdQVVJHRScsXG5cdCdQVVQnLFxuXHQnUkVQT1JUJyxcblx0J1NFQVJDSCcsXG5cdCdTVUJTQ1JJQkUnLFxuXHQnVFJBQ0UnLFxuXHQnVU5MT0NLJyxcblx0J1VOU1VCU0NSSUJFJ1xuXSIsImV4cG9ydHMuZmV0Y2ggPSBpc0Z1bmN0aW9uKGdsb2JhbC5mZXRjaCkgJiYgaXNGdW5jdGlvbihnbG9iYWwuUmVhZGFibGVCeXRlU3RyZWFtKVxuXG5leHBvcnRzLmJsb2JDb25zdHJ1Y3RvciA9IGZhbHNlXG50cnkge1xuXHRuZXcgQmxvYihbbmV3IEFycmF5QnVmZmVyKDEpXSlcblx0ZXhwb3J0cy5ibG9iQ29uc3RydWN0b3IgPSB0cnVlXG59IGNhdGNoIChlKSB7fVxuXG52YXIgeGhyID0gbmV3IGdsb2JhbC5YTUxIdHRwUmVxdWVzdCgpXG4vLyBJZiBsb2NhdGlvbi5ob3N0IGlzIGVtcHR5LCBlLmcuIGlmIHRoaXMgcGFnZS93b3JrZXIgd2FzIGxvYWRlZFxuLy8gZnJvbSBhIEJsb2IsIHRoZW4gdXNlIGV4YW1wbGUuY29tIHRvIGF2b2lkIGFuIGVycm9yXG54aHIub3BlbignR0VUJywgZ2xvYmFsLmxvY2F0aW9uLmhvc3QgPyAnLycgOiAnaHR0cHM6Ly9leGFtcGxlLmNvbScpXG5cbmZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQgKHR5cGUpIHtcblx0dHJ5IHtcblx0XHR4aHIucmVzcG9uc2VUeXBlID0gdHlwZVxuXHRcdHJldHVybiB4aHIucmVzcG9uc2VUeXBlID09PSB0eXBlXG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZVxufVxuXG4vLyBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgU2FmYXJpIDcuMCByZXBvcnRzIHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdvYmplY3QnLlxuLy8gU2FmYXJpIDcuMSBhcHBlYXJzIHRvIGhhdmUgZml4ZWQgdGhpcyBidWcuXG52YXIgaGF2ZUFycmF5QnVmZmVyID0gdHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCdcbnZhciBoYXZlU2xpY2UgPSBoYXZlQXJyYXlCdWZmZXIgJiYgaXNGdW5jdGlvbihnbG9iYWwuQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlKVxuXG5leHBvcnRzLmFycmF5YnVmZmVyID0gaGF2ZUFycmF5QnVmZmVyICYmIGNoZWNrVHlwZVN1cHBvcnQoJ2FycmF5YnVmZmVyJylcbi8vIFRoZXNlIG5leHQgdHdvIHRlc3RzIHVuYXZvaWRhYmx5IHNob3cgd2FybmluZ3MgaW4gQ2hyb21lLiBTaW5jZSBmZXRjaCB3aWxsIGFsd2F5c1xuLy8gYmUgdXNlZCBpZiBpdCdzIGF2YWlsYWJsZSwganVzdCByZXR1cm4gZmFsc2UgZm9yIHRoZXNlIHRvIGF2b2lkIHRoZSB3YXJuaW5ncy5cbmV4cG9ydHMubXNzdHJlYW0gPSAhZXhwb3J0cy5mZXRjaCAmJiBoYXZlU2xpY2UgJiYgY2hlY2tUeXBlU3VwcG9ydCgnbXMtc3RyZWFtJylcbmV4cG9ydHMubW96Y2h1bmtlZGFycmF5YnVmZmVyID0gIWV4cG9ydHMuZmV0Y2ggJiYgaGF2ZUFycmF5QnVmZmVyICYmXG5cdGNoZWNrVHlwZVN1cHBvcnQoJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJylcbmV4cG9ydHMub3ZlcnJpZGVNaW1lVHlwZSA9IGlzRnVuY3Rpb24oeGhyLm92ZXJyaWRlTWltZVR5cGUpXG5leHBvcnRzLnZiQXJyYXkgPSBpc0Z1bmN0aW9uKGdsb2JhbC5WQkFycmF5KVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG5cbnhociA9IG51bGwgLy8gSGVscCBnY1xuIiwiLy8gdmFyIEJhc2U2NCA9IHJlcXVpcmUoJ0Jhc2U2NCcpXG52YXIgY2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2FwYWJpbGl0eScpXG52YXIgZm9yZWFjaCA9IHJlcXVpcmUoJ2ZvcmVhY2gnKVxudmFyIGluZGV4T2YgPSByZXF1aXJlKCdpbmRleG9mJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKVxudmFyIHJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG52YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxudmFyIEluY29taW5nTWVzc2FnZSA9IHJlc3BvbnNlLkluY29taW5nTWVzc2FnZVxudmFyIHJTdGF0ZXMgPSByZXNwb25zZS5yZWFkeVN0YXRlc1xuXG5mdW5jdGlvbiBkZWNpZGVNb2RlIChwcmVmZXJCaW5hcnkpIHtcblx0aWYgKGNhcGFiaWxpdHkuZmV0Y2gpIHtcblx0XHRyZXR1cm4gJ2ZldGNoJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkubW96Y2h1bmtlZGFycmF5YnVmZmVyKSB7XG5cdFx0cmV0dXJuICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcidcblx0fSBlbHNlIGlmIChjYXBhYmlsaXR5Lm1zc3RyZWFtKSB7XG5cdFx0cmV0dXJuICdtcy1zdHJlYW0nXG5cdH0gZWxzZSBpZiAoY2FwYWJpbGl0eS5hcnJheWJ1ZmZlciAmJiBwcmVmZXJCaW5hcnkpIHtcblx0XHRyZXR1cm4gJ2FycmF5YnVmZmVyJ1xuXHR9IGVsc2UgaWYgKGNhcGFiaWxpdHkudmJBcnJheSAmJiBwcmVmZXJCaW5hcnkpIHtcblx0XHRyZXR1cm4gJ3RleHQ6dmJhcnJheSdcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gJ3RleHQnXG5cdH1cbn1cblxudmFyIENsaWVudFJlcXVlc3QgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRzKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRzdHJlYW0uV3JpdGFibGUuY2FsbChzZWxmKVxuXG5cdHNlbGYuX29wdHMgPSBvcHRzXG5cdHNlbGYuX2JvZHkgPSBbXVxuXHRzZWxmLl9oZWFkZXJzID0ge31cblx0aWYgKG9wdHMuYXV0aClcblx0XHRzZWxmLnNldEhlYWRlcignQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgbmV3IEJ1ZmZlcihvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKSlcblx0Zm9yZWFjaChrZXlzKG9wdHMuaGVhZGVycyksIGZ1bmN0aW9uIChuYW1lKSB7XG5cdFx0c2VsZi5zZXRIZWFkZXIobmFtZSwgb3B0cy5oZWFkZXJzW25hbWVdKVxuXHR9KVxuXG5cdHZhciBwcmVmZXJCaW5hcnlcblx0aWYgKG9wdHMubW9kZSA9PT0gJ3ByZWZlci1zdHJlYW1pbmcnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIGEgaGlnaCBwcmlvcml0eSBidXQgYmluYXJ5IGNvbXBhdGliaWxpdHkgYW5kXG5cdFx0Ly8gdGhlIGFjY3VyYWN5IG9mIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXIgYXJlbid0XG5cdFx0cHJlZmVyQmluYXJ5ID0gZmFsc2Vcblx0fSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdhbGxvdy13cm9uZy1jb250ZW50LXR5cGUnKSB7XG5cdFx0Ly8gSWYgc3RyZWFtaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJlc2VydmluZyB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyXG5cdFx0cHJlZmVyQmluYXJ5ID0gIWNhcGFiaWxpdHkub3ZlcnJpZGVNaW1lVHlwZVxuXHR9IGVsc2UgaWYgKCFvcHRzLm1vZGUgfHwgb3B0cy5tb2RlID09PSAnZGVmYXVsdCcgfHwgb3B0cy5tb2RlID09PSAncHJlZmVyLWZhc3QnKSB7XG5cdFx0Ly8gVXNlIGJpbmFyeSBpZiB0ZXh0IHN0cmVhbWluZyBtYXkgY29ycnVwdCBkYXRhIG9yIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyLCBvciBmb3Igc3BlZWRcblx0XHRwcmVmZXJCaW5hcnkgPSB0cnVlXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRzLm1vZGUnKVxuXHR9XG5cdHNlbGYuX21vZGUgPSBkZWNpZGVNb2RlKHByZWZlckJpbmFyeSlcblxuXHRzZWxmLm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG5cdFx0c2VsZi5fb25GaW5pc2goKVxuXHR9KVxufVxuXG5pbmhlcml0cyhDbGllbnRSZXF1ZXN0LCBzdHJlYW0uV3JpdGFibGUpXG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0dmFyIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuXHQvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGJyb3dzZXJzIGFib3V0IHNldHRpbmcgdW5zYWZlXG5cdC8vIGhlYWRlcnMuIFRvIGJlIGhvbmVzdCBJJ20gbm90IGVudGlyZWx5IHN1cmUgaGlkaW5nIHRoZXNlIHdhcm5pbmdzIGlzIGEgZ29vZCB0aGluZywgYnV0XG5cdC8vIGh0dHAtYnJvd3NlcmlmeSBkaWQgaXQsIHNvIEkgd2lsbCB0b28uXG5cdGlmIChpbmRleE9mKHVuc2FmZUhlYWRlcnMsIGxvd2VyTmFtZSkgIT09IC0xKVxuXHRcdHJldHVyblxuXG5cdHNlbGYuX2hlYWRlcnNbbG93ZXJOYW1lXSA9IHtcblx0XHRuYW1lOiBuYW1lLFxuXHRcdHZhbHVlOiB2YWx1ZVxuXHR9XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRyZXR1cm4gc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldLnZhbHVlXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnJlbW92ZUhlYWRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXHRkZWxldGUgc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldXG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblx0dmFyIG9wdHMgPSBzZWxmLl9vcHRzXG5cblx0dmFyIGhlYWRlcnNPYmogPSBzZWxmLl9oZWFkZXJzXG5cdHZhciBib2R5XG5cdGlmIChvcHRzLm1ldGhvZCA9PT0gJ1BPU1QnIHx8IG9wdHMubWV0aG9kID09PSAnUFVUJykge1xuXHRcdGlmIChjYXBhYmlsaXR5LmJsb2JDb25zdHJ1Y3Rvcikge1xuXHRcdFx0Ym9keSA9IG5ldyBnbG9iYWwuQmxvYihzZWxmLl9ib2R5Lm1hcChmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdFx0XHRcdHJldHVybiBidWZmZXIudG9BcnJheUJ1ZmZlcigpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHR0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG5cdFx0XHR9KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBnZXQgdXRmOCBzdHJpbmdcblx0XHRcdGJvZHkgPSBCdWZmZXIuY29uY2F0KHNlbGYuX2JvZHkpLnRvU3RyaW5nKClcblx0XHR9XG5cdH1cblxuXHRpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHZhciBoZWFkZXJzID0ga2V5cyhoZWFkZXJzT2JqKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcblx0XHRcdHJldHVybiBbaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlXVxuXHRcdH0pXG5cblx0XHRnbG9iYWwuZmV0Y2goc2VsZi5fb3B0cy51cmwsIHtcblx0XHRcdG1ldGhvZDogc2VsZi5fb3B0cy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiBoZWFkZXJzLFxuXHRcdFx0Ym9keTogYm9keSxcblx0XHRcdG1vZGU6ICdjb3JzJyxcblx0XHRcdGNyZWRlbnRpYWxzOiBvcHRzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbidcblx0XHR9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHRcdFx0c2VsZi5fZmV0Y2hSZXNwb25zZSA9IHJlc3BvbnNlXG5cdFx0XHRzZWxmLl9jb25uZWN0KClcblx0XHR9KS50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHRcdFx0c2VsZi5lbWl0KCdlcnJvcicsIHJlYXNvbilcblx0XHR9KVxuXHR9IGVsc2Uge1xuXHRcdHZhciB4aHIgPSBzZWxmLl94aHIgPSBuZXcgZ2xvYmFsLlhNTEh0dHBSZXF1ZXN0KClcblx0XHR0cnkge1xuXHRcdFx0eGhyLm9wZW4oc2VsZi5fb3B0cy5tZXRob2QsIHNlbGYuX29wdHMudXJsLCB0cnVlKVxuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Ly8gQ2FuJ3Qgc2V0IHJlc3BvbnNlVHlwZSBvbiByZWFsbHkgb2xkIGJyb3dzZXJzXG5cdFx0aWYgKCdyZXNwb25zZVR5cGUnIGluIHhocilcblx0XHRcdHhoci5yZXNwb25zZVR5cGUgPSBzZWxmLl9tb2RlLnNwbGl0KCc6JylbMF1cblxuXHRcdGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpXG5cdFx0XHR4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRzLndpdGhDcmVkZW50aWFsc1xuXG5cdFx0aWYgKHNlbGYuX21vZGUgPT09ICd0ZXh0JyAmJiAnb3ZlcnJpZGVNaW1lVHlwZScgaW4geGhyKVxuXHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKVxuXG5cdFx0Zm9yZWFjaChrZXlzKGhlYWRlcnNPYmopLCBmdW5jdGlvbiAobmFtZSkge1xuXHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlKVxuXHRcdH0pXG5cblx0XHRzZWxmLl9yZXNwb25zZSA9IG51bGxcblx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0c3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuXHRcdFx0XHRjYXNlIHJTdGF0ZXMuTE9BRElORzpcblx0XHRcdFx0Y2FzZSByU3RhdGVzLkRPTkU6XG5cdFx0XHRcdFx0c2VsZi5fb25YSFJQcm9ncmVzcygpXG5cdFx0XHRcdFx0YnJlYWtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gTmVjZXNzYXJ5IGZvciBzdHJlYW1pbmcgaW4gRmlyZWZveCwgc2luY2UgeGhyLnJlc3BvbnNlIGlzIE9OTFkgZGVmaW5lZFxuXHRcdC8vIGluIG9ucHJvZ3Jlc3MsIG5vdCBpbiBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aCB4aHIucmVhZHlTdGF0ZSA9IDNcblx0XHRpZiAoc2VsZi5fbW9kZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJykge1xuXHRcdFx0eGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHNlbGYuX29uWEhSUHJvZ3Jlc3MoKVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHNlbGYuX2Rlc3Ryb3llZClcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSlcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0eGhyLnNlbmQoYm9keSlcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB4aHIuc3RhdHVzIGlzIHJlYWRhYmxlLiBFdmVuIHRob3VnaCB0aGUgc3BlYyBzYXlzIGl0IHNob3VsZFxuICogYmUgYXZhaWxhYmxlIGluIHJlYWR5U3RhdGUgMywgYWNjZXNzaW5nIGl0IHRocm93cyBhbiBleGNlcHRpb24gaW4gSUU4XG4gKi9cbmZ1bmN0aW9uIHN0YXR1c1ZhbGlkICh4aHIpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gKHhoci5zdGF0dXMgIT09IG51bGwpXG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0aWYgKCFzdGF0dXNWYWxpZChzZWxmLl94aHIpIHx8IHNlbGYuX2Rlc3Ryb3llZClcblx0XHRyZXR1cm5cblxuXHRpZiAoIXNlbGYuX3Jlc3BvbnNlKVxuXHRcdHNlbGYuX2Nvbm5lY3QoKVxuXG5cdHNlbGYuX3Jlc3BvbnNlLl9vblhIUlByb2dyZXNzKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBzZWxmID0gdGhpc1xuXG5cdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0cmV0dXJuXG5cblx0c2VsZi5fcmVzcG9uc2UgPSBuZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hociwgc2VsZi5fZmV0Y2hSZXNwb25zZSwgc2VsZi5fbW9kZSlcblx0c2VsZi5lbWl0KCdyZXNwb25zZScsIHNlbGYuX3Jlc3BvbnNlKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuXHR2YXIgc2VsZiA9IHRoaXNcblxuXHRzZWxmLl9ib2R5LnB1c2goY2h1bmspXG5cdGNiKClcbn1cblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgc2VsZiA9IHRoaXNcblx0c2VsZi5fZGVzdHJveWVkID0gdHJ1ZVxuXHRpZiAoc2VsZi5fcmVzcG9uc2UpXG5cdFx0c2VsZi5fcmVzcG9uc2UuX2Rlc3Ryb3llZCA9IHRydWVcblx0aWYgKHNlbGYuX3hocilcblx0XHRzZWxmLl94aHIuYWJvcnQoKVxuXHQvLyBDdXJyZW50bHksIHRoZXJlIGlzbid0IGEgd2F5IHRvIHRydWx5IGFib3J0IGEgZmV0Y2guXG5cdC8vIElmIHlvdSBsaWtlIGJpa2VzaGVkZGluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzI3XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZywgY2IpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGNiID0gZGF0YVxuXHRcdGRhdGEgPSB1bmRlZmluZWRcblx0fVxuXG5cdHN0cmVhbS5Xcml0YWJsZS5wcm90b3R5cGUuZW5kLmNhbGwoc2VsZiwgZGF0YSwgZW5jb2RpbmcsIGNiKVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5mbHVzaEhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7fVxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHt9XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXROb0RlbGF5ID0gZnVuY3Rpb24gKCkge31cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFNvY2tldEtlZXBBbGl2ZSA9IGZ1bmN0aW9uICgpIHt9XG5cbi8vIFRha2VuIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvWE1MSHR0cFJlcXVlc3QvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyJTI4JTI5LW1ldGhvZFxudmFyIHVuc2FmZUhlYWRlcnMgPSBbXG5cdCdhY2NlcHQtY2hhcnNldCcsXG5cdCdhY2NlcHQtZW5jb2RpbmcnLFxuXHQnYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1oZWFkZXJzJyxcblx0J2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtbWV0aG9kJyxcblx0J2Nvbm5lY3Rpb24nLFxuXHQnY29udGVudC1sZW5ndGgnLFxuXHQnY29va2llJyxcblx0J2Nvb2tpZTInLFxuXHQnZGF0ZScsXG5cdCdkbnQnLFxuXHQnZXhwZWN0Jyxcblx0J2hvc3QnLFxuXHQna2VlcC1hbGl2ZScsXG5cdCdvcmlnaW4nLFxuXHQncmVmZXJlcicsXG5cdCd0ZScsXG5cdCd0cmFpbGVyJyxcblx0J3RyYW5zZmVyLWVuY29kaW5nJyxcblx0J3VwZ3JhZGUnLFxuXHQndXNlci1hZ2VudCcsXG5cdCd2aWEnXG5dXG4iLCJ2YXIgY2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vY2FwYWJpbGl0eScpXG52YXIgZm9yZWFjaCA9IHJlcXVpcmUoJ2ZvcmVhY2gnKVxudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKVxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbnZhciByU3RhdGVzID0gZXhwb3J0cy5yZWFkeVN0YXRlcyA9IHtcblx0VU5TRU5UOiAwLFxuXHRPUEVORUQ6IDEsXG5cdEhFQURFUlNfUkVDRUlWRUQ6IDIsXG5cdExPQURJTkc6IDMsXG5cdERPTkU6IDRcbn1cblxudmFyIEluY29taW5nTWVzc2FnZSA9IGV4cG9ydHMuSW5jb21pbmdNZXNzYWdlID0gZnVuY3Rpb24gKHhociwgcmVzcG9uc2UsIG1vZGUpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cdHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpXG5cblx0c2VsZi5fbW9kZSA9IG1vZGVcblx0c2VsZi5oZWFkZXJzID0ge31cblx0c2VsZi5yYXdIZWFkZXJzID0gW11cblx0c2VsZi50cmFpbGVycyA9IHt9XG5cdHNlbGYucmF3VHJhaWxlcnMgPSBbXVxuXG5cdC8vIEZha2UgdGhlICdjbG9zZScgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgJ2VuZCcgZmlyZXNcblx0c2VsZi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuXHRcdHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpXG5cdFx0fSlcblx0fSlcblxuXHRpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuXHRcdHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZVxuXG5cdFx0c2VsZi5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dFxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgZm9yICg8aXRlbT4gb2YgPGl0ZXJhYmxlPik6XG5cdFx0Ly8gZm9yICh2YXIgPGl0ZW0+LF9pLF9pdCA9IDxpdGVyYWJsZT5bU3ltYm9sLml0ZXJhdG9yXSgpOyA8aXRlbT4gPSAoX2kgPSBfaXQubmV4dCgpKS52YWx1ZSwhX2kuZG9uZTspXG5cdFx0Zm9yICh2YXIgaGVhZGVyLCBfaSwgX2l0ID0gcmVzcG9uc2UuaGVhZGVyc1tTeW1ib2wuaXRlcmF0b3JdKCk7IGhlYWRlciA9IChfaSA9IF9pdC5uZXh0KCkpLnZhbHVlLCAhX2kuZG9uZTspIHtcblx0XHRcdHNlbGYuaGVhZGVyc1toZWFkZXJbMF0udG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJbMV1cblx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuXHRcdH1cblxuXHRcdC8vIFRPRE86IHRoaXMgZG9lc24ndCByZXNwZWN0IGJhY2twcmVzc3VyZS4gT25jZSBXcml0YWJsZVN0cmVhbSBpcyBhdmFpbGFibGUsIHRoaXMgY2FuIGJlIGZpeGVkXG5cdFx0dmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKClcblx0XHRmdW5jdGlvbiByZWFkICgpIHtcblx0XHRcdHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG5cdFx0XHRcdGlmIChzZWxmLl9kZXN0cm95ZWQpXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGlmIChyZXN1bHQuZG9uZSkge1xuXHRcdFx0XHRcdHNlbGYucHVzaChudWxsKVxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpXG5cdFx0XHRcdHJlYWQoKVxuXHRcdFx0fSlcblx0XHR9XG5cdFx0cmVhZCgpXG5cblx0fSBlbHNlIHtcblx0XHRzZWxmLl94aHIgPSB4aHJcblx0XHRzZWxmLl9wb3MgPSAwXG5cblx0XHRzZWxmLnN0YXR1c0NvZGUgPSB4aHIuc3RhdHVzXG5cdFx0c2VsZi5zdGF0dXNNZXNzYWdlID0geGhyLnN0YXR1c1RleHRcblx0XHR2YXIgaGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgvXFxyP1xcbi8pXG5cdFx0Zm9yZWFjaChoZWFkZXJzLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyA9IGhlYWRlci5tYXRjaCgvXihbXjpdKyk6XFxzKiguKikvKVxuXHRcdFx0aWYgKG1hdGNoZXMpIHtcblx0XHRcdFx0dmFyIGtleSA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRpZiAoc2VsZi5oZWFkZXJzW2tleV0gIT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRzZWxmLmhlYWRlcnNba2V5XSArPSAnLCAnICsgbWF0Y2hlc1syXVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c2VsZi5oZWFkZXJzW2tleV0gPSBtYXRjaGVzWzJdXG5cdFx0XHRcdHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pXG5cdFx0XHR9XG5cdFx0fSlcblxuXHRcdHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnXG5cdFx0aWYgKCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpIHtcblx0XHRcdHZhciBtaW1lVHlwZSA9IHNlbGYucmF3SGVhZGVyc1snbWltZS10eXBlJ11cblx0XHRcdGlmIChtaW1lVHlwZSkge1xuXHRcdFx0XHR2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pXG5cdFx0XHRcdGlmIChjaGFyc2V0TWF0Y2gpIHtcblx0XHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHRzZWxmLl9jaGFyc2V0ID0gJ3V0Zi04JyAvLyBiZXN0IGd1ZXNzXG5cdFx0fVxuXHR9XG59XG5cbmluaGVyaXRzKEluY29taW5nTWVzc2FnZSwgc3RyZWFtLlJlYWRhYmxlKVxuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge31cblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHNlbGYgPSB0aGlzXG5cblx0dmFyIHhociA9IHNlbGYuX3hoclxuXG5cdHZhciByZXNwb25zZSA9IG51bGxcblx0c3dpdGNoIChzZWxmLl9tb2RlKSB7XG5cdFx0Y2FzZSAndGV4dDp2YmFycmF5JzogLy8gRm9yIElFOVxuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUaGlzIGZhaWxzIGluIElFOFxuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBnbG9iYWwuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KClcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Ly8gRmFsbHMgdGhyb3VnaCBpbiBJRThcdFxuXHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0dHJ5IHsgLy8gVGhpcyB3aWxsIGZhaWwgd2hlbiByZWFkeVN0YXRlID0gMyBpbiBJRTkuIFN3aXRjaCBtb2RlIGFuZCB3YWl0IGZvciByZWFkeVN0YXRlID0gNFxuXHRcdFx0XHRyZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHRcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0c2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG5cdFx0XHRcdHZhciBuZXdEYXRhID0gcmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcylcblx0XHRcdFx0aWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcihuZXdEYXRhLmxlbmd0aClcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0XHRidWZmZXJbaV0gPSBuZXdEYXRhLmNoYXJDb2RlQXQoaSkgJiAweGZmXG5cblx0XHRcdFx0XHRzZWxmLnB1c2goYnVmZmVyKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aFxuXHRcdFx0fVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZXNwb25zZSkpKVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcic6IC8vIHRha2Ugd2hvbGVcblx0XHRcdHJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG5cdFx0XHRpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORyB8fCAhcmVzcG9uc2UpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZXNwb25zZSkpKVxuXHRcdFx0YnJlYWtcblx0XHRjYXNlICdtcy1zdHJlYW0nOlxuXHRcdFx0cmVzcG9uc2UgPSB4aHIucmVzcG9uc2Vcblx0XHRcdGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0dmFyIHJlYWRlciA9IG5ldyBnbG9iYWwuTVNTdHJlYW1SZWFkZXIoKVxuXHRcdFx0cmVhZGVyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChyZWFkZXIucmVzdWx0LmJ5dGVMZW5ndGggPiBzZWxmLl9wb3MpIHtcblx0XHRcdFx0XHRzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZWFkZXIucmVzdWx0LnNsaWNlKHNlbGYuX3BvcykpKSlcblx0XHRcdFx0XHRzZWxmLl9wb3MgPSByZWFkZXIucmVzdWx0LmJ5dGVMZW5ndGhcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0c2VsZi5wdXNoKG51bGwpXG5cdFx0XHR9XG5cdFx0XHQvLyByZWFkZXIub25lcnJvciA9ID8/PyAvLyBUT0RPOiB0aGlzXG5cdFx0XHRyZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIocmVzcG9uc2UpXG5cdFx0XHRicmVha1xuXHR9XG5cblx0Ly8gVGhlIG1zLXN0cmVhbSBjYXNlIGhhbmRsZXMgZW5kIHNlcGFyYXRlbHkgaW4gcmVhZGVyLm9ubG9hZCgpXG5cdGlmIChzZWxmLl94aHIucmVhZHlTdGF0ZSA9PT0gclN0YXRlcy5ET05FICYmIHNlbGYuX21vZGUgIT09ICdtcy1zdHJlYW0nKSB7XG5cdFx0c2VsZi5wdXNoKG51bGwpXG5cdH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwidmFyIG5leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy9icm93c2VyLmpzJykubmV4dFRpY2s7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgaW1tZWRpYXRlSWRzID0ge307XG52YXIgbmV4dEltbWVkaWF0ZUlkID0gMDtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHsgdGltZW91dC5jbG9zZSgpOyB9O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIFRoYXQncyBub3QgaG93IG5vZGUuanMgaW1wbGVtZW50cyBpdCBidXQgdGhlIGV4cG9zZWQgYXBpIGlzIHRoZSBzYW1lLlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBzZXRJbW1lZGlhdGUgOiBmdW5jdGlvbihmbikge1xuICB2YXIgaWQgPSBuZXh0SW1tZWRpYXRlSWQrKztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGZhbHNlIDogc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGltbWVkaWF0ZUlkc1tpZF0gPSB0cnVlO1xuXG4gIG5leHRUaWNrKGZ1bmN0aW9uIG9uTmV4dFRpY2soKSB7XG4gICAgaWYgKGltbWVkaWF0ZUlkc1tpZF0pIHtcbiAgICAgIC8vIGZuLmNhbGwoKSBpcyBmYXN0ZXIgc28gd2Ugb3B0aW1pemUgZm9yIHRoZSBjb21tb24gdXNlLWNhc2VcbiAgICAgIC8vIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vY2FsbC1hcHBseS1zZWd1XG4gICAgICBpZiAoYXJncykge1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCk7XG4gICAgICB9XG4gICAgICAvLyBQcmV2ZW50IGlkcyBmcm9tIGxlYWtpbmdcbiAgICAgIGV4cG9ydHMuY2xlYXJJbW1lZGlhdGUoaWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlkO1xufTtcblxuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IHR5cGVvZiBjbGVhckltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY2xlYXJJbW1lZGlhdGUgOiBmdW5jdGlvbihpZCkge1xuICBkZWxldGUgaW1tZWRpYXRlSWRzW2lkXTtcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBwdW55Y29kZSA9IHJlcXVpcmUoJ3B1bnljb2RlJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAgIC8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICAgIHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKSxcblxuICAgIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgICAvLyB0aGVtLlxuICAgIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICAgIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bYS16MC05QS1aXy1dezAsNjN9JC8sXG4gICAgaG9zdG5hbWVQYXJ0U3RhcnQgPSAvXihbYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiBpc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24odXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIWlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAgIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG5cbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KCk7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnkgY29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgIC8vIEl0IG9ubHkgY29udmVydHMgdGhlIHBhcnQgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgIC8vIGhhcyBub24gQVNDSUkgY2hhcmFjdGVycy4gSS5lLiBpdCBkb3NlbnQgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBpbiBBU0NJSS5cbiAgICAgIHZhciBkb21haW5BcnJheSA9IHRoaXMuaG9zdG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgIHZhciBuZXdPdXQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tYWluQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHMgPSBkb21haW5BcnJheVtpXTtcbiAgICAgICAgbmV3T3V0LnB1c2gocy5tYXRjaCgvW15BLVphLXowLTlfLV0vKSA/XG4gICAgICAgICAgICAneG4tLScgKyBwdW55Y29kZS5lbmNvZGUocykgOiBzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBuZXdPdXQuam9pbignLicpO1xuICAgIH1cblxuICAgIHZhciBwID0gdGhpcy5wb3J0ID8gJzonICsgdGhpcy5wb3J0IDogJyc7XG4gICAgdmFyIGggPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGggKyBwO1xuICAgIHRoaXMuaHJlZiArPSB0aGlzLmhvc3Q7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zdWJzdHIoMSwgdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIGlmIChyZXN0WzBdICE9PSAnLycpIHtcbiAgICAgICAgcmVzdCA9ICcvJyArIHJlc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm93IHJlc3QgaXMgc2V0IHRvIHRoZSBwb3N0LWhvc3Qgc3R1ZmYuXG4gIC8vIGNob3Agb2ZmIGFueSBkZWxpbSBjaGFycy5cbiAgaWYgKCF1bnNhZmVQcm90b2NvbFtsb3dlclByb3RvXSkge1xuXG4gICAgLy8gRmlyc3QsIG1ha2UgMTAwJSBzdXJlIHRoYXQgYW55IFwiYXV0b0VzY2FwZVwiIGNoYXJzIGdldFxuICAgIC8vIGVzY2FwZWQsIGV2ZW4gaWYgZW5jb2RlVVJJQ29tcG9uZW50IGRvZXNuJ3QgdGhpbmsgdGhleVxuICAgIC8vIG5lZWQgdG8gYmUuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAoaXNTdHJpbmcob2JqKSkgb2JqID0gdXJsUGFyc2Uob2JqKTtcbiAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgcmV0dXJuIFVybC5wcm90b3R5cGUuZm9ybWF0LmNhbGwob2JqKTtcbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuVXJsLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGF1dGggPSB0aGlzLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJycsXG4gICAgICBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJycsXG4gICAgICBoYXNoID0gdGhpcy5oYXNoIHx8ICcnLFxuICAgICAgaG9zdCA9IGZhbHNlLFxuICAgICAgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgOlxuICAgICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAmJlxuICAgICAgaXNPYmplY3QodGhpcy5xdWVyeSkgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHRoaXMucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHxcbiAgICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKGlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICBPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICByZXN1bHRba10gPSB0aGlzW2tdO1xuICB9LCB0aGlzKTtcblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIE9iamVjdC5rZXlzKHJlbGF0aXZlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgIGlmIChrICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICB9KTtcblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmXG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICBPYmplY3Qua2V5cyhyZWxhdGl2ZSkuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfSk7XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIHJlbFBhdGggPSAocmVsYXRpdmUucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgICB3aGlsZSAocmVsUGF0aC5sZW5ndGggJiYgIShyZWxhdGl2ZS5ob3N0ID0gcmVsUGF0aC5zaGlmdCgpKSk7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3QpIHJlbGF0aXZlLmhvc3QgPSAnJztcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHJlbGF0aXZlLmhvc3RuYW1lID0gJyc7XG4gICAgICBpZiAocmVsUGF0aFswXSAhPT0gJycpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICBpZiAocmVsUGF0aC5sZW5ndGggPCAyKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSAocmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyksXG4gICAgICBpc1JlbEFicyA9IChcbiAgICAgICAgICByZWxhdGl2ZS5ob3N0IHx8XG4gICAgICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICAgICksXG4gICAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgICAgcmVtb3ZlQWxsRG90cyA9IG11c3RFbmRBYnMsXG4gICAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICBwc3ljaG90aWMgPSByZXN1bHQucHJvdG9jb2wgJiYgIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdO1xuXG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHNyY1BhdGggPSBbXTtcbiAgICBzcmNQYXRoLnBvcCgpO1xuICAgIHNyY1BhdGggPSBzcmNQYXRoLmNvbmNhdChyZWxQYXRoKTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICB9IGVsc2UgaWYgKCFpc051bGxPclVuZGVmaW5lZChyZWxhdGl2ZS5zZWFyY2gpKSB7XG4gICAgLy8ganVzdCBwdWxsIG91dCB0aGUgc2VhcmNoLlxuICAgIC8vIGxpa2UgaHJlZj0nP2ZvbycuXG4gICAgLy8gUHV0IHRoaXMgYWZ0ZXIgdGhlIG90aGVyIHR3byBjYXNlcyBiZWNhdXNlIGl0IHNpbXBsaWZpZXMgdGhlIGJvb2xlYW5zXG4gICAgaWYgKHBzeWNob3RpYykge1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBzcmNQYXRoLnNoaWZ0KCk7XG4gICAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIHZhciBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKCFpc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0KSAmJiAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8XG4gICAgICBsYXN0ID09PSAnJyk7XG5cbiAgLy8gc3RyaXAgc2luZ2xlIGRvdHMsIHJlc29sdmUgZG91YmxlIGRvdHMgdG8gcGFyZW50IGRpclxuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAgIChzcmNQYXRoWzBdICYmIHNyY1BhdGhbMF0uY2hhckF0KDApID09PSAnLycpO1xuXG4gIC8vIHB1dCB0aGUgaG9zdCBiYWNrXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IGlzQWJzb2x1dGUgPyAnJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYXRoLmxlbmd0aCA/IHNyY1BhdGguc2hpZnQoKSA6ICcnO1xuICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAvL3RoaXMgZXNwZWNpYWx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCFpc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaG9zdCA9IHRoaXMuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiAgYXJnID09IG51bGw7XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIGV4cG9ydHMuc3RyaXBCT00gPSBmdW5jdGlvbihzdHIpIHtcbiAgICBpZiAoc3RyWzBdID09PSAnXFx1RkVGRicpIHtcbiAgICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgYnVpbGRlciwgZGVmYXVsdHMsIGVzY2FwZUNEQVRBLCByZXF1aXJlc0NEQVRBLCB3cmFwQ0RBVEEsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGJ1aWxkZXIgPSByZXF1aXJlKCd4bWxidWlsZGVyJyk7XG5cbiAgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJykuZGVmYXVsdHM7XG5cbiAgcmVxdWlyZXNDREFUQSA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiAoZW50cnkuaW5kZXhPZignJicpID49IDAgfHwgZW50cnkuaW5kZXhPZignPicpID49IDAgfHwgZW50cnkuaW5kZXhPZignPCcpID49IDApO1xuICB9O1xuXG4gIHdyYXBDREFUQSA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuIFwiPCFbQ0RBVEFbXCIgKyAoZXNjYXBlQ0RBVEEoZW50cnkpKSArIFwiXV0+XCI7XG4gIH07XG5cbiAgZXNjYXBlQ0RBVEEgPSBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeS5yZXBsYWNlKCddXT4nLCAnXV1dXT48IVtDREFUQVs+Jyk7XG4gIH07XG5cbiAgZXhwb3J0cy5CdWlsZGVyID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIEJ1aWxkZXIob3B0cykge1xuICAgICAgdmFyIGtleSwgcmVmLCB2YWx1ZTtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgICAgcmVmID0gZGVmYXVsdHNbXCIwLjJcIl07XG4gICAgICBmb3IgKGtleSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSByZWZba2V5XTtcbiAgICAgICAgdGhpcy5vcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwob3B0cywga2V5KSkgY29udGludWU7XG4gICAgICAgIHZhbHVlID0gb3B0c1trZXldO1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIEJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkT2JqZWN0ID0gZnVuY3Rpb24ocm9vdE9iaikge1xuICAgICAgdmFyIGF0dHJrZXksIGNoYXJrZXksIHJlbmRlciwgcm9vdEVsZW1lbnQsIHJvb3ROYW1lO1xuICAgICAgYXR0cmtleSA9IHRoaXMub3B0aW9ucy5hdHRya2V5O1xuICAgICAgY2hhcmtleSA9IHRoaXMub3B0aW9ucy5jaGFya2V5O1xuICAgICAgaWYgKChPYmplY3Qua2V5cyhyb290T2JqKS5sZW5ndGggPT09IDEpICYmICh0aGlzLm9wdGlvbnMucm9vdE5hbWUgPT09IGRlZmF1bHRzWycwLjInXS5yb290TmFtZSkpIHtcbiAgICAgICAgcm9vdE5hbWUgPSBPYmplY3Qua2V5cyhyb290T2JqKVswXTtcbiAgICAgICAgcm9vdE9iaiA9IHJvb3RPYmpbcm9vdE5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdE5hbWUgPSB0aGlzLm9wdGlvbnMucm9vdE5hbWU7XG4gICAgICB9XG4gICAgICByZW5kZXIgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQsIG9iaikge1xuICAgICAgICAgIHZhciBhdHRyLCBjaGlsZCwgZW50cnksIGluZGV4LCBrZXksIHZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuY2RhdGEgJiYgcmVxdWlyZXNDREFUQShvYmopKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQucmF3KHdyYXBDREFUQShvYmopKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQudHh0KG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIGZvciAoaW5kZXggaW4gb2JqKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG9iaiwgaW5kZXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2hpbGQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gY2hpbGRba2V5XTtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gcmVuZGVyKGVsZW1lbnQuZWxlKGtleSksIGVudHJ5KS51cCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjaGlsZCA9IG9ialtrZXldO1xuICAgICAgICAgICAgICBpZiAoa2V5ID09PSBhdHRya2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgZm9yIChhdHRyIGluIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2hpbGRbYXR0cl07XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmF0dChhdHRyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gY2hhcmtleSkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNkYXRhICYmIHJlcXVpcmVzQ0RBVEEoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5yYXcod3JhcENEQVRBKGNoaWxkKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnR4dChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpbmRleCBpbiBjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwoY2hpbGQsIGluZGV4KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBlbnRyeSA9IGNoaWxkW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmNkYXRhICYmIHJlcXVpcmVzQ0RBVEEoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSkucmF3KHdyYXBDREFUQShlbnRyeSkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSwgZW50cnkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSByZW5kZXIoZWxlbWVudC5lbGUoa2V5KSwgZW50cnkpLnVwKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSByZW5kZXIoZWxlbWVudC5lbGUoa2V5KSwgY2hpbGQpLnVwKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycgJiYgX3RoaXMub3B0aW9ucy5jZGF0YSAmJiByZXF1aXJlc0NEQVRBKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlKGtleSkucmF3KHdyYXBDREFUQShjaGlsZCkpLnVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gJyc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5lbGUoa2V5LCBjaGlsZC50b1N0cmluZygpKS51cCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfTtcbiAgICAgIH0pKHRoaXMpO1xuICAgICAgcm9vdEVsZW1lbnQgPSBidWlsZGVyLmNyZWF0ZShyb290TmFtZSwgdGhpcy5vcHRpb25zLnhtbGRlYywgdGhpcy5vcHRpb25zLmRvY3R5cGUsIHtcbiAgICAgICAgaGVhZGxlc3M6IHRoaXMub3B0aW9ucy5oZWFkbGVzcyxcbiAgICAgICAgYWxsb3dTdXJyb2dhdGVDaGFyczogdGhpcy5vcHRpb25zLmFsbG93U3Vycm9nYXRlQ2hhcnNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlbmRlcihyb290RWxlbWVudCwgcm9vdE9iaikuZW5kKHRoaXMub3B0aW9ucy5yZW5kZXJPcHRzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEJ1aWxkZXI7XG5cbiAgfSkoKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIGV4cG9ydHMuZGVmYXVsdHMgPSB7XG4gICAgXCIwLjFcIjoge1xuICAgICAgZXhwbGljaXRDaGFya2V5OiBmYWxzZSxcbiAgICAgIHRyaW06IHRydWUsXG4gICAgICBub3JtYWxpemU6IHRydWUsXG4gICAgICBub3JtYWxpemVUYWdzOiBmYWxzZSxcbiAgICAgIGF0dHJrZXk6IFwiQFwiLFxuICAgICAgY2hhcmtleTogXCIjXCIsXG4gICAgICBleHBsaWNpdEFycmF5OiBmYWxzZSxcbiAgICAgIGlnbm9yZUF0dHJzOiBmYWxzZSxcbiAgICAgIG1lcmdlQXR0cnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRSb290OiBmYWxzZSxcbiAgICAgIHZhbGlkYXRvcjogbnVsbCxcbiAgICAgIHhtbG5zOiBmYWxzZSxcbiAgICAgIGV4cGxpY2l0Q2hpbGRyZW46IGZhbHNlLFxuICAgICAgY2hpbGRrZXk6ICdAQCcsXG4gICAgICBjaGFyc0FzQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgaW5jbHVkZVdoaXRlQ2hhcnM6IGZhbHNlLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgYXR0ck5hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgYXR0clZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHRhZ05hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgdmFsdWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgZW1wdHlUYWc6ICcnXG4gICAgfSxcbiAgICBcIjAuMlwiOiB7XG4gICAgICBleHBsaWNpdENoYXJrZXk6IGZhbHNlLFxuICAgICAgdHJpbTogZmFsc2UsXG4gICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgbm9ybWFsaXplVGFnczogZmFsc2UsXG4gICAgICBhdHRya2V5OiBcIiRcIixcbiAgICAgIGNoYXJrZXk6IFwiX1wiLFxuICAgICAgZXhwbGljaXRBcnJheTogdHJ1ZSxcbiAgICAgIGlnbm9yZUF0dHJzOiBmYWxzZSxcbiAgICAgIG1lcmdlQXR0cnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRSb290OiB0cnVlLFxuICAgICAgdmFsaWRhdG9yOiBudWxsLFxuICAgICAgeG1sbnM6IGZhbHNlLFxuICAgICAgZXhwbGljaXRDaGlsZHJlbjogZmFsc2UsXG4gICAgICBwcmVzZXJ2ZUNoaWxkcmVuT3JkZXI6IGZhbHNlLFxuICAgICAgY2hpbGRrZXk6ICckJCcsXG4gICAgICBjaGFyc0FzQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgaW5jbHVkZVdoaXRlQ2hhcnM6IGZhbHNlLFxuICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgYXR0ck5hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgYXR0clZhbHVlUHJvY2Vzc29yczogbnVsbCxcbiAgICAgIHRhZ05hbWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgdmFsdWVQcm9jZXNzb3JzOiBudWxsLFxuICAgICAgcm9vdE5hbWU6ICdyb290JyxcbiAgICAgIHhtbGRlYzoge1xuICAgICAgICAndmVyc2lvbic6ICcxLjAnLFxuICAgICAgICAnZW5jb2RpbmcnOiAnVVRGLTgnLFxuICAgICAgICAnc3RhbmRhbG9uZSc6IHRydWVcbiAgICAgIH0sXG4gICAgICBkb2N0eXBlOiBudWxsLFxuICAgICAgcmVuZGVyT3B0czoge1xuICAgICAgICAncHJldHR5JzogdHJ1ZSxcbiAgICAgICAgJ2luZGVudCc6ICcgICcsXG4gICAgICAgICduZXdsaW5lJzogJ1xcbidcbiAgICAgIH0sXG4gICAgICBoZWFkbGVzczogZmFsc2UsXG4gICAgICBjaHVua1NpemU6IDEwMDAwLFxuICAgICAgZW1wdHlUYWc6ICcnLFxuICAgICAgY2RhdGE6IGZhbHNlXG4gICAgfVxuICB9O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjdcbihmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG4gIHZhciBib20sIGRlZmF1bHRzLCBldmVudHMsIGlzRW1wdHksIHByb2Nlc3NJdGVtLCBwcm9jZXNzb3JzLCBzYXgsIHNldEltbWVkaWF0ZSxcbiAgICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHNheCA9IHJlcXVpcmUoJ3NheCcpO1xuXG4gIGV2ZW50cyA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4gIGJvbSA9IHJlcXVpcmUoJy4vYm9tJyk7XG5cbiAgcHJvY2Vzc29ycyA9IHJlcXVpcmUoJy4vcHJvY2Vzc29ycycpO1xuXG4gIHNldEltbWVkaWF0ZSA9IHJlcXVpcmUoJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcblxuICBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKS5kZWZhdWx0cztcblxuICBpc0VtcHR5ID0gZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmICh0aGluZyAhPSBudWxsKSAmJiBPYmplY3Qua2V5cyh0aGluZykubGVuZ3RoID09PSAwO1xuICB9O1xuXG4gIHByb2Nlc3NJdGVtID0gZnVuY3Rpb24ocHJvY2Vzc29ycywgaXRlbSwga2V5KSB7XG4gICAgdmFyIGksIGxlbiwgcHJvY2VzcztcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm9jZXNzb3JzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBwcm9jZXNzID0gcHJvY2Vzc29yc1tpXTtcbiAgICAgIGl0ZW0gPSBwcm9jZXNzKGl0ZW0sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG4gIGV4cG9ydHMuUGFyc2VyID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoUGFyc2VyLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFBhcnNlcihvcHRzKSB7XG4gICAgICB0aGlzLnBhcnNlU3RyaW5nID0gYmluZCh0aGlzLnBhcnNlU3RyaW5nLCB0aGlzKTtcbiAgICAgIHRoaXMucmVzZXQgPSBiaW5kKHRoaXMucmVzZXQsIHRoaXMpO1xuICAgICAgdGhpcy5hc3NpZ25PclB1c2ggPSBiaW5kKHRoaXMuYXNzaWduT3JQdXNoLCB0aGlzKTtcbiAgICAgIHRoaXMucHJvY2Vzc0FzeW5jID0gYmluZCh0aGlzLnByb2Nlc3NBc3luYywgdGhpcyk7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGV4cG9ydHMuUGFyc2VyKSkge1xuICAgICAgICByZXR1cm4gbmV3IGV4cG9ydHMuUGFyc2VyKG9wdHMpO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgICByZWYgPSBkZWZhdWx0c1tcIjAuMlwiXTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgZm9yIChrZXkgaW4gb3B0cykge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvcHRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSBvcHRzW2tleV07XG4gICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnhtbG5zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy54bWxuc2tleSA9IHRoaXMub3B0aW9ucy5hdHRya2V5ICsgXCJuc1wiO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ub3JtYWxpemVUYWdzKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnRhZ05hbWVQcm9jZXNzb3JzLnVuc2hpZnQocHJvY2Vzc29ycy5ub3JtYWxpemUpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIFBhcnNlci5wcm90b3R5cGUucHJvY2Vzc0FzeW5jID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2h1bmssIGVycjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZy5sZW5ndGggPD0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZSkge1xuICAgICAgICAgIGNodW5rID0gdGhpcy5yZW1haW5pbmc7XG4gICAgICAgICAgdGhpcy5yZW1haW5pbmcgPSAnJztcbiAgICAgICAgICB0aGlzLnNheFBhcnNlciA9IHRoaXMuc2F4UGFyc2VyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVuayA9IHRoaXMucmVtYWluaW5nLnN1YnN0cigwLCB0aGlzLm9wdGlvbnMuY2h1bmtTaXplKTtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnN1YnN0cih0aGlzLm9wdGlvbnMuY2h1bmtTaXplLCB0aGlzLnJlbWFpbmluZy5sZW5ndGgpO1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyID0gdGhpcy5zYXhQYXJzZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUodGhpcy5wcm9jZXNzQXN5bmMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyID0gZXJyb3IxO1xuICAgICAgICBpZiAoIXRoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgIHRoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFBhcnNlci5wcm90b3R5cGUuYXNzaWduT3JQdXNoID0gZnVuY3Rpb24ob2JqLCBrZXksIG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5leHBsaWNpdEFycmF5KSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9ialtrZXldID0gW25ld1ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEob2JqW2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9ialtrZXldLnB1c2gobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBQYXJzZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXR0cmtleSwgY2hhcmtleSwgb250ZXh0LCBzdGFjaztcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLnNheFBhcnNlciA9IHNheC5wYXJzZXIodGhpcy5vcHRpb25zLnN0cmljdCwge1xuICAgICAgICB0cmltOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplOiBmYWxzZSxcbiAgICAgICAgeG1sbnM6IHRoaXMub3B0aW9ucy54bWxuc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lcnJUaHJvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZXJyb3IgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLnJlc3VtZSgpO1xuICAgICAgICAgIGlmICghX3RoaXMuc2F4UGFyc2VyLmVyclRocm93bikge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVyclRocm93biA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uZW5kID0gKGZ1bmN0aW9uKF90aGlzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoIV90aGlzLnNheFBhcnNlci5lbmRlZCkge1xuICAgICAgICAgICAgX3RoaXMuc2F4UGFyc2VyLmVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5lbWl0KFwiZW5kXCIsIF90aGlzLnJlc3VsdE9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5lbmRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5FWFBMSUNJVF9DSEFSS0VZID0gdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hhcmtleTtcbiAgICAgIHRoaXMucmVzdWx0T2JqZWN0ID0gbnVsbDtcbiAgICAgIHN0YWNrID0gW107XG4gICAgICBhdHRya2V5ID0gdGhpcy5vcHRpb25zLmF0dHJrZXk7XG4gICAgICBjaGFya2V5ID0gdGhpcy5vcHRpb25zLmNoYXJrZXk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbm9wZW50YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICB2YXIga2V5LCBuZXdWYWx1ZSwgb2JqLCBwcm9jZXNzZWRLZXksIHJlZjtcbiAgICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbY2hhcmtleV0gPSBcIlwiO1xuICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5pZ25vcmVBdHRycykge1xuICAgICAgICAgICAgcmVmID0gbm9kZS5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gcmVmKSB7XG4gICAgICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmICghKGF0dHJrZXkgaW4gb2JqKSAmJiAhX3RoaXMub3B0aW9ucy5tZXJnZUF0dHJzKSB7XG4gICAgICAgICAgICAgICAgb2JqW2F0dHJrZXldID0ge307XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbmV3VmFsdWUgPSBfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLmF0dHJWYWx1ZVByb2Nlc3NvcnMsIG5vZGUuYXR0cmlidXRlc1trZXldLCBrZXkpIDogbm9kZS5hdHRyaWJ1dGVzW2tleV07XG4gICAgICAgICAgICAgIHByb2Nlc3NlZEtleSA9IF90aGlzLm9wdGlvbnMuYXR0ck5hbWVQcm9jZXNzb3JzID8gcHJvY2Vzc0l0ZW0oX3RoaXMub3B0aW9ucy5hdHRyTmFtZVByb2Nlc3NvcnMsIGtleSkgOiBrZXk7XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm1lcmdlQXR0cnMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5hc3NpZ25PclB1c2gob2JqLCBwcm9jZXNzZWRLZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbYXR0cmtleV1bcHJvY2Vzc2VkS2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtcIiNuYW1lXCJdID0gX3RoaXMub3B0aW9ucy50YWdOYW1lUHJvY2Vzc29ycyA/IHByb2Nlc3NJdGVtKF90aGlzLm9wdGlvbnMudGFnTmFtZVByb2Nlc3NvcnMsIG5vZGUubmFtZSkgOiBub2RlLm5hbWU7XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMueG1sbnMpIHtcbiAgICAgICAgICAgIG9ialtfdGhpcy5vcHRpb25zLnhtbG5za2V5XSA9IHtcbiAgICAgICAgICAgICAgdXJpOiBub2RlLnVyaSxcbiAgICAgICAgICAgICAgbG9jYWw6IG5vZGUubG9jYWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdGFjay5wdXNoKG9iaik7XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHRoaXMuc2F4UGFyc2VyLm9uY2xvc2V0YWcgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBjZGF0YSwgZW1wdHlTdHIsIGtleSwgbm9kZSwgbm9kZU5hbWUsIG9iaiwgb2JqQ2xvbmUsIG9sZCwgcywgeHBhdGg7XG4gICAgICAgICAgb2JqID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgbm9kZU5hbWUgPSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICBpZiAoIV90aGlzLm9wdGlvbnMuZXhwbGljaXRDaGlsZHJlbiB8fCAhX3RoaXMub3B0aW9ucy5wcmVzZXJ2ZUNoaWxkcmVuT3JkZXIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbXCIjbmFtZVwiXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9iai5jZGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2RhdGEgPSBvYmouY2RhdGE7XG4gICAgICAgICAgICBkZWxldGUgb2JqLmNkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKG9ialtjaGFya2V5XS5tYXRjaCgvXlxccyokLykgJiYgIWNkYXRhKSB7XG4gICAgICAgICAgICBlbXB0eVN0ciA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpbY2hhcmtleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnRyaW0pIHtcbiAgICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gb2JqW2NoYXJrZXldLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLm5vcm1hbGl6ZSkge1xuICAgICAgICAgICAgICBvYmpbY2hhcmtleV0gPSBvYmpbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqW2NoYXJrZXldID0gX3RoaXMub3B0aW9ucy52YWx1ZVByb2Nlc3NvcnMgPyBwcm9jZXNzSXRlbShfdGhpcy5vcHRpb25zLnZhbHVlUHJvY2Vzc29ycywgb2JqW2NoYXJrZXldLCBub2RlTmFtZSkgOiBvYmpbY2hhcmtleV07XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDEgJiYgY2hhcmtleSBpbiBvYmogJiYgIV90aGlzLkVYUExJQ0lUX0NIQVJLRVkpIHtcbiAgICAgICAgICAgICAgb2JqID0gb2JqW2NoYXJrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNFbXB0eShvYmopKSB7XG4gICAgICAgICAgICBvYmogPSBfdGhpcy5vcHRpb25zLmVtcHR5VGFnICE9PSAnJyA/IF90aGlzLm9wdGlvbnMuZW1wdHlUYWcgOiBlbXB0eVN0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMudmFsaWRhdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIHhwYXRoID0gXCIvXCIgKyAoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgaSwgbGVuLCByZXN1bHRzO1xuICAgICAgICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0YWNrLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHN0YWNrW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChub2RlW1wiI25hbWVcIl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfSkoKSkuY29uY2F0KG5vZGVOYW1lKS5qb2luKFwiL1wiKTtcbiAgICAgICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqID0gX3RoaXMub3B0aW9ucy52YWxpZGF0b3IoeHBhdGgsIHMgJiYgc1tub2RlTmFtZV0sIG9iaik7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmV4cGxpY2l0Q2hpbGRyZW4gJiYgIV90aGlzLm9wdGlvbnMubWVyZ2VBdHRycyAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLnByZXNlcnZlQ2hpbGRyZW5PcmRlcikge1xuICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5vcHRpb25zLmF0dHJrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmF0dHJrZXldID0gb2JqW190aGlzLm9wdGlvbnMuYXR0cmtleV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9ialtfdGhpcy5vcHRpb25zLmF0dHJrZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghX3RoaXMub3B0aW9ucy5jaGFyc0FzQ2hpbGRyZW4gJiYgX3RoaXMub3B0aW9ucy5jaGFya2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgIG5vZGVbX3RoaXMub3B0aW9ucy5jaGFya2V5XSA9IG9ialtfdGhpcy5vcHRpb25zLmNoYXJrZXldO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpbX3RoaXMub3B0aW9ucy5jaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZVtfdGhpcy5vcHRpb25zLmNoaWxka2V5XSA9IG9iajtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvYmogPSBub2RlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBvYmpDbG9uZSA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG9iakNsb25lW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldLnB1c2gob2JqQ2xvbmUpO1xuICAgICAgICAgICAgICBkZWxldGUgb2JqW1wiI25hbWVcIl07XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMSAmJiBjaGFya2V5IGluIG9iaiAmJiAhX3RoaXMuRVhQTElDSVRfQ0hBUktFWSkge1xuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtjaGFya2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFzc2lnbk9yUHVzaChzLCBub2RlTmFtZSwgb2JqKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMuZXhwbGljaXRSb290KSB7XG4gICAgICAgICAgICAgIG9sZCA9IG9iajtcbiAgICAgICAgICAgICAgb2JqID0ge307XG4gICAgICAgICAgICAgIG9ialtub2RlTmFtZV0gPSBvbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5yZXN1bHRPYmplY3QgPSBvYmo7XG4gICAgICAgICAgICBfdGhpcy5zYXhQYXJzZXIuZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVtaXQoXCJlbmRcIiwgX3RoaXMucmVzdWx0T2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIG9udGV4dCA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBjaGFyQ2hpbGQsIHM7XG4gICAgICAgICAgcyA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzW2NoYXJrZXldICs9IHRleHQ7XG4gICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5leHBsaWNpdENoaWxkcmVuICYmIF90aGlzLm9wdGlvbnMucHJlc2VydmVDaGlsZHJlbk9yZGVyICYmIF90aGlzLm9wdGlvbnMuY2hhcnNBc0NoaWxkcmVuICYmIChfdGhpcy5vcHRpb25zLmluY2x1ZGVXaGl0ZUNoYXJzIHx8IHRleHQucmVwbGFjZSgvXFxcXG4vZywgJycpLnRyaW0oKSAhPT0gJycpKSB7XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0gPSBzW190aGlzLm9wdGlvbnMuY2hpbGRrZXldIHx8IFtdO1xuICAgICAgICAgICAgICBjaGFyQ2hpbGQgPSB7XG4gICAgICAgICAgICAgICAgJyNuYW1lJzogJ19fdGV4dF9fJ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSB0ZXh0O1xuICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5ub3JtYWxpemUpIHtcbiAgICAgICAgICAgICAgICBjaGFyQ2hpbGRbY2hhcmtleV0gPSBjaGFyQ2hpbGRbY2hhcmtleV0ucmVwbGFjZSgvXFxzezIsfS9nLCBcIiBcIikudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNbX3RoaXMub3B0aW9ucy5jaGlsZGtleV0ucHVzaChjaGFyQ2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkodGhpcyk7XG4gICAgICB0aGlzLnNheFBhcnNlci5vbnRleHQgPSBvbnRleHQ7XG4gICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIub25jZGF0YSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgIHZhciBzO1xuICAgICAgICAgIHMgPSBvbnRleHQodGV4dCk7XG4gICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmNkYXRhID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICB9O1xuXG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgY2IpIHtcbiAgICAgIHZhciBlcnI7XG4gICAgICBpZiAoKGNiICE9IG51bGwpICYmIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub24oXCJlbmRcIiwgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzdHIgPSBzdHIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHN0ci50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIkVtcHR5IHN0cmluZyBpcyBub3QgdmFsaWQgWE1MXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYm9tLnN0cmlwQk9NKHN0cik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXN5bmMpIHtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHN0cjtcbiAgICAgICAgICBzZXRJbW1lZGlhdGUodGhpcy5wcm9jZXNzQXN5bmMpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNheFBhcnNlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zYXhQYXJzZXIud3JpdGUoc3RyKS5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGVyciA9IGVycm9yMTtcbiAgICAgICAgaWYgKCEodGhpcy5zYXhQYXJzZXIuZXJyVGhyb3duIHx8IHRoaXMuc2F4UGFyc2VyLmVuZGVkKSkge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNheFBhcnNlci5lcnJUaHJvd24gPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2F4UGFyc2VyLmVuZGVkKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBQYXJzZXI7XG5cbiAgfSkoZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cbiAgZXhwb3J0cy5wYXJzZVN0cmluZyA9IGZ1bmN0aW9uKHN0ciwgYSwgYikge1xuICAgIHZhciBjYiwgb3B0aW9ucywgcGFyc2VyO1xuICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IGI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBhO1xuICAgICAgfVxuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBwYXJzZXIgPSBuZXcgZXhwb3J0cy5QYXJzZXIob3B0aW9ucyk7XG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZVN0cmluZyhzdHIsIGNiKTtcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgcHJlZml4TWF0Y2g7XG5cbiAgcHJlZml4TWF0Y2ggPSBuZXcgUmVnRXhwKC8oPyF4bWxucyleLio6Lyk7XG5cbiAgZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG4gIH07XG5cbiAgZXhwb3J0cy5maXJzdENoYXJMb3dlckNhc2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuICB9O1xuXG4gIGV4cG9ydHMuc3RyaXBQcmVmaXggPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocHJlZml4TWF0Y2gsICcnKTtcbiAgfTtcblxuICBleHBvcnRzLnBhcnNlTnVtYmVycyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmICghaXNOYU4oc3RyKSkge1xuICAgICAgc3RyID0gc3RyICUgMSA9PT0gMCA/IHBhcnNlSW50KHN0ciwgMTApIDogcGFyc2VGbG9hdChzdHIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIGV4cG9ydHMucGFyc2VCb29sZWFucyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGlmICgvXig/OnRydWV8ZmFsc2UpJC9pLnRlc3Qoc3RyKSkge1xuICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICB2YXIgYnVpbGRlciwgZGVmYXVsdHMsIHBhcnNlciwgcHJvY2Vzc29ycyxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xuXG4gIGJ1aWxkZXIgPSByZXF1aXJlKCcuL2J1aWxkZXInKTtcblxuICBwYXJzZXIgPSByZXF1aXJlKCcuL3BhcnNlcicpO1xuXG4gIHByb2Nlc3NvcnMgPSByZXF1aXJlKCcuL3Byb2Nlc3NvcnMnKTtcblxuICBleHBvcnRzLmRlZmF1bHRzID0gZGVmYXVsdHMuZGVmYXVsdHM7XG5cbiAgZXhwb3J0cy5wcm9jZXNzb3JzID0gcHJvY2Vzc29ycztcblxuICBleHBvcnRzLlZhbGlkYXRpb25FcnJvciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFZhbGlkYXRpb25FcnJvciwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gVmFsaWRhdGlvbkVycm9yO1xuXG4gIH0pKEVycm9yKTtcblxuICBleHBvcnRzLkJ1aWxkZXIgPSBidWlsZGVyLkJ1aWxkZXI7XG5cbiAgZXhwb3J0cy5QYXJzZXIgPSBwYXJzZXIuUGFyc2VyO1xuXG4gIGV4cG9ydHMucGFyc2VTdHJpbmcgPSBwYXJzZXIucGFyc2VTdHJpbmc7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgYXNzaWduLCBpc0FycmF5LCBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNQbGFpbk9iamVjdCxcbiAgICBzbGljZSA9IFtdLnNsaWNlLFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBhc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaSwga2V5LCBsZW4sIHNvdXJjZSwgc291cmNlcywgdGFyZ2V0O1xuICAgIHRhcmdldCA9IGFyZ3VtZW50c1swXSwgc291cmNlcyA9IDIgPD0gYXJndW1lbnRzLmxlbmd0aCA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSA6IFtdO1xuICAgIGlmIChpc0Z1bmN0aW9uKE9iamVjdC5hc3NpZ24pKSB7XG4gICAgICBPYmplY3QuYXNzaWduLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc291cmNlID0gc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICBpc0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsKSB7XG4gICAgcmV0dXJuICEhdmFsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xuXG4gIGlzT2JqZWN0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gISF2YWwgJiYgKChyZWYgPSB0eXBlb2YgdmFsKSA9PT0gJ2Z1bmN0aW9uJyB8fCByZWYgPT09ICdvYmplY3QnKTtcbiAgfTtcblxuICBpc0FycmF5ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oQXJyYXkuaXNBcnJheSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG4gIH07XG5cbiAgaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciBrZXk7XG4gICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0dXJuICF2YWwubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGtleSBpbiB2YWwpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwodmFsLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbih2YWwpIHtcbiAgICB2YXIgY3RvciwgcHJvdG87XG4gICAgcmV0dXJuIGlzT2JqZWN0KHZhbCkgJiYgKHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCkpICYmIChjdG9yID0gcHJvdG8uY29uc3RydWN0b3IpICYmICh0eXBlb2YgY3RvciA9PT0gJ2Z1bmN0aW9uJykgJiYgKGN0b3IgaW5zdGFuY2VvZiBjdG9yKSAmJiAoRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY3RvcikgPT09IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdCkpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLmFzc2lnbiA9IGFzc2lnbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuICBtb2R1bGUuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuXG4gIG1vZHVsZS5leHBvcnRzLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTEF0dHJpYnV0ZTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTEF0dHJpYnV0ZSA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxBdHRyaWJ1dGUocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgdGhpcy5vcHRpb25zID0gcGFyZW50Lm9wdGlvbnM7XG4gICAgICB0aGlzLnN0cmluZ2lmeSA9IHBhcmVudC5zdHJpbmdpZnk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXR0cmlidXRlIG5hbWUgb2YgZWxlbWVudCBcIiArIHBhcmVudC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXR0cmlidXRlIHZhbHVlIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lICsgXCIgb2YgZWxlbWVudCBcIiArIHBhcmVudC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5LmF0dE5hbWUobmFtZSk7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuYXR0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIFhNTEF0dHJpYnV0ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxBdHRyaWJ1dGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmF0dHJpYnV0ZSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTEF0dHJpYnV0ZTtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MQ0RhdGEgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxDRGF0YSwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDRGF0YShwYXJlbnQsIHRleHQpIHtcbiAgICAgIFhNTENEYXRhLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgQ0RBVEEgdGV4dFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGV4dCA9IHRoaXMuc3RyaW5naWZ5LmNkYXRhKHRleHQpO1xuICAgIH1cblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTENEYXRhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5jZGF0YSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTENEYXRhO1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENvbW1lbnQsIFhNTE5vZGUsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxDb21tZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MQ29tbWVudCwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxDb21tZW50KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MQ29tbWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRleHQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGNvbW1lbnQgdGV4dFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGV4dCA9IHRoaXMuc3RyaW5naWZ5LmNvbW1lbnQodGV4dCk7XG4gICAgfVxuXG4gICAgWE1MQ29tbWVudC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxDb21tZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5jb21tZW50KHRoaXMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MQ29tbWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEVERBdHRMaXN0LCBYTUxOb2RlLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFREQXR0TGlzdCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERUREF0dExpc3QsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFREQXR0TGlzdChwYXJlbnQsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIFhNTERUREF0dExpc3QuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgRFREIGVsZW1lbnQgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWF0dHJpYnV0ZVR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIHR5cGVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZmF1bHRWYWx1ZVR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBEVEQgYXR0cmlidXRlIGRlZmF1bHRcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlVHlwZS5pbmRleE9mKCcjJykgIT09IDApIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlVHlwZSA9ICcjJyArIGRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZmF1bHRWYWx1ZVR5cGUubWF0Y2goL14oI1JFUVVJUkVEfCNJTVBMSUVEfCNGSVhFRHwjREVGQVVMVCkkLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkZWZhdWx0IHZhbHVlIHR5cGU7IGV4cGVjdGVkOiAjUkVRVUlSRUQsICNJTVBMSUVELCAjRklYRUQgb3IgI0RFRkFVTFRcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICYmICFkZWZhdWx0VmFsdWVUeXBlLm1hdGNoKC9eKCNGSVhFRHwjREVGQVVMVCkkLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCB2YWx1ZSBvbmx5IGFwcGxpZXMgdG8gI0ZJWEVEIG9yICNERUZBVUxUXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IHRoaXMuc3RyaW5naWZ5LmVsZU5hbWUoZWxlbWVudE5hbWUpO1xuICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gdGhpcy5zdHJpbmdpZnkuYXR0TmFtZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlVHlwZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEF0dFR5cGUoYXR0cmlidXRlVHlwZSk7XG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEF0dERlZmF1bHQoZGVmYXVsdFZhbHVlKTtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlVHlwZSA9IGRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgfVxuXG4gICAgWE1MRFREQXR0TGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkQXR0TGlzdCh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREF0dExpc3Q7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRFRERWxlbWVudCwgWE1MTm9kZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERUREVsZW1lbnQgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxEVERFbGVtZW50LCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERUREVsZW1lbnQocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRERWxlbWVudC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIERURCBlbGVtZW50IG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gJygjUENEQVRBKSc7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSAnKCcgKyB2YWx1ZS5qb2luKCcsJykgKyAnKSc7XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLnN0cmluZ2lmeS5lbGVOYW1lKG5hbWUpO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3RyaW5naWZ5LmR0ZEVsZW1lbnRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgWE1MRFRERWxlbWVudC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkRWxlbWVudCh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREVsZW1lbnQ7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRFRERW50aXR5LCBYTUxOb2RlLCBpc09iamVjdCxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNPYmplY3Q7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRFRERW50aXR5ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRERW50aXR5LCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTERUREVudGl0eShwYXJlbnQsIHBlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRERW50aXR5Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAobmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgZW50aXR5IG5hbWVcIik7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGVudGl0eSB2YWx1ZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGUgPSAhIXBlO1xuICAgICAgdGhpcy5uYW1lID0gdGhpcy5zdHJpbmdpZnkuZWxlTmFtZShuYW1lKTtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnN0cmluZ2lmeS5kdGRFbnRpdHlWYWx1ZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXZhbHVlLnB1YklEICYmICF2YWx1ZS5zeXNJRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlB1YmxpYyBhbmQvb3Igc3lzdGVtIGlkZW50aWZpZXJzIGFyZSByZXF1aXJlZCBmb3IgYW4gZXh0ZXJuYWwgZW50aXR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5wdWJJRCAmJiAhdmFsdWUuc3lzSUQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeXN0ZW0gaWRlbnRpZmllciBpcyByZXF1aXJlZCBmb3IgYSBwdWJsaWMgZXh0ZXJuYWwgZW50aXR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS5wdWJJRCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHZhbHVlLnB1YklEKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuc3lzSUQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRCh2YWx1ZS5zeXNJRCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLm5EYXRhICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm5EYXRhID0gdGhpcy5zdHJpbmdpZnkuZHRkTkRhdGEodmFsdWUubkRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlICYmIHRoaXMubkRhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3RhdGlvbiBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBhIHBhcmFtZXRlciBlbnRpdHlcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxEVERFbnRpdHkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmR0ZEVudGl0eSh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERUREVudGl0eTtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEVEROb3RhdGlvbiwgWE1MTm9kZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERURE5vdGF0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRFRETm90YXRpb24sIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRFRETm90YXRpb24ocGFyZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgWE1MRFRETm90YXRpb24uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBub3RhdGlvbiBuYW1lXCIpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZS5wdWJJRCAmJiAhdmFsdWUuc3lzSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHVibGljIG9yIHN5c3RlbSBpZGVudGlmaWVycyBhcmUgcmVxdWlyZWQgZm9yIGFuIGV4dGVybmFsIGVudGl0eVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubmFtZSA9IHRoaXMuc3RyaW5naWZ5LmVsZU5hbWUobmFtZSk7XG4gICAgICBpZiAodmFsdWUucHViSUQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnB1YklEID0gdGhpcy5zdHJpbmdpZnkuZHRkUHViSUQodmFsdWUucHViSUQpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN5c0lEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zeXNJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFN5c0lEKHZhbHVlLnN5c0lEKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxEVEROb3RhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZHRkTm90YXRpb24odGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEVEROb3RhdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxEZWNsYXJhdGlvbiwgWE1MTm9kZSwgaXNPYmplY3QsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBpc09iamVjdCA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLmlzT2JqZWN0O1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRGVjbGFyYXRpb24sIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRGVjbGFyYXRpb24ocGFyZW50LCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSkge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIFhNTERlY2xhcmF0aW9uLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAoaXNPYmplY3QodmVyc2lvbikpIHtcbiAgICAgICAgcmVmID0gdmVyc2lvbiwgdmVyc2lvbiA9IHJlZi52ZXJzaW9uLCBlbmNvZGluZyA9IHJlZi5lbmNvZGluZywgc3RhbmRhbG9uZSA9IHJlZi5zdGFuZGFsb25lO1xuICAgICAgfVxuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIHZlcnNpb24gPSAnMS4wJztcbiAgICAgIH1cbiAgICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuc3RyaW5naWZ5LnhtbFZlcnNpb24odmVyc2lvbik7XG4gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gdGhpcy5zdHJpbmdpZnkueG1sRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmUgPSB0aGlzLnN0cmluZ2lmeS54bWxTdGFuZGFsb25lKHN0YW5kYWxvbmUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTERlY2xhcmF0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud3JpdGVyLnNldChvcHRpb25zKS5kZWNsYXJhdGlvbih0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERlY2xhcmF0aW9uO1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTERUREF0dExpc3QsIFhNTERUREVsZW1lbnQsIFhNTERUREVudGl0eSwgWE1MRFRETm90YXRpb24sIFhNTERvY1R5cGUsIFhNTE5vZGUsIGlzT2JqZWN0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgaXNPYmplY3QgPSByZXF1aXJlKCcuL1V0aWxpdHknKS5pc09iamVjdDtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgWE1MRFREQXR0TGlzdCA9IHJlcXVpcmUoJy4vWE1MRFREQXR0TGlzdCcpO1xuXG4gIFhNTERUREVudGl0eSA9IHJlcXVpcmUoJy4vWE1MRFRERW50aXR5Jyk7XG5cbiAgWE1MRFRERWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRFRERWxlbWVudCcpO1xuXG4gIFhNTERURE5vdGF0aW9uID0gcmVxdWlyZSgnLi9YTUxEVEROb3RhdGlvbicpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jVHlwZSA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTERvY1R5cGUsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRG9jVHlwZShwYXJlbnQsIHB1YklELCBzeXNJRCkge1xuICAgICAgdmFyIHJlZiwgcmVmMTtcbiAgICAgIFhNTERvY1R5cGUuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIHRoaXMuZG9jdW1lbnRPYmplY3QgPSBwYXJlbnQ7XG4gICAgICBpZiAoaXNPYmplY3QocHViSUQpKSB7XG4gICAgICAgIHJlZiA9IHB1YklELCBwdWJJRCA9IHJlZi5wdWJJRCwgc3lzSUQgPSByZWYuc3lzSUQ7XG4gICAgICB9XG4gICAgICBpZiAoc3lzSUQgPT0gbnVsbCkge1xuICAgICAgICByZWYxID0gW3B1YklELCBzeXNJRF0sIHN5c0lEID0gcmVmMVswXSwgcHViSUQgPSByZWYxWzFdO1xuICAgICAgfVxuICAgICAgaWYgKHB1YklEICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wdWJJRCA9IHRoaXMuc3RyaW5naWZ5LmR0ZFB1YklEKHB1YklEKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeXNJRCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3lzSUQgPSB0aGlzLnN0cmluZ2lmeS5kdGRTeXNJRChzeXNJRCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbGVtZW50KHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuYXR0TGlzdCA9IGZ1bmN0aW9uKGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVUeXBlLCBkZWZhdWx0VmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTERUREF0dExpc3QodGhpcywgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLmVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbnRpdHkodGhpcywgZmFsc2UsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUucEVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVERFbnRpdHkodGhpcywgdHJ1ZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2NUeXBlLnByb3RvdHlwZS5ub3RhdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxEVEROb3RhdGlvbih0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmRvY1R5cGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdChlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVHlwZSwgZGVmYXVsdFZhbHVlVHlwZSwgZGVmYXVsdFZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jVHlwZS5wcm90b3R5cGUuZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnBlbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucEVudGl0eShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RhdGlvbihuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY1R5cGUucHJvdG90eXBlLnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290KCkgfHwgdGhpcy5kb2N1bWVudE9iamVjdDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTERvY1R5cGU7XG5cbiAgfSkoWE1MTm9kZSk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MRG9jdW1lbnQsIFhNTE5vZGUsIFhNTFN0cmluZ1dyaXRlciwgWE1MU3RyaW5naWZpZXIsIGlzUGxhaW5PYmplY3QsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9VdGlsaXR5JykuaXNQbGFpbk9iamVjdDtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgWE1MU3RyaW5naWZpZXIgPSByZXF1aXJlKCcuL1hNTFN0cmluZ2lmaWVyJyk7XG5cbiAgWE1MU3RyaW5nV3JpdGVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdXcml0ZXInKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTERvY3VtZW50ID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MRG9jdW1lbnQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRG9jdW1lbnQob3B0aW9ucykge1xuICAgICAgWE1MRG9jdW1lbnQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbnVsbCk7XG4gICAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgICAgaWYgKCFvcHRpb25zLndyaXRlcikge1xuICAgICAgICBvcHRpb25zLndyaXRlciA9IG5ldyBYTUxTdHJpbmdXcml0ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLnN0cmluZ2lmeSA9IG5ldyBYTUxTdHJpbmdpZmllcihvcHRpb25zKTtcbiAgICAgIHRoaXMuaXNEb2N1bWVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgWE1MRG9jdW1lbnQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKHdyaXRlcikge1xuICAgICAgdmFyIHdyaXRlck9wdGlvbnM7XG4gICAgICBpZiAoIXdyaXRlcikge1xuICAgICAgICB3cml0ZXIgPSB0aGlzLm9wdGlvbnMud3JpdGVyO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHdyaXRlcikpIHtcbiAgICAgICAgd3JpdGVyT3B0aW9ucyA9IHdyaXRlcjtcbiAgICAgICAgd3JpdGVyID0gdGhpcy5vcHRpb25zLndyaXRlci5zZXQod3JpdGVyT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JpdGVyLmRvY3VtZW50KHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndyaXRlci5zZXQob3B0aW9ucykuZG9jdW1lbnQodGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxEb2N1bWVudDtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxBdHRyaWJ1dGUsIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEVERBdHRMaXN0LCBYTUxEVERFbGVtZW50LCBYTUxEVERFbnRpdHksIFhNTERURE5vdGF0aW9uLCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRG9jdW1lbnRDQiwgWE1MRWxlbWVudCwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFN0cmluZ1dyaXRlciwgWE1MU3RyaW5naWZpZXIsIFhNTFRleHQsIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1BsYWluT2JqZWN0LCByZWYsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uLCBpc1BsYWluT2JqZWN0ID0gcmVmLmlzUGxhaW5PYmplY3Q7XG5cbiAgWE1MRWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRWxlbWVudCcpO1xuXG4gIFhNTENEYXRhID0gcmVxdWlyZSgnLi9YTUxDRGF0YScpO1xuXG4gIFhNTENvbW1lbnQgPSByZXF1aXJlKCcuL1hNTENvbW1lbnQnKTtcblxuICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuXG4gIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcblxuICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSByZXF1aXJlKCcuL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbicpO1xuXG4gIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuXG4gIFhNTERvY1R5cGUgPSByZXF1aXJlKCcuL1hNTERvY1R5cGUnKTtcblxuICBYTUxEVERBdHRMaXN0ID0gcmVxdWlyZSgnLi9YTUxEVERBdHRMaXN0Jyk7XG5cbiAgWE1MRFRERW50aXR5ID0gcmVxdWlyZSgnLi9YTUxEVERFbnRpdHknKTtcblxuICBYTUxEVERFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxEVERFbGVtZW50Jyk7XG5cbiAgWE1MRFRETm90YXRpb24gPSByZXF1aXJlKCcuL1hNTERURE5vdGF0aW9uJyk7XG5cbiAgWE1MQXR0cmlidXRlID0gcmVxdWlyZSgnLi9YTUxBdHRyaWJ1dGUnKTtcblxuICBYTUxTdHJpbmdpZmllciA9IHJlcXVpcmUoJy4vWE1MU3RyaW5naWZpZXInKTtcblxuICBYTUxTdHJpbmdXcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmluZ1dyaXRlcicpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRG9jdW1lbnRDQiA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxEb2N1bWVudENCKG9wdGlvbnMsIG9uRGF0YSwgb25FbmQpIHtcbiAgICAgIHZhciB3cml0ZXJPcHRpb25zO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIGlmICghb3B0aW9ucy53cml0ZXIpIHtcbiAgICAgICAgb3B0aW9ucy53cml0ZXIgPSBuZXcgWE1MU3RyaW5nV3JpdGVyKG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnMud3JpdGVyKSkge1xuICAgICAgICB3cml0ZXJPcHRpb25zID0gb3B0aW9ucy53cml0ZXI7XG4gICAgICAgIG9wdGlvbnMud3JpdGVyID0gbmV3IFhNTFN0cmluZ1dyaXRlcih3cml0ZXJPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB0aGlzLndyaXRlciA9IG9wdGlvbnMud3JpdGVyO1xuICAgICAgdGhpcy5zdHJpbmdpZnkgPSBuZXcgWE1MU3RyaW5naWZpZXIob3B0aW9ucyk7XG4gICAgICB0aGlzLm9uRGF0YUNhbGxiYWNrID0gb25EYXRhIHx8IGZ1bmN0aW9uKCkge307XG4gICAgICB0aGlzLm9uRW5kQ2FsbGJhY2sgPSBvbkVuZCB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IC0xO1xuICAgICAgdGhpcy5vcGVuVGFncyA9IHt9O1xuICAgICAgdGhpcy5kb2N1bWVudFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZG9jdW1lbnRDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgfVxuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciByZWYxO1xuICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG5vZGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvb3QgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRvY3VtZW50IGNhbiBvbmx5IGhhdmUgb25lIHJvb3Qgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMudmFsdWVPZigpO1xuICAgICAgaWYgKCFpc09iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgICAgICByZWYxID0gW2F0dHJpYnV0ZXMsIHRleHRdLCB0ZXh0ID0gcmVmMVswXSwgYXR0cmlidXRlcyA9IHJlZjFbMV07XG4gICAgICB9XG4gICAgICB0aGlzLmN1cnJlbnROb2RlID0gbmV3IFhNTEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCsrO1xuICAgICAgdGhpcy5vcGVuVGFnc1t0aGlzLmN1cnJlbnRMZXZlbF0gPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgaWYgKHRleHQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRleHQodGV4dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlICYmIHRoaXMuY3VycmVudE5vZGUgaW5zdGFuY2VvZiBYTUxEb2NUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR0ZEVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgYXR0TmFtZSwgYXR0VmFsdWU7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudE5vZGUgfHwgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHQoKSBjYW4gb25seSBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGVsZSgpIGNhbGwgaW4gY2FsbGJhY2sgbW9kZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICAgIGZvciAoYXR0TmFtZSBpbiBuYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwobmFtZSwgYXR0TmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGF0dFZhbHVlID0gbmFtZVthdHROYW1lXTtcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5za2lwTnVsbEF0dHJpYnV0ZXMgfHwgKHZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5hdHRyaWJ1dGVzW25hbWVdID0gbmV3IFhNTEF0dHJpYnV0ZSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgbm9kZSA9IG5ldyBYTUxUZXh0KHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnRleHQobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTENEYXRhKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmNkYXRhKG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTENvbW1lbnQodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuY29tbWVudChub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTFJhdyh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5yYXcobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgaSwgaW5zVGFyZ2V0LCBpbnNWYWx1ZSwgbGVuLCBub2RlO1xuICAgICAgdGhpcy5vcGVuQ3VycmVudCgpO1xuICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gdGFyZ2V0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaW5zVGFyZ2V0ID0gdGFyZ2V0W2ldO1xuICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb24oaW5zVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgIGZvciAoaW5zVGFyZ2V0IGluIHRhcmdldCkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHRhcmdldCwgaW5zVGFyZ2V0KSkgY29udGludWU7XG4gICAgICAgICAgaW5zVmFsdWUgPSB0YXJnZXRbaW5zVGFyZ2V0XTtcbiAgICAgICAgICB0aGlzLmluc3RydWN0aW9uKGluc1RhcmdldCwgaW5zVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmFwcGx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5ldyBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcywgdGFyZ2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIGlmICh0aGlzLmRvY3VtZW50U3RhcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWNsYXJhdGlvbigpIG11c3QgYmUgdGhlIGZpcnN0IG5vZGVcIik7XG4gICAgICB9XG4gICAgICBub2RlID0gbmV3IFhNTERlY2xhcmF0aW9uKHRoaXMsIHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmRlY2xhcmF0aW9uKG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRvY3R5cGUgPSBmdW5jdGlvbihyb290LCBwdWJJRCwgc3lzSUQpIHtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIGlmIChyb290ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyByb290IG5vZGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZHRkKCkgbXVzdCBjb21lIGJlZm9yZSB0aGUgcm9vdCBub2RlXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG5ldyBYTUxEb2NUeXBlKHRoaXMsIHB1YklELCBzeXNJRCk7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLnJvb3ROb2RlTmFtZSA9IHJvb3Q7XG4gICAgICB0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRMZXZlbCsrO1xuICAgICAgdGhpcy5vcGVuVGFnc1t0aGlzLmN1cnJlbnRMZXZlbF0gPSB0aGlzLmN1cnJlbnROb2RlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZEVsZW1lbnQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERUREVsZW1lbnQodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkRWxlbWVudChub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5hdHRMaXN0ID0gZnVuY3Rpb24oZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICB0aGlzLm9wZW5DdXJyZW50KCk7XG4gICAgICBub2RlID0gbmV3IFhNTERUREF0dExpc3QodGhpcywgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVR5cGUsIGRlZmF1bHRWYWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRBdHRMaXN0KG5vZGUsIHRoaXMuY3VycmVudExldmVsICsgMSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRERW50aXR5KHRoaXMsIGZhbHNlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5kdGRFbnRpdHkobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUucEVudGl0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRERW50aXR5KHRoaXMsIHRydWUsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLmR0ZEVudGl0eShub2RlLCB0aGlzLmN1cnJlbnRMZXZlbCArIDEpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub3RhdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIHRoaXMub3BlbkN1cnJlbnQoKTtcbiAgICAgIG5vZGUgPSBuZXcgWE1MRFRETm90YXRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5vbkRhdGEodGhpcy53cml0ZXIuZHRkTm90YXRpb24obm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwgKyAxKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUudXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGRvY3VtZW50IG5vZGUgaGFzIG5vIHBhcmVudFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZU5vZGUodGhpcy5jdXJyZW50Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuTm9kZSh0aGlzLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VOb2RlKHRoaXMub3BlblRhZ3NbdGhpcy5jdXJyZW50TGV2ZWxdKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLm9wZW5UYWdzW3RoaXMuY3VycmVudExldmVsXTtcbiAgICAgIHRoaXMuY3VycmVudExldmVsLS07XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aGlsZSAodGhpcy5jdXJyZW50TGV2ZWwgPj0gMCkge1xuICAgICAgICB0aGlzLnVwKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZCgpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuQ3VycmVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5jaGlsZHJlbiA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Ob2RlKHRoaXMuY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc09wZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QgJiYgdGhpcy5jdXJyZW50TGV2ZWwgPT09IDAgJiYgbm9kZSBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJvb3QgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25EYXRhKHRoaXMud3JpdGVyLm9wZW5Ob2RlKG5vZGUsIHRoaXMuY3VycmVudExldmVsKSk7XG4gICAgICAgIHJldHVybiBub2RlLmlzT3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNsb3NlTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc0Nsb3NlZCkge1xuICAgICAgICB0aGlzLm9uRGF0YSh0aGlzLndyaXRlci5jbG9zZU5vZGUobm9kZSwgdGhpcy5jdXJyZW50TGV2ZWwpKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbihjaHVuaykge1xuICAgICAgdGhpcy5kb2N1bWVudFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMub25EYXRhQ2FsbGJhY2soY2h1bmspO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb2N1bWVudENvbXBsZXRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5vbkVuZENhbGxiYWNrKCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub2QgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS50eHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRhdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZGF0YSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmNvbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuaW5zID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmRlYyA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNsYXJhdGlvbih2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmR0ZCA9IGZ1bmN0aW9uKHJvb3QsIHB1YklELCBzeXNJRCkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9jdHlwZShyb290LCBwdWJJRCwgc3lzSUQpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5lID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUubiA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2RhdGEodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5jID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhdyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmkgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYXR0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZSAmJiB0aGlzLmN1cnJlbnROb2RlIGluc3RhbmNlb2YgWE1MRG9jVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRMaXN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MRG9jdW1lbnRDQi5wcm90b3R5cGUuYSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUgJiYgdGhpcy5jdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFhNTERvY1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0TGlzdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTERvY3VtZW50Q0IucHJvdG90eXBlLmVudCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRpdHkobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5wZW50ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnBFbnRpdHkobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxEb2N1bWVudENCLnByb3RvdHlwZS5ub3QgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90YXRpb24obmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MRG9jdW1lbnRDQjtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTEF0dHJpYnV0ZSwgWE1MRWxlbWVudCwgWE1MTm9kZSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIHJlZixcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uO1xuXG4gIFhNTE5vZGUgPSByZXF1aXJlKCcuL1hNTE5vZGUnKTtcblxuICBYTUxBdHRyaWJ1dGUgPSByZXF1aXJlKCcuL1hNTEF0dHJpYnV0ZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MRWxlbWVudCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTEVsZW1lbnQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MRWxlbWVudChwYXJlbnQsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICAgIFhNTEVsZW1lbnQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBlbGVtZW50IG5hbWVcIik7XG4gICAgICB9XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLnN0cmluZ2lmeS5lbGVOYW1lKG5hbWUpO1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlKGF0dHJpYnV0ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudC5pc0RvY3VtZW50KSB7XG4gICAgICAgIHRoaXMuaXNSb290ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb2N1bWVudE9iamVjdCA9IHBhcmVudDtcbiAgICAgICAgcGFyZW50LnJvb3RPYmplY3QgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXR0LCBhdHROYW1lLCBjbG9uZWRTZWxmLCByZWYxO1xuICAgICAgY2xvbmVkU2VsZiA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICBpZiAoY2xvbmVkU2VsZi5pc1Jvb3QpIHtcbiAgICAgICAgY2xvbmVkU2VsZi5kb2N1bWVudE9iamVjdCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjbG9uZWRTZWxmLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgIHJlZjEgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKGF0dE5hbWUgaW4gcmVmMSkge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYxLCBhdHROYW1lKSkgY29udGludWU7XG4gICAgICAgIGF0dCA9IHJlZjFbYXR0TmFtZV07XG4gICAgICAgIGNsb25lZFNlbGYuYXR0cmlidXRlc1thdHROYW1lXSA9IGF0dC5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgY2xvbmVkU2VsZi5jaGlsZHJlbiA9IFtdO1xuICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHZhciBjbG9uZWRDaGlsZDtcbiAgICAgICAgY2xvbmVkQ2hpbGQgPSBjaGlsZC5jbG9uZSgpO1xuICAgICAgICBjbG9uZWRDaGlsZC5wYXJlbnQgPSBjbG9uZWRTZWxmO1xuICAgICAgICByZXR1cm4gY2xvbmVkU2VsZi5jaGlsZHJlbi5wdXNoKGNsb25lZENoaWxkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNsb25lZFNlbGY7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgYXR0TmFtZSwgYXR0VmFsdWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgICAgICBmb3IgKGF0dE5hbWUgaW4gbmFtZSkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG5hbWUsIGF0dE5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICBhdHRWYWx1ZSA9IG5hbWVbYXR0TmFtZV07XG4gICAgICAgICAgdGhpcy5hdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmFwcGx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcE51bGxBdHRyaWJ1dGVzIHx8ICh2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IG5ldyBYTUxBdHRyaWJ1dGUodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGF0dE5hbWUsIGksIGxlbjtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBhdHRyaWJ1dGUgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBhdHROYW1lID0gbmFtZVtpXTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2F0dE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLmVsZW1lbnQodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTEVsZW1lbnQucHJvdG90eXBlLmF0dCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxFbGVtZW50LnByb3RvdHlwZS5hID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxFbGVtZW50O1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRWxlbWVudCwgWE1MTm9kZSwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFRleHQsIGlzRW1wdHksIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCByZWYsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIHJlZiA9IHJlcXVpcmUoJy4vVXRpbGl0eScpLCBpc09iamVjdCA9IHJlZi5pc09iamVjdCwgaXNGdW5jdGlvbiA9IHJlZi5pc0Z1bmN0aW9uLCBpc0VtcHR5ID0gcmVmLmlzRW1wdHk7XG5cbiAgWE1MRWxlbWVudCA9IG51bGw7XG5cbiAgWE1MQ0RhdGEgPSBudWxsO1xuXG4gIFhNTENvbW1lbnQgPSBudWxsO1xuXG4gIFhNTERlY2xhcmF0aW9uID0gbnVsbDtcblxuICBYTUxEb2NUeXBlID0gbnVsbDtcblxuICBYTUxSYXcgPSBudWxsO1xuXG4gIFhNTFRleHQgPSBudWxsO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IG51bGw7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxOb2RlID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIFhNTE5vZGUocGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnBhcmVudC5vcHRpb25zO1xuICAgICAgICB0aGlzLnN0cmluZ2lmeSA9IHRoaXMucGFyZW50LnN0cmluZ2lmeTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgIGlmICghWE1MRWxlbWVudCkge1xuICAgICAgICBYTUxFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxFbGVtZW50Jyk7XG4gICAgICAgIFhNTENEYXRhID0gcmVxdWlyZSgnLi9YTUxDRGF0YScpO1xuICAgICAgICBYTUxDb21tZW50ID0gcmVxdWlyZSgnLi9YTUxDb21tZW50Jyk7XG4gICAgICAgIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuICAgICAgICBYTUxEb2NUeXBlID0gcmVxdWlyZSgnLi9YTUxEb2NUeXBlJyk7XG4gICAgICAgIFhNTFJhdyA9IHJlcXVpcmUoJy4vWE1MUmF3Jyk7XG4gICAgICAgIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcbiAgICAgICAgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gcmVxdWlyZSgnLi9YTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24obmFtZSwgYXR0cmlidXRlcywgdGV4dCkge1xuICAgICAgdmFyIGNoaWxkTm9kZSwgaXRlbSwgaiwgaywga2V5LCBsYXN0Q2hpbGQsIGxlbiwgbGVuMSwgcmVmMSwgdmFsO1xuICAgICAgbGFzdENoaWxkID0gbnVsbDtcbiAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMudmFsdWVPZigpO1xuICAgICAgaWYgKCFpc09iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgICAgICByZWYxID0gW2F0dHJpYnV0ZXMsIHRleHRdLCB0ZXh0ID0gcmVmMVswXSwgYXR0cmlidXRlcyA9IHJlZjFbMV07XG4gICAgICB9XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbiA9IG5hbWUubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpdGVtID0gbmFtZVtqXTtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihuYW1lKSkge1xuICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQobmFtZS5hcHBseSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICAgICAgZm9yIChrZXkgaW4gbmFtZSkge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKG5hbWUsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhbCA9IG5hbWVba2V5XTtcbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuYXBwbHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChpc09iamVjdCh2YWwpKSAmJiAoaXNFbXB0eSh2YWwpKSkge1xuICAgICAgICAgICAgdmFsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRGVjb3JhdG9ycyAmJiB0aGlzLnN0cmluZ2lmeS5jb252ZXJ0QXR0S2V5ICYmIGtleS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkpID09PSAwKSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmF0dHJpYnV0ZShrZXkuc3Vic3RyKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRBdHRLZXkubGVuZ3RoKSwgdmFsKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdGVBcnJheUl0ZW1zICYmIEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHZhbC5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHtcbiAgICAgICAgICAgICAgaXRlbSA9IHZhbFtrXTtcbiAgICAgICAgICAgICAgY2hpbGROb2RlID0ge307XG4gICAgICAgICAgICAgIGNoaWxkTm9kZVtrZXldID0gaXRlbTtcbiAgICAgICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5lbGVtZW50KGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmVsZW1lbnQoa2V5KTtcbiAgICAgICAgICAgIGxhc3RDaGlsZC5lbGVtZW50KHZhbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuZWxlbWVudChrZXksIHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRUZXh0S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0VGV4dEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLnRleHQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDRGF0YUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydENEYXRhS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuY2RhdGEodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRDb21tZW50S2V5ICYmIG5hbWUuaW5kZXhPZih0aGlzLnN0cmluZ2lmeS5jb252ZXJ0Q29tbWVudEtleSkgPT09IDApIHtcbiAgICAgICAgICBsYXN0Q2hpbGQgPSB0aGlzLmNvbW1lbnQodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkgJiYgbmFtZS5pbmRleE9mKHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRSYXdLZXkpID09PSAwKSB7XG4gICAgICAgICAgbGFzdENoaWxkID0gdGhpcy5yYXcodGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVEZWNvcmF0b3JzICYmIHRoaXMuc3RyaW5naWZ5LmNvbnZlcnRQSUtleSAmJiBuYW1lLmluZGV4T2YodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5KSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMuaW5zdHJ1Y3Rpb24obmFtZS5zdWJzdHIodGhpcy5zdHJpbmdpZnkuY29udmVydFBJS2V5Lmxlbmd0aCksIHRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RDaGlsZCA9IHRoaXMubm9kZShuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBjcmVhdGUgYW55IGVsZW1lbnRzIHdpdGg6IFwiICsgbmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFzdENoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpZiAodGhpcy5pc1Jvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGluc2VydCBlbGVtZW50cyBhdCByb290IGxldmVsXCIpO1xuICAgICAgfVxuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5lbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgcmVtb3ZlZDtcbiAgICAgIGlmICh0aGlzLmlzUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zZXJ0IGVsZW1lbnRzIGF0IHJvb3QgbGV2ZWxcIik7XG4gICAgICB9XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSArIDEpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5lbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpLCByZWYxO1xuICAgICAgaWYgKHRoaXMuaXNSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZW1vdmUgdGhlIHJvb3QgZWxlbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIGkgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuICAgICAgW10uc3BsaWNlLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCBbaSwgaSAtIGkgKyAxXS5jb25jYXQocmVmMSA9IFtdKSksIHJlZjE7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICB2YXIgY2hpbGQsIHJlZjE7XG4gICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMgfHwgKGF0dHJpYnV0ZXMgPSB7fSk7XG4gICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy52YWx1ZU9mKCk7XG4gICAgICBpZiAoIWlzT2JqZWN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHJlZjEgPSBbYXR0cmlidXRlcywgdGV4dF0sIHRleHQgPSByZWYxWzBdLCBhdHRyaWJ1dGVzID0gcmVmMVsxXTtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gbmV3IFhNTEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICAgIGNoaWxkLnRleHQodGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTFRleHQodGhpcywgdmFsdWUpO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQ7XG4gICAgICBjaGlsZCA9IG5ldyBYTUxDRGF0YSh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkO1xuICAgICAgY2hpbGQgPSBuZXcgWE1MQ29tbWVudCh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmNvbW1lbnRCZWZvcmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkLCBpLCByZW1vdmVkO1xuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5jb21tZW50KHZhbHVlKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5jb21tZW50QWZ0ZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGNoaWxkLCBpLCByZW1vdmVkO1xuICAgICAgaSA9IHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgICByZW1vdmVkID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGkgKyAxKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJlbnQuY29tbWVudCh2YWx1ZSk7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLnBhcmVudC5jaGlsZHJlbiwgcmVtb3ZlZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucmF3ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBjaGlsZDtcbiAgICAgIGNoaWxkID0gbmV3IFhNTFJhdyh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgdmFyIGluc1RhcmdldCwgaW5zVmFsdWUsIGluc3RydWN0aW9uLCBqLCBsZW47XG4gICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnZhbHVlT2YoKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSB0YXJnZXQubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICBpbnNUYXJnZXQgPSB0YXJnZXRbal07XG4gICAgICAgICAgdGhpcy5pbnN0cnVjdGlvbihpbnNUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgICAgZm9yIChpbnNUYXJnZXQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwodGFyZ2V0LCBpbnNUYXJnZXQpKSBjb250aW51ZTtcbiAgICAgICAgICBpbnNWYWx1ZSA9IHRhcmdldFtpbnNUYXJnZXRdO1xuICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb24oaW5zVGFyZ2V0LCBpbnNWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IG5ldyBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGhpcywgdGFyZ2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChpbnN0cnVjdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuaW5zdHJ1Y3Rpb25CZWZvcmUgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyZW50Lmluc3RydWN0aW9uKHRhcmdldCwgdmFsdWUpO1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wYXJlbnQuY2hpbGRyZW4sIHJlbW92ZWQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmluc3RydWN0aW9uQWZ0ZXIgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hpbGQsIGksIHJlbW92ZWQ7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIHJlbW92ZWQgPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaSArIDEpO1xuICAgICAgY2hpbGQgPSB0aGlzLnBhcmVudC5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMucGFyZW50LmNoaWxkcmVuLCByZW1vdmVkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKSB7XG4gICAgICB2YXIgZG9jLCB4bWxkZWM7XG4gICAgICBkb2MgPSB0aGlzLmRvY3VtZW50KCk7XG4gICAgICB4bWxkZWMgPSBuZXcgWE1MRGVjbGFyYXRpb24oZG9jLCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk7XG4gICAgICBpZiAoZG9jLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgWE1MRGVjbGFyYXRpb24pIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuWzBdID0geG1sZGVjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNoaWxkcmVuLnVuc2hpZnQoeG1sZGVjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb2Mucm9vdCgpIHx8IGRvYztcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZG9jdHlwZSA9IGZ1bmN0aW9uKHB1YklELCBzeXNJRCkge1xuICAgICAgdmFyIGNoaWxkLCBkb2MsIGRvY3R5cGUsIGksIGosIGssIGxlbiwgbGVuMSwgcmVmMSwgcmVmMjtcbiAgICAgIGRvYyA9IHRoaXMuZG9jdW1lbnQoKTtcbiAgICAgIGRvY3R5cGUgPSBuZXcgWE1MRG9jVHlwZShkb2MsIHB1YklELCBzeXNJRCk7XG4gICAgICByZWYxID0gZG9jLmNoaWxkcmVuO1xuICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHJlZjEubGVuZ3RoOyBqIDwgbGVuOyBpID0gKytqKSB7XG4gICAgICAgIGNoaWxkID0gcmVmMVtpXTtcbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWE1MRG9jVHlwZSkge1xuICAgICAgICAgIGRvYy5jaGlsZHJlbltpXSA9IGRvY3R5cGU7XG4gICAgICAgICAgcmV0dXJuIGRvY3R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlZjIgPSBkb2MuY2hpbGRyZW47XG4gICAgICBmb3IgKGkgPSBrID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBrIDwgbGVuMTsgaSA9ICsraykge1xuICAgICAgICBjaGlsZCA9IHJlZjJbaV07XG4gICAgICAgIGlmIChjaGlsZC5pc1Jvb3QpIHtcbiAgICAgICAgICBkb2MuY2hpbGRyZW4uc3BsaWNlKGksIDAsIGRvY3R5cGUpO1xuICAgICAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb2MuY2hpbGRyZW4ucHVzaChkb2N0eXBlKTtcbiAgICAgIHJldHVybiBkb2N0eXBlO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS51cCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuaXNSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSByb290IG5vZGUgaGFzIG5vIHBhcmVudC4gVXNlIGRvYygpIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgZG9jdW1lbnQgb2JqZWN0LlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucm9vdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGU7XG4gICAgICBub2RlID0gdGhpcztcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmlzRG9jdW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5yb290T2JqZWN0O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuaXNSb290KSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmRvY3VtZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbm9kZTtcbiAgICAgIG5vZGUgPSB0aGlzO1xuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNEb2N1bWVudCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudCgpLmVuZChvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGk7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIGlmIChpIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbHJlYWR5IGF0IHRoZSBmaXJzdCBub2RlXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2kgLSAxXTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGk7XG4gICAgICBpID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgIGlmIChpID09PSAtMSB8fCBpID09PSB0aGlzLnBhcmVudC5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFscmVhZHkgYXQgdGhlIGxhc3Qgbm9kZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltpICsgMV07XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmltcG9ydERvY3VtZW50ID0gZnVuY3Rpb24oZG9jKSB7XG4gICAgICB2YXIgY2xvbmVkUm9vdDtcbiAgICAgIGNsb25lZFJvb3QgPSBkb2Mucm9vdCgpLmNsb25lKCk7XG4gICAgICBjbG9uZWRSb290LnBhcmVudCA9IHRoaXM7XG4gICAgICBjbG9uZWRSb290LmlzUm9vdCA9IGZhbHNlO1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNsb25lZFJvb3QpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmVsZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm5vZCA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnR4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZGF0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNkYXRhKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuY29tID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pbnMgPSBmdW5jdGlvbih0YXJnZXQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbih0YXJnZXQsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZG9jID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2N1bWVudCgpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kZWMgPSBmdW5jdGlvbih2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24odmVyc2lvbiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kdGQgPSBmdW5jdGlvbihwdWJJRCwgc3lzSUQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3R5cGUocHViSUQsIHN5c0lEKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuZSA9IGZ1bmN0aW9uKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQobmFtZSwgYXR0cmlidXRlcywgdGV4dCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLm4gPSBmdW5jdGlvbihuYW1lLCBhdHRyaWJ1dGVzLCB0ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlKG5hbWUsIGF0dHJpYnV0ZXMsIHRleHQpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS50ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5kID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNkYXRhKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuYyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50KHZhbHVlKTtcbiAgICB9O1xuXG4gICAgWE1MTm9kZS5wcm90b3R5cGUuciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXcodmFsdWUpO1xuICAgIH07XG5cbiAgICBYTUxOb2RlLnByb3RvdHlwZS5pID0gZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb24odGFyZ2V0LCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLnUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwKCk7XG4gICAgfTtcblxuICAgIFhNTE5vZGUucHJvdG90eXBlLmltcG9ydFhNTEJ1aWxkZXIgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydERvY3VtZW50KGRvYyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxOb2RlO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuNlxuKGZ1bmN0aW9uKCkge1xuICB2YXIgWE1MTm9kZSwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gKGZ1bmN0aW9uKHN1cGVyQ2xhc3MpIHtcbiAgICBleHRlbmQoWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBzdXBlckNsYXNzKTtcblxuICAgIGZ1bmN0aW9uIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJlbnQsIHRhcmdldCwgdmFsdWUpIHtcbiAgICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBwYXJlbnQpO1xuICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0XCIpO1xuICAgICAgfVxuICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnN0cmluZ2lmeS5pbnNUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuaW5zVmFsdWUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbjtcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxOb2RlLCBYTUxSYXcsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxOb2RlID0gcmVxdWlyZSgnLi9YTUxOb2RlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxSYXcgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxSYXcsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MUmF3KHBhcmVudCwgdGV4dCkge1xuICAgICAgWE1MUmF3Ll9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHBhcmVudCk7XG4gICAgICBpZiAodGV4dCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmF3IHRleHRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkucmF3KHRleHQpO1xuICAgIH1cblxuICAgIFhNTFJhdy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIH07XG5cbiAgICBYTUxSYXcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnJhdyh0aGlzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFJhdztcblxuICB9KShYTUxOb2RlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxDRGF0YSwgWE1MQ29tbWVudCwgWE1MRFREQXR0TGlzdCwgWE1MRFRERWxlbWVudCwgWE1MRFRERW50aXR5LCBYTUxEVEROb3RhdGlvbiwgWE1MRGVjbGFyYXRpb24sIFhNTERvY1R5cGUsIFhNTEVsZW1lbnQsIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwgWE1MUmF3LCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFRleHQsIFhNTFdyaXRlckJhc2UsXG4gICAgZXh0ZW5kID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChoYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07IH0gZnVuY3Rpb24gY3RvcigpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkOyB9IGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTsgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTsgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTsgcmV0dXJuIGNoaWxkOyB9LFxuICAgIGhhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuICBYTUxEZWNsYXJhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRGVjbGFyYXRpb24nKTtcblxuICBYTUxEb2NUeXBlID0gcmVxdWlyZSgnLi9YTUxEb2NUeXBlJyk7XG5cbiAgWE1MQ0RhdGEgPSByZXF1aXJlKCcuL1hNTENEYXRhJyk7XG5cbiAgWE1MQ29tbWVudCA9IHJlcXVpcmUoJy4vWE1MQ29tbWVudCcpO1xuXG4gIFhNTEVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTEVsZW1lbnQnKTtcblxuICBYTUxSYXcgPSByZXF1aXJlKCcuL1hNTFJhdycpO1xuXG4gIFhNTFRleHQgPSByZXF1aXJlKCcuL1hNTFRleHQnKTtcblxuICBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSByZXF1aXJlKCcuL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbicpO1xuXG4gIFhNTERUREF0dExpc3QgPSByZXF1aXJlKCcuL1hNTERUREF0dExpc3QnKTtcblxuICBYTUxEVERFbGVtZW50ID0gcmVxdWlyZSgnLi9YTUxEVERFbGVtZW50Jyk7XG5cbiAgWE1MRFRERW50aXR5ID0gcmVxdWlyZSgnLi9YTUxEVERFbnRpdHknKTtcblxuICBYTUxEVEROb3RhdGlvbiA9IHJlcXVpcmUoJy4vWE1MRFRETm90YXRpb24nKTtcblxuICBYTUxXcml0ZXJCYXNlID0gcmVxdWlyZSgnLi9YTUxXcml0ZXJCYXNlJyk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxTdHJlYW1Xcml0ZXIgPSAoZnVuY3Rpb24oc3VwZXJDbGFzcykge1xuICAgIGV4dGVuZChYTUxTdHJlYW1Xcml0ZXIsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucykge1xuICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICBYTUxTdHJlYW1Xcml0ZXIuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kb2N1bWVudCA9IGZ1bmN0aW9uKGRvYykge1xuICAgICAgdmFyIGNoaWxkLCBpLCBqLCBsZW4sIGxlbjEsIHJlZiwgcmVmMSwgcmVzdWx0cztcbiAgICAgIHJlZiA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjaGlsZCA9IHJlZltpXTtcbiAgICAgICAgY2hpbGQuaXNMYXN0Um9vdE5vZGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRvYy5jaGlsZHJlbltkb2MuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uaXNMYXN0Um9vdE5vZGUgPSB0cnVlO1xuICAgICAgcmVmMSA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIGZvciAoaiA9IDAsIGxlbjEgPSByZWYxLmxlbmd0aDsgaiA8IGxlbjE7IGorKykge1xuICAgICAgICBjaGlsZCA9IHJlZjFbal07XG4gICAgICAgIHN3aXRjaCAoZmFsc2UpIHtcbiAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEZWNsYXJhdGlvbik6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5kZWNsYXJhdGlvbihjaGlsZCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRG9jVHlwZSk6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5kb2NUeXBlKGNoaWxkKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDb21tZW50KTpcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLmNvbW1lbnQoY2hpbGQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbik6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5lbGVtZW50KGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCcgJyArIGF0dC5uYW1lICsgJz1cIicgKyBhdHQudmFsdWUgKyAnXCInKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyAnPCFbQ0RBVEFbJyArIG5vZGUudGV4dCArICddXT4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IS0tICcgKyBub2RlLnRleHQgKyAnIC0tPicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmRlY2xhcmF0aW9uID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UobGV2ZWwpKTtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc8P3htbCB2ZXJzaW9uPVwiJyArIG5vZGUudmVyc2lvbiArICdcIicpO1xuICAgICAgaWYgKG5vZGUuZW5jb2RpbmcgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIGVuY29kaW5nPVwiJyArIG5vZGUuZW5jb2RpbmcgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIHN0YW5kYWxvbmU9XCInICsgbm9kZS5zdGFuZGFsb25lICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPz4nKTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmRvY1R5cGUgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGNoaWxkLCBpLCBsZW4sIHJlZjtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkpO1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJzwhRE9DVFlQRSAnICsgbm9kZS5yb290KCkubmFtZSk7XG4gICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIicpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnN5c0lEKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBbJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgICAgIHJlZiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIHN3aXRjaCAoZmFsc2UpIHtcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTERUREF0dExpc3QpOlxuICAgICAgICAgICAgICB0aGlzLmR0ZEF0dExpc3QoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRFRERWxlbWVudCk6XG4gICAgICAgICAgICAgIHRoaXMuZHRkRWxlbWVudChjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbnRpdHkpOlxuICAgICAgICAgICAgICB0aGlzLmR0ZEVudGl0eShjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVEROb3RhdGlvbik6XG4gICAgICAgICAgICAgIHRoaXMuZHRkTm90YXRpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MQ0RhdGEpOlxuICAgICAgICAgICAgICB0aGlzLmNkYXRhKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKTpcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBEVEQgbm9kZSB0eXBlOiBcIiArIGNoaWxkLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnXScpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJz4nKTtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGF0dCwgY2hpbGQsIGksIGxlbiwgbmFtZSwgcmVmLCByZWYxLCBzcGFjZTtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgc3BhY2UgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHNwYWNlICsgJzwnICsgbm9kZS5uYW1lKTtcbiAgICAgIHJlZiA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgIGZvciAobmFtZSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBuYW1lKSkgY29udGludWU7XG4gICAgICAgIGF0dCA9IHJlZltuYW1lXTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGUoYXR0KTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWUgPT09ICcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCc+PC8nICsgbm9kZS5uYW1lICsgJz4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnLz4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXR0eSAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiAobm9kZS5jaGlsZHJlblswXS52YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicpO1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShub2RlLmNoaWxkcmVuWzBdLnZhbHVlKTtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJzwvJyArIG5vZGUubmFtZSArICc+Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnPicgKyB0aGlzLm5ld2xpbmUpO1xuICAgICAgICByZWYxID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmVmMS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmMVtpXTtcbiAgICAgICAgICBzd2l0Y2ggKGZhbHNlKSB7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MQ29tbWVudCk6XG4gICAgICAgICAgICAgIHRoaXMuY29tbWVudChjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxFbGVtZW50KTpcbiAgICAgICAgICAgICAgdGhpcy5lbGVtZW50KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFJhdyk6XG4gICAgICAgICAgICAgIHRoaXMucmF3KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFRleHQpOlxuICAgICAgICAgICAgICB0aGlzLnRleHQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uKTpcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBYTUwgbm9kZSB0eXBlOiBcIiArIGNoaWxkLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShzcGFjZSArICc8LycgKyBub2RlLm5hbWUgKyAnPicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUucHJvY2Vzc2luZ0luc3RydWN0aW9uID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMuc3BhY2UobGV2ZWwpICsgJzw/JyArIG5vZGUudGFyZ2V0KTtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgJyArIG5vZGUudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCc/PicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyBub2RlLnZhbHVlICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArIG5vZGUudmFsdWUgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmR0ZEF0dExpc3QgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5zcGFjZShsZXZlbCkgKyAnPCFBVFRMSVNUICcgKyBub2RlLmVsZW1lbnROYW1lICsgJyAnICsgbm9kZS5hdHRyaWJ1dGVOYW1lICsgJyAnICsgbm9kZS5hdHRyaWJ1dGVUeXBlKTtcbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZVR5cGUgIT09ICcjREVGQVVMVCcpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyAnICsgbm9kZS5kZWZhdWx0VmFsdWVUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFwiJyArIG5vZGUuZGVmYXVsdFZhbHVlICsgJ1wiJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kdGRFbGVtZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IUVMRU1FTlQgJyArIG5vZGUubmFtZSArICcgJyArIG5vZGUudmFsdWUgKyAnPicgKyB0aGlzLmVuZGxpbmUobm9kZSkpO1xuICAgIH07XG5cbiAgICBYTUxTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmR0ZEVudGl0eSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IUVOVElUWScpO1xuICAgICAgaWYgKG5vZGUucGUpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyAlJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSgnICcgKyBub2RlLm5hbWUpO1xuICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBcIicgKyBub2RlLnZhbHVlICsgJ1wiJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBQVUJMSUMgXCInICsgbm9kZS5wdWJJRCArICdcIiBcIicgKyBub2RlLnN5c0lEICsgJ1wiJyk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5uRGF0YSkge1xuICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCcgTkRBVEEgJyArIG5vZGUubkRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW0ud3JpdGUoJz4nICsgdGhpcy5lbmRsaW5lKG5vZGUpKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyZWFtV3JpdGVyLnByb3RvdHlwZS5kdGROb3RhdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB0aGlzLnN0cmVhbS53cml0ZSh0aGlzLnNwYWNlKGxldmVsKSArICc8IU5PVEFUSU9OICcgKyBub2RlLm5hbWUpO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5wdWJJRCkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiJyk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuc3lzSUQpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLndyaXRlKCc+JyArIHRoaXMuZW5kbGluZShub2RlKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmVhbVdyaXRlci5wcm90b3R5cGUuZW5kbGluZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5pc0xhc3RSb290Tm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdsaW5lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gWE1MU3RyZWFtV3JpdGVyO1xuXG4gIH0pKFhNTFdyaXRlckJhc2UpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTENEYXRhLCBYTUxDb21tZW50LCBYTUxEVERBdHRMaXN0LCBYTUxEVERFbGVtZW50LCBYTUxEVERFbnRpdHksIFhNTERURE5vdGF0aW9uLCBYTUxEZWNsYXJhdGlvbiwgWE1MRG9jVHlwZSwgWE1MRWxlbWVudCwgWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uLCBYTUxSYXcsIFhNTFN0cmluZ1dyaXRlciwgWE1MVGV4dCwgWE1MV3JpdGVyQmFzZSxcbiAgICBleHRlbmQgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKGhhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH0sXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIFhNTERlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9YTUxEZWNsYXJhdGlvbicpO1xuXG4gIFhNTERvY1R5cGUgPSByZXF1aXJlKCcuL1hNTERvY1R5cGUnKTtcblxuICBYTUxDRGF0YSA9IHJlcXVpcmUoJy4vWE1MQ0RhdGEnKTtcblxuICBYTUxDb21tZW50ID0gcmVxdWlyZSgnLi9YTUxDb21tZW50Jyk7XG5cbiAgWE1MRWxlbWVudCA9IHJlcXVpcmUoJy4vWE1MRWxlbWVudCcpO1xuXG4gIFhNTFJhdyA9IHJlcXVpcmUoJy4vWE1MUmF3Jyk7XG5cbiAgWE1MVGV4dCA9IHJlcXVpcmUoJy4vWE1MVGV4dCcpO1xuXG4gIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IHJlcXVpcmUoJy4vWE1MUHJvY2Vzc2luZ0luc3RydWN0aW9uJyk7XG5cbiAgWE1MRFREQXR0TGlzdCA9IHJlcXVpcmUoJy4vWE1MRFREQXR0TGlzdCcpO1xuXG4gIFhNTERUREVsZW1lbnQgPSByZXF1aXJlKCcuL1hNTERUREVsZW1lbnQnKTtcblxuICBYTUxEVERFbnRpdHkgPSByZXF1aXJlKCcuL1hNTERUREVudGl0eScpO1xuXG4gIFhNTERURE5vdGF0aW9uID0gcmVxdWlyZSgnLi9YTUxEVEROb3RhdGlvbicpO1xuXG4gIFhNTFdyaXRlckJhc2UgPSByZXF1aXJlKCcuL1hNTFdyaXRlckJhc2UnKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IFhNTFN0cmluZ1dyaXRlciA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFN0cmluZ1dyaXRlciwgc3VwZXJDbGFzcyk7XG5cbiAgICBmdW5jdGlvbiBYTUxTdHJpbmdXcml0ZXIob3B0aW9ucykge1xuICAgICAgWE1MU3RyaW5nV3JpdGVyLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZG9jdW1lbnQgPSBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICB0aGlzLnRleHRpc3ByZXNlbnQgPSBmYWxzZTtcbiAgICAgIHIgPSAnJztcbiAgICAgIHJlZiA9IGRvYy5jaGlsZHJlbjtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjaGlsZCA9IHJlZltpXTtcbiAgICAgICAgciArPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRGVjbGFyYXRpb24pOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNsYXJhdGlvbihjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEb2NUeXBlKTpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jVHlwZShjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDb21tZW50KTpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudChjaGlsZCk7XG4gICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY2hpbGQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudChjaGlsZCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucHJldHR5ICYmIHIuc2xpY2UoLXRoaXMubmV3bGluZS5sZW5ndGgpID09PSB0aGlzLm5ld2xpbmUpIHtcbiAgICAgICAgciA9IHIuc2xpY2UoMCwgLXRoaXMubmV3bGluZS5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuYXR0cmlidXRlID0gZnVuY3Rpb24oYXR0KSB7XG4gICAgICByZXR1cm4gJyAnICsgYXR0Lm5hbWUgKyAnPVwiJyArIGF0dC52YWx1ZSArICdcIic7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuY2RhdGEgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgJzwhW0NEQVRBWycgKyBub2RlLnRleHQgKyAnXV0+JyArIHRoaXMubmV3bGluZTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNlKGxldmVsKSArICc8IS0tICcgKyBub2RlLnRleHQgKyAnIC0tPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICByID0gdGhpcy5zcGFjZShsZXZlbCk7XG4gICAgICByICs9ICc8P3htbCB2ZXJzaW9uPVwiJyArIG5vZGUudmVyc2lvbiArICdcIic7XG4gICAgICBpZiAobm9kZS5lbmNvZGluZyAhPSBudWxsKSB7XG4gICAgICAgIHIgKz0gJyBlbmNvZGluZz1cIicgKyBub2RlLmVuY29kaW5nICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnN0YW5kYWxvbmUgIT0gbnVsbCkge1xuICAgICAgICByICs9ICcgc3RhbmRhbG9uZT1cIicgKyBub2RlLnN0YW5kYWxvbmUgKyAnXCInO1xuICAgICAgfVxuICAgICAgciArPSAnPz4nO1xuICAgICAgciArPSB0aGlzLm5ld2xpbmU7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5kb2NUeXBlID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHZhciBjaGlsZCwgaSwgbGVuLCByLCByZWY7XG4gICAgICBsZXZlbCB8fCAobGV2ZWwgPSAwKTtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHIgKz0gJzwhRE9DVFlQRSAnICsgbm9kZS5yb290KCkubmFtZTtcbiAgICAgIGlmIChub2RlLnB1YklEICYmIG5vZGUuc3lzSUQpIHtcbiAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnN5c0lEKSB7XG4gICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHIgKz0gJyBbJztcbiAgICAgICAgciArPSB0aGlzLm5ld2xpbmU7XG4gICAgICAgIHJlZiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGNoaWxkID0gcmVmW2ldO1xuICAgICAgICAgIHIgKz0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERBdHRMaXN0KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kdGRBdHRMaXN0KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbGVtZW50KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kdGRFbGVtZW50KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxEVERFbnRpdHkpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmR0ZEVudGl0eShjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgY2FzZSAhKGNoaWxkIGluc3RhbmNlb2YgWE1MRFRETm90YXRpb24pOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmR0ZE5vdGF0aW9uKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbik6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2luZ0luc3RydWN0aW9uKGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gRFREIG5vZGUgdHlwZTogXCIgKyBjaGlsZC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gJ10nO1xuICAgICAgfVxuICAgICAgciArPSAnPic7XG4gICAgICByICs9IHRoaXMubmV3bGluZTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLmVsZW1lbnQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIGF0dCwgY2hpbGQsIGksIGosIGxlbiwgbGVuMSwgbmFtZSwgciwgcmVmLCByZWYxLCByZWYyLCBzcGFjZSwgdGV4dGlzcHJlc2VudHdhc3NldDtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgdGV4dGlzcHJlc2VudHdhc3NldCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMudGV4dGlzcHJlc2VudCkge1xuICAgICAgICB0aGlzLm5ld2xpbmUgPSAnJztcbiAgICAgICAgdGhpcy5wcmV0dHkgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmV3bGluZSA9IHRoaXMubmV3bGluZWRlZmF1bHQ7XG4gICAgICAgIHRoaXMucHJldHR5ID0gdGhpcy5wcmV0dHlkZWZhdWx0O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSB0aGlzLnNwYWNlKGxldmVsKTtcbiAgICAgIHIgPSAnJztcbiAgICAgIHIgKz0gc3BhY2UgKyAnPCcgKyBub2RlLm5hbWU7XG4gICAgICByZWYgPSBub2RlLmF0dHJpYnV0ZXM7XG4gICAgICBmb3IgKG5hbWUgaW4gcmVmKSB7XG4gICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICBhdHQgPSByZWZbbmFtZV07XG4gICAgICAgIHIgKz0gdGhpcy5hdHRyaWJ1dGUoYXR0KTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBub2RlLmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgcmV0dXJuIGUudmFsdWUgPT09ICcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dFbXB0eSkge1xuICAgICAgICAgIHIgKz0gJz48LycgKyBub2RlLm5hbWUgKyAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgciArPSAnLz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucHJldHR5ICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIChub2RlLmNoaWxkcmVuWzBdLnZhbHVlICE9IG51bGwpKSB7XG4gICAgICAgIHIgKz0gJz4nO1xuICAgICAgICByICs9IG5vZGUuY2hpbGRyZW5bMF0udmFsdWU7XG4gICAgICAgIHIgKz0gJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMpIHtcbiAgICAgICAgICByZWYxID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHJlZjFbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLnRleHRpc3ByZXNlbnQrKztcbiAgICAgICAgICAgICAgdGV4dGlzcHJlc2VudHdhc3NldCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0aXNwcmVzZW50KSB7XG4gICAgICAgICAgdGhpcy5uZXdsaW5lID0gJyc7XG4gICAgICAgICAgdGhpcy5wcmV0dHkgPSBmYWxzZTtcbiAgICAgICAgICBzcGFjZSA9IHRoaXMuc3BhY2UobGV2ZWwpO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICByZWYyID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBqIDwgbGVuMTsgaisrKSB7XG4gICAgICAgICAgY2hpbGQgPSByZWYyW2pdO1xuICAgICAgICAgIHIgKz0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxDRGF0YSk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2RhdGEoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTENvbW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQoY2hpbGQsIGxldmVsICsgMSk7XG4gICAgICAgICAgICAgIGNhc2UgIShjaGlsZCBpbnN0YW5jZW9mIFhNTFJhdyk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxUZXh0KTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0KGNoaWxkLCBsZXZlbCArIDEpO1xuICAgICAgICAgICAgICBjYXNlICEoY2hpbGQgaW5zdGFuY2VvZiBYTUxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihjaGlsZCwgbGV2ZWwgKyAxKTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFhNTCBub2RlIHR5cGU6IFwiICsgY2hpbGQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dGlzcHJlc2VudHdhc3NldCkge1xuICAgICAgICAgIHRoaXMudGV4dGlzcHJlc2VudC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50ZXh0aXNwcmVzZW50KSB7XG4gICAgICAgICAgdGhpcy5uZXdsaW5lID0gdGhpcy5uZXdsaW5lZGVmYXVsdDtcbiAgICAgICAgICB0aGlzLnByZXR0eSA9IHRoaXMucHJldHR5ZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICByICs9IHNwYWNlICsgJzwvJyArIG5vZGUubmFtZSArICc+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnByb2Nlc3NpbmdJbnN0cnVjdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8PycgKyBub2RlLnRhcmdldDtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHIgKz0gJyAnICsgbm9kZS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHIgKz0gJz8+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIHJldHVybiByO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjZShsZXZlbCkgKyBub2RlLnZhbHVlICsgdGhpcy5uZXdsaW5lO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgbm9kZS52YWx1ZSArIHRoaXMubmV3bGluZTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5kdGRBdHRMaXN0ID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIHZhciByO1xuICAgICAgciA9IHRoaXMuc3BhY2UobGV2ZWwpICsgJzwhQVRUTElTVCAnICsgbm9kZS5lbGVtZW50TmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlTmFtZSArICcgJyArIG5vZGUuYXR0cmlidXRlVHlwZTtcbiAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZVR5cGUgIT09ICcjREVGQVVMVCcpIHtcbiAgICAgICAgciArPSAnICcgKyBub2RlLmRlZmF1bHRWYWx1ZVR5cGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgciArPSAnIFwiJyArIG5vZGUuZGVmYXVsdFZhbHVlICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZHRkRWxlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCFFTEVNRU5UICcgKyBub2RlLm5hbWUgKyAnICcgKyBub2RlLnZhbHVlICsgJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdXcml0ZXIucHJvdG90eXBlLmR0ZEVudGl0eSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8IUVOVElUWSc7XG4gICAgICBpZiAobm9kZS5wZSkge1xuICAgICAgICByICs9ICcgJSc7XG4gICAgICB9XG4gICAgICByICs9ICcgJyArIG5vZGUubmFtZTtcbiAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHIgKz0gJyBcIicgKyBub2RlLnZhbHVlICsgJ1wiJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub2RlLnB1YklEICYmIG5vZGUuc3lzSUQpIHtcbiAgICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICAgIHIgKz0gJyBTWVNURU0gXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubkRhdGEpIHtcbiAgICAgICAgICByICs9ICcgTkRBVEEgJyArIG5vZGUubkRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHIgKz0gJz4nICsgdGhpcy5uZXdsaW5lO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuZHRkTm90YXRpb24gPSBmdW5jdGlvbihub2RlLCBsZXZlbCkge1xuICAgICAgdmFyIHI7XG4gICAgICByID0gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCFOT1RBVElPTiAnICsgbm9kZS5uYW1lO1xuICAgICAgaWYgKG5vZGUucHViSUQgJiYgbm9kZS5zeXNJRCkge1xuICAgICAgICByICs9ICcgUFVCTElDIFwiJyArIG5vZGUucHViSUQgKyAnXCIgXCInICsgbm9kZS5zeXNJRCArICdcIic7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUucHViSUQpIHtcbiAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiJztcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5zeXNJRCkge1xuICAgICAgICByICs9ICcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgfVxuICAgICAgciArPSAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5nV3JpdGVyLnByb3RvdHlwZS5vcGVuTm9kZSA9IGZ1bmN0aW9uKG5vZGUsIGxldmVsKSB7XG4gICAgICB2YXIgYXR0LCBuYW1lLCByLCByZWY7XG4gICAgICBsZXZlbCB8fCAobGV2ZWwgPSAwKTtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWE1MRWxlbWVudCkge1xuICAgICAgICByID0gdGhpcy5zcGFjZShsZXZlbCkgKyAnPCcgKyBub2RlLm5hbWU7XG4gICAgICAgIHJlZiA9IG5vZGUuYXR0cmlidXRlcztcbiAgICAgICAgZm9yIChuYW1lIGluIHJlZikge1xuICAgICAgICAgIGlmICghaGFzUHJvcC5jYWxsKHJlZiwgbmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICAgIGF0dCA9IHJlZltuYW1lXTtcbiAgICAgICAgICByICs9IHRoaXMuYXR0cmlidXRlKGF0dCk7XG4gICAgICAgIH1cbiAgICAgICAgciArPSAobm9kZS5jaGlsZHJlbiA/ICc+JyA6ICcvPicpICsgdGhpcy5uZXdsaW5lO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgPSB0aGlzLnNwYWNlKGxldmVsKSArICc8IURPQ1RZUEUgJyArIG5vZGUucm9vdE5vZGVOYW1lO1xuICAgICAgICBpZiAobm9kZS5wdWJJRCAmJiBub2RlLnN5c0lEKSB7XG4gICAgICAgICAgciArPSAnIFBVQkxJQyBcIicgKyBub2RlLnB1YklEICsgJ1wiIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3lzSUQpIHtcbiAgICAgICAgICByICs9ICcgU1lTVEVNIFwiJyArIG5vZGUuc3lzSUQgKyAnXCInO1xuICAgICAgICB9XG4gICAgICAgIHIgKz0gKG5vZGUuY2hpbGRyZW4gPyAnIFsnIDogJz4nKSArIHRoaXMubmV3bGluZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ1dyaXRlci5wcm90b3R5cGUuY2xvc2VOb2RlID0gZnVuY3Rpb24obm9kZSwgbGV2ZWwpIHtcbiAgICAgIGxldmVsIHx8IChsZXZlbCA9IDApO1xuICAgICAgc3dpdGNoIChmYWxzZSkge1xuICAgICAgICBjYXNlICEobm9kZSBpbnN0YW5jZW9mIFhNTEVsZW1lbnQpOlxuICAgICAgICAgIHJldHVybiB0aGlzLnNwYWNlKGxldmVsKSArICc8LycgKyBub2RlLm5hbWUgKyAnPicgKyB0aGlzLm5ld2xpbmU7XG4gICAgICAgIGNhc2UgIShub2RlIGluc3RhbmNlb2YgWE1MRG9jVHlwZSk6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3BhY2UobGV2ZWwpICsgJ10+JyArIHRoaXMubmV3bGluZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIFhNTFN0cmluZ1dyaXRlcjtcblxuICB9KShYTUxXcml0ZXJCYXNlKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxTdHJpbmdpZmllcixcbiAgICBiaW5kID0gZnVuY3Rpb24oZm4sIG1lKXsgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiBmbi5hcHBseShtZSwgYXJndW1lbnRzKTsgfTsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBYTUxTdHJpbmdpZmllciA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxTdHJpbmdpZmllcihvcHRpb25zKSB7XG4gICAgICB0aGlzLmFzc2VydExlZ2FsQ2hhciA9IGJpbmQodGhpcy5hc3NlcnRMZWdhbENoYXIsIHRoaXMpO1xuICAgICAgdmFyIGtleSwgcmVmLCB2YWx1ZTtcbiAgICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gICAgICB0aGlzLm5vRG91YmxlRW5jb2RpbmcgPSBvcHRpb25zLm5vRG91YmxlRW5jb2Rpbmc7XG4gICAgICByZWYgPSBvcHRpb25zLnN0cmluZ2lmeSB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZikge1xuICAgICAgICBpZiAoIWhhc1Byb3AuY2FsbChyZWYsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICB2YWx1ZSA9IHJlZltrZXldO1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZWxlTmFtZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICByZXR1cm4gdGhpcy5hc3NlcnRMZWdhbENoYXIodmFsKTtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmVsZVRleHQgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHZhbCA9ICcnICsgdmFsIHx8ICcnO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHRoaXMuZWxFc2NhcGUodmFsKSk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jZGF0YSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSgnXV0+JywgJ11dXV0+PCFbQ0RBVEFbPicpO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHZhbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIGlmICh2YWwubWF0Y2goLy0tLykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbWVudCB0ZXh0IGNhbm5vdCBjb250YWluIGRvdWJsZS1oeXBlbjogXCIgKyB2YWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0TGVnYWxDaGFyKHZhbCk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHJldHVybiAnJyArIHZhbCB8fCAnJztcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmF0dE5hbWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmF0dFZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICB2YWwgPSAnJyArIHZhbCB8fCAnJztcbiAgICAgIHJldHVybiB0aGlzLmF0dEVzY2FwZSh2YWwpO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuaW5zVGFyZ2V0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5pbnNWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAodmFsLm1hdGNoKC9cXD8+LykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHZhbHVlOiBcIiArIHZhbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUueG1sVmVyc2lvbiA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAoIXZhbC5tYXRjaCgvMVxcLlswLTldKy8pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmVyc2lvbiBudW1iZXI6IFwiICsgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS54bWxFbmNvZGluZyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgdmFsID0gJycgKyB2YWwgfHwgJyc7XG4gICAgICBpZiAoIXZhbC5tYXRjaCgvXltBLVphLXpdKD86W0EtWmEtejAtOS5fLV18LSkqJC8pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZW5jb2Rpbmc6IFwiICsgdmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS54bWxTdGFuZGFsb25lID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHJldHVybiBcInllc1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwibm9cIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZFB1YklEID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRTeXNJRCA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuZHRkRWxlbWVudFZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRBdHRUeXBlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRBdHREZWZhdWx0ID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmR0ZEVudGl0eVZhbHVlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gJycgKyB2YWwgfHwgJyc7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5kdGRORGF0YSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgcmV0dXJuICcnICsgdmFsIHx8ICcnO1xuICAgIH07XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydEF0dEtleSA9ICdAJztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UElLZXkgPSAnPyc7XG5cbiAgICBYTUxTdHJpbmdpZmllci5wcm90b3R5cGUuY29udmVydFRleHRLZXkgPSAnI3RleHQnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDRGF0YUtleSA9ICcjY2RhdGEnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmNvbnZlcnRDb21tZW50S2V5ID0gJyNjb21tZW50JztcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5jb252ZXJ0UmF3S2V5ID0gJyNyYXcnO1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmFzc2VydExlZ2FsQ2hhciA9IGZ1bmN0aW9uKHN0cikge1xuICAgICAgdmFyIHJlcztcbiAgICAgIHJlcyA9IHN0ci5tYXRjaCgvW1xcMFxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS8pO1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlciBpbiBzdHJpbmc6IFwiICsgc3RyICsgXCIgYXQgaW5kZXggXCIgKyByZXMuaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9O1xuXG4gICAgWE1MU3RyaW5naWZpZXIucHJvdG90eXBlLmVsRXNjYXBlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgICB2YXIgYW1wcmVnZXg7XG4gICAgICBhbXByZWdleCA9IHRoaXMubm9Eb3VibGVFbmNvZGluZyA/IC8oPyEmXFxTKzspJi9nIDogLyYvZztcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShhbXByZWdleCwgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cXHIvZywgJyYjeEQ7Jyk7XG4gICAgfTtcblxuICAgIFhNTFN0cmluZ2lmaWVyLnByb3RvdHlwZS5hdHRFc2NhcGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICAgIHZhciBhbXByZWdleDtcbiAgICAgIGFtcHJlZ2V4ID0gdGhpcy5ub0RvdWJsZUVuY29kaW5nID8gLyg/ISZcXFMrOykmL2cgOiAvJi9nO1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFtcHJlZ2V4LCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoL1xcdC9nLCAnJiN4OTsnKS5yZXBsYWNlKC9cXG4vZywgJyYjeEE7JykucmVwbGFjZSgvXFxyL2csICcmI3hEOycpO1xuICAgIH07XG5cbiAgICByZXR1cm4gWE1MU3RyaW5naWZpZXI7XG5cbiAgfSkoKTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi42XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBYTUxOb2RlLCBYTUxUZXh0LFxuICAgIGV4dGVuZCA9IGZ1bmN0aW9uKGNoaWxkLCBwYXJlbnQpIHsgZm9yICh2YXIga2V5IGluIHBhcmVudCkgeyBpZiAoaGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfSxcbiAgICBoYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHk7XG5cbiAgWE1MTm9kZSA9IHJlcXVpcmUoJy4vWE1MTm9kZScpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MVGV4dCA9IChmdW5jdGlvbihzdXBlckNsYXNzKSB7XG4gICAgZXh0ZW5kKFhNTFRleHQsIHN1cGVyQ2xhc3MpO1xuXG4gICAgZnVuY3Rpb24gWE1MVGV4dChwYXJlbnQsIHRleHQpIHtcbiAgICAgIFhNTFRleHQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgcGFyZW50KTtcbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBlbGVtZW50IHRleHRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdHJpbmdpZnkuZWxlVGV4dCh0ZXh0KTtcbiAgICB9XG5cbiAgICBYTUxUZXh0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgfTtcblxuICAgIFhNTFRleHQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy53cml0ZXIuc2V0KG9wdGlvbnMpLnRleHQodGhpcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBYTUxUZXh0O1xuXG4gIH0pKFhNTE5vZGUpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTFdyaXRlckJhc2UsXG4gICAgaGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gWE1MV3JpdGVyQmFzZSA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBYTUxXcml0ZXJCYXNlKG9wdGlvbnMpIHtcbiAgICAgIHZhciBrZXksIHJlZiwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgdmFsdWU7XG4gICAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgICAgdGhpcy5wcmV0dHkgPSBvcHRpb25zLnByZXR0eSB8fCBmYWxzZTtcbiAgICAgIHRoaXMuYWxsb3dFbXB0eSA9IChyZWYgPSBvcHRpb25zLmFsbG93RW1wdHkpICE9IG51bGwgPyByZWYgOiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICB0aGlzLmluZGVudCA9IChyZWYxID0gb3B0aW9ucy5pbmRlbnQpICE9IG51bGwgPyByZWYxIDogJyAgJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gKHJlZjIgPSBvcHRpb25zLm5ld2xpbmUpICE9IG51bGwgPyByZWYyIDogJ1xcbic7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gKHJlZjMgPSBvcHRpb25zLm9mZnNldCkgIT0gbnVsbCA/IHJlZjMgOiAwO1xuICAgICAgICB0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMgPSAocmVmNCA9IG9wdGlvbnMuZG9udHByZXR0eXRleHRub2RlcykgIT0gbnVsbCA/IHJlZjQgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmRlbnQgPSAnJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gJyc7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5kb250cHJldHR5dGV4dG5vZGVzID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMubmV3bGluZWRlZmF1bHQgPSB0aGlzLm5ld2xpbmU7XG4gICAgICB0aGlzLnByZXR0eWRlZmF1bHQgPSB0aGlzLnByZXR0eTtcbiAgICAgIHJlZjUgPSBvcHRpb25zLndyaXRlciB8fCB7fTtcbiAgICAgIGZvciAoa2V5IGluIHJlZjUpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmNSwga2V5KSkgY29udGludWU7XG4gICAgICAgIHZhbHVlID0gcmVmNVtrZXldO1xuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBYTUxXcml0ZXJCYXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICB2YXIga2V5LCByZWYsIHZhbHVlO1xuICAgICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICAgIGlmIChcInByZXR0eVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcmV0dHkgPSBvcHRpb25zLnByZXR0eTtcbiAgICAgIH1cbiAgICAgIGlmIChcImFsbG93RW1wdHlcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuYWxsb3dFbXB0eSA9IG9wdGlvbnMuYWxsb3dFbXB0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICB0aGlzLmluZGVudCA9IFwiaW5kZW50XCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuaW5kZW50IDogJyAgJztcbiAgICAgICAgdGhpcy5uZXdsaW5lID0gXCJuZXdsaW5lXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMubmV3bGluZSA6ICdcXG4nO1xuICAgICAgICB0aGlzLm9mZnNldCA9IFwib2Zmc2V0XCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMub2Zmc2V0IDogMDtcbiAgICAgICAgdGhpcy5kb250cHJldHR5dGV4dG5vZGVzID0gXCJkb250cHJldHR5dGV4dG5vZGVzXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZG9udHByZXR0eXRleHRub2RlcyA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGVudCA9ICcnO1xuICAgICAgICB0aGlzLm5ld2xpbmUgPSAnJztcbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmRvbnRwcmV0dHl0ZXh0bm9kZXMgPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5uZXdsaW5lZGVmYXVsdCA9IHRoaXMubmV3bGluZTtcbiAgICAgIHRoaXMucHJldHR5ZGVmYXVsdCA9IHRoaXMucHJldHR5O1xuICAgICAgcmVmID0gb3B0aW9ucy53cml0ZXIgfHwge307XG4gICAgICBmb3IgKGtleSBpbiByZWYpIHtcbiAgICAgICAgaWYgKCFoYXNQcm9wLmNhbGwocmVmLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgdmFsdWUgPSByZWZba2V5XTtcbiAgICAgICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgWE1MV3JpdGVyQmFzZS5wcm90b3R5cGUuc3BhY2UgPSBmdW5jdGlvbihsZXZlbCkge1xuICAgICAgdmFyIGluZGVudDtcbiAgICAgIGlmICh0aGlzLnByZXR0eSkge1xuICAgICAgICBpbmRlbnQgPSAobGV2ZWwgfHwgMCkgKyB0aGlzLm9mZnNldCArIDE7XG4gICAgICAgIGlmIChpbmRlbnQgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBcnJheShpbmRlbnQpLmpvaW4odGhpcy5pbmRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gWE1MV3JpdGVyQmFzZTtcblxuICB9KSgpO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEyLjZcbihmdW5jdGlvbigpIHtcbiAgdmFyIFhNTERvY3VtZW50LCBYTUxEb2N1bWVudENCLCBYTUxTdHJlYW1Xcml0ZXIsIFhNTFN0cmluZ1dyaXRlciwgYXNzaWduLCBpc0Z1bmN0aW9uLCByZWY7XG5cbiAgcmVmID0gcmVxdWlyZSgnLi9VdGlsaXR5JyksIGFzc2lnbiA9IHJlZi5hc3NpZ24sIGlzRnVuY3Rpb24gPSByZWYuaXNGdW5jdGlvbjtcblxuICBYTUxEb2N1bWVudCA9IHJlcXVpcmUoJy4vWE1MRG9jdW1lbnQnKTtcblxuICBYTUxEb2N1bWVudENCID0gcmVxdWlyZSgnLi9YTUxEb2N1bWVudENCJyk7XG5cbiAgWE1MU3RyaW5nV3JpdGVyID0gcmVxdWlyZSgnLi9YTUxTdHJpbmdXcml0ZXInKTtcblxuICBYTUxTdHJlYW1Xcml0ZXIgPSByZXF1aXJlKCcuL1hNTFN0cmVhbVdyaXRlcicpO1xuXG4gIG1vZHVsZS5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKG5hbWUsIHhtbGRlYywgZG9jdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBkb2MsIHJvb3Q7XG4gICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUm9vdCBlbGVtZW50IG5lZWRzIGEgbmFtZVwiKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IGFzc2lnbih7fSwgeG1sZGVjLCBkb2N0eXBlLCBvcHRpb25zKTtcbiAgICBkb2MgPSBuZXcgWE1MRG9jdW1lbnQob3B0aW9ucyk7XG4gICAgcm9vdCA9IGRvYy5lbGVtZW50KG5hbWUpO1xuICAgIGlmICghb3B0aW9ucy5oZWFkbGVzcykge1xuICAgICAgZG9jLmRlY2xhcmF0aW9uKG9wdGlvbnMpO1xuICAgICAgaWYgKChvcHRpb25zLnB1YklEICE9IG51bGwpIHx8IChvcHRpb25zLnN5c0lEICE9IG51bGwpKSB7XG4gICAgICAgIGRvYy5kb2N0eXBlKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cy5iZWdpbiA9IGZ1bmN0aW9uKG9wdGlvbnMsIG9uRGF0YSwgb25FbmQpIHtcbiAgICB2YXIgcmVmMTtcbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgcmVmMSA9IFtvcHRpb25zLCBvbkRhdGFdLCBvbkRhdGEgPSByZWYxWzBdLCBvbkVuZCA9IHJlZjFbMV07XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmIChvbkRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MRG9jdW1lbnRDQihvcHRpb25zLCBvbkRhdGEsIG9uRW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBYTUxEb2N1bWVudChvcHRpb25zKTtcbiAgICB9XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMuc3RyaW5nV3JpdGVyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyaW5nV3JpdGVyKG9wdGlvbnMpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzLnN0cmVhbVdyaXRlciA9IGZ1bmN0aW9uKHN0cmVhbSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgWE1MU3RyZWFtV3JpdGVyKHN0cmVhbSwgb3B0aW9ucyk7XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJmdW5jdGlvbiBET01QYXJzZXIob3B0aW9ucyl7XHJcblx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fHtsb2NhdG9yOnt9fTtcclxuXHRcclxufVxyXG5ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZyA9IGZ1bmN0aW9uKHNvdXJjZSxtaW1lVHlwZSl7XHJcblx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcblx0dmFyIHNheCA9ICBuZXcgWE1MUmVhZGVyKCk7XHJcblx0dmFyIGRvbUJ1aWxkZXIgPSBvcHRpb25zLmRvbUJ1aWxkZXIgfHwgbmV3IERPTUhhbmRsZXIoKTsvL2NvbnRlbnRIYW5kbGVyIGFuZCBMZXhpY2FsSGFuZGxlclxyXG5cdHZhciBlcnJvckhhbmRsZXIgPSBvcHRpb25zLmVycm9ySGFuZGxlcjtcclxuXHR2YXIgbG9jYXRvciA9IG9wdGlvbnMubG9jYXRvcjtcclxuXHR2YXIgZGVmYXVsdE5TTWFwID0gb3B0aW9ucy54bWxuc3x8e307XHJcblx0dmFyIGVudGl0eU1hcCA9IHsnbHQnOic8JywnZ3QnOic+JywnYW1wJzonJicsJ3F1b3QnOidcIicsJ2Fwb3MnOlwiJ1wifVxyXG5cdGlmKGxvY2F0b3Ipe1xyXG5cdFx0ZG9tQnVpbGRlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcilcclxuXHR9XHJcblx0XHJcblx0c2F4LmVycm9ySGFuZGxlciA9IGJ1aWxkRXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcixkb21CdWlsZGVyLGxvY2F0b3IpO1xyXG5cdHNheC5kb21CdWlsZGVyID0gb3B0aW9ucy5kb21CdWlsZGVyIHx8IGRvbUJ1aWxkZXI7XHJcblx0aWYoL1xcL3g/aHRtbD8kLy50ZXN0KG1pbWVUeXBlKSl7XHJcblx0XHRlbnRpdHlNYXAubmJzcCA9ICdcXHhhMCc7XHJcblx0XHRlbnRpdHlNYXAuY29weSA9ICdcXHhhOSc7XHJcblx0XHRkZWZhdWx0TlNNYXBbJyddPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XHJcblx0fVxyXG5cdGRlZmF1bHROU01hcC54bWwgPSBkZWZhdWx0TlNNYXAueG1sIHx8ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnO1xyXG5cdGlmKHNvdXJjZSl7XHJcblx0XHRzYXgucGFyc2Uoc291cmNlLGRlZmF1bHROU01hcCxlbnRpdHlNYXApO1xyXG5cdH1lbHNle1xyXG5cdFx0c2F4LmVycm9ySGFuZGxlci5lcnJvcihcImludmFsaWQgZG9jIHNvdXJjZVwiKTtcclxuXHR9XHJcblx0cmV0dXJuIGRvbUJ1aWxkZXIuZG9jO1xyXG59XHJcbmZ1bmN0aW9uIGJ1aWxkRXJyb3JIYW5kbGVyKGVycm9ySW1wbCxkb21CdWlsZGVyLGxvY2F0b3Ipe1xyXG5cdGlmKCFlcnJvckltcGwpe1xyXG5cdFx0aWYoZG9tQnVpbGRlciBpbnN0YW5jZW9mIERPTUhhbmRsZXIpe1xyXG5cdFx0XHRyZXR1cm4gZG9tQnVpbGRlcjtcclxuXHRcdH1cclxuXHRcdGVycm9ySW1wbCA9IGRvbUJ1aWxkZXIgO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JIYW5kbGVyID0ge31cclxuXHR2YXIgaXNDYWxsYmFjayA9IGVycm9ySW1wbCBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xyXG5cdGxvY2F0b3IgPSBsb2NhdG9yfHx7fVxyXG5cdGZ1bmN0aW9uIGJ1aWxkKGtleSl7XHJcblx0XHR2YXIgZm4gPSBlcnJvckltcGxba2V5XTtcclxuXHRcdGlmKCFmbiAmJiBpc0NhbGxiYWNrKXtcclxuXHRcdFx0Zm4gPSBlcnJvckltcGwubGVuZ3RoID09IDI/ZnVuY3Rpb24obXNnKXtlcnJvckltcGwoa2V5LG1zZyl9OmVycm9ySW1wbDtcclxuXHRcdH1cclxuXHRcdGVycm9ySGFuZGxlcltrZXldID0gZm4gJiYgZnVuY3Rpb24obXNnKXtcclxuXHRcdFx0Zm4oJ1t4bWxkb20gJytrZXkrJ11cXHQnK21zZytfbG9jYXRvcihsb2NhdG9yKSk7XHJcblx0XHR9fHxmdW5jdGlvbigpe307XHJcblx0fVxyXG5cdGJ1aWxkKCd3YXJuaW5nJyk7XHJcblx0YnVpbGQoJ2Vycm9yJyk7XHJcblx0YnVpbGQoJ2ZhdGFsRXJyb3InKTtcclxuXHRyZXR1cm4gZXJyb3JIYW5kbGVyO1xyXG59XHJcblxyXG4vL2NvbnNvbGUubG9nKCcjXFxuXFxuXFxuXFxuXFxuXFxuXFxuIyMjIycpXHJcbi8qKlxyXG4gKiArQ29udGVudEhhbmRsZXIrRXJyb3JIYW5kbGVyXHJcbiAqICtMZXhpY2FsSGFuZGxlcitFbnRpdHlSZXNvbHZlcjJcclxuICogLURlY2xIYW5kbGVyLURUREhhbmRsZXIgXHJcbiAqIFxyXG4gKiBEZWZhdWx0SGFuZGxlcjpFbnRpdHlSZXNvbHZlciwgRFRESGFuZGxlciwgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlclxyXG4gKiBEZWZhdWx0SGFuZGxlcjI6RGVmYXVsdEhhbmRsZXIsTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyLCBFbnRpdHlSZXNvbHZlcjJcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvaGVscGVycy9EZWZhdWx0SGFuZGxlci5odG1sXHJcbiAqL1xyXG5mdW5jdGlvbiBET01IYW5kbGVyKCkge1xyXG4gICAgdGhpcy5jZGF0YSA9IGZhbHNlO1xyXG59XHJcbmZ1bmN0aW9uIHBvc2l0aW9uKGxvY2F0b3Isbm9kZSl7XHJcblx0bm9kZS5saW5lTnVtYmVyID0gbG9jYXRvci5saW5lTnVtYmVyO1xyXG5cdG5vZGUuY29sdW1uTnVtYmVyID0gbG9jYXRvci5jb2x1bW5OdW1iZXI7XHJcbn1cclxuLyoqXHJcbiAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudFxyXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9Db250ZW50SGFuZGxlci5odG1sXHJcbiAqLyBcclxuRE9NSGFuZGxlci5wcm90b3R5cGUgPSB7XHJcblx0c3RhcnREb2N1bWVudCA6IGZ1bmN0aW9uKCkge1xyXG4gICAgXHR0aGlzLmRvYyA9IG5ldyBET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgXHRpZiAodGhpcy5sb2NhdG9yKSB7XHJcbiAgICAgICAgXHR0aGlzLmRvYy5kb2N1bWVudFVSSSA9IHRoaXMubG9jYXRvci5zeXN0ZW1JZDtcclxuICAgIFx0fVxyXG5cdH0sXHJcblx0c3RhcnRFbGVtZW50OmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cnMpIHtcclxuXHRcdHZhciBkb2MgPSB0aGlzLmRvYztcclxuXHQgICAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHFOYW1lfHxsb2NhbE5hbWUpO1xyXG5cdCAgICB2YXIgbGVuID0gYXR0cnMubGVuZ3RoO1xyXG5cdCAgICBhcHBlbmRFbGVtZW50KHRoaXMsIGVsKTtcclxuXHQgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsO1xyXG5cdCAgICBcclxuXHRcdHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsZWwpXHJcblx0ICAgIGZvciAodmFyIGkgPSAwIDsgaSA8IGxlbjsgaSsrKSB7XHJcblx0ICAgICAgICB2YXIgbmFtZXNwYWNlVVJJID0gYXR0cnMuZ2V0VVJJKGkpO1xyXG5cdCAgICAgICAgdmFyIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7XHJcblx0ICAgICAgICB2YXIgcU5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTtcclxuXHRcdFx0dmFyIGF0dHIgPSBkb2MuY3JlYXRlQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxTmFtZSk7XHJcblx0XHRcdHRoaXMubG9jYXRvciAmJnBvc2l0aW9uKGF0dHJzLmdldExvY2F0b3IoaSksYXR0cik7XHJcblx0XHRcdGF0dHIudmFsdWUgPSBhdHRyLm5vZGVWYWx1ZSA9IHZhbHVlO1xyXG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpXHJcblx0ICAgIH1cclxuXHR9LFxyXG5cdGVuZEVsZW1lbnQ6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKSB7XHJcblx0XHR2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudEVsZW1lbnRcclxuXHRcdHZhciB0YWdOYW1lID0gY3VycmVudC50YWdOYW1lO1xyXG5cdFx0dGhpcy5jdXJyZW50RWxlbWVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcclxuXHR9LFxyXG5cdHN0YXJ0UHJlZml4TWFwcGluZzpmdW5jdGlvbihwcmVmaXgsIHVyaSkge1xyXG5cdH0sXHJcblx0ZW5kUHJlZml4TWFwcGluZzpmdW5jdGlvbihwcmVmaXgpIHtcclxuXHR9LFxyXG5cdHByb2Nlc3NpbmdJbnN0cnVjdGlvbjpmdW5jdGlvbih0YXJnZXQsIGRhdGEpIHtcclxuXHQgICAgdmFyIGlucyA9IHRoaXMuZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpO1xyXG5cdCAgICB0aGlzLmxvY2F0b3IgJiYgcG9zaXRpb24odGhpcy5sb2NhdG9yLGlucylcclxuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBpbnMpO1xyXG5cdH0sXHJcblx0aWdub3JhYmxlV2hpdGVzcGFjZTpmdW5jdGlvbihjaCwgc3RhcnQsIGxlbmd0aCkge1xyXG5cdH0sXHJcblx0Y2hhcmFjdGVyczpmdW5jdGlvbihjaGFycywgc3RhcnQsIGxlbmd0aCkge1xyXG5cdFx0Y2hhcnMgPSBfdG9TdHJpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpXHJcblx0XHQvL2NvbnNvbGUubG9nKGNoYXJzKVxyXG5cdFx0aWYoY2hhcnMpe1xyXG5cdFx0XHRpZiAodGhpcy5jZGF0YSkge1xyXG5cdFx0XHRcdHZhciBjaGFyTm9kZSA9IHRoaXMuZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihjaGFycyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dmFyIGNoYXJOb2RlID0gdGhpcy5kb2MuY3JlYXRlVGV4dE5vZGUoY2hhcnMpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKHRoaXMuY3VycmVudEVsZW1lbnQpe1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hhck5vZGUpO1xyXG5cdFx0XHR9ZWxzZSBpZigvXlxccyokLy50ZXN0KGNoYXJzKSl7XHJcblx0XHRcdFx0dGhpcy5kb2MuYXBwZW5kQ2hpbGQoY2hhck5vZGUpO1xyXG5cdFx0XHRcdC8vcHJvY2VzcyB4bWxcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmxvY2F0b3IgJiYgcG9zaXRpb24odGhpcy5sb2NhdG9yLGNoYXJOb2RlKVxyXG5cdFx0fVxyXG5cdH0sXHJcblx0c2tpcHBlZEVudGl0eTpmdW5jdGlvbihuYW1lKSB7XHJcblx0fSxcclxuXHRlbmREb2N1bWVudDpmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuZG9jLm5vcm1hbGl6ZSgpO1xyXG5cdH0sXHJcblx0c2V0RG9jdW1lbnRMb2NhdG9yOmZ1bmN0aW9uIChsb2NhdG9yKSB7XHJcblx0ICAgIGlmKHRoaXMubG9jYXRvciA9IGxvY2F0b3Ipey8vICYmICEoJ2xpbmVOdW1iZXInIGluIGxvY2F0b3IpKXtcclxuXHQgICAgXHRsb2NhdG9yLmxpbmVOdW1iZXIgPSAwO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHQvL0xleGljYWxIYW5kbGVyXHJcblx0Y29tbWVudDpmdW5jdGlvbihjaGFycywgc3RhcnQsIGxlbmd0aCkge1xyXG5cdFx0Y2hhcnMgPSBfdG9TdHJpbmcuYXBwbHkodGhpcyxhcmd1bWVudHMpXHJcblx0ICAgIHZhciBjb21tID0gdGhpcy5kb2MuY3JlYXRlQ29tbWVudChjaGFycyk7XHJcblx0ICAgIHRoaXMubG9jYXRvciAmJiBwb3NpdGlvbih0aGlzLmxvY2F0b3IsY29tbSlcclxuXHQgICAgYXBwZW5kRWxlbWVudCh0aGlzLCBjb21tKTtcclxuXHR9LFxyXG5cdFxyXG5cdHN0YXJ0Q0RBVEE6ZnVuY3Rpb24oKSB7XHJcblx0ICAgIC8vdXNlZCBpbiBjaGFyYWN0ZXJzKCkgbWV0aG9kc1xyXG5cdCAgICB0aGlzLmNkYXRhID0gdHJ1ZTtcclxuXHR9LFxyXG5cdGVuZENEQVRBOmZ1bmN0aW9uKCkge1xyXG5cdCAgICB0aGlzLmNkYXRhID0gZmFsc2U7XHJcblx0fSxcclxuXHRcclxuXHRzdGFydERURDpmdW5jdGlvbihuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpIHtcclxuXHRcdHZhciBpbXBsID0gdGhpcy5kb2MuaW1wbGVtZW50YXRpb247XHJcblx0ICAgIGlmIChpbXBsICYmIGltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKSB7XHJcblx0ICAgICAgICB2YXIgZHQgPSBpbXBsLmNyZWF0ZURvY3VtZW50VHlwZShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpO1xyXG5cdCAgICAgICAgdGhpcy5sb2NhdG9yICYmIHBvc2l0aW9uKHRoaXMubG9jYXRvcixkdClcclxuXHQgICAgICAgIGFwcGVuZEVsZW1lbnQodGhpcywgZHQpO1xyXG5cdCAgICB9XHJcblx0fSxcclxuXHQvKipcclxuXHQgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlclxyXG5cdCAqIEBsaW5rIGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L0Vycm9ySGFuZGxlci5odG1sXHJcblx0ICovXHJcblx0d2FybmluZzpmdW5jdGlvbihlcnJvcikge1xyXG5cdFx0Y29uc29sZS53YXJuKCdbeG1sZG9tIHdhcm5pbmddXFx0JytlcnJvcixfbG9jYXRvcih0aGlzLmxvY2F0b3IpKTtcclxuXHR9LFxyXG5cdGVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHRjb25zb2xlLmVycm9yKCdbeG1sZG9tIGVycm9yXVxcdCcrZXJyb3IsX2xvY2F0b3IodGhpcy5sb2NhdG9yKSk7XHJcblx0fSxcclxuXHRmYXRhbEVycm9yOmZ1bmN0aW9uKGVycm9yKSB7XHJcblx0XHRjb25zb2xlLmVycm9yKCdbeG1sZG9tIGZhdGFsRXJyb3JdXFx0JytlcnJvcixfbG9jYXRvcih0aGlzLmxvY2F0b3IpKTtcclxuXHQgICAgdGhyb3cgZXJyb3I7XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIF9sb2NhdG9yKGwpe1xyXG5cdGlmKGwpe1xyXG5cdFx0cmV0dXJuICdcXG5AJysobC5zeXN0ZW1JZCB8fCcnKSsnI1tsaW5lOicrbC5saW5lTnVtYmVyKycsY29sOicrbC5jb2x1bW5OdW1iZXIrJ10nXHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIF90b1N0cmluZyhjaGFycyxzdGFydCxsZW5ndGgpe1xyXG5cdGlmKHR5cGVvZiBjaGFycyA9PSAnc3RyaW5nJyl7XHJcblx0XHRyZXR1cm4gY2hhcnMuc3Vic3RyKHN0YXJ0LGxlbmd0aClcclxuXHR9ZWxzZXsvL2phdmEgc2F4IGNvbm5lY3Qgd2lkdGggeG1sZG9tIG9uIHJoaW5vKHdoYXQgYWJvdXQ6IFwiPyAmJiAhKGNoYXJzIGluc3RhbmNlb2YgU3RyaW5nKVwiKVxyXG5cdFx0aWYoY2hhcnMubGVuZ3RoID49IHN0YXJ0K2xlbmd0aCB8fCBzdGFydCl7XHJcblx0XHRcdHJldHVybiBuZXcgamF2YS5sYW5nLlN0cmluZyhjaGFycyxzdGFydCxsZW5ndGgpKycnO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNoYXJzO1xyXG5cdH1cclxufVxyXG5cclxuLypcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0xleGljYWxIYW5kbGVyLmh0bWxcclxuICogdXNlZCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOlxyXG4gKiAgI2NvbW1lbnQoY2hhcnMsIHN0YXJ0LCBsZW5ndGgpXHJcbiAqICAjc3RhcnRDREFUQSgpXHJcbiAqICAjZW5kQ0RBVEEoKVxyXG4gKiAgI3N0YXJ0RFREKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZClcclxuICpcclxuICpcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOlxyXG4gKiAgI2VuZERURCgpXHJcbiAqICAjc3RhcnRFbnRpdHkobmFtZSlcclxuICogICNlbmRFbnRpdHkobmFtZSlcclxuICpcclxuICpcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0RlY2xIYW5kbGVyLmh0bWxcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyXHJcbiAqIFx0I2F0dHJpYnV0ZURlY2woZU5hbWUsIGFOYW1lLCB0eXBlLCBtb2RlLCB2YWx1ZSlcclxuICogICNlbGVtZW50RGVjbChuYW1lLCBtb2RlbClcclxuICogICNleHRlcm5hbEVudGl0eURlY2wobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKVxyXG4gKiAgI2ludGVybmFsRW50aXR5RGVjbChuYW1lLCB2YWx1ZSlcclxuICogQGxpbmsgaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvZXh0L0VudGl0eVJlc29sdmVyMi5odG1sXHJcbiAqIElHTk9SRUQgbWV0aG9kIG9mIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyMlxyXG4gKiAgI3Jlc29sdmVFbnRpdHkoU3RyaW5nIG5hbWUsU3RyaW5nIHB1YmxpY0lkLFN0cmluZyBiYXNlVVJJLFN0cmluZyBzeXN0ZW1JZClcclxuICogICNyZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZClcclxuICogICNnZXRFeHRlcm5hbFN1YnNldChuYW1lLCBiYXNlVVJJKVxyXG4gKiBAbGluayBodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9EVERIYW5kbGVyLmh0bWxcclxuICogSUdOT1JFRCBtZXRob2Qgb2Ygb3JnLnhtbC5zYXguRFRESGFuZGxlclxyXG4gKiAgI25vdGF0aW9uRGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpIHt9O1xyXG4gKiAgI3VucGFyc2VkRW50aXR5RGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5vdGF0aW9uTmFtZSkge307XHJcbiAqL1xyXG5cImVuZERURCxzdGFydEVudGl0eSxlbmRFbnRpdHksYXR0cmlidXRlRGVjbCxlbGVtZW50RGVjbCxleHRlcm5hbEVudGl0eURlY2wsaW50ZXJuYWxFbnRpdHlEZWNsLHJlc29sdmVFbnRpdHksZ2V0RXh0ZXJuYWxTdWJzZXQsbm90YXRpb25EZWNsLHVucGFyc2VkRW50aXR5RGVjbFwiLnJlcGxhY2UoL1xcdysvZyxmdW5jdGlvbihrZXkpe1xyXG5cdERPTUhhbmRsZXIucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbigpe3JldHVybiBudWxsfVxyXG59KVxyXG5cclxuLyogUHJpdmF0ZSBzdGF0aWMgaGVscGVycyB0cmVhdGVkIGJlbG93IGFzIHByaXZhdGUgaW5zdGFuY2UgbWV0aG9kcywgc28gZG9uJ3QgbmVlZCB0byBhZGQgdGhlc2UgdG8gdGhlIHB1YmxpYyBBUEk7IHdlIG1pZ2h0IHVzZSBhIFJlbGF0b3IgdG8gYWxzbyBnZXQgcmlkIG9mIG5vbi1zdGFuZGFyZCBwdWJsaWMgcHJvcGVydGllcyAqL1xyXG5mdW5jdGlvbiBhcHBlbmRFbGVtZW50IChoYW5kZXIsbm9kZSkge1xyXG4gICAgaWYgKCFoYW5kZXIuY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICBoYW5kZXIuZG9jLmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBoYW5kZXIuY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICB9XHJcbn0vL2FwcGVuZENoaWxkIGFuZCBzZXRBdHRyaWJ1dGVOUyBhcmUgcHJlZm9ybWFuY2Uga2V5XHJcblxyXG4vL2lmKHR5cGVvZiByZXF1aXJlID09ICdmdW5jdGlvbicpe1xyXG5cdHZhciBYTUxSZWFkZXIgPSByZXF1aXJlKCcuL3NheCcpLlhNTFJlYWRlcjtcclxuXHR2YXIgRE9NSW1wbGVtZW50YXRpb24gPSBleHBvcnRzLkRPTUltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9kb20nKS5ET01JbXBsZW1lbnRhdGlvbjtcclxuXHRleHBvcnRzLlhNTFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL2RvbScpLlhNTFNlcmlhbGl6ZXIgO1xyXG5cdGV4cG9ydHMuRE9NUGFyc2VyID0gRE9NUGFyc2VyO1xyXG4vL31cclxuIiwiLypcbiAqIERPTSBMZXZlbCAyXG4gKiBPYmplY3QgRE9NRXhjZXB0aW9uXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1ET00tTGV2ZWwtMS9lY21hLXNjcmlwdC1sYW5ndWFnZS1iaW5kaW5nLmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItQ29yZS0yMDAwMTExMy9lY21hLXNjcmlwdC1iaW5kaW5nLmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBjb3B5KHNyYyxkZXN0KXtcblx0Zm9yKHZhciBwIGluIHNyYyl7XG5cdFx0ZGVzdFtwXSA9IHNyY1twXTtcblx0fVxufVxuLyoqXG5eXFx3K1xcLnByb3RvdHlwZVxcLihbX1xcd10rKVxccyo9XFxzKigoPzouKlxce1xccyo/W1xcclxcbl1bXFxzXFxTXSo/Xn0pfFxcUy4qPyg/PVs7XFxyXFxuXSkpOz9cbl5cXHcrXFwucHJvdG90eXBlXFwuKFtfXFx3XSspXFxzKj1cXHMqKFxcUy4qPyg/PVs7XFxyXFxuXSkpOz9cbiAqL1xuZnVuY3Rpb24gX2V4dGVuZHMoQ2xhc3MsU3VwZXIpe1xuXHR2YXIgcHQgPSBDbGFzcy5wcm90b3R5cGU7XG5cdGlmKE9iamVjdC5jcmVhdGUpe1xuXHRcdHZhciBwcHQgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSlcblx0XHRwdC5fX3Byb3RvX18gPSBwcHQ7XG5cdH1cblx0aWYoIShwdCBpbnN0YW5jZW9mIFN1cGVyKSl7XG5cdFx0ZnVuY3Rpb24gdCgpe307XG5cdFx0dC5wcm90b3R5cGUgPSBTdXBlci5wcm90b3R5cGU7XG5cdFx0dCA9IG5ldyB0KCk7XG5cdFx0Y29weShwdCx0KTtcblx0XHRDbGFzcy5wcm90b3R5cGUgPSBwdCA9IHQ7XG5cdH1cblx0aWYocHQuY29uc3RydWN0b3IgIT0gQ2xhc3Mpe1xuXHRcdGlmKHR5cGVvZiBDbGFzcyAhPSAnZnVuY3Rpb24nKXtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJ1bmtub3cgQ2xhc3M6XCIrQ2xhc3MpXG5cdFx0fVxuXHRcdHB0LmNvbnN0cnVjdG9yID0gQ2xhc3Ncblx0fVxufVxudmFyIGh0bWxucyA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyA7XG4vLyBOb2RlIFR5cGVzXG52YXIgTm9kZVR5cGUgPSB7fVxudmFyIEVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IE5vZGVUeXBlLkVMRU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IDE7XG52YXIgQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gTm9kZVR5cGUuQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gMjtcbnZhciBURVhUX05PREUgICAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5URVhUX05PREUgICAgICAgICAgICAgICAgICAgPSAzO1xudmFyIENEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkNEQVRBX1NFQ1RJT05fTk9ERSAgICAgICAgICA9IDQ7XG52YXIgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gNTtcbnZhciBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5FTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSA2O1xudmFyIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IE5vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9IDc7XG52YXIgQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gTm9kZVR5cGUuQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gODtcbnZhciBET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSBOb2RlVHlwZS5ET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSA5O1xudmFyIERPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX1RZUEVfTk9ERSAgICAgICAgICA9IDEwO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IE5vZGVUeXBlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IDExO1xudmFyIE5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IE5vZGVUeXBlLk5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IDEyO1xuXG4vLyBFeGNlcHRpb25Db2RlXG52YXIgRXhjZXB0aW9uQ29kZSA9IHt9XG52YXIgRXhjZXB0aW9uTWVzc2FnZSA9IHt9O1xudmFyIElOREVYX1NJWkVfRVJSICAgICAgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5ERVhfU0laRV9FUlIgICAgICAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzFdPVwiSW5kZXggc2l6ZSBlcnJvclwiKSwxKTtcbnZhciBET01TVFJJTkdfU0laRV9FUlIgICAgICAgICAgPSBFeGNlcHRpb25Db2RlLkRPTVNUUklOR19TSVpFX0VSUiAgICAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVsyXT1cIkRPTVN0cmluZyBzaXplIGVycm9yXCIpLDIpO1xudmFyIEhJRVJBUkNIWV9SRVFVRVNUX0VSUiAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSElFUkFSQ0hZX1JFUVVFU1RfRVJSICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzNdPVwiSGllcmFyY2h5IHJlcXVlc3QgZXJyb3JcIiksMyk7XG52YXIgV1JPTkdfRE9DVU1FTlRfRVJSICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5XUk9OR19ET0NVTUVOVF9FUlIgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbNF09XCJXcm9uZyBkb2N1bWVudFwiKSw0KTtcbnZhciBJTlZBTElEX0NIQVJBQ1RFUl9FUlIgICAgICAgPSBFeGNlcHRpb25Db2RlLklOVkFMSURfQ0hBUkFDVEVSX0VSUiAgICAgICA9ICgoRXhjZXB0aW9uTWVzc2FnZVs1XT1cIkludmFsaWQgY2hhcmFjdGVyXCIpLDUpO1xudmFyIE5PX0RBVEFfQUxMT1dFRF9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuTk9fREFUQV9BTExPV0VEX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzZdPVwiTm8gZGF0YSBhbGxvd2VkXCIpLDYpO1xudmFyIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiA9IEV4Y2VwdGlvbkNvZGUuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSID0gKChFeGNlcHRpb25NZXNzYWdlWzddPVwiTm8gbW9kaWZpY2F0aW9uIGFsbG93ZWRcIiksNyk7XG52YXIgTk9UX0ZPVU5EX0VSUiAgICAgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfRk9VTkRfRVJSICAgICAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOF09XCJOb3QgZm91bmRcIiksOCk7XG52YXIgTk9UX1NVUFBPUlRFRF9FUlIgICAgICAgICAgID0gRXhjZXB0aW9uQ29kZS5OT1RfU1VQUE9SVEVEX0VSUiAgICAgICAgICAgPSAoKEV4Y2VwdGlvbk1lc3NhZ2VbOV09XCJOb3Qgc3VwcG9ydGVkXCIpLDkpO1xudmFyIElOVVNFX0FUVFJJQlVURV9FUlIgICAgICAgICA9IEV4Y2VwdGlvbkNvZGUuSU5VU0VfQVRUUklCVVRFX0VSUiAgICAgICAgID0gKChFeGNlcHRpb25NZXNzYWdlWzEwXT1cIkF0dHJpYnV0ZSBpbiB1c2VcIiksMTApO1xuLy9sZXZlbDJcbnZhciBJTlZBTElEX1NUQVRFX0VSUiAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuSU5WQUxJRF9TVEFURV9FUlIgICAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTFdPVwiSW52YWxpZCBzdGF0ZVwiKSwxMSk7XG52YXIgU1lOVEFYX0VSUiAgICAgICAgICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLlNZTlRBWF9FUlIgICAgICAgICAgICAgICBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEyXT1cIlN5bnRheCBlcnJvclwiKSwxMik7XG52YXIgSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiBcdD0gKChFeGNlcHRpb25NZXNzYWdlWzEzXT1cIkludmFsaWQgbW9kaWZpY2F0aW9uXCIpLDEzKTtcbnZhciBOQU1FU1BBQ0VfRVJSICAgICAgICAgICAgXHQ9IEV4Y2VwdGlvbkNvZGUuTkFNRVNQQUNFX0VSUiAgICAgICAgICAgXHQ9ICgoRXhjZXB0aW9uTWVzc2FnZVsxNF09XCJJbnZhbGlkIG5hbWVzcGFjZVwiKSwxNCk7XG52YXIgSU5WQUxJRF9BQ0NFU1NfRVJSICAgICAgIFx0PSBFeGNlcHRpb25Db2RlLklOVkFMSURfQUNDRVNTX0VSUiAgICAgIFx0PSAoKEV4Y2VwdGlvbk1lc3NhZ2VbMTVdPVwiSW52YWxpZCBhY2Nlc3NcIiksMTUpO1xuXG5cbmZ1bmN0aW9uIERPTUV4Y2VwdGlvbihjb2RlLCBtZXNzYWdlKSB7XG5cdGlmKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcil7XG5cdFx0dmFyIGVycm9yID0gbWVzc2FnZTtcblx0fWVsc2V7XG5cdFx0ZXJyb3IgPSB0aGlzO1xuXHRcdEVycm9yLmNhbGwodGhpcywgRXhjZXB0aW9uTWVzc2FnZVtjb2RlXSk7XG5cdFx0dGhpcy5tZXNzYWdlID0gRXhjZXB0aW9uTWVzc2FnZVtjb2RlXTtcblx0XHRpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRE9NRXhjZXB0aW9uKTtcblx0fVxuXHRlcnJvci5jb2RlID0gY29kZTtcblx0aWYobWVzc2FnZSkgdGhpcy5tZXNzYWdlID0gdGhpcy5tZXNzYWdlICsgXCI6IFwiICsgbWVzc2FnZTtcblx0cmV0dXJuIGVycm9yO1xufTtcbkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5jb3B5KEV4Y2VwdGlvbkNvZGUsRE9NRXhjZXB0aW9uKVxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMvY29yZS5odG1sI0lELTUzNjI5NzE3N1xuICogVGhlIE5vZGVMaXN0IGludGVyZmFjZSBwcm92aWRlcyB0aGUgYWJzdHJhY3Rpb24gb2YgYW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG5vZGVzLCB3aXRob3V0IGRlZmluaW5nIG9yIGNvbnN0cmFpbmluZyBob3cgdGhpcyBjb2xsZWN0aW9uIGlzIGltcGxlbWVudGVkLiBOb2RlTGlzdCBvYmplY3RzIGluIHRoZSBET00gYXJlIGxpdmUuXG4gKiBUaGUgaXRlbXMgaW4gdGhlIE5vZGVMaXN0IGFyZSBhY2Nlc3NpYmxlIHZpYSBhbiBpbnRlZ3JhbCBpbmRleCwgc3RhcnRpbmcgZnJvbSAwLlxuICovXG5mdW5jdGlvbiBOb2RlTGlzdCgpIHtcbn07XG5Ob2RlTGlzdC5wcm90b3R5cGUgPSB7XG5cdC8qKlxuXHQgKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgY2hpbGQgbm9kZSBpbmRpY2VzIGlzIDAgdG8gbGVuZ3RoLTEgaW5jbHVzaXZlLlxuXHQgKiBAc3RhbmRhcmQgbGV2ZWwxXG5cdCAqL1xuXHRsZW5ndGg6MCwgXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpbmRleHRoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24uIElmIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LCB0aGlzIHJldHVybnMgbnVsbC5cblx0ICogQHN0YW5kYXJkIGxldmVsMVxuXHQgKiBAcGFyYW0gaW5kZXggIHVuc2lnbmVkIGxvbmcgXG5cdCAqICAgSW5kZXggaW50byB0aGUgY29sbGVjdGlvbi5cblx0ICogQHJldHVybiBOb2RlXG5cdCAqIFx0VGhlIG5vZGUgYXQgdGhlIGluZGV4dGggcG9zaXRpb24gaW4gdGhlIE5vZGVMaXN0LCBvciBudWxsIGlmIHRoYXQgaXMgbm90IGEgdmFsaWQgaW5kZXguIFxuXHQgKi9cblx0aXRlbTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRyZXR1cm4gdGhpc1tpbmRleF0gfHwgbnVsbDtcblx0fSxcblx0dG9TdHJpbmc6ZnVuY3Rpb24oaXNIVE1MLG5vZGVGaWx0ZXIpe1xuXHRcdGZvcih2YXIgYnVmID0gW10sIGkgPSAwO2k8dGhpcy5sZW5ndGg7aSsrKXtcblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKHRoaXNbaV0sYnVmLGlzSFRNTCxub2RlRmlsdGVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ1Zi5qb2luKCcnKTtcblx0fVxufTtcbmZ1bmN0aW9uIExpdmVOb2RlTGlzdChub2RlLHJlZnJlc2gpe1xuXHR0aGlzLl9ub2RlID0gbm9kZTtcblx0dGhpcy5fcmVmcmVzaCA9IHJlZnJlc2hcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xufVxuZnVuY3Rpb24gX3VwZGF0ZUxpdmVMaXN0KGxpc3Qpe1xuXHR2YXIgaW5jID0gbGlzdC5fbm9kZS5faW5jIHx8IGxpc3QuX25vZGUub3duZXJEb2N1bWVudC5faW5jO1xuXHRpZihsaXN0Ll9pbmMgIT0gaW5jKXtcblx0XHR2YXIgbHMgPSBsaXN0Ll9yZWZyZXNoKGxpc3QuX25vZGUpO1xuXHRcdC8vY29uc29sZS5sb2cobHMubGVuZ3RoKVxuXHRcdF9fc2V0X18obGlzdCwnbGVuZ3RoJyxscy5sZW5ndGgpO1xuXHRcdGNvcHkobHMsbGlzdCk7XG5cdFx0bGlzdC5faW5jID0gaW5jO1xuXHR9XG59XG5MaXZlTm9kZUxpc3QucHJvdG90eXBlLml0ZW0gPSBmdW5jdGlvbihpKXtcblx0X3VwZGF0ZUxpdmVMaXN0KHRoaXMpO1xuXHRyZXR1cm4gdGhpc1tpXTtcbn1cblxuX2V4dGVuZHMoTGl2ZU5vZGVMaXN0LE5vZGVMaXN0KTtcbi8qKlxuICogXG4gKiBPYmplY3RzIGltcGxlbWVudGluZyB0aGUgTmFtZWROb2RlTWFwIGludGVyZmFjZSBhcmUgdXNlZCB0byByZXByZXNlbnQgY29sbGVjdGlvbnMgb2Ygbm9kZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgYnkgbmFtZS4gTm90ZSB0aGF0IE5hbWVkTm9kZU1hcCBkb2VzIG5vdCBpbmhlcml0IGZyb20gTm9kZUxpc3Q7IE5hbWVkTm9kZU1hcHMgYXJlIG5vdCBtYWludGFpbmVkIGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLiBPYmplY3RzIGNvbnRhaW5lZCBpbiBhbiBvYmplY3QgaW1wbGVtZW50aW5nIE5hbWVkTm9kZU1hcCBtYXkgYWxzbyBiZSBhY2Nlc3NlZCBieSBhbiBvcmRpbmFsIGluZGV4LCBidXQgdGhpcyBpcyBzaW1wbHkgdG8gYWxsb3cgY29udmVuaWVudCBlbnVtZXJhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBOYW1lZE5vZGVNYXAsIGFuZCBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSBET00gc3BlY2lmaWVzIGFuIG9yZGVyIHRvIHRoZXNlIE5vZGVzLlxuICogTmFtZWROb2RlTWFwIG9iamVjdHMgaW4gdGhlIERPTSBhcmUgbGl2ZS5cbiAqIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb3IgRG9jdW1lbnRUeXBlIGVudGl0aWVzIFxuICovXG5mdW5jdGlvbiBOYW1lZE5vZGVNYXAoKSB7XG59O1xuXG5mdW5jdGlvbiBfZmluZE5vZGVJbmRleChsaXN0LG5vZGUpe1xuXHR2YXIgaSA9IGxpc3QubGVuZ3RoO1xuXHR3aGlsZShpLS0pe1xuXHRcdGlmKGxpc3RbaV0gPT09IG5vZGUpe3JldHVybiBpfVxuXHR9XG59XG5cbmZ1bmN0aW9uIF9hZGROYW1lZE5vZGUoZWwsbGlzdCxuZXdBdHRyLG9sZEF0dHIpe1xuXHRpZihvbGRBdHRyKXtcblx0XHRsaXN0W19maW5kTm9kZUluZGV4KGxpc3Qsb2xkQXR0cildID0gbmV3QXR0cjtcblx0fWVsc2V7XG5cdFx0bGlzdFtsaXN0Lmxlbmd0aCsrXSA9IG5ld0F0dHI7XG5cdH1cblx0aWYoZWwpe1xuXHRcdG5ld0F0dHIub3duZXJFbGVtZW50ID0gZWw7XG5cdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0aWYoZG9jKXtcblx0XHRcdG9sZEF0dHIgJiYgX29uUmVtb3ZlQXR0cmlidXRlKGRvYyxlbCxvbGRBdHRyKTtcblx0XHRcdF9vbkFkZEF0dHJpYnV0ZShkb2MsZWwsbmV3QXR0cik7XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBfcmVtb3ZlTmFtZWROb2RlKGVsLGxpc3QsYXR0cil7XG5cdC8vY29uc29sZS5sb2coJ3JlbW92ZSBhdHRyOicrYXR0cilcblx0dmFyIGkgPSBfZmluZE5vZGVJbmRleChsaXN0LGF0dHIpO1xuXHRpZihpPj0wKXtcblx0XHR2YXIgbGFzdEluZGV4ID0gbGlzdC5sZW5ndGgtMVxuXHRcdHdoaWxlKGk8bGFzdEluZGV4KXtcblx0XHRcdGxpc3RbaV0gPSBsaXN0WysraV1cblx0XHR9XG5cdFx0bGlzdC5sZW5ndGggPSBsYXN0SW5kZXg7XG5cdFx0aWYoZWwpe1xuXHRcdFx0dmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRpZihkb2Mpe1xuXHRcdFx0XHRfb25SZW1vdmVBdHRyaWJ1dGUoZG9jLGVsLGF0dHIpO1xuXHRcdFx0XHRhdHRyLm93bmVyRWxlbWVudCA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ZWxzZXtcblx0XHR0aHJvdyBET01FeGNlcHRpb24oTk9UX0ZPVU5EX0VSUixuZXcgRXJyb3IoZWwudGFnTmFtZSsnQCcrYXR0cikpXG5cdH1cbn1cbk5hbWVkTm9kZU1hcC5wcm90b3R5cGUgPSB7XG5cdGxlbmd0aDowLFxuXHRpdGVtOk5vZGVMaXN0LnByb3RvdHlwZS5pdGVtLFxuXHRnZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGtleSkge1xuLy9cdFx0aWYoa2V5LmluZGV4T2YoJzonKT4wIHx8IGtleSA9PSAneG1sbnMnKXtcbi8vXHRcdFx0cmV0dXJuIG51bGw7XG4vL1x0XHR9XG5cdFx0Ly9jb25zb2xlLmxvZygpXG5cdFx0dmFyIGkgPSB0aGlzLmxlbmd0aDtcblx0XHR3aGlsZShpLS0pe1xuXHRcdFx0dmFyIGF0dHIgPSB0aGlzW2ldO1xuXHRcdFx0Ly9jb25zb2xlLmxvZyhhdHRyLm5vZGVOYW1lLGtleSlcblx0XHRcdGlmKGF0dHIubm9kZU5hbWUgPT0ga2V5KXtcblx0XHRcdFx0cmV0dXJuIGF0dHI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRzZXROYW1lZEl0ZW06IGZ1bmN0aW9uKGF0dHIpIHtcblx0XHR2YXIgZWwgPSBhdHRyLm93bmVyRWxlbWVudDtcblx0XHRpZihlbCAmJiBlbCE9dGhpcy5fb3duZXJFbGVtZW50KXtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oSU5VU0VfQVRUUklCVVRFX0VSUik7XG5cdFx0fVxuXHRcdHZhciBvbGRBdHRyID0gdGhpcy5nZXROYW1lZEl0ZW0oYXR0ci5ub2RlTmFtZSk7XG5cdFx0X2FkZE5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyLG9sZEF0dHIpO1xuXHRcdHJldHVybiBvbGRBdHRyO1xuXHR9LFxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0c2V0TmFtZWRJdGVtTlM6IGZ1bmN0aW9uKGF0dHIpIHsvLyByYWlzZXM6IFdST05HX0RPQ1VNRU5UX0VSUixOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsSU5VU0VfQVRUUklCVVRFX0VSUlxuXHRcdHZhciBlbCA9IGF0dHIub3duZXJFbGVtZW50LCBvbGRBdHRyO1xuXHRcdGlmKGVsICYmIGVsIT10aGlzLl9vd25lckVsZW1lbnQpe1xuXHRcdFx0dGhyb3cgbmV3IERPTUV4Y2VwdGlvbihJTlVTRV9BVFRSSUJVVEVfRVJSKTtcblx0XHR9XG5cdFx0b2xkQXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtTlMoYXR0ci5uYW1lc3BhY2VVUkksYXR0ci5sb2NhbE5hbWUpO1xuXHRcdF9hZGROYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cixvbGRBdHRyKTtcblx0XHRyZXR1cm4gb2xkQXR0cjtcblx0fSxcblxuXHQvKiByZXR1cm5zIE5vZGUgKi9cblx0cmVtb3ZlTmFtZWRJdGVtOiBmdW5jdGlvbihrZXkpIHtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0TmFtZWRJdGVtKGtleSk7XG5cdFx0X3JlbW92ZU5hbWVkTm9kZSh0aGlzLl9vd25lckVsZW1lbnQsdGhpcyxhdHRyKTtcblx0XHRyZXR1cm4gYXR0cjtcblx0XHRcblx0XHRcblx0fSwvLyByYWlzZXM6IE5PVF9GT1VORF9FUlIsTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXG5cdFxuXHQvL2ZvciBsZXZlbDJcblx0cmVtb3ZlTmFtZWRJdGVtTlM6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLGxvY2FsTmFtZSl7XG5cdFx0dmFyIGF0dHIgPSB0aGlzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSxsb2NhbE5hbWUpO1xuXHRcdF9yZW1vdmVOYW1lZE5vZGUodGhpcy5fb3duZXJFbGVtZW50LHRoaXMsYXR0cik7XG5cdFx0cmV0dXJuIGF0dHI7XG5cdH0sXG5cdGdldE5hbWVkSXRlbU5TOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkge1xuXHRcdHZhciBpID0gdGhpcy5sZW5ndGg7XG5cdFx0d2hpbGUoaS0tKXtcblx0XHRcdHZhciBub2RlID0gdGhpc1tpXTtcblx0XHRcdGlmKG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSAmJiBub2RlLm5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkpe1xuXHRcdFx0XHRyZXR1cm4gbm9kZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn07XG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLURPTS1MZXZlbC0xL2xldmVsLW9uZS1jb3JlLmh0bWwjSUQtMTAyMTYxNDkwXG4gKi9cbmZ1bmN0aW9uIERPTUltcGxlbWVudGF0aW9uKC8qIE9iamVjdCAqLyBmZWF0dXJlcykge1xuXHR0aGlzLl9mZWF0dXJlcyA9IHt9O1xuXHRpZiAoZmVhdHVyZXMpIHtcblx0XHRmb3IgKHZhciBmZWF0dXJlIGluIGZlYXR1cmVzKSB7XG5cdFx0XHQgdGhpcy5fZmVhdHVyZXMgPSBmZWF0dXJlc1tmZWF0dXJlXTtcblx0XHR9XG5cdH1cbn07XG5cbkRPTUltcGxlbWVudGF0aW9uLnByb3RvdHlwZSA9IHtcblx0aGFzRmVhdHVyZTogZnVuY3Rpb24oLyogc3RyaW5nICovIGZlYXR1cmUsIC8qIHN0cmluZyAqLyB2ZXJzaW9uKSB7XG5cdFx0dmFyIHZlcnNpb25zID0gdGhpcy5fZmVhdHVyZXNbZmVhdHVyZS50b0xvd2VyQ2FzZSgpXTtcblx0XHRpZiAodmVyc2lvbnMgJiYgKCF2ZXJzaW9uIHx8IHZlcnNpb24gaW4gdmVyc2lvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSxcblx0Ly8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcblx0Y3JlYXRlRG9jdW1lbnQ6ZnVuY3Rpb24obmFtZXNwYWNlVVJJLCAgcXVhbGlmaWVkTmFtZSwgZG9jdHlwZSl7Ly8gcmFpc2VzOklOVkFMSURfQ0hBUkFDVEVSX0VSUixOQU1FU1BBQ0VfRVJSLFdST05HX0RPQ1VNRU5UX0VSUlxuXHRcdHZhciBkb2MgPSBuZXcgRG9jdW1lbnQoKTtcblx0XHRkb2MuaW1wbGVtZW50YXRpb24gPSB0aGlzO1xuXHRcdGRvYy5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0ZG9jLmRvY3R5cGUgPSBkb2N0eXBlO1xuXHRcdGlmKGRvY3R5cGUpe1xuXHRcdFx0ZG9jLmFwcGVuZENoaWxkKGRvY3R5cGUpO1xuXHRcdH1cblx0XHRpZihxdWFsaWZpZWROYW1lKXtcblx0XHRcdHZhciByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRkb2MuYXBwZW5kQ2hpbGQocm9vdCk7XG5cdFx0fVxuXHRcdHJldHVybiBkb2M7XG5cdH0sXG5cdC8vIEludHJvZHVjZWQgaW4gRE9NIExldmVsIDI6XG5cdGNyZWF0ZURvY3VtZW50VHlwZTpmdW5jdGlvbihxdWFsaWZpZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpey8vIHJhaXNlczpJTlZBTElEX0NIQVJBQ1RFUl9FUlIsTkFNRVNQQUNFX0VSUlxuXHRcdHZhciBub2RlID0gbmV3IERvY3VtZW50VHlwZSgpO1xuXHRcdG5vZGUubmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5ub2RlTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5wdWJsaWNJZCA9IHB1YmxpY0lkO1xuXHRcdG5vZGUuc3lzdGVtSWQgPSBzeXN0ZW1JZDtcblx0XHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRcdC8vcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyAgICAgICAgaW50ZXJuYWxTdWJzZXQ7XG5cdFx0XG5cdFx0Ly9UT0RPOi4uXG5cdFx0Ly8gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOYW1lZE5vZGVNYXAgICAgIGVudGl0aWVzO1xuXHRcdC8vICByZWFkb25seSBhdHRyaWJ1dGUgTmFtZWROb2RlTWFwICAgICBub3RhdGlvbnM7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH1cbn07XG5cblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMvY29yZS5odG1sI0lELTE5NTA2NDEyNDdcbiAqL1xuXG5mdW5jdGlvbiBOb2RlKCkge1xufTtcblxuTm9kZS5wcm90b3R5cGUgPSB7XG5cdGZpcnN0Q2hpbGQgOiBudWxsLFxuXHRsYXN0Q2hpbGQgOiBudWxsLFxuXHRwcmV2aW91c1NpYmxpbmcgOiBudWxsLFxuXHRuZXh0U2libGluZyA6IG51bGwsXG5cdGF0dHJpYnV0ZXMgOiBudWxsLFxuXHRwYXJlbnROb2RlIDogbnVsbCxcblx0Y2hpbGROb2RlcyA6IG51bGwsXG5cdG93bmVyRG9jdW1lbnQgOiBudWxsLFxuXHRub2RlVmFsdWUgOiBudWxsLFxuXHRuYW1lc3BhY2VVUkkgOiBudWxsLFxuXHRwcmVmaXggOiBudWxsLFxuXHRsb2NhbE5hbWUgOiBudWxsLFxuXHQvLyBNb2RpZmllZCBpbiBET00gTGV2ZWwgMjpcblx0aW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKG5ld0NoaWxkLCByZWZDaGlsZCl7Ly9yYWlzZXMgXG5cdFx0cmV0dXJuIF9pbnNlcnRCZWZvcmUodGhpcyxuZXdDaGlsZCxyZWZDaGlsZCk7XG5cdH0sXG5cdHJlcGxhY2VDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCwgb2xkQ2hpbGQpey8vcmFpc2VzIFxuXHRcdHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG9sZENoaWxkKTtcblx0XHRpZihvbGRDaGlsZCl7XG5cdFx0XHR0aGlzLnJlbW92ZUNoaWxkKG9sZENoaWxkKTtcblx0XHR9XG5cdH0sXG5cdHJlbW92ZUNoaWxkOmZ1bmN0aW9uKG9sZENoaWxkKXtcblx0XHRyZXR1cm4gX3JlbW92ZUNoaWxkKHRoaXMsb2xkQ2hpbGQpO1xuXHR9LFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG51bGwpO1xuXHR9LFxuXHRoYXNDaGlsZE5vZGVzOmZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsO1xuXHR9LFxuXHRjbG9uZU5vZGU6ZnVuY3Rpb24oZGVlcCl7XG5cdFx0cmV0dXJuIGNsb25lTm9kZSh0aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsdGhpcyxkZWVwKTtcblx0fSxcblx0Ly8gTW9kaWZpZWQgaW4gRE9NIExldmVsIDI6XG5cdG5vcm1hbGl6ZTpmdW5jdGlvbigpe1xuXHRcdHZhciBjaGlsZCA9IHRoaXMuZmlyc3RDaGlsZDtcblx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHR2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0aWYobmV4dCAmJiBuZXh0Lm5vZGVUeXBlID09IFRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSA9PSBURVhUX05PREUpe1xuXHRcdFx0XHR0aGlzLnJlbW92ZUNoaWxkKG5leHQpO1xuXHRcdFx0XHRjaGlsZC5hcHBlbmREYXRhKG5leHQuZGF0YSk7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0Y2hpbGQubm9ybWFsaXplKCk7XG5cdFx0XHRcdGNoaWxkID0gbmV4dDtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG4gIFx0Ly8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcblx0aXNTdXBwb3J0ZWQ6ZnVuY3Rpb24oZmVhdHVyZSwgdmVyc2lvbil7XG5cdFx0cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKGZlYXR1cmUsdmVyc2lvbik7XG5cdH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMjpcbiAgICBoYXNBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7XG4gICAgXHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aD4wO1xuICAgIH0sXG4gICAgbG9va3VwUHJlZml4OmZ1bmN0aW9uKG5hbWVzcGFjZVVSSSl7XG4gICAgXHR2YXIgZWwgPSB0aGlzO1xuICAgIFx0d2hpbGUoZWwpe1xuICAgIFx0XHR2YXIgbWFwID0gZWwuX25zTWFwO1xuICAgIFx0XHQvL2NvbnNvbGUuZGlyKG1hcClcbiAgICBcdFx0aWYobWFwKXtcbiAgICBcdFx0XHRmb3IodmFyIG4gaW4gbWFwKXtcbiAgICBcdFx0XHRcdGlmKG1hcFtuXSA9PSBuYW1lc3BhY2VVUkkpe1xuICAgIFx0XHRcdFx0XHRyZXR1cm4gbjtcbiAgICBcdFx0XHRcdH1cbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdFx0ZWwgPSBlbC5ub2RlVHlwZSA9PSBBVFRSSUJVVEVfTk9ERT9lbC5vd25lckRvY3VtZW50IDogZWwucGFyZW50Tm9kZTtcbiAgICBcdH1cbiAgICBcdHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMzpcbiAgICBsb29rdXBOYW1lc3BhY2VVUkk6ZnVuY3Rpb24ocHJlZml4KXtcbiAgICBcdHZhciBlbCA9IHRoaXM7XG4gICAgXHR3aGlsZShlbCl7XG4gICAgXHRcdHZhciBtYXAgPSBlbC5fbnNNYXA7XG4gICAgXHRcdC8vY29uc29sZS5kaXIobWFwKVxuICAgIFx0XHRpZihtYXApe1xuICAgIFx0XHRcdGlmKHByZWZpeCBpbiBtYXApe1xuICAgIFx0XHRcdFx0cmV0dXJuIG1hcFtwcmVmaXhdIDtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdFx0ZWwgPSBlbC5ub2RlVHlwZSA9PSBBVFRSSUJVVEVfTk9ERT9lbC5vd25lckRvY3VtZW50IDogZWwucGFyZW50Tm9kZTtcbiAgICBcdH1cbiAgICBcdHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgLy8gSW50cm9kdWNlZCBpbiBET00gTGV2ZWwgMzpcbiAgICBpc0RlZmF1bHROYW1lc3BhY2U6ZnVuY3Rpb24obmFtZXNwYWNlVVJJKXtcbiAgICBcdHZhciBwcmVmaXggPSB0aGlzLmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpO1xuICAgIFx0cmV0dXJuIHByZWZpeCA9PSBudWxsO1xuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gX3htbEVuY29kZXIoYyl7XG5cdHJldHVybiBjID09ICc8JyAmJiAnJmx0OycgfHxcbiAgICAgICAgIGMgPT0gJz4nICYmICcmZ3Q7JyB8fFxuICAgICAgICAgYyA9PSAnJicgJiYgJyZhbXA7JyB8fFxuICAgICAgICAgYyA9PSAnXCInICYmICcmcXVvdDsnIHx8XG4gICAgICAgICAnJiMnK2MuY2hhckNvZGVBdCgpKyc7J1xufVxuXG5cbmNvcHkoTm9kZVR5cGUsTm9kZSk7XG5jb3B5KE5vZGVUeXBlLE5vZGUucHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0gY2FsbGJhY2sgcmV0dXJuIHRydWUgZm9yIGNvbnRpbnVlLGZhbHNlIGZvciBicmVha1xuICogQHJldHVybiBib29sZWFuIHRydWU6IGJyZWFrIHZpc2l0O1xuICovXG5mdW5jdGlvbiBfdmlzaXROb2RlKG5vZGUsY2FsbGJhY2spe1xuXHRpZihjYWxsYmFjayhub2RlKSl7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYobm9kZSA9IG5vZGUuZmlyc3RDaGlsZCl7XG5cdFx0ZG97XG5cdFx0XHRpZihfdmlzaXROb2RlKG5vZGUsY2FsbGJhY2spKXtyZXR1cm4gdHJ1ZX1cbiAgICAgICAgfXdoaWxlKG5vZGU9bm9kZS5uZXh0U2libGluZylcbiAgICB9XG59XG5cblxuXG5mdW5jdGlvbiBEb2N1bWVudCgpe1xufVxuZnVuY3Rpb24gX29uQWRkQXR0cmlidXRlKGRvYyxlbCxuZXdBdHRyKXtcblx0ZG9jICYmIGRvYy5faW5jKys7XG5cdHZhciBucyA9IG5ld0F0dHIubmFtZXNwYWNlVVJJIDtcblx0aWYobnMgPT0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJyl7XG5cdFx0Ly91cGRhdGUgbmFtZXNwYWNlXG5cdFx0ZWwuX25zTWFwW25ld0F0dHIucHJlZml4P25ld0F0dHIubG9jYWxOYW1lOicnXSA9IG5ld0F0dHIudmFsdWVcblx0fVxufVxuZnVuY3Rpb24gX29uUmVtb3ZlQXR0cmlidXRlKGRvYyxlbCxuZXdBdHRyLHJlbW92ZSl7XG5cdGRvYyAmJiBkb2MuX2luYysrO1xuXHR2YXIgbnMgPSBuZXdBdHRyLm5hbWVzcGFjZVVSSSA7XG5cdGlmKG5zID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycpe1xuXHRcdC8vdXBkYXRlIG5hbWVzcGFjZVxuXHRcdGRlbGV0ZSBlbC5fbnNNYXBbbmV3QXR0ci5wcmVmaXg/bmV3QXR0ci5sb2NhbE5hbWU6JyddXG5cdH1cbn1cbmZ1bmN0aW9uIF9vblVwZGF0ZUNoaWxkKGRvYyxlbCxuZXdDaGlsZCl7XG5cdGlmKGRvYyAmJiBkb2MuX2luYyl7XG5cdFx0ZG9jLl9pbmMrKztcblx0XHQvL3VwZGF0ZSBjaGlsZE5vZGVzXG5cdFx0dmFyIGNzID0gZWwuY2hpbGROb2Rlcztcblx0XHRpZihuZXdDaGlsZCl7XG5cdFx0XHRjc1tjcy5sZW5ndGgrK10gPSBuZXdDaGlsZDtcblx0XHR9ZWxzZXtcblx0XHRcdC8vY29uc29sZS5sb2coMSlcblx0XHRcdHZhciBjaGlsZCA9IGVsLmZpcnN0Q2hpbGQ7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdGNzW2krK10gPSBjaGlsZDtcblx0XHRcdFx0Y2hpbGQgPWNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdFx0Y3MubGVuZ3RoID0gaTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBhdHRyaWJ1dGVzO1xuICogY2hpbGRyZW47XG4gKiBcbiAqIHdyaXRlYWJsZSBwcm9wZXJ0aWVzOlxuICogbm9kZVZhbHVlLEF0dHI6dmFsdWUsQ2hhcmFjdGVyRGF0YTpkYXRhXG4gKiBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gX3JlbW92ZUNoaWxkKHBhcmVudE5vZGUsY2hpbGQpe1xuXHR2YXIgcHJldmlvdXMgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmc7XG5cdHZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdGlmKHByZXZpb3VzKXtcblx0XHRwcmV2aW91cy5uZXh0U2libGluZyA9IG5leHQ7XG5cdH1lbHNle1xuXHRcdHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5leHRcblx0fVxuXHRpZihuZXh0KXtcblx0XHRuZXh0LnByZXZpb3VzU2libGluZyA9IHByZXZpb3VzO1xuXHR9ZWxzZXtcblx0XHRwYXJlbnROb2RlLmxhc3RDaGlsZCA9IHByZXZpb3VzO1xuXHR9XG5cdF9vblVwZGF0ZUNoaWxkKHBhcmVudE5vZGUub3duZXJEb2N1bWVudCxwYXJlbnROb2RlKTtcblx0cmV0dXJuIGNoaWxkO1xufVxuLyoqXG4gKiBwcmVmb3JtYW5jZSBrZXkocmVmQ2hpbGQgPT0gbnVsbClcbiAqL1xuZnVuY3Rpb24gX2luc2VydEJlZm9yZShwYXJlbnROb2RlLG5ld0NoaWxkLG5leHRDaGlsZCl7XG5cdHZhciBjcCA9IG5ld0NoaWxkLnBhcmVudE5vZGU7XG5cdGlmKGNwKXtcblx0XHRjcC5yZW1vdmVDaGlsZChuZXdDaGlsZCk7Ly9yZW1vdmUgYW5kIHVwZGF0ZVxuXHR9XG5cdGlmKG5ld0NoaWxkLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtcblx0XHR2YXIgbmV3Rmlyc3QgPSBuZXdDaGlsZC5maXJzdENoaWxkO1xuXHRcdGlmIChuZXdGaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gbmV3Q2hpbGQ7XG5cdFx0fVxuXHRcdHZhciBuZXdMYXN0ID0gbmV3Q2hpbGQubGFzdENoaWxkO1xuXHR9ZWxzZXtcblx0XHRuZXdGaXJzdCA9IG5ld0xhc3QgPSBuZXdDaGlsZDtcblx0fVxuXHR2YXIgcHJlID0gbmV4dENoaWxkID8gbmV4dENoaWxkLnByZXZpb3VzU2libGluZyA6IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXG5cdG5ld0ZpcnN0LnByZXZpb3VzU2libGluZyA9IHByZTtcblx0bmV3TGFzdC5uZXh0U2libGluZyA9IG5leHRDaGlsZDtcblx0XG5cdFxuXHRpZihwcmUpe1xuXHRcdHByZS5uZXh0U2libGluZyA9IG5ld0ZpcnN0O1xuXHR9ZWxzZXtcblx0XHRwYXJlbnROb2RlLmZpcnN0Q2hpbGQgPSBuZXdGaXJzdDtcblx0fVxuXHRpZihuZXh0Q2hpbGQgPT0gbnVsbCl7XG5cdFx0cGFyZW50Tm9kZS5sYXN0Q2hpbGQgPSBuZXdMYXN0O1xuXHR9ZWxzZXtcblx0XHRuZXh0Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gbmV3TGFzdDtcblx0fVxuXHRkb3tcblx0XHRuZXdGaXJzdC5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcblx0fXdoaWxlKG5ld0ZpcnN0ICE9PSBuZXdMYXN0ICYmIChuZXdGaXJzdD0gbmV3Rmlyc3QubmV4dFNpYmxpbmcpKVxuXHRfb25VcGRhdGVDaGlsZChwYXJlbnROb2RlLm93bmVyRG9jdW1lbnR8fHBhcmVudE5vZGUscGFyZW50Tm9kZSk7XG5cdC8vY29uc29sZS5sb2cocGFyZW50Tm9kZS5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPT0gbnVsbClcblx0aWYgKG5ld0NoaWxkLm5vZGVUeXBlID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcblx0XHRuZXdDaGlsZC5maXJzdENoaWxkID0gbmV3Q2hpbGQubGFzdENoaWxkID0gbnVsbDtcblx0fVxuXHRyZXR1cm4gbmV3Q2hpbGQ7XG59XG5mdW5jdGlvbiBfYXBwZW5kU2luZ2xlQ2hpbGQocGFyZW50Tm9kZSxuZXdDaGlsZCl7XG5cdHZhciBjcCA9IG5ld0NoaWxkLnBhcmVudE5vZGU7XG5cdGlmKGNwKXtcblx0XHR2YXIgcHJlID0gcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdFx0Y3AucmVtb3ZlQ2hpbGQobmV3Q2hpbGQpOy8vcmVtb3ZlIGFuZCB1cGRhdGVcblx0XHR2YXIgcHJlID0gcGFyZW50Tm9kZS5sYXN0Q2hpbGQ7XG5cdH1cblx0dmFyIHByZSA9IHBhcmVudE5vZGUubGFzdENoaWxkO1xuXHRuZXdDaGlsZC5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcblx0bmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gcHJlO1xuXHRuZXdDaGlsZC5uZXh0U2libGluZyA9IG51bGw7XG5cdGlmKHByZSl7XG5cdFx0cHJlLm5leHRTaWJsaW5nID0gbmV3Q2hpbGQ7XG5cdH1lbHNle1xuXHRcdHBhcmVudE5vZGUuZmlyc3RDaGlsZCA9IG5ld0NoaWxkO1xuXHR9XG5cdHBhcmVudE5vZGUubGFzdENoaWxkID0gbmV3Q2hpbGQ7XG5cdF9vblVwZGF0ZUNoaWxkKHBhcmVudE5vZGUub3duZXJEb2N1bWVudCxwYXJlbnROb2RlLG5ld0NoaWxkKTtcblx0cmV0dXJuIG5ld0NoaWxkO1xuXHQvL2NvbnNvbGUubG9nKFwiX19hYVwiLHBhcmVudE5vZGUubGFzdENoaWxkLm5leHRTaWJsaW5nID09IG51bGwpXG59XG5Eb2N1bWVudC5wcm90b3R5cGUgPSB7XG5cdC8vaW1wbGVtZW50YXRpb24gOiBudWxsLFxuXHRub2RlTmFtZSA6ICAnI2RvY3VtZW50Jyxcblx0bm9kZVR5cGUgOiAgRE9DVU1FTlRfTk9ERSxcblx0ZG9jdHlwZSA6ICBudWxsLFxuXHRkb2N1bWVudEVsZW1lbnQgOiAgbnVsbCxcblx0X2luYyA6IDEsXG5cdFxuXHRpbnNlcnRCZWZvcmUgOiAgZnVuY3Rpb24obmV3Q2hpbGQsIHJlZkNoaWxkKXsvL3JhaXNlcyBcblx0XHRpZihuZXdDaGlsZC5ub2RlVHlwZSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXtcblx0XHRcdHZhciBjaGlsZCA9IG5ld0NoaWxkLmZpcnN0Q2hpbGQ7XG5cdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdHZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdHRoaXMuaW5zZXJ0QmVmb3JlKGNoaWxkLHJlZkNoaWxkKTtcblx0XHRcdFx0Y2hpbGQgPSBuZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5ld0NoaWxkO1xuXHRcdH1cblx0XHRpZih0aGlzLmRvY3VtZW50RWxlbWVudCA9PSBudWxsICYmIG5ld0NoaWxkLm5vZGVUeXBlID09IEVMRU1FTlRfTk9ERSl7XG5cdFx0XHR0aGlzLmRvY3VtZW50RWxlbWVudCA9IG5ld0NoaWxkO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gX2luc2VydEJlZm9yZSh0aGlzLG5ld0NoaWxkLHJlZkNoaWxkKSwobmV3Q2hpbGQub3duZXJEb2N1bWVudCA9IHRoaXMpLG5ld0NoaWxkO1xuXHR9LFxuXHRyZW1vdmVDaGlsZCA6ICBmdW5jdGlvbihvbGRDaGlsZCl7XG5cdFx0aWYodGhpcy5kb2N1bWVudEVsZW1lbnQgPT0gb2xkQ2hpbGQpe1xuXHRcdFx0dGhpcy5kb2N1bWVudEVsZW1lbnQgPSBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gX3JlbW92ZUNoaWxkKHRoaXMsb2xkQ2hpbGQpO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRpbXBvcnROb2RlIDogZnVuY3Rpb24oaW1wb3J0ZWROb2RlLGRlZXApe1xuXHRcdHJldHVybiBpbXBvcnROb2RlKHRoaXMsaW1wb3J0ZWROb2RlLGRlZXApO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRnZXRFbGVtZW50QnlJZCA6XHRmdW5jdGlvbihpZCl7XG5cdFx0dmFyIHJ0diA9IG51bGw7XG5cdFx0X3Zpc2l0Tm9kZSh0aGlzLmRvY3VtZW50RWxlbWVudCxmdW5jdGlvbihub2RlKXtcblx0XHRcdGlmKG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVF9OT0RFKXtcblx0XHRcdFx0aWYobm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykgPT0gaWQpe1xuXHRcdFx0XHRcdHJ0diA9IG5vZGU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KVxuXHRcdHJldHVybiBydHY7XG5cdH0sXG5cdFxuXHQvL2RvY3VtZW50IGZhY3RvcnkgbWV0aG9kOlxuXHRjcmVhdGVFbGVtZW50IDpcdGZ1bmN0aW9uKHRhZ05hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEVsZW1lbnQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSB0YWdOYW1lO1xuXHRcdG5vZGUudGFnTmFtZSA9IHRhZ05hbWU7XG5cdFx0bm9kZS5jaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0KCk7XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcyA9IG5ldyBOYW1lZE5vZGVNYXAoKTtcblx0XHRhdHRycy5fb3duZXJFbGVtZW50ID0gbm9kZTtcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCA6XHRmdW5jdGlvbigpe1xuXHRcdHZhciBub2RlID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVUZXh0Tm9kZSA6XHRmdW5jdGlvbihkYXRhKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBUZXh0KCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLmFwcGVuZERhdGEoZGF0YSlcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQ29tbWVudCA6XHRmdW5jdGlvbihkYXRhKXtcblx0XHR2YXIgbm9kZSA9IG5ldyBDb21tZW50KCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLmFwcGVuZERhdGEoZGF0YSlcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQ0RBVEFTZWN0aW9uIDpcdGZ1bmN0aW9uKGRhdGEpe1xuXHRcdHZhciBub2RlID0gbmV3IENEQVRBU2VjdGlvbigpO1xuXHRcdG5vZGUub3duZXJEb2N1bWVudCA9IHRoaXM7XG5cdFx0bm9kZS5hcHBlbmREYXRhKGRhdGEpXG5cdFx0cmV0dXJuIG5vZGU7XG5cdH0sXG5cdGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiA6XHRmdW5jdGlvbih0YXJnZXQsZGF0YSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50ID0gdGhpcztcblx0XHRub2RlLnRhZ05hbWUgPSBub2RlLnRhcmdldCA9IHRhcmdldDtcblx0XHRub2RlLm5vZGVWYWx1ZT0gbm9kZS5kYXRhID0gZGF0YTtcblx0XHRyZXR1cm4gbm9kZTtcblx0fSxcblx0Y3JlYXRlQXR0cmlidXRlIDpcdGZ1bmN0aW9uKG5hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEF0dHIoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnRcdD0gdGhpcztcblx0XHRub2RlLm5hbWUgPSBuYW1lO1xuXHRcdG5vZGUubm9kZU5hbWVcdD0gbmFtZTtcblx0XHRub2RlLmxvY2FsTmFtZSA9IG5hbWU7XG5cdFx0bm9kZS5zcGVjaWZpZWQgPSB0cnVlO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHRjcmVhdGVFbnRpdHlSZWZlcmVuY2UgOlx0ZnVuY3Rpb24obmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgRW50aXR5UmVmZXJlbmNlKCk7XG5cdFx0bm9kZS5vd25lckRvY3VtZW50XHQ9IHRoaXM7XG5cdFx0bm9kZS5ub2RlTmFtZVx0PSBuYW1lO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRjcmVhdGVFbGVtZW50TlMgOlx0ZnVuY3Rpb24obmFtZXNwYWNlVVJJLHF1YWxpZmllZE5hbWUpe1xuXHRcdHZhciBub2RlID0gbmV3IEVsZW1lbnQoKTtcblx0XHR2YXIgcGwgPSBxdWFsaWZpZWROYW1lLnNwbGl0KCc6Jyk7XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcyA9IG5ldyBOYW1lZE5vZGVNYXAoKTtcblx0XHRub2RlLmNoaWxkTm9kZXMgPSBuZXcgTm9kZUxpc3QoKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUudGFnTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cdFx0aWYocGwubGVuZ3RoID09IDIpe1xuXHRcdFx0bm9kZS5wcmVmaXggPSBwbFswXTtcblx0XHRcdG5vZGUubG9jYWxOYW1lID0gcGxbMV07XG5cdFx0fWVsc2V7XG5cdFx0XHQvL2VsLnByZWZpeCA9IG51bGw7XG5cdFx0XHRub2RlLmxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0fVxuXHRcdGF0dHJzLl9vd25lckVsZW1lbnQgPSBub2RlO1xuXHRcdHJldHVybiBub2RlO1xuXHR9LFxuXHQvLyBJbnRyb2R1Y2VkIGluIERPTSBMZXZlbCAyOlxuXHRjcmVhdGVBdHRyaWJ1dGVOUyA6XHRmdW5jdGlvbihuYW1lc3BhY2VVUkkscXVhbGlmaWVkTmFtZSl7XG5cdFx0dmFyIG5vZGUgPSBuZXcgQXR0cigpO1xuXHRcdHZhciBwbCA9IHF1YWxpZmllZE5hbWUuc3BsaXQoJzonKTtcblx0XHRub2RlLm93bmVyRG9jdW1lbnQgPSB0aGlzO1xuXHRcdG5vZGUubm9kZU5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdG5vZGUubmFtZSA9IHF1YWxpZmllZE5hbWU7XG5cdFx0bm9kZS5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cdFx0bm9kZS5zcGVjaWZpZWQgPSB0cnVlO1xuXHRcdGlmKHBsLmxlbmd0aCA9PSAyKXtcblx0XHRcdG5vZGUucHJlZml4ID0gcGxbMF07XG5cdFx0XHRub2RlLmxvY2FsTmFtZSA9IHBsWzFdO1xuXHRcdH1lbHNle1xuXHRcdFx0Ly9lbC5wcmVmaXggPSBudWxsO1xuXHRcdFx0bm9kZS5sb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9kZTtcblx0fVxufTtcbl9leHRlbmRzKERvY3VtZW50LE5vZGUpO1xuXG5cbmZ1bmN0aW9uIEVsZW1lbnQoKSB7XG5cdHRoaXMuX25zTWFwID0ge307XG59O1xuRWxlbWVudC5wcm90b3R5cGUgPSB7XG5cdG5vZGVUeXBlIDogRUxFTUVOVF9OT0RFLFxuXHRoYXNBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpIT1udWxsO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTtcblx0XHRyZXR1cm4gYXR0ciAmJiBhdHRyLnZhbHVlIHx8ICcnO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOb2RlIDogZnVuY3Rpb24obmFtZSl7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obmFtZSk7XG5cdH0sXG5cdHNldEF0dHJpYnV0ZSA6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0YXR0ci52YWx1ZSA9IGF0dHIubm9kZVZhbHVlID0gXCJcIiArIHZhbHVlO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlTm9kZShhdHRyKVxuXHR9LFxuXHRyZW1vdmVBdHRyaWJ1dGUgOiBmdW5jdGlvbihuYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZShuYW1lKVxuXHRcdGF0dHIgJiYgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpO1xuXHR9LFxuXHRcblx0Ly9mb3VyIHJlYWwgb3BlYXJ0aW9uIG1ldGhvZFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0aWYobmV3Q2hpbGQubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe1xuXHRcdFx0cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLG51bGwpO1xuXHRcdH1lbHNle1xuXHRcdFx0cmV0dXJuIF9hcHBlbmRTaW5nbGVDaGlsZCh0aGlzLG5ld0NoaWxkKTtcblx0XHR9XG5cdH0sXG5cdHNldEF0dHJpYnV0ZU5vZGUgOiBmdW5jdGlvbihuZXdBdHRyKXtcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShuZXdBdHRyKTtcblx0fSxcblx0c2V0QXR0cmlidXRlTm9kZU5TIDogZnVuY3Rpb24obmV3QXR0cil7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5zZXROYW1lZEl0ZW1OUyhuZXdBdHRyKTtcblx0fSxcblx0cmVtb3ZlQXR0cmlidXRlTm9kZSA6IGZ1bmN0aW9uKG9sZEF0dHIpe1xuXHRcdC8vY29uc29sZS5sb2codGhpcyA9PSBvbGRBdHRyLm93bmVyRWxlbWVudClcblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShvbGRBdHRyLm5vZGVOYW1lKTtcblx0fSxcblx0Ly9nZXQgcmVhbCBhdHRyaWJ1dGUgbmFtZSxhbmQgcmVtb3ZlIGl0IGJ5IHJlbW92ZUF0dHJpYnV0ZU5vZGVcblx0cmVtb3ZlQXR0cmlidXRlTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0dmFyIG9sZCA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTtcblx0XHRvbGQgJiYgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZCk7XG5cdH0sXG5cdFxuXHRoYXNBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpIT1udWxsO1xuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKXtcblx0XHR2YXIgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTtcblx0XHRyZXR1cm4gYXR0ciAmJiBhdHRyLnZhbHVlIHx8ICcnO1xuXHR9LFxuXHRzZXRBdHRyaWJ1dGVOUyA6IGZ1bmN0aW9uKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpe1xuXHRcdHZhciBhdHRyID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7XG5cdFx0YXR0ci52YWx1ZSA9IGF0dHIubm9kZVZhbHVlID0gXCJcIiArIHZhbHVlO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlTm9kZShhdHRyKVxuXHR9LFxuXHRnZXRBdHRyaWJ1dGVOb2RlTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7XG5cdH0sXG5cdFxuXHRnZXRFbGVtZW50c0J5VGFnTmFtZSA6IGZ1bmN0aW9uKHRhZ05hbWUpe1xuXHRcdHJldHVybiBuZXcgTGl2ZU5vZGVMaXN0KHRoaXMsZnVuY3Rpb24oYmFzZSl7XG5cdFx0XHR2YXIgbHMgPSBbXTtcblx0XHRcdF92aXNpdE5vZGUoYmFzZSxmdW5jdGlvbihub2RlKXtcblx0XHRcdFx0aWYobm9kZSAhPT0gYmFzZSAmJiBub2RlLm5vZGVUeXBlID09IEVMRU1FTlRfTk9ERSAmJiAodGFnTmFtZSA9PT0gJyonIHx8IG5vZGUudGFnTmFtZSA9PSB0YWdOYW1lKSl7XG5cdFx0XHRcdFx0bHMucHVzaChub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gbHM7XG5cdFx0fSk7XG5cdH0sXG5cdGdldEVsZW1lbnRzQnlUYWdOYW1lTlMgOiBmdW5jdGlvbihuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSl7XG5cdFx0cmV0dXJuIG5ldyBMaXZlTm9kZUxpc3QodGhpcyxmdW5jdGlvbihiYXNlKXtcblx0XHRcdHZhciBscyA9IFtdO1xuXHRcdFx0X3Zpc2l0Tm9kZShiYXNlLGZ1bmN0aW9uKG5vZGUpe1xuXHRcdFx0XHRpZihub2RlICE9PSBiYXNlICYmIG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiAobmFtZXNwYWNlVVJJID09PSAnKicgfHwgbm9kZS5uYW1lc3BhY2VVUkkgPT09IG5hbWVzcGFjZVVSSSkgJiYgKGxvY2FsTmFtZSA9PT0gJyonIHx8IG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSkpe1xuXHRcdFx0XHRcdGxzLnB1c2gobm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGxzO1xuXHRcdFx0XG5cdFx0fSk7XG5cdH1cbn07XG5Eb2N1bWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBFbGVtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZTtcbkRvY3VtZW50LnByb3RvdHlwZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TID0gRWxlbWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUztcblxuXG5fZXh0ZW5kcyhFbGVtZW50LE5vZGUpO1xuZnVuY3Rpb24gQXR0cigpIHtcbn07XG5BdHRyLnByb3RvdHlwZS5ub2RlVHlwZSA9IEFUVFJJQlVURV9OT0RFO1xuX2V4dGVuZHMoQXR0cixOb2RlKTtcblxuXG5mdW5jdGlvbiBDaGFyYWN0ZXJEYXRhKCkge1xufTtcbkNoYXJhY3RlckRhdGEucHJvdG90eXBlID0ge1xuXHRkYXRhIDogJycsXG5cdHN1YnN0cmluZ0RhdGEgOiBmdW5jdGlvbihvZmZzZXQsIGNvdW50KSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQrY291bnQpO1xuXHR9LFxuXHRhcHBlbmREYXRhOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0dGV4dCA9IHRoaXMuZGF0YSt0ZXh0O1xuXHRcdHRoaXMubm9kZVZhbHVlID0gdGhpcy5kYXRhID0gdGV4dDtcblx0XHR0aGlzLmxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXHR9LFxuXHRpbnNlcnREYXRhOiBmdW5jdGlvbihvZmZzZXQsdGV4dCkge1xuXHRcdHRoaXMucmVwbGFjZURhdGEob2Zmc2V0LDAsdGV4dCk7XG5cdFxuXHR9LFxuXHRhcHBlbmRDaGlsZDpmdW5jdGlvbihuZXdDaGlsZCl7XG5cdFx0dGhyb3cgbmV3IEVycm9yKEV4Y2VwdGlvbk1lc3NhZ2VbSElFUkFSQ0hZX1JFUVVFU1RfRVJSXSlcblx0fSxcblx0ZGVsZXRlRGF0YTogZnVuY3Rpb24ob2Zmc2V0LCBjb3VudCkge1xuXHRcdHRoaXMucmVwbGFjZURhdGEob2Zmc2V0LGNvdW50LFwiXCIpO1xuXHR9LFxuXHRyZXBsYWNlRGF0YTogZnVuY3Rpb24ob2Zmc2V0LCBjb3VudCwgdGV4dCkge1xuXHRcdHZhciBzdGFydCA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCxvZmZzZXQpO1xuXHRcdHZhciBlbmQgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKG9mZnNldCtjb3VudCk7XG5cdFx0dGV4dCA9IHN0YXJ0ICsgdGV4dCArIGVuZDtcblx0XHR0aGlzLm5vZGVWYWx1ZSA9IHRoaXMuZGF0YSA9IHRleHQ7XG5cdFx0dGhpcy5sZW5ndGggPSB0ZXh0Lmxlbmd0aDtcblx0fVxufVxuX2V4dGVuZHMoQ2hhcmFjdGVyRGF0YSxOb2RlKTtcbmZ1bmN0aW9uIFRleHQoKSB7XG59O1xuVGV4dC5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjdGV4dFwiLFxuXHRub2RlVHlwZSA6IFRFWFRfTk9ERSxcblx0c3BsaXRUZXh0IDogZnVuY3Rpb24ob2Zmc2V0KSB7XG5cdFx0dmFyIHRleHQgPSB0aGlzLmRhdGE7XG5cdFx0dmFyIG5ld1RleHQgPSB0ZXh0LnN1YnN0cmluZyhvZmZzZXQpO1xuXHRcdHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBvZmZzZXQpO1xuXHRcdHRoaXMuZGF0YSA9IHRoaXMubm9kZVZhbHVlID0gdGV4dDtcblx0XHR0aGlzLmxlbmd0aCA9IHRleHQubGVuZ3RoO1xuXHRcdHZhciBuZXdOb2RlID0gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld1RleHQpO1xuXHRcdGlmKHRoaXMucGFyZW50Tm9kZSl7XG5cdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXMubmV4dFNpYmxpbmcpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3Tm9kZTtcblx0fVxufVxuX2V4dGVuZHMoVGV4dCxDaGFyYWN0ZXJEYXRhKTtcbmZ1bmN0aW9uIENvbW1lbnQoKSB7XG59O1xuQ29tbWVudC5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjY29tbWVudFwiLFxuXHRub2RlVHlwZSA6IENPTU1FTlRfTk9ERVxufVxuX2V4dGVuZHMoQ29tbWVudCxDaGFyYWN0ZXJEYXRhKTtcblxuZnVuY3Rpb24gQ0RBVEFTZWN0aW9uKCkge1xufTtcbkNEQVRBU2VjdGlvbi5wcm90b3R5cGUgPSB7XG5cdG5vZGVOYW1lIDogXCIjY2RhdGEtc2VjdGlvblwiLFxuXHRub2RlVHlwZSA6IENEQVRBX1NFQ1RJT05fTk9ERVxufVxuX2V4dGVuZHMoQ0RBVEFTZWN0aW9uLENoYXJhY3RlckRhdGEpO1xuXG5cbmZ1bmN0aW9uIERvY3VtZW50VHlwZSgpIHtcbn07XG5Eb2N1bWVudFR5cGUucHJvdG90eXBlLm5vZGVUeXBlID0gRE9DVU1FTlRfVFlQRV9OT0RFO1xuX2V4dGVuZHMoRG9jdW1lbnRUeXBlLE5vZGUpO1xuXG5mdW5jdGlvbiBOb3RhdGlvbigpIHtcbn07XG5Ob3RhdGlvbi5wcm90b3R5cGUubm9kZVR5cGUgPSBOT1RBVElPTl9OT0RFO1xuX2V4dGVuZHMoTm90YXRpb24sTm9kZSk7XG5cbmZ1bmN0aW9uIEVudGl0eSgpIHtcbn07XG5FbnRpdHkucHJvdG90eXBlLm5vZGVUeXBlID0gRU5USVRZX05PREU7XG5fZXh0ZW5kcyhFbnRpdHksTm9kZSk7XG5cbmZ1bmN0aW9uIEVudGl0eVJlZmVyZW5jZSgpIHtcbn07XG5FbnRpdHlSZWZlcmVuY2UucHJvdG90eXBlLm5vZGVUeXBlID0gRU5USVRZX1JFRkVSRU5DRV9OT0RFO1xuX2V4dGVuZHMoRW50aXR5UmVmZXJlbmNlLE5vZGUpO1xuXG5mdW5jdGlvbiBEb2N1bWVudEZyYWdtZW50KCkge1xufTtcbkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLm5vZGVOYW1lID1cdFwiI2RvY3VtZW50LWZyYWdtZW50XCI7XG5Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5ub2RlVHlwZSA9XHRET0NVTUVOVF9GUkFHTUVOVF9OT0RFO1xuX2V4dGVuZHMoRG9jdW1lbnRGcmFnbWVudCxOb2RlKTtcblxuXG5mdW5jdGlvbiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKSB7XG59XG5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ucHJvdG90eXBlLm5vZGVUeXBlID0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFO1xuX2V4dGVuZHMoUHJvY2Vzc2luZ0luc3RydWN0aW9uLE5vZGUpO1xuZnVuY3Rpb24gWE1MU2VyaWFsaXplcigpe31cblhNTFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVRvU3RyaW5nID0gZnVuY3Rpb24obm9kZSxpc0h0bWwsbm9kZUZpbHRlcil7XG5cdHJldHVybiBub2RlU2VyaWFsaXplVG9TdHJpbmcuY2FsbChub2RlLGlzSHRtbCxub2RlRmlsdGVyKTtcbn1cbk5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gbm9kZVNlcmlhbGl6ZVRvU3RyaW5nO1xuZnVuY3Rpb24gbm9kZVNlcmlhbGl6ZVRvU3RyaW5nKGlzSHRtbCxub2RlRmlsdGVyKXtcblx0dmFyIGJ1ZiA9IFtdO1xuXHR2YXIgcmVmTm9kZSA9IHRoaXMubm9kZVR5cGUgPT0gOT90aGlzLmRvY3VtZW50RWxlbWVudDp0aGlzO1xuXHR2YXIgcHJlZml4ID0gcmVmTm9kZS5wcmVmaXg7XG5cdHZhciB1cmkgPSByZWZOb2RlLm5hbWVzcGFjZVVSSTtcblx0XG5cdGlmKHVyaSAmJiBwcmVmaXggPT0gbnVsbCl7XG5cdFx0Ly9jb25zb2xlLmxvZyhwcmVmaXgpXG5cdFx0dmFyIHByZWZpeCA9IHJlZk5vZGUubG9va3VwUHJlZml4KHVyaSk7XG5cdFx0aWYocHJlZml4ID09IG51bGwpe1xuXHRcdFx0Ly9pc0hUTUwgPSB0cnVlO1xuXHRcdFx0dmFyIHZpc2libGVOYW1lc3BhY2VzPVtcblx0XHRcdHtuYW1lc3BhY2U6dXJpLHByZWZpeDpudWxsfVxuXHRcdFx0Ly97bmFtZXNwYWNlOnVyaSxwcmVmaXg6Jyd9XG5cdFx0XHRdXG5cdFx0fVxuXHR9XG5cdHNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMsYnVmLGlzSHRtbCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKTtcblx0Ly9jb25zb2xlLmxvZygnIyMjJyx0aGlzLm5vZGVUeXBlLHVyaSxwcmVmaXgsYnVmLmpvaW4oJycpKVxuXHRyZXR1cm4gYnVmLmpvaW4oJycpO1xufVxuZnVuY3Rpb24gbmVlZE5hbWVzcGFjZURlZmluZShub2RlLGlzSFRNTCwgdmlzaWJsZU5hbWVzcGFjZXMpIHtcblx0dmFyIHByZWZpeCA9IG5vZGUucHJlZml4fHwnJztcblx0dmFyIHVyaSA9IG5vZGUubmFtZXNwYWNlVVJJO1xuXHRpZiAoIXByZWZpeCAmJiAhdXJpKXtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHByZWZpeCA9PT0gXCJ4bWxcIiAmJiB1cmkgPT09IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIgXG5cdFx0fHwgdXJpID09ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycpe1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRcblx0dmFyIGkgPSB2aXNpYmxlTmFtZXNwYWNlcy5sZW5ndGggXG5cdC8vY29uc29sZS5sb2coJ0BAQEAnLG5vZGUudGFnTmFtZSxwcmVmaXgsdXJpLHZpc2libGVOYW1lc3BhY2VzKVxuXHR3aGlsZSAoaS0tKSB7XG5cdFx0dmFyIG5zID0gdmlzaWJsZU5hbWVzcGFjZXNbaV07XG5cdFx0Ly8gZ2V0IG5hbWVzcGFjZSBwcmVmaXhcblx0XHQvL2NvbnNvbGUubG9nKG5vZGUubm9kZVR5cGUsbm9kZS50YWdOYW1lLG5zLnByZWZpeCxwcmVmaXgpXG5cdFx0aWYgKG5zLnByZWZpeCA9PSBwcmVmaXgpe1xuXHRcdFx0cmV0dXJuIG5zLm5hbWVzcGFjZSAhPSB1cmk7XG5cdFx0fVxuXHR9XG5cdC8vY29uc29sZS5sb2coaXNIVE1MLHVyaSxwcmVmaXg9PScnKVxuXHQvL2lmKGlzSFRNTCAmJiBwcmVmaXggPT1udWxsICYmIHVyaSA9PSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcpe1xuXHQvL1x0cmV0dXJuIGZhbHNlO1xuXHQvL31cblx0Ly9ub2RlLmZsYWcgPSAnMTExMTEnXG5cdC8vY29uc29sZS5lcnJvcigzLHRydWUsbm9kZS5mbGFnLG5vZGUucHJlZml4LG5vZGUubmFtZXNwYWNlVVJJKVxuXHRyZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUsYnVmLGlzSFRNTCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKXtcblx0aWYobm9kZUZpbHRlcil7XG5cdFx0bm9kZSA9IG5vZGVGaWx0ZXIobm9kZSk7XG5cdFx0aWYobm9kZSl7XG5cdFx0XHRpZih0eXBlb2Ygbm9kZSA9PSAnc3RyaW5nJyl7XG5cdFx0XHRcdGJ1Zi5wdXNoKG5vZGUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fWVsc2V7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vYnVmLnNvcnQuYXBwbHkoYXR0cnMsIGF0dHJpYnV0ZVNvcnRlcik7XG5cdH1cblx0c3dpdGNoKG5vZGUubm9kZVR5cGUpe1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRpZiAoIXZpc2libGVOYW1lc3BhY2VzKSB2aXNpYmxlTmFtZXNwYWNlcyA9IFtdO1xuXHRcdHZhciBzdGFydFZpc2libGVOYW1lc3BhY2VzID0gdmlzaWJsZU5hbWVzcGFjZXMubGVuZ3RoO1xuXHRcdHZhciBhdHRycyA9IG5vZGUuYXR0cmlidXRlcztcblx0XHR2YXIgbGVuID0gYXR0cnMubGVuZ3RoO1xuXHRcdHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblx0XHR2YXIgbm9kZU5hbWUgPSBub2RlLnRhZ05hbWU7XG5cdFx0XG5cdFx0aXNIVE1MID0gIChodG1sbnMgPT09IG5vZGUubmFtZXNwYWNlVVJJKSB8fGlzSFRNTCBcblx0XHRidWYucHVzaCgnPCcsbm9kZU5hbWUpO1xuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdGZvcih2YXIgaT0wO2k8bGVuO2krKyl7XG5cdFx0XHQvLyBhZGQgbmFtZXNwYWNlcyBmb3IgYXR0cmlidXRlc1xuXHRcdFx0dmFyIGF0dHIgPSBhdHRycy5pdGVtKGkpO1xuXHRcdFx0aWYgKGF0dHIucHJlZml4ID09ICd4bWxucycpIHtcblx0XHRcdFx0dmlzaWJsZU5hbWVzcGFjZXMucHVzaCh7IHByZWZpeDogYXR0ci5sb2NhbE5hbWUsIG5hbWVzcGFjZTogYXR0ci52YWx1ZSB9KTtcblx0XHRcdH1lbHNlIGlmKGF0dHIubm9kZU5hbWUgPT0gJ3htbG5zJyl7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6ICcnLCBuYW1lc3BhY2U6IGF0dHIudmFsdWUgfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvcih2YXIgaT0wO2k8bGVuO2krKyl7XG5cdFx0XHR2YXIgYXR0ciA9IGF0dHJzLml0ZW0oaSk7XG5cdFx0XHRpZiAobmVlZE5hbWVzcGFjZURlZmluZShhdHRyLGlzSFRNTCwgdmlzaWJsZU5hbWVzcGFjZXMpKSB7XG5cdFx0XHRcdHZhciBwcmVmaXggPSBhdHRyLnByZWZpeHx8Jyc7XG5cdFx0XHRcdHZhciB1cmkgPSBhdHRyLm5hbWVzcGFjZVVSSTtcblx0XHRcdFx0dmFyIG5zID0gcHJlZml4ID8gJyB4bWxuczonICsgcHJlZml4IDogXCIgeG1sbnNcIjtcblx0XHRcdFx0YnVmLnB1c2gobnMsICc9XCInICwgdXJpICwgJ1wiJyk7XG5cdFx0XHRcdHZpc2libGVOYW1lc3BhY2VzLnB1c2goeyBwcmVmaXg6IHByZWZpeCwgbmFtZXNwYWNlOnVyaSB9KTtcblx0XHRcdH1cblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGF0dHIsYnVmLGlzSFRNTCxub2RlRmlsdGVyLHZpc2libGVOYW1lc3BhY2VzKTtcblx0XHR9XG5cdFx0Ly8gYWRkIG5hbWVzcGFjZSBmb3IgY3VycmVudCBub2RlXHRcdFxuXHRcdGlmIChuZWVkTmFtZXNwYWNlRGVmaW5lKG5vZGUsaXNIVE1MLCB2aXNpYmxlTmFtZXNwYWNlcykpIHtcblx0XHRcdHZhciBwcmVmaXggPSBub2RlLnByZWZpeHx8Jyc7XG5cdFx0XHR2YXIgdXJpID0gbm9kZS5uYW1lc3BhY2VVUkk7XG5cdFx0XHR2YXIgbnMgPSBwcmVmaXggPyAnIHhtbG5zOicgKyBwcmVmaXggOiBcIiB4bWxuc1wiO1xuXHRcdFx0YnVmLnB1c2gobnMsICc9XCInICwgdXJpICwgJ1wiJyk7XG5cdFx0XHR2aXNpYmxlTmFtZXNwYWNlcy5wdXNoKHsgcHJlZml4OiBwcmVmaXgsIG5hbWVzcGFjZTp1cmkgfSk7XG5cdFx0fVxuXHRcdFxuXHRcdGlmKGNoaWxkIHx8IGlzSFRNTCAmJiAhL14oPzptZXRhfGxpbmt8aW1nfGJyfGhyfGlucHV0KSQvaS50ZXN0KG5vZGVOYW1lKSl7XG5cdFx0XHRidWYucHVzaCgnPicpO1xuXHRcdFx0Ly9pZiBpcyBjZGF0YSBjaGlsZCBub2RlXG5cdFx0XHRpZihpc0hUTUwgJiYgL15zY3JpcHQkL2kudGVzdChub2RlTmFtZSkpe1xuXHRcdFx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRcdFx0aWYoY2hpbGQuZGF0YSl7XG5cdFx0XHRcdFx0XHRidWYucHVzaChjaGlsZC5kYXRhKTtcblx0XHRcdFx0XHR9ZWxzZXtcblx0XHRcdFx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGNoaWxkLGJ1Zixpc0hUTUwsbm9kZUZpbHRlcix2aXNpYmxlTmFtZXNwYWNlcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1lbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdFx0XHRzZXJpYWxpemVUb1N0cmluZyhjaGlsZCxidWYsaXNIVE1MLG5vZGVGaWx0ZXIsdmlzaWJsZU5hbWVzcGFjZXMpO1xuXHRcdFx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGJ1Zi5wdXNoKCc8Lycsbm9kZU5hbWUsJz4nKTtcblx0XHR9ZWxzZXtcblx0XHRcdGJ1Zi5wdXNoKCcvPicpO1xuXHRcdH1cblx0XHQvLyByZW1vdmUgYWRkZWQgdmlzaWJsZSBuYW1lc3BhY2VzXG5cdFx0Ly92aXNpYmxlTmFtZXNwYWNlcy5sZW5ndGggPSBzdGFydFZpc2libGVOYW1lc3BhY2VzO1xuXHRcdHJldHVybjtcblx0Y2FzZSBET0NVTUVOVF9OT0RFOlxuXHRjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG5cdFx0dmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdHNlcmlhbGl6ZVRvU3RyaW5nKGNoaWxkLGJ1Zixpc0hUTUwsbm9kZUZpbHRlcix2aXNpYmxlTmFtZXNwYWNlcyk7XG5cdFx0XHRjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdGNhc2UgQVRUUklCVVRFX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCcgJyxub2RlLm5hbWUsJz1cIicsbm9kZS52YWx1ZS5yZXBsYWNlKC9bPCZcIl0vZyxfeG1sRW5jb2RlciksJ1wiJyk7XG5cdGNhc2UgVEVYVF9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaChub2RlLmRhdGEucmVwbGFjZSgvWzwmXS9nLF94bWxFbmNvZGVyKSk7XG5cdGNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJzwhW0NEQVRBWycsbm9kZS5kYXRhLCddXT4nKTtcblx0Y2FzZSBDT01NRU5UX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjwhLS1cIixub2RlLmRhdGEsXCItLT5cIik7XG5cdGNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHRcdHZhciBwdWJpZCA9IG5vZGUucHVibGljSWQ7XG5cdFx0dmFyIHN5c2lkID0gbm9kZS5zeXN0ZW1JZDtcblx0XHRidWYucHVzaCgnPCFET0NUWVBFICcsbm9kZS5uYW1lKTtcblx0XHRpZihwdWJpZCl7XG5cdFx0XHRidWYucHVzaCgnIFBVQkxJQyBcIicscHViaWQpO1xuXHRcdFx0aWYgKHN5c2lkICYmIHN5c2lkIT0nLicpIHtcblx0XHRcdFx0YnVmLnB1c2goICdcIiBcIicsc3lzaWQpO1xuXHRcdFx0fVxuXHRcdFx0YnVmLnB1c2goJ1wiPicpO1xuXHRcdH1lbHNlIGlmKHN5c2lkICYmIHN5c2lkIT0nLicpe1xuXHRcdFx0YnVmLnB1c2goJyBTWVNURU0gXCInLHN5c2lkLCdcIj4nKTtcblx0XHR9ZWxzZXtcblx0XHRcdHZhciBzdWIgPSBub2RlLmludGVybmFsU3Vic2V0O1xuXHRcdFx0aWYoc3ViKXtcblx0XHRcdFx0YnVmLnB1c2goXCIgW1wiLHN1YixcIl1cIik7XG5cdFx0XHR9XG5cdFx0XHRidWYucHVzaChcIj5cIik7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0Y2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6XG5cdFx0cmV0dXJuIGJ1Zi5wdXNoKCBcIjw/XCIsbm9kZS50YXJnZXQsXCIgXCIsbm9kZS5kYXRhLFwiPz5cIik7XG5cdGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOlxuXHRcdHJldHVybiBidWYucHVzaCggJyYnLG5vZGUubm9kZU5hbWUsJzsnKTtcblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERTpcblx0ZGVmYXVsdDpcblx0XHRidWYucHVzaCgnPz8nLG5vZGUubm9kZU5hbWUpO1xuXHR9XG59XG5mdW5jdGlvbiBpbXBvcnROb2RlKGRvYyxub2RlLGRlZXApe1xuXHR2YXIgbm9kZTI7XG5cdHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuXHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRub2RlMiA9IG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcblx0XHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRcdC8vdmFyIGF0dHJzID0gbm9kZTIuYXR0cmlidXRlcztcblx0XHQvL3ZhciBsZW4gPSBhdHRycy5sZW5ndGg7XG5cdFx0Ly9mb3IodmFyIGk9MDtpPGxlbjtpKyspe1xuXHRcdFx0Ly9ub2RlMi5zZXRBdHRyaWJ1dGVOb2RlTlMoaW1wb3J0Tm9kZShkb2MsYXR0cnMuaXRlbShpKSxkZWVwKSk7XG5cdFx0Ly99XG5cdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRicmVhaztcblx0Y2FzZSBBVFRSSUJVVEVfTk9ERTpcblx0XHRkZWVwID0gdHJ1ZTtcblx0XHRicmVhaztcblx0Ly9jYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTpcblx0Ly9jYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTpcblx0Ly8vL2Nhc2UgVEVYVF9OT0RFOlxuXHQvL2Nhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOlxuXHQvL2Nhc2UgQ09NTUVOVF9OT0RFOlxuXHQvL1x0ZGVlcCA9IGZhbHNlO1xuXHQvL1x0YnJlYWs7XG5cdC8vY2FzZSBET0NVTUVOVF9OT0RFOlxuXHQvL2Nhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOlxuXHQvL2Nhbm5vdCBiZSBpbXBvcnRlZC5cblx0Ly9jYXNlIEVOVElUWV9OT0RFOlxuXHQvL2Nhc2UgTk9UQVRJT05fTk9ERe+8mlxuXHQvL2NhbiBub3QgaGl0IGluIGxldmVsM1xuXHQvL2RlZmF1bHQ6dGhyb3cgZTtcblx0fVxuXHRpZighbm9kZTIpe1xuXHRcdG5vZGUyID0gbm9kZS5jbG9uZU5vZGUoZmFsc2UpOy8vZmFsc2Vcblx0fVxuXHRub2RlMi5vd25lckRvY3VtZW50ID0gZG9jO1xuXHRub2RlMi5wYXJlbnROb2RlID0gbnVsbDtcblx0aWYoZGVlcCl7XG5cdFx0dmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdHdoaWxlKGNoaWxkKXtcblx0XHRcdG5vZGUyLmFwcGVuZENoaWxkKGltcG9ydE5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cbi8vXG4vL3ZhciBfcmVsYXRpb25NYXAgPSB7Zmlyc3RDaGlsZDoxLGxhc3RDaGlsZDoxLHByZXZpb3VzU2libGluZzoxLG5leHRTaWJsaW5nOjEsXG4vL1x0XHRcdFx0XHRhdHRyaWJ1dGVzOjEsY2hpbGROb2RlczoxLHBhcmVudE5vZGU6MSxkb2N1bWVudEVsZW1lbnQ6MSxkb2N0eXBlLH07XG5mdW5jdGlvbiBjbG9uZU5vZGUoZG9jLG5vZGUsZGVlcCl7XG5cdHZhciBub2RlMiA9IG5ldyBub2RlLmNvbnN0cnVjdG9yKCk7XG5cdGZvcih2YXIgbiBpbiBub2RlKXtcblx0XHR2YXIgdiA9IG5vZGVbbl07XG5cdFx0aWYodHlwZW9mIHYgIT0gJ29iamVjdCcgKXtcblx0XHRcdGlmKHYgIT0gbm9kZTJbbl0pe1xuXHRcdFx0XHRub2RlMltuXSA9IHY7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGlmKG5vZGUuY2hpbGROb2Rlcyl7XG5cdFx0bm9kZTIuY2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdCgpO1xuXHR9XG5cdG5vZGUyLm93bmVyRG9jdW1lbnQgPSBkb2M7XG5cdHN3aXRjaCAobm9kZTIubm9kZVR5cGUpIHtcblx0Y2FzZSBFTEVNRU5UX05PREU6XG5cdFx0dmFyIGF0dHJzXHQ9IG5vZGUuYXR0cmlidXRlcztcblx0XHR2YXIgYXR0cnMyXHQ9IG5vZGUyLmF0dHJpYnV0ZXMgPSBuZXcgTmFtZWROb2RlTWFwKCk7XG5cdFx0dmFyIGxlbiA9IGF0dHJzLmxlbmd0aFxuXHRcdGF0dHJzMi5fb3duZXJFbGVtZW50ID0gbm9kZTI7XG5cdFx0Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtcblx0XHRcdG5vZGUyLnNldEF0dHJpYnV0ZU5vZGUoY2xvbmVOb2RlKGRvYyxhdHRycy5pdGVtKGkpLHRydWUpKTtcblx0XHR9XG5cdFx0YnJlYWs7O1xuXHRjYXNlIEFUVFJJQlVURV9OT0RFOlxuXHRcdGRlZXAgPSB0cnVlO1xuXHR9XG5cdGlmKGRlZXApe1xuXHRcdHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblx0XHR3aGlsZShjaGlsZCl7XG5cdFx0XHRub2RlMi5hcHBlbmRDaGlsZChjbG9uZU5vZGUoZG9jLGNoaWxkLGRlZXApKTtcblx0XHRcdGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBub2RlMjtcbn1cblxuZnVuY3Rpb24gX19zZXRfXyhvYmplY3Qsa2V5LHZhbHVlKXtcblx0b2JqZWN0W2tleV0gPSB2YWx1ZVxufVxuLy9kbyBkeW5hbWljXG50cnl7XG5cdGlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KExpdmVOb2RlTGlzdC5wcm90b3R5cGUsJ2xlbmd0aCcse1xuXHRcdFx0Z2V0OmZ1bmN0aW9uKCl7XG5cdFx0XHRcdF91cGRhdGVMaXZlTGlzdCh0aGlzKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuJCRsZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KE5vZGUucHJvdG90eXBlLCd0ZXh0Q29udGVudCcse1xuXHRcdFx0Z2V0OmZ1bmN0aW9uKCl7XG5cdFx0XHRcdHJldHVybiBnZXRUZXh0Q29udGVudCh0aGlzKTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6ZnVuY3Rpb24oZGF0YSl7XG5cdFx0XHRcdHN3aXRjaCh0aGlzLm5vZGVUeXBlKXtcblx0XHRcdFx0Y2FzZSBFTEVNRU5UX05PREU6XG5cdFx0XHRcdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRcdFx0XHR3aGlsZSh0aGlzLmZpcnN0Q2hpbGQpe1xuXHRcdFx0XHRcdFx0dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZihkYXRhIHx8IFN0cmluZyhkYXRhKSl7XG5cdFx0XHRcdFx0XHR0aGlzLmFwcGVuZENoaWxkKHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdC8vVE9ETzpcblx0XHRcdFx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHRcdFx0XHRcdHRoaXMudmFsdWUgPSBkYXRhO1xuXHRcdFx0XHRcdHRoaXMubm9kZVZhbHVlID0gZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pXG5cdFx0XG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnQobm9kZSl7XG5cdFx0XHRzd2l0Y2gobm9kZS5ub2RlVHlwZSl7XG5cdFx0XHRjYXNlIEVMRU1FTlRfTk9ERTpcblx0XHRcdGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcblx0XHRcdFx0dmFyIGJ1ZiA9IFtdO1xuXHRcdFx0XHRub2RlID0gbm9kZS5maXJzdENoaWxkO1xuXHRcdFx0XHR3aGlsZShub2RlKXtcblx0XHRcdFx0XHRpZihub2RlLm5vZGVUeXBlIT09NyAmJiBub2RlLm5vZGVUeXBlICE9PTgpe1xuXHRcdFx0XHRcdFx0YnVmLnB1c2goZ2V0VGV4dENvbnRlbnQobm9kZSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRub2RlID0gbm9kZS5uZXh0U2libGluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gYnVmLmpvaW4oJycpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIG5vZGUubm9kZVZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRfX3NldF9fID0gZnVuY3Rpb24ob2JqZWN0LGtleSx2YWx1ZSl7XG5cdFx0XHQvL2NvbnNvbGUubG9nKHZhbHVlKVxuXHRcdFx0b2JqZWN0WyckJCcra2V5XSA9IHZhbHVlXG5cdFx0fVxuXHR9XG59Y2F0Y2goZSl7Ly9pZThcbn1cblxuLy9pZih0eXBlb2YgcmVxdWlyZSA9PSAnZnVuY3Rpb24nKXtcblx0ZXhwb3J0cy5ET01JbXBsZW1lbnRhdGlvbiA9IERPTUltcGxlbWVudGF0aW9uO1xuXHRleHBvcnRzLlhNTFNlcmlhbGl6ZXIgPSBYTUxTZXJpYWxpemVyO1xuLy99XG4iLCIvL1s0XSAgIFx0TmFtZVN0YXJ0Q2hhclx0ICAgOjo9ICAgXHRcIjpcIiB8IFtBLVpdIHwgXCJfXCIgfCBbYS16XSB8IFsjeEMwLSN4RDZdIHwgWyN4RDgtI3hGNl0gfCBbI3hGOC0jeDJGRl0gfCBbI3gzNzAtI3gzN0RdIHwgWyN4MzdGLSN4MUZGRl0gfCBbI3gyMDBDLSN4MjAwRF0gfCBbI3gyMDcwLSN4MjE4Rl0gfCBbI3gyQzAwLSN4MkZFRl0gfCBbI3gzMDAxLSN4RDdGRl0gfCBbI3hGOTAwLSN4RkRDRl0gfCBbI3hGREYwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeEVGRkZGXVxyXG4vL1s0YV0gICBcdE5hbWVDaGFyXHQgICA6Oj0gICBcdE5hbWVTdGFydENoYXIgfCBcIi1cIiB8IFwiLlwiIHwgWzAtOV0gfCAjeEI3IHwgWyN4MDMwMC0jeDAzNkZdIHwgWyN4MjAzRi0jeDIwNDBdXHJcbi8vWzVdICAgXHROYW1lXHQgICA6Oj0gICBcdE5hbWVTdGFydENoYXIgKE5hbWVDaGFyKSpcclxudmFyIG5hbWVTdGFydENoYXIgPSAvW0EtWl9hLXpcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXS8vL1xcdTEwMDAwLVxcdUVGRkZGXHJcbnZhciBuYW1lQ2hhciA9IG5ldyBSZWdFeHAoXCJbXFxcXC1cXFxcLjAtOVwiK25hbWVTdGFydENoYXIuc291cmNlLnNsaWNlKDEsLTEpK1wiXFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdXCIpO1xyXG52YXIgdGFnTmFtZVBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeJytuYW1lU3RhcnRDaGFyLnNvdXJjZStuYW1lQ2hhci5zb3VyY2UrJyooPzpcXDonK25hbWVTdGFydENoYXIuc291cmNlK25hbWVDaGFyLnNvdXJjZSsnKik/JCcpO1xyXG4vL3ZhciB0YWdOYW1lUGF0dGVybiA9IC9eW2EtekEtWl9dW1xcd1xcLVxcLl0qKD86XFw6W2EtekEtWl9dW1xcd1xcLVxcLl0qKT8kL1xyXG4vL3ZhciBoYW5kbGVycyA9ICdyZXNvbHZlRW50aXR5LGdldEV4dGVybmFsU3Vic2V0LGNoYXJhY3RlcnMsZW5kRG9jdW1lbnQsZW5kRWxlbWVudCxlbmRQcmVmaXhNYXBwaW5nLGlnbm9yYWJsZVdoaXRlc3BhY2UscHJvY2Vzc2luZ0luc3RydWN0aW9uLHNldERvY3VtZW50TG9jYXRvcixza2lwcGVkRW50aXR5LHN0YXJ0RG9jdW1lbnQsc3RhcnRFbGVtZW50LHN0YXJ0UHJlZml4TWFwcGluZyxub3RhdGlvbkRlY2wsdW5wYXJzZWRFbnRpdHlEZWNsLGVycm9yLGZhdGFsRXJyb3Isd2FybmluZyxhdHRyaWJ1dGVEZWNsLGVsZW1lbnREZWNsLGV4dGVybmFsRW50aXR5RGVjbCxpbnRlcm5hbEVudGl0eURlY2wsY29tbWVudCxlbmRDREFUQSxlbmREVEQsZW5kRW50aXR5LHN0YXJ0Q0RBVEEsc3RhcnREVEQsc3RhcnRFbnRpdHknLnNwbGl0KCcsJylcclxuXHJcbi8vU19UQUcsXHRTX0FUVFIsXHRTX0VRLFx0U19BVFRSX05PUVVPVF9WQUxVRVxyXG4vL1NfQVRUUl9TUEFDRSxcdFNfQVRUUl9FTkQsXHRTX1RBR19TUEFDRSwgU19UQUdfQ0xPU0VcclxudmFyIFNfVEFHID0gMDsvL3RhZyBuYW1lIG9mZmVycmluZ1xyXG52YXIgU19BVFRSID0gMTsvL2F0dHIgbmFtZSBvZmZlcnJpbmcgXHJcbnZhciBTX0FUVFJfU1BBQ0U9MjsvL2F0dHIgbmFtZSBlbmQgYW5kIHNwYWNlIG9mZmVyXHJcbnZhciBTX0VRID0gMzsvLz1zcGFjZT9cclxudmFyIFNfQVRUUl9OT1FVT1RfVkFMVUUgPSA0Oy8vYXR0ciB2YWx1ZShubyBxdW90IHZhbHVlIG9ubHkpXHJcbnZhciBTX0FUVFJfRU5EID0gNTsvL2F0dHIgdmFsdWUgZW5kIGFuZCBubyBzcGFjZShxdW90IGVuZClcclxudmFyIFNfVEFHX1NQQUNFID0gNjsvLyhhdHRyIHZhbHVlIGVuZCB8fCB0YWcgZW5kICkgJiYgKHNwYWNlIG9mZmVyKVxyXG52YXIgU19UQUdfQ0xPU0UgPSA3Oy8vY2xvc2VkIGVsPGVsIC8+XHJcblxyXG5mdW5jdGlvbiBYTUxSZWFkZXIoKXtcclxuXHRcclxufVxyXG5cclxuWE1MUmVhZGVyLnByb3RvdHlwZSA9IHtcclxuXHRwYXJzZTpmdW5jdGlvbihzb3VyY2UsZGVmYXVsdE5TTWFwLGVudGl0eU1hcCl7XHJcblx0XHR2YXIgZG9tQnVpbGRlciA9IHRoaXMuZG9tQnVpbGRlcjtcclxuXHRcdGRvbUJ1aWxkZXIuc3RhcnREb2N1bWVudCgpO1xyXG5cdFx0X2NvcHkoZGVmYXVsdE5TTWFwICxkZWZhdWx0TlNNYXAgPSB7fSlcclxuXHRcdHBhcnNlKHNvdXJjZSxkZWZhdWx0TlNNYXAsZW50aXR5TWFwLFxyXG5cdFx0XHRcdGRvbUJ1aWxkZXIsdGhpcy5lcnJvckhhbmRsZXIpO1xyXG5cdFx0ZG9tQnVpbGRlci5lbmREb2N1bWVudCgpO1xyXG5cdH1cclxufVxyXG5mdW5jdGlvbiBwYXJzZShzb3VyY2UsZGVmYXVsdE5TTWFwQ29weSxlbnRpdHlNYXAsZG9tQnVpbGRlcixlcnJvckhhbmRsZXIpe1xyXG5cdGZ1bmN0aW9uIGZpeGVkRnJvbUNoYXJDb2RlKGNvZGUpIHtcclxuXHRcdC8vIFN0cmluZy5wcm90b3R5cGUuZnJvbUNoYXJDb2RlIGRvZXMgbm90IHN1cHBvcnRzXHJcblx0XHQvLyA+IDIgYnl0ZXMgdW5pY29kZSBjaGFycyBkaXJlY3RseVxyXG5cdFx0aWYgKGNvZGUgPiAweGZmZmYpIHtcclxuXHRcdFx0Y29kZSAtPSAweDEwMDAwO1xyXG5cdFx0XHR2YXIgc3Vycm9nYXRlMSA9IDB4ZDgwMCArIChjb2RlID4+IDEwKVxyXG5cdFx0XHRcdCwgc3Vycm9nYXRlMiA9IDB4ZGMwMCArIChjb2RlICYgMHgzZmYpO1xyXG5cclxuXHRcdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3Vycm9nYXRlMSwgc3Vycm9nYXRlMik7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcclxuXHRcdH1cclxuXHR9XHJcblx0ZnVuY3Rpb24gZW50aXR5UmVwbGFjZXIoYSl7XHJcblx0XHR2YXIgayA9IGEuc2xpY2UoMSwtMSk7XHJcblx0XHRpZihrIGluIGVudGl0eU1hcCl7XHJcblx0XHRcdHJldHVybiBlbnRpdHlNYXBba107IFxyXG5cdFx0fWVsc2UgaWYoay5jaGFyQXQoMCkgPT09ICcjJyl7XHJcblx0XHRcdHJldHVybiBmaXhlZEZyb21DaGFyQ29kZShwYXJzZUludChrLnN1YnN0cigxKS5yZXBsYWNlKCd4JywnMHgnKSkpXHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCdlbnRpdHkgbm90IGZvdW5kOicrYSk7XHJcblx0XHRcdHJldHVybiBhO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRmdW5jdGlvbiBhcHBlbmRUZXh0KGVuZCl7Ly9oYXMgc29tZSBidWdzXHJcblx0XHRpZihlbmQ+c3RhcnQpe1xyXG5cdFx0XHR2YXIgeHQgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkucmVwbGFjZSgvJiM/XFx3KzsvZyxlbnRpdHlSZXBsYWNlcik7XHJcblx0XHRcdGxvY2F0b3ImJnBvc2l0aW9uKHN0YXJ0KTtcclxuXHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHh0LDAsZW5kLXN0YXJ0KTtcclxuXHRcdFx0c3RhcnQgPSBlbmRcclxuXHRcdH1cclxuXHR9XHJcblx0ZnVuY3Rpb24gcG9zaXRpb24ocCxtKXtcclxuXHRcdHdoaWxlKHA+PWxpbmVFbmQgJiYgKG0gPSBsaW5lUGF0dGVybi5leGVjKHNvdXJjZSkpKXtcclxuXHRcdFx0bGluZVN0YXJ0ID0gbS5pbmRleDtcclxuXHRcdFx0bGluZUVuZCA9IGxpbmVTdGFydCArIG1bMF0ubGVuZ3RoO1xyXG5cdFx0XHRsb2NhdG9yLmxpbmVOdW1iZXIrKztcclxuXHRcdFx0Ly9jb25zb2xlLmxvZygnbGluZSsrOicsbG9jYXRvcixzdGFydFBvcyxlbmRQb3MpXHJcblx0XHR9XHJcblx0XHRsb2NhdG9yLmNvbHVtbk51bWJlciA9IHAtbGluZVN0YXJ0KzE7XHJcblx0fVxyXG5cdHZhciBsaW5lU3RhcnQgPSAwO1xyXG5cdHZhciBsaW5lRW5kID0gMDtcclxuXHR2YXIgbGluZVBhdHRlcm4gPSAvLiooPzpcXHJcXG4/fFxcbil8LiokL2dcclxuXHR2YXIgbG9jYXRvciA9IGRvbUJ1aWxkZXIubG9jYXRvcjtcclxuXHRcclxuXHR2YXIgcGFyc2VTdGFjayA9IFt7Y3VycmVudE5TTWFwOmRlZmF1bHROU01hcENvcHl9XVxyXG5cdHZhciBjbG9zZU1hcCA9IHt9O1xyXG5cdHZhciBzdGFydCA9IDA7XHJcblx0d2hpbGUodHJ1ZSl7XHJcblx0XHR0cnl7XHJcblx0XHRcdHZhciB0YWdTdGFydCA9IHNvdXJjZS5pbmRleE9mKCc8JyxzdGFydCk7XHJcblx0XHRcdGlmKHRhZ1N0YXJ0PDApe1xyXG5cdFx0XHRcdGlmKCFzb3VyY2Uuc3Vic3RyKHN0YXJ0KS5tYXRjaCgvXlxccyokLykpe1xyXG5cdFx0XHRcdFx0dmFyIGRvYyA9IGRvbUJ1aWxkZXIuZG9jO1xyXG5cdCAgICBcdFx0XHR2YXIgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShzb3VyY2Uuc3Vic3RyKHN0YXJ0KSk7XHJcblx0ICAgIFx0XHRcdGRvYy5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuXHQgICAgXHRcdFx0ZG9tQnVpbGRlci5jdXJyZW50RWxlbWVudCA9IHRleHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZih0YWdTdGFydD5zdGFydCl7XHJcblx0XHRcdFx0YXBwZW5kVGV4dCh0YWdTdGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3dpdGNoKHNvdXJjZS5jaGFyQXQodGFnU3RhcnQrMSkpe1xyXG5cdFx0XHRjYXNlICcvJzpcclxuXHRcdFx0XHR2YXIgZW5kID0gc291cmNlLmluZGV4T2YoJz4nLHRhZ1N0YXJ0KzMpO1xyXG5cdFx0XHRcdHZhciB0YWdOYW1lID0gc291cmNlLnN1YnN0cmluZyh0YWdTdGFydCsyLGVuZCk7XHJcblx0XHRcdFx0dmFyIGNvbmZpZyA9IHBhcnNlU3RhY2sucG9wKCk7XHJcblx0XHRcdFx0aWYoZW5kPDApe1xyXG5cdFx0XHRcdFx0XHJcblx0ICAgICAgICBcdFx0dGFnTmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcodGFnU3RhcnQrMikucmVwbGFjZSgvW1xcczxdLiovLCcnKTtcclxuXHQgICAgICAgIFx0XHQvL2NvbnNvbGUuZXJyb3IoJyNAQEBAQEAnK3RhZ05hbWUpXHJcblx0ICAgICAgICBcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKFwiZW5kIHRhZyBuYW1lOiBcIit0YWdOYW1lKycgaXMgbm90IGNvbXBsZXRlOicrY29uZmlnLnRhZ05hbWUpO1xyXG5cdCAgICAgICAgXHRcdGVuZCA9IHRhZ1N0YXJ0KzErdGFnTmFtZS5sZW5ndGg7XHJcblx0ICAgICAgICBcdH1lbHNlIGlmKHRhZ05hbWUubWF0Y2goL1xcczwvKSl7XHJcblx0ICAgICAgICBcdFx0dGFnTmFtZSA9IHRhZ05hbWUucmVwbGFjZSgvW1xcczxdLiovLCcnKTtcclxuXHQgICAgICAgIFx0XHRlcnJvckhhbmRsZXIuZXJyb3IoXCJlbmQgdGFnIG5hbWU6IFwiK3RhZ05hbWUrJyBtYXliZSBub3QgY29tcGxldGUnKTtcclxuXHQgICAgICAgIFx0XHRlbmQgPSB0YWdTdGFydCsxK3RhZ05hbWUubGVuZ3RoO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IocGFyc2VTdGFjay5sZW5ndGgscGFyc2VTdGFjaylcclxuXHRcdFx0XHQvL2NvbnNvbGUuZXJyb3IoY29uZmlnKTtcclxuXHRcdFx0XHR2YXIgbG9jYWxOU01hcCA9IGNvbmZpZy5sb2NhbE5TTWFwO1xyXG5cdFx0XHRcdHZhciBlbmRNYXRjaCA9IGNvbmZpZy50YWdOYW1lID09IHRhZ05hbWU7XHJcblx0XHRcdFx0dmFyIGVuZElnbm9yZUNhc2VNYWNoID0gZW5kTWF0Y2ggfHwgY29uZmlnLnRhZ05hbWUmJmNvbmZpZy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpXHJcblx0XHQgICAgICAgIGlmKGVuZElnbm9yZUNhc2VNYWNoKXtcclxuXHRcdCAgICAgICAgXHRkb21CdWlsZGVyLmVuZEVsZW1lbnQoY29uZmlnLnVyaSxjb25maWcubG9jYWxOYW1lLHRhZ05hbWUpO1xyXG5cdFx0XHRcdFx0aWYobG9jYWxOU01hcCl7XHJcblx0XHRcdFx0XHRcdGZvcih2YXIgcHJlZml4IGluIGxvY2FsTlNNYXApe1xyXG5cdFx0XHRcdFx0XHRcdGRvbUJ1aWxkZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpIDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYoIWVuZE1hdGNoKXtcclxuXHRcdCAgICAgICAgICAgIFx0ZXJyb3JIYW5kbGVyLmZhdGFsRXJyb3IoXCJlbmQgdGFnIG5hbWU6IFwiK3RhZ05hbWUrJyBpcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgc3RhcnQgdGFnTmFtZTonK2NvbmZpZy50YWdOYW1lICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHQgICAgICAgIH1lbHNle1xyXG5cdFx0ICAgICAgICBcdHBhcnNlU3RhY2sucHVzaChjb25maWcpXHJcblx0XHQgICAgICAgIH1cclxuXHRcdFx0XHRcclxuXHRcdFx0XHRlbmQrKztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHQvLyBlbmQgZWxtZW50XHJcblx0XHRcdGNhc2UgJz8nOi8vIDw/Li4uPz5cclxuXHRcdFx0XHRsb2NhdG9yJiZwb3NpdGlvbih0YWdTdGFydCk7XHJcblx0XHRcdFx0ZW5kID0gcGFyc2VJbnN0cnVjdGlvbihzb3VyY2UsdGFnU3RhcnQsZG9tQnVpbGRlcik7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJyEnOi8vIDwhZG9jdHlwZSw8IVtDREFUQSw8IS0tXHJcblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xyXG5cdFx0XHRcdGVuZCA9IHBhcnNlRENDKHNvdXJjZSx0YWdTdGFydCxkb21CdWlsZGVyLGVycm9ySGFuZGxlcik7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0bG9jYXRvciYmcG9zaXRpb24odGFnU3RhcnQpO1xyXG5cdFx0XHRcdHZhciBlbCA9IG5ldyBFbGVtZW50QXR0cmlidXRlcygpO1xyXG5cdFx0XHRcdHZhciBjdXJyZW50TlNNYXAgPSBwYXJzZVN0YWNrW3BhcnNlU3RhY2subGVuZ3RoLTFdLmN1cnJlbnROU01hcDtcclxuXHRcdFx0XHQvL2VsU3RhcnRFbmRcclxuXHRcdFx0XHR2YXIgZW5kID0gcGFyc2VFbGVtZW50U3RhcnRQYXJ0KHNvdXJjZSx0YWdTdGFydCxlbCxjdXJyZW50TlNNYXAsZW50aXR5UmVwbGFjZXIsZXJyb3JIYW5kbGVyKTtcclxuXHRcdFx0XHR2YXIgbGVuID0gZWwubGVuZ3RoO1xyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKCFlbC5jbG9zZWQgJiYgZml4U2VsZkNsb3NlZChzb3VyY2UsZW5kLGVsLnRhZ05hbWUsY2xvc2VNYXApKXtcclxuXHRcdFx0XHRcdGVsLmNsb3NlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZighZW50aXR5TWFwLm5ic3Ape1xyXG5cdFx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygndW5jbG9zZWQgeG1sIGF0dHJpYnV0ZScpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZihsb2NhdG9yICYmIGxlbil7XHJcblx0XHRcdFx0XHR2YXIgbG9jYXRvcjIgPSBjb3B5TG9jYXRvcihsb2NhdG9yLHt9KTtcclxuXHRcdFx0XHRcdC8vdHJ5ey8vYXR0cmlidXRlIHBvc2l0aW9uIGZpeGVkXHJcblx0XHRcdFx0XHRmb3IodmFyIGkgPSAwO2k8bGVuO2krKyl7XHJcblx0XHRcdFx0XHRcdHZhciBhID0gZWxbaV07XHJcblx0XHRcdFx0XHRcdHBvc2l0aW9uKGEub2Zmc2V0KTtcclxuXHRcdFx0XHRcdFx0YS5sb2NhdG9yID0gY29weUxvY2F0b3IobG9jYXRvcix7fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvL31jYXRjaChlKXtjb25zb2xlLmVycm9yKCdAQEBAQCcrZSl9XHJcblx0XHRcdFx0XHRkb21CdWlsZGVyLmxvY2F0b3IgPSBsb2NhdG9yMlxyXG5cdFx0XHRcdFx0aWYoYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCkpe1xyXG5cdFx0XHRcdFx0XHRwYXJzZVN0YWNrLnB1c2goZWwpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRkb21CdWlsZGVyLmxvY2F0b3IgPSBsb2NhdG9yO1xyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0aWYoYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCkpe1xyXG5cdFx0XHRcdFx0XHRwYXJzZVN0YWNrLnB1c2goZWwpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmKGVsLnVyaSA9PT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnICYmICFlbC5jbG9zZWQpe1xyXG5cdFx0XHRcdFx0ZW5kID0gcGFyc2VIdG1sU3BlY2lhbENvbnRlbnQoc291cmNlLGVuZCxlbC50YWdOYW1lLGVudGl0eVJlcGxhY2VyLGRvbUJ1aWxkZXIpXHJcblx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRlbmQrKztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1jYXRjaChlKXtcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCdlbGVtZW50IHBhcnNlIGVycm9yOiAnK2UpXHJcblx0XHRcdC8vZXJyb3JIYW5kbGVyLmVycm9yKCdlbGVtZW50IHBhcnNlIGVycm9yOiAnK2UpO1xyXG5cdFx0XHRlbmQgPSAtMTtcclxuXHRcdFx0Ly90aHJvdyBlO1xyXG5cdFx0fVxyXG5cdFx0aWYoZW5kPnN0YXJ0KXtcclxuXHRcdFx0c3RhcnQgPSBlbmQ7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0Ly9UT0RPOiDov5nph4zmnInlj6/og71zYXjlm57pgIDvvIzmnInkvY3nva7plJnor6/po47pmalcclxuXHRcdFx0YXBwZW5kVGV4dChNYXRoLm1heCh0YWdTdGFydCxzdGFydCkrMSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIGNvcHlMb2NhdG9yKGYsdCl7XHJcblx0dC5saW5lTnVtYmVyID0gZi5saW5lTnVtYmVyO1xyXG5cdHQuY29sdW1uTnVtYmVyID0gZi5jb2x1bW5OdW1iZXI7XHJcblx0cmV0dXJuIHQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAc2VlICNhcHBlbmRFbGVtZW50KHNvdXJjZSxlbFN0YXJ0RW5kLGVsLHNlbGZDbG9zZWQsZW50aXR5UmVwbGFjZXIsZG9tQnVpbGRlcixwYXJzZVN0YWNrKTtcclxuICogQHJldHVybiBlbmQgb2YgdGhlIGVsZW1lbnRTdGFydFBhcnQoZW5kIG9mIGVsZW1lbnRFbmRQYXJ0IGZvciBzZWxmQ2xvc2VkIGVsKVxyXG4gKi9cclxuZnVuY3Rpb24gcGFyc2VFbGVtZW50U3RhcnRQYXJ0KHNvdXJjZSxzdGFydCxlbCxjdXJyZW50TlNNYXAsZW50aXR5UmVwbGFjZXIsZXJyb3JIYW5kbGVyKXtcclxuXHR2YXIgYXR0ck5hbWU7XHJcblx0dmFyIHZhbHVlO1xyXG5cdHZhciBwID0gKytzdGFydDtcclxuXHR2YXIgcyA9IFNfVEFHOy8vc3RhdHVzXHJcblx0d2hpbGUodHJ1ZSl7XHJcblx0XHR2YXIgYyA9IHNvdXJjZS5jaGFyQXQocCk7XHJcblx0XHRzd2l0Y2goYyl7XHJcblx0XHRjYXNlICc9JzpcclxuXHRcdFx0aWYocyA9PT0gU19BVFRSKXsvL2F0dHJOYW1lXHJcblx0XHRcdFx0YXR0ck5hbWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XHJcblx0XHRcdFx0cyA9IFNfRVE7XHJcblx0XHRcdH1lbHNlIGlmKHMgPT09IFNfQVRUUl9TUEFDRSl7XHJcblx0XHRcdFx0cyA9IFNfRVE7XHJcblx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdC8vZmF0YWxFcnJvcjogZXF1YWwgbXVzdCBhZnRlciBhdHRyTmFtZSBvciBzcGFjZSBhZnRlciBhdHRyTmFtZVxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignYXR0cmlidXRlIGVxdWFsIG11c3QgYWZ0ZXIgYXR0ck5hbWUnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ1xcJyc6XHJcblx0XHRjYXNlICdcIic6XHJcblx0XHRcdGlmKHMgPT09IFNfRVEgfHwgcyA9PT0gU19BVFRSIC8vfHwgcyA9PSBTX0FUVFJfU1BBQ0VcclxuXHRcdFx0XHQpey8vZXF1YWxcclxuXHRcdFx0XHRpZihzID09PSBTX0FUVFIpe1xyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJylcclxuXHRcdFx0XHRcdGF0dHJOYW1lID0gc291cmNlLnNsaWNlKHN0YXJ0LHApXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHN0YXJ0ID0gcCsxO1xyXG5cdFx0XHRcdHAgPSBzb3VyY2UuaW5kZXhPZihjLHN0YXJ0KVxyXG5cdFx0XHRcdGlmKHA+MCl7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHNvdXJjZS5zbGljZShzdGFydCxwKS5yZXBsYWNlKC8mIz9cXHcrOy9nLGVudGl0eVJlcGxhY2VyKTtcclxuXHRcdFx0XHRcdGVsLmFkZChhdHRyTmFtZSx2YWx1ZSxzdGFydC0xKTtcclxuXHRcdFx0XHRcdHMgPSBTX0FUVFJfRU5EO1xyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0Ly9mYXRhbEVycm9yOiBubyBlbmQgcXVvdCBtYXRjaFxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdhdHRyaWJ1dGUgdmFsdWUgbm8gZW5kIFxcJycrYysnXFwnIG1hdGNoJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ZWxzZSBpZihzID09IFNfQVRUUl9OT1FVT1RfVkFMVUUpe1xyXG5cdFx0XHRcdHZhbHVlID0gc291cmNlLnNsaWNlKHN0YXJ0LHApLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coYXR0ck5hbWUsdmFsdWUsc3RhcnQscClcclxuXHRcdFx0XHRlbC5hZGQoYXR0ck5hbWUsdmFsdWUsc3RhcnQpO1xyXG5cdFx0XHRcdC8vY29uc29sZS5kaXIoZWwpXHJcblx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBcIicrYXR0ck5hbWUrJ1wiIG1pc3NlZCBzdGFydCBxdW90KCcrYysnKSEhJyk7XHJcblx0XHRcdFx0c3RhcnQgPSBwKzE7XHJcblx0XHRcdFx0cyA9IFNfQVRUUl9FTkRcclxuXHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0Ly9mYXRhbEVycm9yOiBubyBlcXVhbCBiZWZvcmVcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2F0dHJpYnV0ZSB2YWx1ZSBtdXN0IGFmdGVyIFwiPVwiJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICcvJzpcclxuXHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRjYXNlIFNfVEFHOlxyXG5cdFx0XHRcdGVsLnNldFRhZ05hbWUoc291cmNlLnNsaWNlKHN0YXJ0LHApKTtcclxuXHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRjYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRjYXNlIFNfVEFHX0NMT1NFOlxyXG5cdFx0XHRcdHMgPVNfVEFHX0NMT1NFO1xyXG5cdFx0XHRcdGVsLmNsb3NlZCA9IHRydWU7XHJcblx0XHRcdGNhc2UgU19BVFRSX05PUVVPVF9WQUxVRTpcclxuXHRcdFx0Y2FzZSBTX0FUVFI6XHJcblx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHQvL2Nhc2UgU19FUTpcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJhdHRyaWJ1dGUgaW52YWxpZCBjbG9zZSBjaGFyKCcvJylcIilcclxuXHRcdFx0fVxyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJyc6Ly9lbmQgZG9jdW1lbnRcclxuXHRcdFx0Ly90aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0JylcclxuXHRcdFx0ZXJyb3JIYW5kbGVyLmVycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xyXG5cdFx0XHRpZihzID09IFNfVEFHKXtcclxuXHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHA7XHJcblx0XHRjYXNlICc+JzpcclxuXHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRjYXNlIFNfVEFHOlxyXG5cdFx0XHRcdGVsLnNldFRhZ05hbWUoc291cmNlLnNsaWNlKHN0YXJ0LHApKTtcclxuXHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRjYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRjYXNlIFNfVEFHX0NMT1NFOlxyXG5cdFx0XHRcdGJyZWFrOy8vbm9ybWFsXHJcblx0XHRcdGNhc2UgU19BVFRSX05PUVVPVF9WQUxVRTovL0NvbXBhdGlibGUgc3RhdGVcclxuXHRcdFx0Y2FzZSBTX0FUVFI6XHJcblx0XHRcdFx0dmFsdWUgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQscCk7XHJcblx0XHRcdFx0aWYodmFsdWUuc2xpY2UoLTEpID09PSAnLycpe1xyXG5cdFx0XHRcdFx0ZWwuY2xvc2VkICA9IHRydWU7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRjYXNlIFNfQVRUUl9TUEFDRTpcclxuXHRcdFx0XHRpZihzID09PSBTX0FUVFJfU1BBQ0Upe1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBhdHRyTmFtZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYocyA9PSBTX0FUVFJfTk9RVU9UX1ZBTFVFKXtcclxuXHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK3ZhbHVlKydcIiBtaXNzZWQgcXVvdChcIikhIScpO1xyXG5cdFx0XHRcdFx0ZWwuYWRkKGF0dHJOYW1lLHZhbHVlLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpLHN0YXJ0KVxyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0aWYoY3VycmVudE5TTWFwWycnXSAhPT0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnIHx8ICF2YWx1ZS5tYXRjaCgvXig/OmRpc2FibGVkfGNoZWNrZWR8c2VsZWN0ZWQpJC9pKSl7XHJcblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci53YXJuaW5nKCdhdHRyaWJ1dGUgXCInK3ZhbHVlKydcIiBtaXNzZWQgdmFsdWUhISBcIicrdmFsdWUrJ1wiIGluc3RlYWQhIScpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRlbC5hZGQodmFsdWUsdmFsdWUsc3RhcnQpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIFNfRVE6XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdhdHRyaWJ1dGUgdmFsdWUgbWlzc2VkISEnKTtcclxuXHRcdFx0fVxyXG4vL1x0XHRcdGNvbnNvbGUubG9nKHRhZ05hbWUsdGFnTmFtZVBhdHRlcm4sdGFnTmFtZVBhdHRlcm4udGVzdCh0YWdOYW1lKSlcclxuXHRcdFx0cmV0dXJuIHA7XHJcblx0XHQvKnhtbCBzcGFjZSAnXFx4MjAnIHwgI3g5IHwgI3hEIHwgI3hBOyAqL1xyXG5cdFx0Y2FzZSAnXFx1MDA4MCc6XHJcblx0XHRcdGMgPSAnICc7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRpZihjPD0gJyAnKXsvL3NwYWNlXHJcblx0XHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRcdGNhc2UgU19UQUc6XHJcblx0XHRcdFx0XHRlbC5zZXRUYWdOYW1lKHNvdXJjZS5zbGljZShzdGFydCxwKSk7Ly90YWdOYW1lXHJcblx0XHRcdFx0XHRzID0gU19UQUdfU1BBQ0U7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFNfQVRUUjpcclxuXHRcdFx0XHRcdGF0dHJOYW1lID0gc291cmNlLnNsaWNlKHN0YXJ0LHApXHJcblx0XHRcdFx0XHRzID0gU19BVFRSX1NQQUNFO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfTk9RVU9UX1ZBTFVFOlxyXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gc291cmNlLnNsaWNlKHN0YXJ0LHApLnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBcIicrdmFsdWUrJ1wiIG1pc3NlZCBxdW90KFwiKSEhJyk7XHJcblx0XHRcdFx0XHRlbC5hZGQoYXR0ck5hbWUsdmFsdWUsc3RhcnQpXHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRcdFx0cyA9IFNfVEFHX1NQQUNFO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfVEFHX1NQQUNFOlxyXG5cdFx0XHRcdC8vY2FzZSBTX0VROlxyXG5cdFx0XHRcdC8vY2FzZSBTX0FUVFJfU1BBQ0U6XHJcblx0XHRcdFx0Ly9cdHZvaWQoKTticmVhaztcclxuXHRcdFx0XHQvL2Nhc2UgU19UQUdfQ0xPU0U6XHJcblx0XHRcdFx0XHQvL2lnbm9yZSB3YXJuaW5nXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ZWxzZXsvL25vdCBzcGFjZVxyXG4vL1NfVEFHLFx0U19BVFRSLFx0U19FUSxcdFNfQVRUUl9OT1FVT1RfVkFMVUVcclxuLy9TX0FUVFJfU1BBQ0UsXHRTX0FUVFJfRU5ELFx0U19UQUdfU1BBQ0UsIFNfVEFHX0NMT1NFXHJcblx0XHRcdFx0c3dpdGNoKHMpe1xyXG5cdFx0XHRcdC8vY2FzZSBTX1RBRzp2b2lkKCk7YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfQVRUUjp2b2lkKCk7YnJlYWs7XHJcblx0XHRcdFx0Ly9jYXNlIFNfQVRUUl9OT1FVT1RfVkFMVUU6dm9pZCgpO2JyZWFrO1xyXG5cdFx0XHRcdGNhc2UgU19BVFRSX1NQQUNFOlxyXG5cdFx0XHRcdFx0dmFyIHRhZ05hbWUgPSAgZWwudGFnTmFtZTtcclxuXHRcdFx0XHRcdGlmKGN1cnJlbnROU01hcFsnJ10gIT09ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyB8fCAhYXR0ck5hbWUubWF0Y2goL14oPzpkaXNhYmxlZHxjaGVja2VkfHNlbGVjdGVkKSQvaSkpe1xyXG5cdFx0XHRcdFx0XHRlcnJvckhhbmRsZXIud2FybmluZygnYXR0cmlidXRlIFwiJythdHRyTmFtZSsnXCIgbWlzc2VkIHZhbHVlISEgXCInK2F0dHJOYW1lKydcIiBpbnN0ZWFkMiEhJylcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsLmFkZChhdHRyTmFtZSxhdHRyTmFtZSxzdGFydCk7XHJcblx0XHRcdFx0XHRzdGFydCA9IHA7XHJcblx0XHRcdFx0XHRzID0gU19BVFRSO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0Y2FzZSBTX0FUVFJfRU5EOlxyXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyLndhcm5pbmcoJ2F0dHJpYnV0ZSBzcGFjZSBpcyByZXF1aXJlZFwiJythdHRyTmFtZSsnXCIhIScpXHJcblx0XHRcdFx0Y2FzZSBTX1RBR19TUEFDRTpcclxuXHRcdFx0XHRcdHMgPSBTX0FUVFI7XHJcblx0XHRcdFx0XHRzdGFydCA9IHA7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIFNfRVE6XHJcblx0XHRcdFx0XHRzID0gU19BVFRSX05PUVVPVF9WQUxVRTtcclxuXHRcdFx0XHRcdHN0YXJ0ID0gcDtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgU19UQUdfQ0xPU0U6XHJcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJlbGVtZW50cyBjbG9zZWQgY2hhcmFjdGVyICcvJyBhbmQgJz4nIG11c3QgYmUgY29ubmVjdGVkIHRvXCIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fS8vZW5kIG91dGVyIHN3aXRjaFxyXG5cdFx0Ly9jb25zb2xlLmxvZygncCsrJyxwKVxyXG5cdFx0cCsrO1xyXG5cdH1cclxufVxyXG4vKipcclxuICogQHJldHVybiB0cnVlIGlmIGhhcyBuZXcgbmFtZXNwYWNlIGRlZmluZVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwZW5kRWxlbWVudChlbCxkb21CdWlsZGVyLGN1cnJlbnROU01hcCl7XHJcblx0dmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lO1xyXG5cdHZhciBsb2NhbE5TTWFwID0gbnVsbDtcclxuXHQvL3ZhciBjdXJyZW50TlNNYXAgPSBwYXJzZVN0YWNrW3BhcnNlU3RhY2subGVuZ3RoLTFdLmN1cnJlbnROU01hcDtcclxuXHR2YXIgaSA9IGVsLmxlbmd0aDtcclxuXHR3aGlsZShpLS0pe1xyXG5cdFx0dmFyIGEgPSBlbFtpXTtcclxuXHRcdHZhciBxTmFtZSA9IGEucU5hbWU7XHJcblx0XHR2YXIgdmFsdWUgPSBhLnZhbHVlO1xyXG5cdFx0dmFyIG5zcCA9IHFOYW1lLmluZGV4T2YoJzonKTtcclxuXHRcdGlmKG5zcD4wKXtcclxuXHRcdFx0dmFyIHByZWZpeCA9IGEucHJlZml4ID0gcU5hbWUuc2xpY2UoMCxuc3ApO1xyXG5cdFx0XHR2YXIgbG9jYWxOYW1lID0gcU5hbWUuc2xpY2UobnNwKzEpO1xyXG5cdFx0XHR2YXIgbnNQcmVmaXggPSBwcmVmaXggPT09ICd4bWxucycgJiYgbG9jYWxOYW1lXHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0bG9jYWxOYW1lID0gcU5hbWU7XHJcblx0XHRcdHByZWZpeCA9IG51bGxcclxuXHRcdFx0bnNQcmVmaXggPSBxTmFtZSA9PT0gJ3htbG5zJyAmJiAnJ1xyXG5cdFx0fVxyXG5cdFx0Ly9jYW4gbm90IHNldCBwcmVmaXgsYmVjYXVzZSBwcmVmaXggIT09ICcnXHJcblx0XHRhLmxvY2FsTmFtZSA9IGxvY2FsTmFtZSA7XHJcblx0XHQvL3ByZWZpeCA9PSBudWxsIGZvciBubyBucyBwcmVmaXggYXR0cmlidXRlIFxyXG5cdFx0aWYobnNQcmVmaXggIT09IGZhbHNlKXsvL2hhY2shIVxyXG5cdFx0XHRpZihsb2NhbE5TTWFwID09IG51bGwpe1xyXG5cdFx0XHRcdGxvY2FsTlNNYXAgPSB7fVxyXG5cdFx0XHRcdC8vY29uc29sZS5sb2coY3VycmVudE5TTWFwLDApXHJcblx0XHRcdFx0X2NvcHkoY3VycmVudE5TTWFwLGN1cnJlbnROU01hcD17fSlcclxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKGN1cnJlbnROU01hcCwxKVxyXG5cdFx0XHR9XHJcblx0XHRcdGN1cnJlbnROU01hcFtuc1ByZWZpeF0gPSBsb2NhbE5TTWFwW25zUHJlZml4XSA9IHZhbHVlO1xyXG5cdFx0XHRhLnVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLydcclxuXHRcdFx0ZG9tQnVpbGRlci5zdGFydFByZWZpeE1hcHBpbmcobnNQcmVmaXgsIHZhbHVlKSBcclxuXHRcdH1cclxuXHR9XHJcblx0dmFyIGkgPSBlbC5sZW5ndGg7XHJcblx0d2hpbGUoaS0tKXtcclxuXHRcdGEgPSBlbFtpXTtcclxuXHRcdHZhciBwcmVmaXggPSBhLnByZWZpeDtcclxuXHRcdGlmKHByZWZpeCl7Ly9ubyBwcmVmaXggYXR0cmlidXRlIGhhcyBubyBuYW1lc3BhY2VcclxuXHRcdFx0aWYocHJlZml4ID09PSAneG1sJyl7XHJcblx0XHRcdFx0YS51cmkgPSAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJztcclxuXHRcdFx0fWlmKHByZWZpeCAhPT0gJ3htbG5zJyl7XHJcblx0XHRcdFx0YS51cmkgPSBjdXJyZW50TlNNYXBbcHJlZml4IHx8ICcnXVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8ve2NvbnNvbGUubG9nKCcjIyMnK2EucU5hbWUsZG9tQnVpbGRlci5sb2NhdG9yLnN5c3RlbUlkKycnLGN1cnJlbnROU01hcCxhLnVyaSl9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0dmFyIG5zcCA9IHRhZ05hbWUuaW5kZXhPZignOicpO1xyXG5cdGlmKG5zcD4wKXtcclxuXHRcdHByZWZpeCA9IGVsLnByZWZpeCA9IHRhZ05hbWUuc2xpY2UoMCxuc3ApO1xyXG5cdFx0bG9jYWxOYW1lID0gZWwubG9jYWxOYW1lID0gdGFnTmFtZS5zbGljZShuc3ArMSk7XHJcblx0fWVsc2V7XHJcblx0XHRwcmVmaXggPSBudWxsOy8vaW1wb3J0YW50ISFcclxuXHRcdGxvY2FsTmFtZSA9IGVsLmxvY2FsTmFtZSA9IHRhZ05hbWU7XHJcblx0fVxyXG5cdC8vbm8gcHJlZml4IGVsZW1lbnQgaGFzIGRlZmF1bHQgbmFtZXNwYWNlXHJcblx0dmFyIG5zID0gZWwudXJpID0gY3VycmVudE5TTWFwW3ByZWZpeCB8fCAnJ107XHJcblx0ZG9tQnVpbGRlci5zdGFydEVsZW1lbnQobnMsbG9jYWxOYW1lLHRhZ05hbWUsZWwpO1xyXG5cdC8vZW5kUHJlZml4TWFwcGluZyBhbmQgc3RhcnRQcmVmaXhNYXBwaW5nIGhhdmUgbm90IGFueSBoZWxwIGZvciBkb20gYnVpbGRlclxyXG5cdC8vbG9jYWxOU01hcCA9IG51bGxcclxuXHRpZihlbC5jbG9zZWQpe1xyXG5cdFx0ZG9tQnVpbGRlci5lbmRFbGVtZW50KG5zLGxvY2FsTmFtZSx0YWdOYW1lKTtcclxuXHRcdGlmKGxvY2FsTlNNYXApe1xyXG5cdFx0XHRmb3IocHJlZml4IGluIGxvY2FsTlNNYXApe1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpIFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fWVsc2V7XHJcblx0XHRlbC5jdXJyZW50TlNNYXAgPSBjdXJyZW50TlNNYXA7XHJcblx0XHRlbC5sb2NhbE5TTWFwID0gbG9jYWxOU01hcDtcclxuXHRcdC8vcGFyc2VTdGFjay5wdXNoKGVsKTtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxufVxyXG5mdW5jdGlvbiBwYXJzZUh0bWxTcGVjaWFsQ29udGVudChzb3VyY2UsZWxTdGFydEVuZCx0YWdOYW1lLGVudGl0eVJlcGxhY2VyLGRvbUJ1aWxkZXIpe1xyXG5cdGlmKC9eKD86c2NyaXB0fHRleHRhcmVhKSQvaS50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdHZhciBlbEVuZFN0YXJ0ID0gIHNvdXJjZS5pbmRleE9mKCc8LycrdGFnTmFtZSsnPicsZWxTdGFydEVuZCk7XHJcblx0XHR2YXIgdGV4dCA9IHNvdXJjZS5zdWJzdHJpbmcoZWxTdGFydEVuZCsxLGVsRW5kU3RhcnQpO1xyXG5cdFx0aWYoL1smPF0vLnRlc3QodGV4dCkpe1xyXG5cdFx0XHRpZigvXnNjcmlwdCQvaS50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdFx0XHQvL2lmKCEvXFxdXFxdPi8udGVzdCh0ZXh0KSl7XHJcblx0XHRcdFx0XHQvL2xleEhhbmRsZXIuc3RhcnRDREFUQSgpO1xyXG5cdFx0XHRcdFx0ZG9tQnVpbGRlci5jaGFyYWN0ZXJzKHRleHQsMCx0ZXh0Lmxlbmd0aCk7XHJcblx0XHRcdFx0XHQvL2xleEhhbmRsZXIuZW5kQ0RBVEEoKTtcclxuXHRcdFx0XHRcdHJldHVybiBlbEVuZFN0YXJ0O1xyXG5cdFx0XHRcdC8vfVxyXG5cdFx0XHR9Ly99ZWxzZXsvL3RleHQgYXJlYVxyXG5cdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoLyYjP1xcdys7L2csZW50aXR5UmVwbGFjZXIpO1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuY2hhcmFjdGVycyh0ZXh0LDAsdGV4dC5sZW5ndGgpO1xyXG5cdFx0XHRcdHJldHVybiBlbEVuZFN0YXJ0O1xyXG5cdFx0XHQvL31cclxuXHRcdFx0XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBlbFN0YXJ0RW5kKzE7XHJcbn1cclxuZnVuY3Rpb24gZml4U2VsZkNsb3NlZChzb3VyY2UsZWxTdGFydEVuZCx0YWdOYW1lLGNsb3NlTWFwKXtcclxuXHQvL2lmKHRhZ05hbWUgaW4gY2xvc2VNYXApe1xyXG5cdHZhciBwb3MgPSBjbG9zZU1hcFt0YWdOYW1lXTtcclxuXHRpZihwb3MgPT0gbnVsbCl7XHJcblx0XHQvL2NvbnNvbGUubG9nKHRhZ05hbWUpXHJcblx0XHRwb3MgPSAgc291cmNlLmxhc3RJbmRleE9mKCc8LycrdGFnTmFtZSsnPicpXHJcblx0XHRpZihwb3M8ZWxTdGFydEVuZCl7Ly/lv5jorrDpl63lkIhcclxuXHRcdFx0cG9zID0gc291cmNlLmxhc3RJbmRleE9mKCc8LycrdGFnTmFtZSlcclxuXHRcdH1cclxuXHRcdGNsb3NlTWFwW3RhZ05hbWVdID1wb3NcclxuXHR9XHJcblx0cmV0dXJuIHBvczxlbFN0YXJ0RW5kO1xyXG5cdC8vfSBcclxufVxyXG5mdW5jdGlvbiBfY29weShzb3VyY2UsdGFyZ2V0KXtcclxuXHRmb3IodmFyIG4gaW4gc291cmNlKXt0YXJnZXRbbl0gPSBzb3VyY2Vbbl19XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VEQ0Moc291cmNlLHN0YXJ0LGRvbUJ1aWxkZXIsZXJyb3JIYW5kbGVyKXsvL3N1cmUgc3RhcnQgd2l0aCAnPCEnXHJcblx0dmFyIG5leHQ9IHNvdXJjZS5jaGFyQXQoc3RhcnQrMilcclxuXHRzd2l0Y2gobmV4dCl7XHJcblx0Y2FzZSAnLSc6XHJcblx0XHRpZihzb3VyY2UuY2hhckF0KHN0YXJ0ICsgMykgPT09ICctJyl7XHJcblx0XHRcdHZhciBlbmQgPSBzb3VyY2UuaW5kZXhPZignLS0+JyxzdGFydCs0KTtcclxuXHRcdFx0Ly9hcHBlbmQgY29tbWVudCBzb3VyY2Uuc3Vic3RyaW5nKDQsZW5kKS8vPCEtLVxyXG5cdFx0XHRpZihlbmQ+c3RhcnQpe1xyXG5cdFx0XHRcdGRvbUJ1aWxkZXIuY29tbWVudChzb3VyY2Usc3RhcnQrNCxlbmQtc3RhcnQtNCk7XHJcblx0XHRcdFx0cmV0dXJuIGVuZCszO1xyXG5cdFx0XHR9ZWxzZXtcclxuXHRcdFx0XHRlcnJvckhhbmRsZXIuZXJyb3IoXCJVbmNsb3NlZCBjb21tZW50XCIpO1xyXG5cdFx0XHRcdHJldHVybiAtMTtcclxuXHRcdFx0fVxyXG5cdFx0fWVsc2V7XHJcblx0XHRcdC8vZXJyb3JcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdGRlZmF1bHQ6XHJcblx0XHRpZihzb3VyY2Uuc3Vic3RyKHN0YXJ0KzMsNikgPT0gJ0NEQVRBWycpe1xyXG5cdFx0XHR2YXIgZW5kID0gc291cmNlLmluZGV4T2YoJ11dPicsc3RhcnQrOSk7XHJcblx0XHRcdGRvbUJ1aWxkZXIuc3RhcnRDREFUQSgpO1xyXG5cdFx0XHRkb21CdWlsZGVyLmNoYXJhY3RlcnMoc291cmNlLHN0YXJ0KzksZW5kLXN0YXJ0LTkpO1xyXG5cdFx0XHRkb21CdWlsZGVyLmVuZENEQVRBKCkgXHJcblx0XHRcdHJldHVybiBlbmQrMztcclxuXHRcdH1cclxuXHRcdC8vPCFET0NUWVBFXHJcblx0XHQvL3N0YXJ0RFREKGphdmEubGFuZy5TdHJpbmcgbmFtZSwgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNJZCwgamF2YS5sYW5nLlN0cmluZyBzeXN0ZW1JZCkgXHJcblx0XHR2YXIgbWF0Y2hzID0gc3BsaXQoc291cmNlLHN0YXJ0KTtcclxuXHRcdHZhciBsZW4gPSBtYXRjaHMubGVuZ3RoO1xyXG5cdFx0aWYobGVuPjEgJiYgLyFkb2N0eXBlL2kudGVzdChtYXRjaHNbMF1bMF0pKXtcclxuXHRcdFx0dmFyIG5hbWUgPSBtYXRjaHNbMV1bMF07XHJcblx0XHRcdHZhciBwdWJpZCA9IGxlbj4zICYmIC9ecHVibGljJC9pLnRlc3QobWF0Y2hzWzJdWzBdKSAmJiBtYXRjaHNbM11bMF1cclxuXHRcdFx0dmFyIHN5c2lkID0gbGVuPjQgJiYgbWF0Y2hzWzRdWzBdO1xyXG5cdFx0XHR2YXIgbGFzdE1hdGNoID0gbWF0Y2hzW2xlbi0xXVxyXG5cdFx0XHRkb21CdWlsZGVyLnN0YXJ0RFREKG5hbWUscHViaWQgJiYgcHViaWQucmVwbGFjZSgvXihbJ1wiXSkoLio/KVxcMSQvLCckMicpLFxyXG5cdFx0XHRcdFx0c3lzaWQgJiYgc3lzaWQucmVwbGFjZSgvXihbJ1wiXSkoLio/KVxcMSQvLCckMicpKTtcclxuXHRcdFx0ZG9tQnVpbGRlci5lbmREVEQoKTtcclxuXHRcdFx0XHJcblx0XHRcdHJldHVybiBsYXN0TWF0Y2guaW5kZXgrbGFzdE1hdGNoWzBdLmxlbmd0aFxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gLTE7XHJcbn1cclxuXHJcblxyXG5cclxuZnVuY3Rpb24gcGFyc2VJbnN0cnVjdGlvbihzb3VyY2Usc3RhcnQsZG9tQnVpbGRlcil7XHJcblx0dmFyIGVuZCA9IHNvdXJjZS5pbmRleE9mKCc/Picsc3RhcnQpO1xyXG5cdGlmKGVuZCl7XHJcblx0XHR2YXIgbWF0Y2ggPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0LGVuZCkubWF0Y2goL148XFw/KFxcUyopXFxzKihbXFxzXFxTXSo/KVxccyokLyk7XHJcblx0XHRpZihtYXRjaCl7XHJcblx0XHRcdHZhciBsZW4gPSBtYXRjaFswXS5sZW5ndGg7XHJcblx0XHRcdGRvbUJ1aWxkZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG1hdGNoWzFdLCBtYXRjaFsyXSkgO1xyXG5cdFx0XHRyZXR1cm4gZW5kKzI7XHJcblx0XHR9ZWxzZXsvL2Vycm9yXHJcblx0XHRcdHJldHVybiAtMTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIC0xO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHNvdXJjZVxyXG4gKi9cclxuZnVuY3Rpb24gRWxlbWVudEF0dHJpYnV0ZXMoc291cmNlKXtcclxuXHRcclxufVxyXG5FbGVtZW50QXR0cmlidXRlcy5wcm90b3R5cGUgPSB7XHJcblx0c2V0VGFnTmFtZTpmdW5jdGlvbih0YWdOYW1lKXtcclxuXHRcdGlmKCF0YWdOYW1lUGF0dGVybi50ZXN0KHRhZ05hbWUpKXtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhZ05hbWU6Jyt0YWdOYW1lKVxyXG5cdFx0fVxyXG5cdFx0dGhpcy50YWdOYW1lID0gdGFnTmFtZVxyXG5cdH0sXHJcblx0YWRkOmZ1bmN0aW9uKHFOYW1lLHZhbHVlLG9mZnNldCl7XHJcblx0XHRpZighdGFnTmFtZVBhdHRlcm4udGVzdChxTmFtZSkpe1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXR0cmlidXRlOicrcU5hbWUpXHJcblx0XHR9XHJcblx0XHR0aGlzW3RoaXMubGVuZ3RoKytdID0ge3FOYW1lOnFOYW1lLHZhbHVlOnZhbHVlLG9mZnNldDpvZmZzZXR9XHJcblx0fSxcclxuXHRsZW5ndGg6MCxcclxuXHRnZXRMb2NhbE5hbWU6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXNbaV0ubG9jYWxOYW1lfSxcclxuXHRnZXRMb2NhdG9yOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzW2ldLmxvY2F0b3J9LFxyXG5cdGdldFFOYW1lOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzW2ldLnFOYW1lfSxcclxuXHRnZXRVUkk6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXNbaV0udXJpfSxcclxuXHRnZXRWYWx1ZTpmdW5jdGlvbihpKXtyZXR1cm4gdGhpc1tpXS52YWx1ZX1cclxuLy9cdCxnZXRJbmRleDpmdW5jdGlvbih1cmksIGxvY2FsTmFtZSkpe1xyXG4vL1x0XHRpZihsb2NhbE5hbWUpe1xyXG4vL1x0XHRcdFxyXG4vL1x0XHR9ZWxzZXtcclxuLy9cdFx0XHR2YXIgcU5hbWUgPSB1cmlcclxuLy9cdFx0fVxyXG4vL1x0fSxcclxuLy9cdGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWUodGhpcy5nZXRJbmRleC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxcclxuLy9cdGdldFR5cGU6ZnVuY3Rpb24odXJpLGxvY2FsTmFtZSl7fVxyXG4vL1x0Z2V0VHlwZTpmdW5jdGlvbihpKXt9LFxyXG59XHJcblxyXG5cclxuXHJcblxyXG5mdW5jdGlvbiBfc2V0X3Byb3RvXyh0aGl6LHBhcmVudCl7XHJcblx0dGhpei5fX3Byb3RvX18gPSBwYXJlbnQ7XHJcblx0cmV0dXJuIHRoaXo7XHJcbn1cclxuaWYoIShfc2V0X3Byb3RvXyh7fSxfc2V0X3Byb3RvXy5wcm90b3R5cGUpIGluc3RhbmNlb2YgX3NldF9wcm90b18pKXtcclxuXHRfc2V0X3Byb3RvXyA9IGZ1bmN0aW9uKHRoaXoscGFyZW50KXtcclxuXHRcdGZ1bmN0aW9uIHAoKXt9O1xyXG5cdFx0cC5wcm90b3R5cGUgPSBwYXJlbnQ7XHJcblx0XHRwID0gbmV3IHAoKTtcclxuXHRcdGZvcihwYXJlbnQgaW4gdGhpeil7XHJcblx0XHRcdHBbcGFyZW50XSA9IHRoaXpbcGFyZW50XTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBwO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaXQoc291cmNlLHN0YXJ0KXtcclxuXHR2YXIgbWF0Y2g7XHJcblx0dmFyIGJ1ZiA9IFtdO1xyXG5cdHZhciByZWcgPSAvJ1teJ10rJ3xcIlteXCJdK1wifFteXFxzPD5cXC89XSs9P3woXFwvP1xccyo+fDwpL2c7XHJcblx0cmVnLmxhc3RJbmRleCA9IHN0YXJ0O1xyXG5cdHJlZy5leGVjKHNvdXJjZSk7Ly9za2lwIDxcclxuXHR3aGlsZShtYXRjaCA9IHJlZy5leGVjKHNvdXJjZSkpe1xyXG5cdFx0YnVmLnB1c2gobWF0Y2gpO1xyXG5cdFx0aWYobWF0Y2hbMV0pcmV0dXJuIGJ1ZjtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydHMuWE1MUmVhZGVyID0gWE1MUmVhZGVyO1xyXG5cclxuIiwiLyoqXG4gKiBXcmFwcGVyIGZvciBidWlsdC1pbiBodHRwLmpzIHRvIGVtdWxhdGUgdGhlIGJyb3dzZXIgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LlxuICpcbiAqIFRoaXMgY2FuIGJlIHVzZWQgd2l0aCBKUyBkZXNpZ25lZCBmb3IgYnJvd3NlcnMgdG8gaW1wcm92ZSByZXVzZSBvZiBjb2RlIGFuZFxuICogYWxsb3cgdGhlIHVzZSBvZiBleGlzdGluZyBsaWJyYXJpZXMuXG4gKlxuICogVXNhZ2U6IGluY2x1ZGUoXCJYTUxIdHRwUmVxdWVzdC5qc1wiKSBhbmQgdXNlIFhNTEh0dHBSZXF1ZXN0IHBlciBXM0Mgc3BlY3MuXG4gKlxuICogQGF1dGhvciBEYW4gRGVGZWxpcHBpIDxkYW5AZHJpdmVyZGFuLmNvbT5cbiAqIEBjb250cmlidXRvciBEYXZpZCBFbGxpcyA8ZC5mLmVsbGlzQGllZWUub3JnPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxudmFyIFVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG52YXIgc3Bhd24gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKS5zcGF3bjtcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcblxuZXhwb3J0cy5YTUxIdHRwUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICAvKipcbiAgICogUHJpdmF0ZSB2YXJpYWJsZXNcbiAgICovXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGh0dHAgPSByZXF1aXJlKFwiaHR0cFwiKTtcbiAgdmFyIGh0dHBzID0gcmVxdWlyZShcImh0dHBzXCIpO1xuXG4gIC8vIEhvbGRzIGh0dHAuanMgb2JqZWN0c1xuICB2YXIgcmVxdWVzdDtcbiAgdmFyIHJlc3BvbnNlO1xuXG4gIC8vIFJlcXVlc3Qgc2V0dGluZ3NcbiAgdmFyIHNldHRpbmdzID0ge307XG5cbiAgLy8gRGlzYWJsZSBoZWFkZXIgYmxhY2tsaXN0LlxuICAvLyBOb3QgcGFydCBvZiBYSFIgc3BlY3MuXG4gIHZhciBkaXNhYmxlSGVhZGVyQ2hlY2sgPSBmYWxzZTtcblxuICAvLyBTZXQgc29tZSBkZWZhdWx0IGhlYWRlcnNcbiAgdmFyIGRlZmF1bHRIZWFkZXJzID0ge1xuICAgIFwiVXNlci1BZ2VudFwiOiBcIm5vZGUtWE1MSHR0cFJlcXVlc3RcIixcbiAgICBcIkFjY2VwdFwiOiBcIiovKlwiLFxuICB9O1xuXG4gIHZhciBoZWFkZXJzID0ge307XG4gIHZhciBoZWFkZXJzQ2FzZSA9IHt9O1xuXG4gIC8vIFRoZXNlIGhlYWRlcnMgYXJlIG5vdCB1c2VyIHNldGFibGUuXG4gIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGFsbG93ZWQgYnV0IGJhbm5lZCBpbiB0aGUgc3BlYzpcbiAgLy8gKiB1c2VyLWFnZW50XG4gIHZhciBmb3JiaWRkZW5SZXF1ZXN0SGVhZGVycyA9IFtcbiAgICBcImFjY2VwdC1jaGFyc2V0XCIsXG4gICAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgICBcImFjY2Vzcy1jb250cm9sLXJlcXVlc3QtaGVhZGVyc1wiLFxuICAgIFwiYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2RcIixcbiAgICBcImNvbm5lY3Rpb25cIixcbiAgICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgXCJjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nXCIsXG4gICAgXCJjb29raWVcIixcbiAgICBcImNvb2tpZTJcIixcbiAgICBcImRhdGVcIixcbiAgICBcImV4cGVjdFwiLFxuICAgIFwiaG9zdFwiLFxuICAgIFwia2VlcC1hbGl2ZVwiLFxuICAgIFwib3JpZ2luXCIsXG4gICAgXCJyZWZlcmVyXCIsXG4gICAgXCJ0ZVwiLFxuICAgIFwidHJhaWxlclwiLFxuICAgIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgICBcInVwZ3JhZGVcIixcbiAgICBcInZpYVwiXG4gIF07XG5cbiAgLy8gVGhlc2UgcmVxdWVzdCBtZXRob2RzIGFyZSBub3QgYWxsb3dlZFxuICB2YXIgZm9yYmlkZGVuUmVxdWVzdE1ldGhvZHMgPSBbXG4gICAgXCJUUkFDRVwiLFxuICAgIFwiVFJBQ0tcIixcbiAgICBcIkNPTk5FQ1RcIlxuICBdO1xuXG4gIC8vIFNlbmQgZmxhZ1xuICB2YXIgc2VuZEZsYWcgPSBmYWxzZTtcbiAgLy8gRXJyb3IgZmxhZywgdXNlZCB3aGVuIGVycm9ycyBvY2N1ciBvciBhYm9ydCBpcyBjYWxsZWRcbiAgdmFyIGVycm9yRmxhZyA9IGZhbHNlO1xuXG4gIC8vIEV2ZW50IGxpc3RlbmVyc1xuICB2YXIgbGlzdGVuZXJzID0ge307XG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICB0aGlzLlVOU0VOVCA9IDA7XG4gIHRoaXMuT1BFTkVEID0gMTtcbiAgdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gMjtcbiAgdGhpcy5MT0FESU5HID0gMztcbiAgdGhpcy5ET05FID0gNDtcblxuICAvKipcbiAgICogUHVibGljIHZhcnNcbiAgICovXG5cbiAgLy8gQ3VycmVudCBzdGF0ZVxuICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLlVOU0VOVDtcblxuICAvLyBkZWZhdWx0IHJlYWR5IHN0YXRlIGNoYW5nZSBoYW5kbGVyIGluIGNhc2Ugb25lIGlzIG5vdCBzZXQgb3IgaXMgc2V0IGxhdGVcbiAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG4gIC8vIFJlc3VsdCAmIHJlc3BvbnNlXG4gIHRoaXMucmVzcG9uc2VUZXh0ID0gXCJcIjtcbiAgdGhpcy5yZXNwb25zZVhNTCA9IFwiXCI7XG4gIHRoaXMuc3RhdHVzID0gbnVsbDtcbiAgdGhpcy5zdGF0dXNUZXh0ID0gbnVsbDtcbiAgXG4gIC8vIFdoZXRoZXIgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyBzaG91bGQgYmUgbWFkZSB1c2luZ1xuICAvLyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMgb3IgYXV0aG9yaXphdGlvbiBoZWFkZXJzXG4gIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBoZWFkZXIgaXMgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBoZWFkZXIgSGVhZGVyIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm4gYm9vbGVhbiBGYWxzZSBpZiBub3QgYWxsb3dlZCwgb3RoZXJ3aXNlIHRydWVcbiAgICovXG4gIHZhciBpc0FsbG93ZWRIdHRwSGVhZGVyID0gZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgcmV0dXJuIGRpc2FibGVIZWFkZXJDaGVjayB8fCAoaGVhZGVyICYmIGZvcmJpZGRlblJlcXVlc3RIZWFkZXJzLmluZGV4T2YoaGVhZGVyLnRvTG93ZXJDYXNlKCkpID09PSAtMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmcgbWV0aG9kIFJlcXVlc3QgbWV0aG9kIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm4gYm9vbGVhbiBGYWxzZSBpZiBub3QgYWxsb3dlZCwgb3RoZXJ3aXNlIHRydWVcbiAgICovXG4gIHZhciBpc0FsbG93ZWRIdHRwTWV0aG9kID0gZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIChtZXRob2QgJiYgZm9yYmlkZGVuUmVxdWVzdE1ldGhvZHMuaW5kZXhPZihtZXRob2QpID09PSAtMSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjb25uZWN0aW9uLiBDdXJyZW50bHkgc3VwcG9ydHMgbG9jYWwgc2VydmVyIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyaW5nIG1ldGhvZCBDb25uZWN0aW9uIG1ldGhvZCAoZWcgR0VULCBQT1NUKVxuICAgKiBAcGFyYW0gc3RyaW5nIHVybCBVUkwgZm9yIHRoZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gYm9vbGVhbiBhc3luYyBBc3luY2hyb25vdXMgY29ubmVjdGlvbi4gRGVmYXVsdCBpcyB0cnVlLlxuICAgKiBAcGFyYW0gc3RyaW5nIHVzZXIgVXNlcm5hbWUgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIChvcHRpb25hbClcbiAgICogQHBhcmFtIHN0cmluZyBwYXNzd29yZCBQYXNzd29yZCBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24gKG9wdGlvbmFsKVxuICAgKi9cbiAgdGhpcy5vcGVuID0gZnVuY3Rpb24obWV0aG9kLCB1cmwsIGFzeW5jLCB1c2VyLCBwYXNzd29yZCkge1xuICAgIHRoaXMuYWJvcnQoKTtcbiAgICBlcnJvckZsYWcgPSBmYWxzZTtcblxuICAgIC8vIENoZWNrIGZvciB2YWxpZCByZXF1ZXN0IG1ldGhvZFxuICAgIGlmICghaXNBbGxvd2VkSHR0cE1ldGhvZChtZXRob2QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWN1cml0eUVycm9yOiBSZXF1ZXN0IG1ldGhvZCBub3QgYWxsb3dlZFwiKTtcbiAgICB9XG5cbiAgICBzZXR0aW5ncyA9IHtcbiAgICAgIFwibWV0aG9kXCI6IG1ldGhvZCxcbiAgICAgIFwidXJsXCI6IHVybC50b1N0cmluZygpLFxuICAgICAgXCJhc3luY1wiOiAodHlwZW9mIGFzeW5jICE9PSBcImJvb2xlYW5cIiA/IHRydWUgOiBhc3luYyksXG4gICAgICBcInVzZXJcIjogdXNlciB8fCBudWxsLFxuICAgICAgXCJwYXNzd29yZFwiOiBwYXNzd29yZCB8fCBudWxsXG4gICAgfTtcblxuICAgIHNldFN0YXRlKHRoaXMuT1BFTkVEKTtcbiAgfTtcblxuICAvKipcbiAgICogRGlzYWJsZXMgb3IgZW5hYmxlcyBpc0FsbG93ZWRIdHRwSGVhZGVyKCkgY2hlY2sgdGhlIHJlcXVlc3QuIEVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICogVGhpcyBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBXM0Mgc3BlYy5cbiAgICpcbiAgICogQHBhcmFtIGJvb2xlYW4gc3RhdGUgRW5hYmxlIG9yIGRpc2FibGUgaGVhZGVyIGNoZWNraW5nLlxuICAgKi9cbiAgdGhpcy5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgPSBmdW5jdGlvbihzdGF0ZSkge1xuICAgIGRpc2FibGVIZWFkZXJDaGVjayA9IHN0YXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgaGVhZGVyIGZvciB0aGUgcmVxdWVzdCBvciBhcHBlbmRzIHRoZSB2YWx1ZSBpZiBvbmUgaXMgYWxyZWFkeSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmcgaGVhZGVyIEhlYWRlciBuYW1lXG4gICAqIEBwYXJhbSBzdHJpbmcgdmFsdWUgSGVhZGVyIHZhbHVlXG4gICAqL1xuICB0aGlzLnNldFJlcXVlc3RIZWFkZXIgPSBmdW5jdGlvbihoZWFkZXIsIHZhbHVlKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSOiBzZXRSZXF1ZXN0SGVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHN0YXRlIGlzIE9QRU5cIik7XG4gICAgfVxuICAgIGlmICghaXNBbGxvd2VkSHR0cEhlYWRlcihoZWFkZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJSZWZ1c2VkIHRvIHNldCB1bnNhZmUgaGVhZGVyIFxcXCJcIiArIGhlYWRlciArIFwiXFxcIlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbmRGbGFnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEX1NUQVRFX0VSUjogc2VuZCBmbGFnIGlzIHRydWVcIik7XG4gICAgfVxuICAgIGhlYWRlciA9IGhlYWRlcnNDYXNlW2hlYWRlci50b0xvd2VyQ2FzZSgpXSB8fCBoZWFkZXI7XG4gICAgaGVhZGVyc0Nhc2VbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gaGVhZGVyO1xuICAgIGhlYWRlcnNbaGVhZGVyXSA9IGhlYWRlcnNbaGVhZGVyXSA/IGhlYWRlcnNbaGVhZGVyXSArICcsICcgKyB2YWx1ZSA6IHZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgaGVhZGVyIGZyb20gdGhlIHNlcnZlciByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBoZWFkZXIgTmFtZSBvZiBoZWFkZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJuIHN0cmluZyBUZXh0IG9mIHRoZSBoZWFkZXIgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgdGhpcy5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlcikge1xuICAgIGlmICh0eXBlb2YgaGVhZGVyID09PSBcInN0cmluZ1wiXG4gICAgICAmJiB0aGlzLnJlYWR5U3RhdGUgPiB0aGlzLk9QRU5FRFxuICAgICAgJiYgcmVzcG9uc2VcbiAgICAgICYmIHJlc3BvbnNlLmhlYWRlcnNcbiAgICAgICYmIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldXG4gICAgICAmJiAhZXJyb3JGbGFnXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVyc1toZWFkZXIudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSByZXNwb25zZSBoZWFkZXJzLlxuICAgKlxuICAgKiBAcmV0dXJuIHN0cmluZyBBIHN0cmluZyB3aXRoIGFsbCByZXNwb25zZSBoZWFkZXJzIHNlcGFyYXRlZCBieSBDUitMRlxuICAgKi9cbiAgdGhpcy5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlIDwgdGhpcy5IRUFERVJTX1JFQ0VJVkVEIHx8IGVycm9yRmxhZykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuXG4gICAgZm9yICh2YXIgaSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICAvLyBDb29raWUgaGVhZGVycyBhcmUgZXhjbHVkZWRcbiAgICAgIGlmIChpICE9PSBcInNldC1jb29raWVcIiAmJiBpICE9PSBcInNldC1jb29raWUyXCIpIHtcbiAgICAgICAgcmVzdWx0ICs9IGkgKyBcIjogXCIgKyByZXNwb25zZS5oZWFkZXJzW2ldICsgXCJcXHJcXG5cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVxdWVzdCBoZWFkZXJcbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBuYW1lIE5hbWUgb2YgaGVhZGVyIHRvIGdldFxuICAgKiBAcmV0dXJuIHN0cmluZyBSZXR1cm5zIHRoZSByZXF1ZXN0IGhlYWRlciBvciBlbXB0eSBzdHJpbmcgaWYgbm90IHNldFxuICAgKi9cbiAgdGhpcy5nZXRSZXF1ZXN0SGVhZGVyID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBoZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICByZXR1cm4gaGVhZGVyc1toZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcbiAgfTtcblxuICAvKipcbiAgICogU2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHN0cmluZyBkYXRhIE9wdGlvbmFsIGRhdGEgdG8gc2VuZCBhcyByZXF1ZXN0IGJvZHkuXG4gICAqL1xuICB0aGlzLnNlbmQgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIklOVkFMSURfU1RBVEVfRVJSOiBjb25uZWN0aW9uIG11c3QgYmUgb3BlbmVkIGJlZm9yZSBzZW5kKCkgaXMgY2FsbGVkXCIpO1xuICAgIH1cblxuICAgIGlmIChzZW5kRmxhZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRF9TVEFURV9FUlI6IHNlbmQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgdmFyIHNzbCA9IGZhbHNlLCBsb2NhbCA9IGZhbHNlO1xuICAgIHZhciB1cmwgPSBVcmwucGFyc2Uoc2V0dGluZ3MudXJsKTtcbiAgICB2YXIgaG9zdDtcbiAgICAvLyBEZXRlcm1pbmUgdGhlIHNlcnZlclxuICAgIHN3aXRjaCAodXJsLnByb3RvY29sKSB7XG4gICAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgICAgIHNzbCA9IHRydWU7XG4gICAgICAgIC8vIFNTTCAmIG5vbi1TU0wgYm90aCBuZWVkIGhvc3QsIG5vIGJyZWFrIGhlcmUuXG4gICAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICAgICAgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJmaWxlOlwiOlxuICAgICAgICBsb2NhbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgbnVsbDpcbiAgICAgIGNhc2UgXCJcIjpcbiAgICAgICAgaG9zdCA9IFwibG9jYWxob3N0XCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm90b2NvbCBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIGZpbGVzIG9mZiB0aGUgbG9jYWwgZmlsZXN5c3RlbSAoZmlsZTovLylcbiAgICBpZiAobG9jYWwpIHtcbiAgICAgIGlmIChzZXR0aW5ncy5tZXRob2QgIT09IFwiR0VUXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWE1MSHR0cFJlcXVlc3Q6IE9ubHkgR0VUIG1ldGhvZCBpcyBzdXBwb3J0ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR0aW5ncy5hc3luYykge1xuICAgICAgICBmcy5yZWFkRmlsZSh1cmwucGF0aG5hbWUsIFwidXRmOFwiLCBmdW5jdGlvbihlcnJvciwgZGF0YSkge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gMjAwO1xuICAgICAgICAgICAgc2VsZi5yZXNwb25zZVRleHQgPSBkYXRhO1xuICAgICAgICAgICAgc2V0U3RhdGUoc2VsZi5ET05FKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IGZzLnJlYWRGaWxlU3luYyh1cmwucGF0aG5hbWUsIFwidXRmOFwiKTtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IDIwMDtcbiAgICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIHBvcnQgODAuIElmIGFjY2Vzc2luZyBsb2NhbGhvc3Qgb24gYW5vdGhlciBwb3J0IGJlIHN1cmVcbiAgICAvLyB0byB1c2UgaHR0cDovL2xvY2FsaG9zdDpwb3J0L3BhdGhcbiAgICB2YXIgcG9ydCA9IHVybC5wb3J0IHx8IChzc2wgPyA0NDMgOiA4MCk7XG4gICAgLy8gQWRkIHF1ZXJ5IHN0cmluZyBpZiBvbmUgaXMgdXNlZFxuICAgIHZhciB1cmkgPSB1cmwucGF0aG5hbWUgKyAodXJsLnNlYXJjaCA/IHVybC5zZWFyY2ggOiBcIlwiKTtcblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgaWYgdGhleSBoYXZlbid0IGJlZW4gc2V0XG4gICAgZm9yICh2YXIgbmFtZSBpbiBkZWZhdWx0SGVhZGVycykge1xuICAgICAgaWYgKCFoZWFkZXJzQ2FzZVtuYW1lLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGhlYWRlcnNbbmFtZV0gPSBkZWZhdWx0SGVhZGVyc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIEhvc3QgaGVhZGVyIG9yIHRoZSBzZXJ2ZXIgbWF5IHJlamVjdCB0aGUgcmVxdWVzdFxuICAgIGhlYWRlcnMuSG9zdCA9IGhvc3Q7XG4gICAgaWYgKCEoKHNzbCAmJiBwb3J0ID09PSA0NDMpIHx8IHBvcnQgPT09IDgwKSkge1xuICAgICAgaGVhZGVycy5Ib3N0ICs9IFwiOlwiICsgdXJsLnBvcnQ7XG4gICAgfVxuXG4gICAgLy8gU2V0IEJhc2ljIEF1dGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHNldHRpbmdzLnVzZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MucGFzc3dvcmQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgc2V0dGluZ3MucGFzc3dvcmQgPSBcIlwiO1xuICAgICAgfVxuICAgICAgdmFyIGF1dGhCdWYgPSBuZXcgQnVmZmVyKHNldHRpbmdzLnVzZXIgKyBcIjpcIiArIHNldHRpbmdzLnBhc3N3b3JkKTtcbiAgICAgIGhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IFwiQmFzaWMgXCIgKyBhdXRoQnVmLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIH1cblxuICAgIC8vIFNldCBjb250ZW50IGxlbmd0aCBoZWFkZXJcbiAgICBpZiAoc2V0dGluZ3MubWV0aG9kID09PSBcIkdFVFwiIHx8IHNldHRpbmdzLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtTGVuZ3RoXCJdID0gQnVmZmVyLmlzQnVmZmVyKGRhdGEpID8gZGF0YS5sZW5ndGggOiBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcblxuICAgICAgaWYgKCFoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgLy8gRm9yIGEgcG9zdCB3aXRoIG5vIGRhdGEgc2V0IENvbnRlbnQtTGVuZ3RoOiAwLlxuICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBieSBidWdneSBzZXJ2ZXJzIHRoYXQgZG9uJ3QgbWVldCB0aGUgc3BlY3MuXG4gICAgICBoZWFkZXJzW1wiQ29udGVudC1MZW5ndGhcIl0gPSAwO1xuICAgIH1cblxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICBwYXRoOiB1cmksXG4gICAgICBtZXRob2Q6IHNldHRpbmdzLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBhZ2VudDogZmFsc2UsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHNlbGYud2l0aENyZWRlbnRpYWxzXG4gICAgfTtcblxuICAgIC8vIFJlc2V0IGVycm9yIGZsYWdcbiAgICBlcnJvckZsYWcgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBhc3luYyByZXF1ZXN0c1xuICAgIGlmIChzZXR0aW5ncy5hc3luYykge1xuICAgICAgLy8gVXNlIHRoZSBwcm9wZXIgcHJvdG9jb2xcbiAgICAgIHZhciBkb1JlcXVlc3QgPSBzc2wgPyBodHRwcy5yZXF1ZXN0IDogaHR0cC5yZXF1ZXN0O1xuXG4gICAgICAvLyBSZXF1ZXN0IGlzIGJlaW5nIHNlbnQsIHNldCBzZW5kIGZsYWdcbiAgICAgIHNlbmRGbGFnID0gdHJ1ZTtcblxuICAgICAgLy8gQXMgcGVyIHNwZWMsIHRoaXMgaXMgY2FsbGVkIGhlcmUgZm9yIGhpc3RvcmljYWwgcmVhc29ucy5cbiAgICAgIHNlbGYuZGlzcGF0Y2hFdmVudChcInJlYWR5c3RhdGVjaGFuZ2VcIik7XG5cbiAgICAgIC8vIEhhbmRsZXIgZm9yIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxlciA9IGZ1bmN0aW9uIHJlc3BvbnNlSGFuZGxlcihyZXNwKSB7XG4gICAgICAgIC8vIFNldCByZXNwb25zZSB2YXIgdG8gdGhlIHJlc3BvbnNlIHdlIGdvdCBiYWNrXG4gICAgICAgIC8vIFRoaXMgaXMgc28gaXQgcmVtYWlucyBhY2Nlc3NhYmxlIG91dHNpZGUgdGhpcyBzY29wZVxuICAgICAgICByZXNwb25zZSA9IHJlc3A7XG4gICAgICAgIC8vIENoZWNrIGZvciByZWRpcmVjdFxuICAgICAgICAvLyBAVE9ETyBQcmV2ZW50IGxvb3BlZCByZWRpcmVjdHNcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXNwb25zZS5zdGF0dXNDb2RlID09PSAzMDIgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMzAzIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDMwNykge1xuICAgICAgICAgIC8vIENoYW5nZSBVUkwgdG8gdGhlIHJlZGlyZWN0IGxvY2F0aW9uXG4gICAgICAgICAgc2V0dGluZ3MudXJsID0gcmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbjtcbiAgICAgICAgICB2YXIgdXJsID0gVXJsLnBhcnNlKHNldHRpbmdzLnVybCk7XG4gICAgICAgICAgLy8gU2V0IGhvc3QgdmFyIGluIGNhc2UgaXQncyB1c2VkIGxhdGVyXG4gICAgICAgICAgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAgICAgICAvLyBPcHRpb25zIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgICAgICBwb3J0OiB1cmwucG9ydCxcbiAgICAgICAgICAgIHBhdGg6IHVybC5wYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiByZXNwb25zZS5zdGF0dXNDb2RlID09PSAzMDMgPyBcIkdFVFwiIDogc2V0dGluZ3MubWV0aG9kLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogc2VsZi53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gSXNzdWUgdGhlIG5ldyByZXF1ZXN0XG4gICAgICAgICAgcmVxdWVzdCA9IGRvUmVxdWVzdChuZXdPcHRpb25zLCByZXNwb25zZUhhbmRsZXIpLm9uKFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICByZXF1ZXN0LmVuZCgpO1xuICAgICAgICAgIC8vIEBUT0RPIENoZWNrIGlmIGFuIFhIUiBldmVudCBuZWVkcyB0byBiZSBmaXJlZCBoZXJlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2Uuc2V0RW5jb2RpbmcoXCJ1dGY4XCIpO1xuXG4gICAgICAgIHNldFN0YXRlKHNlbGYuSEVBREVSU19SRUNFSVZFRCk7XG4gICAgICAgIHNlbGYuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzQ29kZTtcblxuICAgICAgICByZXNwb25zZS5vbihcImRhdGFcIiwgZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUncyBzb21lIGRhdGFcbiAgICAgICAgICBpZiAoY2h1bmspIHtcbiAgICAgICAgICAgIHNlbGYucmVzcG9uc2VUZXh0ICs9IGNodW5rO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEb24ndCBlbWl0IHN0YXRlIGNoYW5nZXMgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWJvcnRlZC5cbiAgICAgICAgICBpZiAoc2VuZEZsYWcpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKHNlbGYuTE9BRElORyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoc2VuZEZsYWcpIHtcbiAgICAgICAgICAgIC8vIERpc2NhcmQgdGhlIGVuZCBldmVudCBpZiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgICAgICAgc2VuZEZsYWcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFcnJvciBoYW5kbGVyIGZvciB0aGUgcmVxdWVzdFxuICAgICAgdmFyIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnJvcikge1xuICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IGRvUmVxdWVzdChvcHRpb25zLCByZXNwb25zZUhhbmRsZXIpLm9uKFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcblxuICAgICAgLy8gTm9kZSAwLjQgYW5kIGxhdGVyIHdvbid0IGFjY2VwdCBlbXB0eSBkYXRhLiBNYWtlIHN1cmUgaXQncyBuZWVkZWQuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXF1ZXN0LndyaXRlKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0LmVuZCgpO1xuXG4gICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoXCJsb2Fkc3RhcnRcIik7XG4gICAgfSBlbHNlIHsgLy8gU3luY2hyb25vdXNcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIG90aGVyIE5vZGUgcHJvY2Vzc1xuICAgICAgdmFyIGNvbnRlbnRGaWxlID0gXCIubm9kZS14bWxodHRwcmVxdWVzdC1jb250ZW50LVwiICsgcHJvY2Vzcy5waWQ7XG4gICAgICB2YXIgc3luY0ZpbGUgPSBcIi5ub2RlLXhtbGh0dHByZXF1ZXN0LXN5bmMtXCIgKyBwcm9jZXNzLnBpZDtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoc3luY0ZpbGUsIFwiXCIsIFwidXRmOFwiKTtcbiAgICAgIC8vIFRoZSBhc3luYyByZXF1ZXN0IHRoZSBvdGhlciBOb2RlIHByb2Nlc3MgZXhlY3V0ZXNcbiAgICAgIHZhciBleGVjU3RyaW5nID0gXCJ2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKSwgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpLCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XCJcbiAgICAgICAgKyBcInZhciBkb1JlcXVlc3QgPSBodHRwXCIgKyAoc3NsID8gXCJzXCIgOiBcIlwiKSArIFwiLnJlcXVlc3Q7XCJcbiAgICAgICAgKyBcInZhciBvcHRpb25zID0gXCIgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKSArIFwiO1wiXG4gICAgICAgICsgXCJ2YXIgcmVzcG9uc2VUZXh0ID0gJyc7XCJcbiAgICAgICAgKyBcInZhciByZXEgPSBkb1JlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24ocmVzcG9uc2UpIHtcIlxuICAgICAgICArIFwicmVzcG9uc2Uuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcIlxuICAgICAgICArIFwicmVzcG9uc2Uub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1wiXG4gICAgICAgICsgXCIgIHJlc3BvbnNlVGV4dCArPSBjaHVuaztcIlxuICAgICAgICArIFwifSk7XCJcbiAgICAgICAgKyBcInJlc3BvbnNlLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcIlxuICAgICAgICArIFwiZnMud3JpdGVGaWxlU3luYygnXCIgKyBjb250ZW50RmlsZSArIFwiJywgSlNPTi5zdHJpbmdpZnkoe2VycjogbnVsbCwgZGF0YToge3N0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsIHRleHQ6IHJlc3BvbnNlVGV4dH19KSwgJ3V0ZjgnKTtcIlxuICAgICAgICArIFwiZnMudW5saW5rU3luYygnXCIgKyBzeW5jRmlsZSArIFwiJyk7XCJcbiAgICAgICAgKyBcIn0pO1wiXG4gICAgICAgICsgXCJyZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbihlcnJvcikge1wiXG4gICAgICAgICsgXCJmcy53cml0ZUZpbGVTeW5jKCdcIiArIGNvbnRlbnRGaWxlICsgXCInLCBKU09OLnN0cmluZ2lmeSh7ZXJyOiBlcnJvcn0pLCAndXRmOCcpO1wiXG4gICAgICAgICsgXCJmcy51bmxpbmtTeW5jKCdcIiArIHN5bmNGaWxlICsgXCInKTtcIlxuICAgICAgICArIFwifSk7XCJcbiAgICAgICAgKyBcIn0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycm9yKSB7XCJcbiAgICAgICAgKyBcImZzLndyaXRlRmlsZVN5bmMoJ1wiICsgY29udGVudEZpbGUgKyBcIicsIEpTT04uc3RyaW5naWZ5KHtlcnI6IGVycm9yfSksICd1dGY4Jyk7XCJcbiAgICAgICAgKyBcImZzLnVubGlua1N5bmMoJ1wiICsgc3luY0ZpbGUgKyBcIicpO1wiXG4gICAgICAgICsgXCJ9KTtcIlxuICAgICAgICArIChkYXRhID8gXCJyZXEud3JpdGUoJ1wiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkuc2xpY2UoMSwtMSkucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpICsgXCInKTtcIjpcIlwiKVxuICAgICAgICArIFwicmVxLmVuZCgpO1wiO1xuICAgICAgLy8gU3RhcnQgdGhlIG90aGVyIE5vZGUgUHJvY2VzcywgZXhlY3V0aW5nIHRoaXMgc3RyaW5nXG4gICAgICB2YXIgc3luY1Byb2MgPSBzcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIFtcIi1lXCIsIGV4ZWNTdHJpbmddKTtcbiAgICAgIHdoaWxlKGZzLmV4aXN0c1N5bmMoc3luY0ZpbGUpKSB7XG4gICAgICAgIC8vIFdhaXQgd2hpbGUgdGhlIHN5bmMgZmlsZSBpcyBlbXB0eVxuICAgICAgfVxuICAgICAgdmFyIHJlc3AgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb250ZW50RmlsZSwgJ3V0ZjgnKSk7XG4gICAgICAvLyBLaWxsIHRoZSBjaGlsZCBwcm9jZXNzIG9uY2UgdGhlIGZpbGUgaGFzIGRhdGFcbiAgICAgIHN5bmNQcm9jLnN0ZGluLmVuZCgpO1xuICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgZnMudW5saW5rU3luYyhjb250ZW50RmlsZSk7XG5cbiAgICAgIGlmIChyZXNwLmVycikge1xuICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlc3AuZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlID0gcmVzcC5kYXRhO1xuICAgICAgICBzZWxmLnN0YXR1cyA9IHJlc3AuZGF0YS5zdGF0dXNDb2RlO1xuICAgICAgICBzZWxmLnJlc3BvbnNlVGV4dCA9IHJlc3AuZGF0YS50ZXh0O1xuICAgICAgICBzZXRTdGF0ZShzZWxmLkRPTkUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgdG8gZGVhbCB3aXRoIGl0LlxuICAgKi9cbiAgdGhpcy5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGVycm9yO1xuICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gZXJyb3Iuc3RhY2s7XG4gICAgZXJyb3JGbGFnID0gdHJ1ZTtcbiAgICBzZXRTdGF0ZSh0aGlzLkRPTkUpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnZXJyb3InKTtcbiAgfTtcblxuICAvKipcbiAgICogQWJvcnRzIGEgcmVxdWVzdC5cbiAgICovXG4gIHRoaXMuYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocmVxdWVzdCkge1xuICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaGVhZGVycyA9IGRlZmF1bHRIZWFkZXJzO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IFwiXCI7XG4gICAgdGhpcy5yZXNwb25zZVhNTCA9IFwiXCI7XG5cbiAgICBlcnJvckZsYWcgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5VTlNFTlRcbiAgICAgICAgJiYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5PUEVORUQgfHwgc2VuZEZsYWcpXG4gICAgICAgICYmIHRoaXMucmVhZHlTdGF0ZSAhPT0gdGhpcy5ET05FKSB7XG4gICAgICBzZW5kRmxhZyA9IGZhbHNlO1xuICAgICAgc2V0U3RhdGUodGhpcy5ET05FKTtcbiAgICB9XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gdGhpcy5VTlNFTlQ7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhYm9ydCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyLiBQcmVmZXJyZWQgbWV0aG9kIG9mIGJpbmRpbmcgdG8gZXZlbnRzLlxuICAgKi9cbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCEoZXZlbnQgaW4gbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXJzW2V2ZW50XSA9IFtdO1xuICAgIH1cbiAgICAvLyBDdXJyZW50bHkgYWxsb3dzIGR1cGxpY2F0ZSBjYWxsYmFja3MuIFNob3VsZCBpdD9cbiAgICBsaXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgY2FsbGJhY2sgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGJvdW5kLlxuICAgKiBPbmx5IHdvcmtzIG9uIHRoZSBtYXRjaGluZyBmdW5jaXRvbiwgY2Fubm90IGJlIGEgY29weS5cbiAgICovXG4gIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBjYWxsYmFjaykge1xuICAgIGlmIChldmVudCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIC8vIEZpbHRlciB3aWxsIHJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBjYWxsYmFjayByZW1vdmVkXG4gICAgICBsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzW2V2ZW50XS5maWx0ZXIoZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgcmV0dXJuIGV2ICE9PSBjYWxsYmFjaztcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW55IGV2ZW50cywgaW5jbHVkaW5nIGJvdGggXCJvblwiIG1ldGhvZHMgYW5kIGV2ZW50cyBhdHRhY2hlZCB1c2luZyBhZGRFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgdGhpcy5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHNlbGZbXCJvblwiICsgZXZlbnRdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHNlbGZbXCJvblwiICsgZXZlbnRdKCk7XG4gICAgfVxuICAgIGlmIChldmVudCBpbiBsaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0ZW5lcnNbZXZlbnRdLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxpc3RlbmVyc1tldmVudF1baV0uY2FsbChzZWxmKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgcmVhZHlTdGF0ZSBhbmQgY2FsbHMgb25yZWFkeXN0YXRlY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50IHN0YXRlIE5ldyBzdGF0ZVxuICAgKi9cbiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUgPT0gc2VsZi5MT0FESU5HIHx8IHNlbGYucmVhZHlTdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgIHNlbGYucmVhZHlTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICBpZiAoc2V0dGluZ3MuYXN5bmMgfHwgc2VsZi5yZWFkeVN0YXRlIDwgc2VsZi5PUEVORUQgfHwgc2VsZi5yZWFkeVN0YXRlID09PSBzZWxmLkRPTkUpIHtcbiAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KFwicmVhZHlzdGF0ZWNoYW5nZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYucmVhZHlTdGF0ZSA9PT0gc2VsZi5ET05FICYmICFlcnJvckZsYWcpIHtcbiAgICAgICAgc2VsZi5kaXNwYXRjaEV2ZW50KFwibG9hZFwiKTtcbiAgICAgICAgLy8gQFRPRE8gZmlndXJlIG91dCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZExvYWRYSFIoY29va2llKVxuICAgICAgICBzZWxmLmRpc3BhdGNoRXZlbnQoXCJsb2FkZW5kXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIm5hbWVcIjogXCJzYmdudml6XCIsXG4gIFwidmVyc2lvblwiOiBcIjMuNC4zXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJTQkdOUEQgdmlzdWFsaXphdGlvbiBsaWJyYXJ5XCIsXG4gIFwibWFpblwiOiBcInNyYy9pbmRleC5qc1wiLFxuICBcImxpY2VuY2VcIjogXCJMR1BMLTMuMFwiLFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwidGVzdFwiOiBcImVjaG8gXFxcIkVycm9yOiBubyB0ZXN0IHNwZWNpZmllZFxcXCIgJiYgZXhpdCAxXCIsXG4gICAgXCJidWlsZC1zYmdudml6LWpzXCI6IFwiZ3VscCBidWlsZFwiLFxuICAgIFwiZGVidWctanNcIjogXCJub2RlbW9uIC1lIGpzIC0td2F0Y2ggc3JjIC14IFxcXCJucG0gcnVuIGJ1aWxkLXNiZ252aXotanNcXFwiXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9pVmlzLWF0LUJpbGtlbnQvc2JnbnZpei5qcy5naXRcIlxuICB9LFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2lWaXMtYXQtQmlsa2VudC9zYmdudml6LmpzL2lzc3Vlc1wiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vaVZpcy1hdC1CaWxrZW50L3NiZ252aXouanMvXCIsXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJqcXVlcnlcIjogXCJeMi4yLjRcIixcbiAgICBcImZpbGVzYXZlcmpzXCI6IFwifjAuMi4yXCIsXG4gICAgXCJjeXRvc2NhcGVcIjogXCJpVmlzLWF0LUJpbGtlbnQvY3l0b3NjYXBlLmpzI3Vuc3RhYmxlXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwibGlic2Jnbi5qc1wiOiBcIl4wLjEuMVwiLFxuICAgIFwicHJldHR5LWRhdGFcIjogXCJeMC40MC4wXCIsXG4gICAgXCJ4bWwyanNcIjogXCJeMC40LjE3XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl4xMS4yLjBcIixcbiAgICBcImd1bHBcIjogXCJeMy45LjBcIixcbiAgICBcImd1bHAtZGVyZXF1aXJlXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJndWxwLWpzaGludFwiOiBcIl4xLjExLjJcIixcbiAgICBcImd1bHAtcHJvbXB0XCI6IFwiXjAuMS4yXCIsXG4gICAgXCJndWxwLXJlcGxhY2VcIjogXCJeMC41LjRcIixcbiAgICBcImd1bHAtc2hlbGxcIjogXCJeMC41LjBcIixcbiAgICBcImd1bHAtdXRpbFwiOiBcIl4zLjAuNlwiLFxuICAgIFwianNoaW50LXN0eWxpc2hcIjogXCJeMi4wLjFcIixcbiAgICBcIm5vZGUtbm90aWZpZXJcIjogXCJeNC4zLjFcIixcbiAgICBcInJ1bi1zZXF1ZW5jZVwiOiBcIl4xLjEuNFwiLFxuICAgIFwidmlueWwtYnVmZmVyXCI6IFwiXjEuMC4wXCIsXG4gICAgXCJ2aW55bC1zb3VyY2Utc3RyZWFtXCI6IFwiXjEuMS4wXCJcbiAgfVxufVxuIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBzYmdudml6ID0gd2luZG93LnNiZ252aXogPSBmdW5jdGlvbihfb3B0aW9ucywgX2xpYnMpIHtcbiAgICB2YXIgbGlicyA9IHt9O1xuICAgIGxpYnMualF1ZXJ5ID0gX2xpYnMualF1ZXJ5IHx8IGpRdWVyeTtcbiAgICBsaWJzLmN5dG9zY2FwZSA9IF9saWJzLmN5dG9zY2FwZSB8fCBjeXRvc2NhcGU7XG4gICAgbGlicy5zYXZlQXMgPSBfbGlicy5maWxlc2F2ZXJqcyA/IF9saWJzLmZpbGVzYXZlcmpzLnNhdmVBcyA6IHNhdmVBcztcbiAgICBcbiAgICAvLyBTZXQgdGhlIGxpYnJhcmllcyB0byBhY2Nlc3MgdGhlbSBmcm9tIGFueSBmaWxlXG4gICAgdmFyIGxpYlV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKTtcbiAgICBsaWJVdGlsaXRpZXMuc2V0TGlicyhsaWJzKTtcbiAgICBcbiAgICB2YXIgb3B0aW9uVXRpbGl0aWVzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcycpO1xuICAgIHZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmV4dGVuZE9wdGlvbnMoX29wdGlvbnMpO1xuICAgIFxuICAgIHZhciBzYmduUmVuZGVyZXIgPSByZXF1aXJlKCcuL3NiZ24tZXh0ZW5zaW9ucy9zYmduLWN5LXJlbmRlcmVyJyk7XG4gICAgdmFyIHNiZ25DeUluc3RhbmNlID0gcmVxdWlyZSgnLi9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1pbnN0YW5jZScpO1xuICAgIFxuICAgIC8vIFV0aWxpdGllcyB3aG9zZSBmdW5jdGlvbnMgd2lsbCBiZSBleHBvc2VkIHNlcGVyYXRlbHlcbiAgICB2YXIgdWlVdGlsaXRpZXMgPSByZXF1aXJlKCcuL3V0aWxpdGllcy91aS11dGlsaXRpZXMnKTtcbiAgICB2YXIgZmlsZVV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzJyk7XG4gICAgdmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvZ3JhcGgtdXRpbGl0aWVzJyk7XG4gICAgdmFyIG1haW5VdGlsaXRpZXMgPSByZXF1aXJlKCcuL3V0aWxpdGllcy9tYWluLXV0aWxpdGllcycpO1xuICAgIHJlcXVpcmUoJy4vdXRpbGl0aWVzL2tleWJvYXJkLWlucHV0LXV0aWxpdGllcycpOyAvLyByZXF1aXJlIGtleWJvcmQgaW5wdXQgdXRpbGl0aWVzXG4gICAgLy8gVXRpbGl0aWVzIHRvIGJlIGV4cG9zZWQgYXMgaXNcbiAgICB2YXIgZWxlbWVudFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2VsZW1lbnQtdXRpbGl0aWVzJyk7XG4gICAgdmFyIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zID0gcmVxdWlyZSgnLi91dGlsaXRpZXMvdW5kby1yZWRvLWFjdGlvbi1mdW5jdGlvbnMnKTtcbiAgICB2YXIgY2xhc3NlcyA9IHJlcXVpcmUoJy4vdXRpbGl0aWVzL2NsYXNzZXMnKTtcbiAgICBcbiAgICBzYmduUmVuZGVyZXIoKTtcbiAgICBzYmduQ3lJbnN0YW5jZSgpO1xuICAgIFxuICAgIC8vIEV4cG9zZSB0aGUgYXBpXG4gICAgLy8gRXhwb3NlIGVsZW1lbnRVdGlsaXRpZXMgYW5kIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zIGFzIGlzLCBtb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdGhlc2VcbiAgICBzYmdudml6LmVsZW1lbnRVdGlsaXRpZXMgPSBlbGVtZW50VXRpbGl0aWVzO1xuICAgIHNiZ252aXoudW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMgPSB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucztcbiAgICBcbiAgICAvLyBFeHBvc2UgZWFjaCBtYWluIHV0aWxpdHkgc2VwZXJhdGVseVxuICAgIGZvciAodmFyIHByb3AgaW4gbWFpblV0aWxpdGllcykge1xuICAgICAgc2JnbnZpeltwcm9wXSA9IG1haW5VdGlsaXRpZXNbcHJvcF07XG4gICAgfVxuICAgIFxuICAgIC8vIEV4cG9zZSBlYWNoIGZpbGUgdXRpbGl0eSBzZXBlcmF0ZWx5XG4gICAgZm9yICh2YXIgcHJvcCBpbiBmaWxlVXRpbGl0aWVzKSB7XG4gICAgICBzYmdudml6W3Byb3BdID0gZmlsZVV0aWxpdGllc1twcm9wXTtcbiAgICB9XG4gICAgXG4gICAgLy8gRXhwb3NlIGVhY2ggZmlsZSB1dGlsaXR5IHNlcGVyYXRlbHlcbiAgICBmb3IgKHZhciBwcm9wIGluIHVpVXRpbGl0aWVzKSB7XG4gICAgICBzYmdudml6W3Byb3BdID0gdWlVdGlsaXRpZXNbcHJvcF07XG4gICAgfVxuICAgIFxuICAgIC8vIEV4cG9zZSBlYWNoIHNiZ24gZ3JhcGggdXRpbGl0eSBzZXBlcmF0ZWx5XG4gICAgZm9yICh2YXIgcHJvcCBpbiBncmFwaFV0aWxpdGllcykge1xuICAgICAgc2JnbnZpeltwcm9wXSA9IGdyYXBoVXRpbGl0aWVzW3Byb3BdO1xuICAgIH1cblxuICAgIHNiZ252aXouY2xhc3NlcyA9IGNsYXNzZXM7XG4gIH07XG4gIFxuICBpZiAoIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gc2JnbnZpejtcbiAgfVxufSkoKTsiLCJ2YXIgZWxlbWVudFV0aWxpdGllcyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9lbGVtZW50LXV0aWxpdGllcycpO1xudmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xudmFyIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL3VuZG8tcmVkby1hY3Rpb24tZnVuY3Rpb25zJyk7XG52YXIgcmVmcmVzaFBhZGRpbmdzID0gZ3JhcGhVdGlsaXRpZXMucmVmcmVzaFBhZGRpbmdzLmJpbmQoZ3JhcGhVdGlsaXRpZXMpO1xuXG52YXIgbGlicyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBjeXRvc2NhcGUgPSBsaWJzLmN5dG9zY2FwZTtcblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9vcHRpb24tdXRpbGl0aWVzJyk7XG52YXIgb3B0aW9ucyA9IG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zKCk7XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgbG9jYXRlZCBvbiB0aGUgZ2l2ZW4gYW5nbGUgb24gdGhlIGNpcmNsZSB3aXRoIHRoZSBnaXZlbiBjZW50ZXJhbCBjb29yZGluYXRlcyBhbmQgcmFkaXVzLlxuICovXG52YXIgZ2V0UG9pbnRPbkNpcmNsZSA9IGZ1bmN0aW9uKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgYW5nbGVJbkRlZ3JlZSkge1xuXHR2YXIgYW5nbGVJblJhZGlhbiA9IGFuZ2xlSW5EZWdyZWUgKiAoIE1hdGguUEkgLyAxODAgKTsgLy8gQ29udmVydCBkZWdyZWUgdG8gcmFkaWFuXG5cdHJldHVybiB7XG5cdFx0eDogcmFkaXVzICogTWF0aC5jb3MoYW5nbGVJblJhZGlhbikgKyBjZW50ZXJYLFxuXHRcdHk6IC0xICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGVJblJhZGlhbikgKyBjZW50ZXJZIC8vIFdlIG11bHRpcGx5IHdpdGggLTEgaGVyZSBiZWNhdXNlIEpTIHkgY29vcmRpbmF0ZSBzaWduIGlzIHRoZSBvcG9zaXRlIG9mIHRoZSBNYXRoYW1hdGljYWwgY29vcmRpbmF0ZXMgc3lzdGVtXG5cdH07XG59O1xuXG4vKlxuICogR2VuZXJhdGVzIGEgcG9seWdvbiBzdHJpbmcgYXBwcm94aW1hdGluZyBhIGNpcmNsZSB3aXRoIGdpdmVuIGNlbnRlciwgcmFkaXVzLCBzdGFydCwgZW5kIGFuZ2xlcyBhbmQgbnVtYmVyIG9mIHBvaW50cyB0byByZXByZXNlbnQgdGhlIGNpcmNsZVxuICovXG52YXIgZ2VuZXJhdGVDaXJjbGVTdHJpbmcgPSBmdW5jdGlvbihjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGFuZ2xlRnJvbSwgYW5nbGVUbywgbnVtT2ZQb2ludHMpIHtcblx0dmFyIGNpcmNsZVN0ciA9IFwiXCI7XG5cdHZhciBzdGVwU2l6ZSA9ICggYW5nbGVUbyAtIGFuZ2xlRnJvbSApIC8gbnVtT2ZQb2ludHM7IC8vIFdlIHdpbGwgaW5jcmVtZW50IHRoZSBjdXJyZW50IGFuZ2xlIGJ5IHN0ZXAgc2l6ZSBpbiBlYWNoIGl0ZXJhdGlvblxuXHR2YXIgY3VycmVudEFuZ2xlID0gYW5nbGVGcm9tOyAvLyBjdXJyZW50IGFuZ2xlIHdpbGwgYmUgdXBkYXRlZCBpbiBlYWNoIGl0ZXJhdGlvblxuXHRcblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbnVtT2ZQb2ludHM7IGkrKyApIHtcblx0XHR2YXIgcG9pbnQgPSBnZXRQb2ludE9uQ2lyY2xlKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgY3VycmVudEFuZ2xlKTtcblx0XHRjdXJyZW50QW5nbGUgKz0gc3RlcFNpemU7XG5cdFx0Y2lyY2xlU3RyICs9IHBvaW50LnggKyBcIiBcIiArIHBvaW50LnkgKyBcIiBcIjtcblx0fVxuXHRcblx0cmV0dXJuIGNpcmNsZVN0cjtcbn07XG5cbi8qXG4gKiAgR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBwcm9jZXNzZXMvbG9naWNhbCBvcGVyYXRvcnMgd2l0aCBwb3J0cy5cbiAqICBsaW5lSFc6IEhhbGYgd2lkdGggb2YgbGluZSB0aHJvdWdoIHRoZSBjaXJjbGUgdG8gdGhlIGludGVyc2VjdGlvbiBwb2ludFxuICogIHNoYXBlSFc6IEhhbGYgd2lkdGggb2YgdGhlIHNoYXBlIGRpc2NsdWRpbmcgdGhlIHBvcnRzIChJdCBpcyByYWRpdXMgZm9yIHRoZSBjaXJjdWxhciBzaGFwZXMpXG4gKiAgdHlwZTogVHlwZSBvZiB0aGUgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHMuIE9wdGlvbnMgYXJlICdjaXJjbGUnLCAncmVjdGFuZ2xlJ1xuICogIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiBvZiB0aGUgcG9ydHMgT3B0aW9ucyBhcmUgJ2hvcml6b250YWwnLCAndmVydGljYWwnXG4gKi9cblxudmFyIGdlbmVyYXRlU2hhcGVXaXRoUG9ydFN0cmluZyA9IGZ1bmN0aW9uKGxpbmVIVywgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pIHtcblx0dmFyIHBvbHlnb25TdHI7XG4gICAgdmFyIG51bU9mUG9pbnRzID0gMzA7IC8vIE51bWJlciBvZiBwb2ludHMgdGhhdCBib3RoIGhhbHZlcyBvZiBjaXJjbGUgd2lsbCBoYXZlXG5cdGlmIChvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG5cdFx0dmFyIGFib3ZlUG9pbnRzLCBiZWxvd1BvaW50cztcblx0XG5cdFx0aWYgKHR5cGUgPT09ICdjaXJjbGUnKSB7XG5cdFx0XHRhYm92ZVBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDE4MCwgMCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0YmVsb3dQb2ludHMgPSBnZW5lcmF0ZUNpcmNsZVN0cmluZygwLCAwLCBzaGFwZUhXLCAzNjAsIDE4MCwgbnVtT2ZQb2ludHMpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0YWJvdmVQb2ludHMgPSAnLScgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICc7XG5cdFx0XHRiZWxvd1BvaW50cyA9IHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAnO1xuXHRcdH1cblx0XHRcblx0XHRwb2x5Z29uU3RyID0gXCItMSAtXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgXCI7XHRcblx0XHRwb2x5Z29uU3RyICs9IGFib3ZlUG9pbnRzO1xuXHRcdHBvbHlnb25TdHIgKz0gc2hhcGVIVyArIFwiIC1cIiArIGxpbmVIVyArIFwiIDEgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIFwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgXCI7XG5cdFx0cG9seWdvblN0ciArPSBiZWxvd1BvaW50cztcblx0XHRwb2x5Z29uU3RyICs9IFwiLVwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgLTEgXCIgKyBsaW5lSFc7XG5cdH1cblx0ZWxzZSB7XG5cdFx0dmFyIGxlZnRQb2ludHMsIHJpZ2h0UG9pbnRzO1xuXHRcdFxuXHRcdGlmICh0eXBlID09PSAnY2lyY2xlJykge1xuXHRcdFx0bGVmdFBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDkwLCAyNzAsIG51bU9mUG9pbnRzKTtcblx0XHRcdHJpZ2h0UG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgLTkwLCA5MCwgbnVtT2ZQb2ludHMpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0bGVmdFBvaW50cyA9ICctJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgJztcblx0XHRcdHJpZ2h0UG9pbnRzID0gc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICc7IFxuXHRcdH1cblx0XHRcblx0XHRwb2x5Z29uU3RyID0gXCItXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyAxICsgXCIgLVwiICsgbGluZUhXICsgXCIgLVwiICsgc2hhcGVIVyArIFwiIFwiO1xuXHRcdHBvbHlnb25TdHIgKz0gbGVmdFBvaW50cztcblx0XHRwb2x5Z29uU3RyICs9IFwiLVwiICsgbGluZUhXICsgXCIgXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIDEgXCIgKyBsaW5lSFcgKyBcIiBcIiArIHNoYXBlSFcgKyBcIiBcIjtcblx0XHRwb2x5Z29uU3RyICs9IHJpZ2h0UG9pbnRzO1xuXHRcdHBvbHlnb25TdHIgKz0gbGluZUhXICsgXCIgLVwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgLTFcIjtcblx0fVxuXHRcblx0cmV0dXJuIHBvbHlnb25TdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRhaW5lclNlbGVjdG9yID0gb3B0aW9ucy5uZXR3b3JrQ29udGFpbmVyU2VsZWN0b3I7XG4gIHZhciBpbWdQYXRoID0gb3B0aW9ucy5pbWdQYXRoO1xuICBcbiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKClcbiAge1xuICAgIHZhciBzYmduTmV0d29ya0NvbnRhaW5lciA9ICQoY29udGFpbmVyU2VsZWN0b3IpO1xuXG4gICAgLy8gY3JlYXRlIGFuZCBpbml0IGN5dG9zY2FwZTpcbiAgICB2YXIgY3kgPSBjeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyOiBzYmduTmV0d29ya0NvbnRhaW5lcixcbiAgICAgIHN0eWxlOiBzYmduU3R5bGVTaGVldCxcbiAgICAgIHNob3dPdmVybGF5OiBmYWxzZSwgbWluWm9vbTogMC4xMjUsIG1heFpvb206IDE2LFxuICAgICAgYm94U2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICAgIG1vdGlvbkJsdXI6IHRydWUsXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5OiAwLjEsXG4gICAgICByZWFkeTogZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cuY3kgPSB0aGlzO1xuICAgICAgICAvLyBJZiB1bmRvYWJsZSByZWdpc3RlciB1bmRvL3JlZG8gYWN0aW9uc1xuICAgICAgICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgICAgICAgIHJlZ2lzdGVyVW5kb1JlZG9BY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgYmluZEN5RXZlbnRzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBcbiAgLy8gTm90ZSB0aGF0IGluIENoaVNFIHRoaXMgZnVuY3Rpb24gaXMgaW4gYSBzZXBlcmF0ZSBmaWxlIGJ1dCBpbiB0aGUgdmlld2VyIGl0IGhhcyBqdXN0IDIgbWV0aG9kcyBhbmQgc28gaXQgaXMgbG9jYXRlZCBpbiB0aGlzIGZpbGVcbiAgZnVuY3Rpb24gcmVnaXN0ZXJVbmRvUmVkb0FjdGlvbnMoKSB7XG4gICAgLy8gY3JlYXRlIG9yIGdldCB0aGUgdW5kby1yZWRvIGluc3RhbmNlXG4gICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcblxuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYWwgYWN0aW9uc1xuICAgIC8vIHJlZ2lzdGVyIGFkZCByZW1vdmUgYWN0aW9uc1xuICAgIHVyLmFjdGlvbihcImRlbGV0ZUVsZXNTaW1wbGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlRWxlc1NpbXBsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuICAgIHVyLmFjdGlvbihcImRlbGV0ZU5vZGVzU21hcnRcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlTm9kZXNTbWFydCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuICAgIHVyLmFjdGlvbihcInNldFBvcnRzT3JkZXJpbmdcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuc2V0UG9ydHNPcmRlcmluZywgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuc2V0UG9ydHNPcmRlcmluZyk7XG4gIH1cbiAgXG4gIGZ1bmN0aW9uIGJpbmRDeUV2ZW50cygpIHtcbiAgICBjeS5vbigndGFwZW5kJywgJ25vZGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGN5LnN0eWxlKCkudXBkYXRlKCk7XG4gICAgfSk7XG4gICAgXG4gICAgY3kub24oXCJleHBhbmRjb2xsYXBzZS5iZWZvcmVjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXM7XG4gICAgICAvL1RoZSBjaGlsZHJlbiBpbmZvIG9mIGNvbXBsZXggbm9kZXMgc2hvdWxkIGJlIHNob3duIHdoZW4gdGhleSBhcmUgY29sbGFwc2VkXG4gICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG4gICAgICAgIC8vVGhlIG5vZGUgaXMgYmVpbmcgY29sbGFwc2VkIHN0b3JlIGluZm9sYWJlbCB0byB1c2UgaXQgbGF0ZXJcbiAgICAgICAgdmFyIGluZm9MYWJlbCA9IGVsZW1lbnRVdGlsaXRpZXMuZ2V0SW5mb0xhYmVsKG5vZGUpO1xuICAgICAgICBub2RlLl9wcml2YXRlLmRhdGEuaW5mb0xhYmVsID0gaW5mb0xhYmVsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICB2YXIgbm9kZSA9IHRoaXM7XG4gICAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBqdXN0IGNvbGxhcHNlZCBub2RlcyBzaG91bGQgYmUgMzYsIGJ1dCB0aGV5IGFyZSBzdXBwb3NlZCB0byBiZSByZXNpemFibGUuIFRoZXJlZm9yZSwgd2VcbiAgICAgIC8vIHNldCB0aGVpciBkYXRhKCdiYm94JykgYWNjb3JkaW5nbHkuIFdlIGRvIG5vdCBzdG9yZSB0aGVpciBleGlzdGluZyBiYm94LncgYW5kIGJib3guaCBiZWNhdXNlIHRoZXkgaGF2ZSBubyBzaWduaWZpY2FuY2UgZm9yIGNvbXBvdW5kcyAoZm9yIG5vdykuXG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgICB2YXIgYmJveCA9IG5vZGUuZGF0YSgnYmJveCcpO1xuICAgICAgYmJveC53ID0gMzY7XG4gICAgICBiYm94LmggPSAzNjtcbiAgICAgIG5vZGUuZGF0YSgnYmJveCcsIGJib3gpO1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9KTtcblxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYmVmb3JlZXhwYW5kXCIsIFwibm9kZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcztcbiAgICAgIG5vZGUucmVtb3ZlRGF0YShcImluZm9MYWJlbFwiKTtcbiAgICB9KTtcblxuICAgIGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJleHBhbmRcIiwgXCJub2RlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzO1xuICAgICAgY3kubm9kZXMoKS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuICAgICAgLy9Eb24ndCBzaG93IGNoaWxkcmVuIGluZm8gd2hlbiB0aGUgY29tcGxleCBub2RlIGlzIGV4cGFuZGVkXG4gICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlU3R5bGUoJ2NvbnRlbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGN5Lm9uKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQubGF5b3V0Lm9wdGlvbnMubmFtZSAhPT0gJ3ByZXNldCcpXG4gICAgICB7XG4gICAgICAgIGlmIChncmFwaFV0aWxpdGllcy5wb3J0c0VuYWJsZWQgPT09IHRydWUpXG4gICAgICAgIHtcbiAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNoYW5nZVBvcnRzT3JpZW50YXRpb25BZnRlckxheW91dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkKGRvY3VtZW50KS5vbigndXBkYXRlR3JhcGhFbmQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgLy8gbGlzdCBhbGwgZW50aXR5dHlwZXMgYW5kc3RvcmUgdGhlbSBpbiB0aGUgZ2xvYmFsIHNjcmF0Y2hcbiAgICAgIC8vIG9ubHkgc3RhdGVmdWwgRVBOIChjb21wbGV4LCBtYWNyb21vbGVjdWxlIG9yIG51Y2xlaWMgYWNpZCkgYXJlIGNvbmNlcm5lZFxuXG4gICAgICAvLyBmb2xsb3dpbmcgaXMgdW5hcHBsaWVkIGR1ZSB0byBwZXJmb3JtYW5jZSBkZWNyZWFzaW5nLCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgMjAlIHRpbWUgb24gbG9hZFxuICAgICAgLypjeS5zdGFydEJhdGNoKCk7XG4gICAgICB2YXIgZW50aXR5SGFzaCA9IHt9O1xuICAgICAgY3kubm9kZXMoXCJbY2xhc3M9J2NvbXBsZXgnXSwgW2NsYXNzPSdtYWNyb21vbGVjdWxlJ10sIFtjbGFzcz0nbnVjbGVpYyBhY2lkIGZlYXR1cmUnXVwiKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gaWRlbnRpZnkgYW4gZW50aXR5IGJ5IGl0cyBsYWJlbCBBTkQgY2xhc3NcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5kYXRhKCdsYWJlbCcpO1xuICAgICAgICB2YXIgX2NsYXNzID0gbm9kZS5kYXRhKCdjbGFzcycpO1xuICAgICAgICB2YXIgaWQ9bGFiZWwrJy0nK19jbGFzcztcbiAgICAgICAgaWYoIWVudGl0eUhhc2guaGFzT3duUHJvcGVydHkoaWQpKSB7IC8vIGNyZWF0ZSBlbnRpdHl0eXBlIGlmIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICAgICAgICAgIGVudGl0eUhhc2hbaWRdID0gbmV3IGNsYXNzZXMuRW50aXR5VHlwZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cnJlbnRFbnRpdHlUeXBlID0gZW50aXR5SGFzaFtpZF07XG4gICAgICAgIGN1cnJlbnRFbnRpdHlUeXBlLkVQTnMucHVzaChub2RlKTsgLy8gYXNzaWduZSB0aGUgY3VycmVudCBlbGVtZW50IHRvIGl0cyBjb3JyZXNwb25kaW5nIGVudGl0eXR5cGVcblxuICAgICAgICAvLyBjb2xsZWN0IGFsbCBzdGF0ZVZhcmlhYmxlcyBvZiB0aGUgY3VycmVudCBlbGVtZW50LCB3ZSBuZWVkIHRvIGFzc2lnbiBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbnMgdG8gdGhlbVxuICAgICAgICBmb3IodmFyIGk9MDsgaSA8IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKVtpXTtcbiAgICAgICAgICBpZihzdGF0ZXNhbmRpbmZvcyBpbnN0YW5jZW9mIGNsYXNzZXMuU3RhdGVWYXJpYWJsZSkgeyAvLyBzdGF0ZVZhcmlhYmxlIGZvdW5kXG4gICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlVmFyaWFibGUgPSBzdGF0ZXNhbmRpbmZvcztcbiAgICAgICAgICAgIGN1cnJlbnRFbnRpdHlUeXBlLmFzc2lnblN0YXRlVmFyaWFibGUoY3VycmVudFN0YXRlVmFyaWFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgICAgY3kuc2NyYXRjaCgnX3NiZ252aXonLCB7U0JHTkVudGl0eVR5cGVzOiBlbnRpdHlIYXNofSk7Ki9cblxuICAgICAgLy8gYXNzaWduIHN0YXRlc2FuZGluZm9zIHRvIHRoZWlyIGxheW91dFxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgY3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycsIHt9KTtcbiAgICAgICAgLy8gZm9yIGVhY2ggc3RhdGVzYW5kaW5mb3NcbiAgICAgICAgZm9yKHZhciBpPTA7IGkgPCBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJykubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3RhdGVzYW5kaW5mb3MgPSBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJylbaV07XG4gICAgICAgICAgdmFyIGxvY2F0aW9uID0gc3RhdGVzYW5kaW5mb3MuYW5jaG9yU2lkZTsgLy8gdG9wIGJvdHRvbSByaWdodCBsZWZ0XG4gICAgICAgICAgdmFyIGxheW91dHMgPSBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJyk7XG4gICAgICAgICAgaWYoIWxheW91dHNbbG9jYXRpb25dKSB7IC8vIGxheW91dCBkb2Vzbid0IGV4aXN0IHlldCBmb3IgdGhpcyBsb2NhdGlvblxuICAgICAgICAgICAgbGF5b3V0c1tsb2NhdGlvbl0gPSBuZXcgY2xhc3Nlcy5BdXhVbml0TGF5b3V0KG5vZGUsIGxvY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGxheW91dCBvZiB0aGlzIHNpZGVcbiAgICAgICAgICBsYXlvdXRzW2xvY2F0aW9uXS5hZGRBdXhVbml0KHN0YXRlc2FuZGluZm9zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgdGhhdCBlYWNoIGxheW91dCBoYXMgc3RhdGVzYW5kaW5mb3MgaW4gY29ycmVjdCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlaXIgaW5pdGlhbCBwb3NpdGlvbnNcbiAgICAgICAgZm9yKHZhciBsb2NhdGlvbiBpbiBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJykpIHtcbiAgICAgICAgICBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbbG9jYXRpb25dLnJlb3JkZXJGcm9tUG9zaXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb25Db2xvciA9ICcjZDY3NjE0JztcbiAgdmFyIHNiZ25TdHlsZVNoZWV0ID0gY3l0b3NjYXBlLnN0eWxlc2hlZXQoKVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMS4yNSxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnIzU1NScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjZmZmZmZmJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLjUsXG4gICAgICAgICAgICAndGV4dC1vcGFjaXR5JzogMSxcbiAgICAgICAgICAgICdvcGFjaXR5JzogMSxcbiAgICAgICAgICAgICdwYWRkaW5nJzogMCxcbiAgICAgICAgICAgICd0ZXh0LXdyYXAnOiAnd3JhcCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbP2Nsb25lbWFya2VyXVtjbGFzcz0ncGVydHVyYmluZyBhZ2VudCddLG5vZGVbP2Nsb25lbWFya2VyXVtjbGFzcz0ndW5zcGVjaWZpZWQgZW50aXR5J11cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogXCJ1cmwoJ1wiICsgJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCUzQ3N2ZyUyMHdpZHRoJTNEJTIyMTAwJTIyJTIwaGVpZ2h0JTNEJTIyMTAwJTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMTAwJTIwMTAwJTIyJTIwc3R5bGUlM0QlMjJmaWxsJTNBbm9uZSUzQnN0cm9rZSUzQWJsYWNrJTNCc3Ryb2tlLXdpZHRoJTNBMCUzQiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyMiUyMCUzRSUzQ3JlY3QlMjB4JTNEJTIyMCUyMiUyMHklM0QlMjIwJTIyJTIwd2lkdGglM0QlMjIxMDAlMjIlMjBoZWlnaHQlM0QlMjIxMDAlMjIlMjBzdHlsZSUzRCUyMmZpbGwlM0ElMjNhOWE5YTklMjIvJTNFJTIwJTNDL3N2ZyUzRScgKyBcIicpXCIsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi15JzogJzEwMCUnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtd2lkdGgnOiAnMTAwJScsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnMjUlJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWZpdCc6ICdub25lJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2Nsb25lbWFya2VyJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZWxlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NoYXBlJzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDeVNoYXBlKGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NvbnRlbnQnOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEVsZW1lbnRDb250ZW50KGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0TGFiZWxUZXh0U2l6ZShlbGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J2Fzc29jaWF0aW9uJ10sW2NsYXNzPSdkaXNzb2NpYXRpb24nXSxbY2xhc3M9J2FuZCddLFtjbGFzcz0nb3InXSxbY2xhc3M9J25vdCddLFtjbGFzcz0ncHJvY2VzcyddLFtjbGFzcz0nb21pdHRlZCBwcm9jZXNzJ10sW2NsYXNzPSd1bmNlcnRhaW4gcHJvY2VzcyddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnc2hhcGUtcG9seWdvbi1wb2ludHMnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCA9PT0gdHJ1ZSAmJiBlbGUuZGF0YSgncG9ydHMnKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcG9ydHMgb2YgdGhlIGVkZ2UgYXJlIHN5bWV0cmljIGFjY29yZGluZyB0byB0aGUgbm9kZSBjZW50ZXIgc28ganVzdCBjaGVja2luZyBvbmUgcG9ydCBpcyBlbm91Z2ggZm9yIHVzXG4gICAgICAgICAgICAgICAgdmFyIHBvcnQgPSBlbGUuZGF0YSgncG9ydHMnKVswXTsgXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBvcnRzIGFyZSBsb2NhdGVkIGFib3ZlL2JlbG93IG9mIHRoZSBub2RlIHRoZW4gdGhlIG9yaWVudGF0aW9uIGlzICd2ZXJ0aWNhbCcgZWxzZSBpdCBpcyAnaG9yaXpvbnRhbCdcbiAgICAgICAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBwb3J0LnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBoYWxmIHdpZHRoIG9mIHRoZSBhY3R1YWwgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHNcbiAgICAgICAgICAgICAgICB2YXIgc2hhcGVIVyA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gNTAgLyBNYXRoLmFicyhwb3J0LnkpIDogNTAgLyBNYXRoLmFicyhwb3J0LngpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2xhc3Mgb2YgdGhlIG5vZGVcbiAgICAgICAgICAgICAgICB2YXIgX2NsYXNzID0gZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgICAgICAgICAgLy8gSWYgY2xhc3MgaXMgb25lIG9mIHByb2Nlc3MsIG9taXR0ZWQgcHJvY2VzcyBvciB1bmNlcnRhaW4gcHJvY2VzcyB0aGVuIHRoZSB0eXBlIG9mIGFjdHVhbCBzaGFwZSBpcyAncmVjdGFuZ2xlJyBlbHNlIGl0IGlzICdjaXJjbGUnXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBfY2xhc3MuZW5kc1dpdGgoJ3Byb2Nlc3MnKSA/ICdyZWN0YW5nbGUnIDogJ2NpcmNsZSc7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBwb2x5Z29uIHN0cmluZyB3aXRoIGFib3ZlIHBhcmFtZXRlcnMgYW5kIHJldHVybiBpdFxuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVNoYXBlV2l0aFBvcnRTdHJpbmcoMC4wMSwgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaXMgbm90IGV4cGVjdGVkIHRvIGhhdmUgYSBwb3lnb25pYWwgc2hhcGUgKEJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSAyIHBvcnRzKSBqdXN0IHJldHVybiBhIHRyaXZpYWwgc3RyaW5nIGhlcmUgbm90IHRvIGhhdmUgYSBydW4gdGltZSBidWdcbiAgICAgICAgICAgICAgcmV0dXJuICctMSAtMSAxIDEgMSAwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J3BlcnR1cmJpbmcgYWdlbnQnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NoYXBlLXBvbHlnb24tcG9pbnRzJzogJy0xLCAtMSwgICAtMC41LCAwLCAgLTEsIDEsICAgMSwgMSwgICAwLjUsIDAsIDEsIC0xJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZVtjbGFzcz0ndGFnJ11cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMC4yNSwgLTEsICAgMSwgMCwgICAgMC4yNSwgMSwgICAgLTEsIDEnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFtjbGFzc149J2NvbXBsZXgnXVwiKSAvLyBzdGFydCB3aXRoIGNvbXBsZXhcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAndGV4dC1tYXJnaW4teSc6IGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q29tcGxleE1hcmdpbixcbiAgICAgICAgICAgICdwYWRkaW5nJzogZWxlbWVudFV0aWxpdGllcy5nZXRDb21wbGV4UGFkZGluZyxcbiAgICAgICAgICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycgOiAnZXhjbHVkZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdjb21wYXJ0bWVudCddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMy4yNSxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ2JvdHRvbScsXG4gICAgICAgICAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICd0ZXh0LW1hcmdpbi15JyA6IC0xICogb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZyxcbiAgICAgICAgICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscycgOiAnZXhjbHVkZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFtjbGFzcz0nY29tcGFydG1lbnQnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3BhZGRpbmcnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MoKSArIG9wdGlvbnMuZXh0cmFDb21wYXJ0bWVudFBhZGRpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdzdWJtYXAnXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIuMjUsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMCxcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAndGV4dC1tYXJnaW4teScgOiAtMSAqIG9wdGlvbnMuZXh0cmFDb21wYXJ0bWVudFBhZGRpbmcsXG4gICAgICAgICAgICAnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnIDogJ2V4Y2x1ZGUnLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbY2xhc3M9J3N1Ym1hcCddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAncGFkZGluZyc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ3JhcGhVdGlsaXRpZXMuZ2V0Q29tcG91bmRQYWRkaW5ncygpICsgb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6Y2hpbGRsZXNzW2Jib3hdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnd2lkdGgnOiAnZGF0YShiYm94LncpJyxcbiAgICAgICAgICAgICdoZWlnaHQnOiAnZGF0YShiYm94LmgpJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluSGVpZ2h0XVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzVG9wXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQtYmlhcy10b3AnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzVG9wJykgKyAnJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzQm90dG9tXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzQm90dG9tJykgKyAnJSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5XaWR0aF1cIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdtaW4td2lkdGgnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS5kYXRhKCdtaW5XaWR0aCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoQmlhc0xlZnRdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnbWluLXdpZHRoLWJpYXMtbGVmdCc6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlLmRhdGEoJ21pbldpZHRoQmlhc0xlZnQnKSArICclJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoQmlhc1JpZ2h0XVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ21pbi13aWR0aC1iaWFzLXJpZ2h0JzogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuZGF0YSgnbWluV2lkdGhCaWFzUmlnaHQnKSArICclJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGUuY3ktZXhwYW5kLWNvbGxhcHNlLWNvbGxhcHNlZC1ub2RlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ2Rhc2hlZCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcIm5vZGU6c2VsZWN0ZWRcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzAwMCcsXG4gICAgICAgICAgICAndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJub2RlOmFjdGl2ZVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ2JhY2tncm91bmQtb3BhY2l0eSc6IDAuNywgJ292ZXJsYXktY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICdvdmVybGF5LXBhZGRpbmcnOiAnMTQnXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM1NTUnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1maWxsJzogJ2hvbGxvdycsXG4gICAgICAgICAgICAnc291cmNlLWFycm93LWZpbGwnOiAnaG9sbG93JyxcbiAgICAgICAgICAgICd3aWR0aCc6IDEuMjUsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyM1NTUnLFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjNTU1JyxcbiAgICAgICAgICAgICd0ZXh0LWJvcmRlci1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgaWYgKGVsZS5zZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNvbG9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuY3NzKCdsaW5lLWNvbG9yJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2NvbG9yJzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICBpZiAoZWxlLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uQ29sb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2xpbmUtY29sb3InKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnYXJyb3ctc2NhbGUnOiAxLjI1XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlLmN5LWV4cGFuZC1jb2xsYXBzZS1tZXRhLWVkZ2VcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyNDNEM0QzQnLFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6ICcjQzRDNEM0JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0M0QzRDNCdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2U6c2VsZWN0ZWRcIilcbiAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG4gICAgICAgICAgICAnc291cmNlLWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3JcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2U6YWN0aXZlXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1vcGFjaXR5JzogMC43LCAnb3ZlcmxheS1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuICAgICAgICAgICAgJ292ZXJsYXktcGFkZGluZyc6ICc4J1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiZWRnZVtjYXJkaW5hbGl0eSA+IDBdXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGV4dC1yb3RhdGlvbic6ICdhdXRvcm90YXRlJyxcbiAgICAgICAgICAgICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgICd0ZXh0LWJvcmRlci1vcGFjaXR5JzogJzEnLFxuICAgICAgICAgICAgJ3RleHQtYm9yZGVyLXdpZHRoJzogJzEnLFxuICAgICAgICAgICAgJ3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICd3aGl0ZScsXG4gICAgICAgICAgICAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknOiAnMSdcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J2NvbnN1bXB0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NvdXJjZS1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG4gICAgICAgICAgICAnc291cmNlLXRleHQtb2Zmc2V0JzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDYXJkaW5hbGl0eURpc3RhbmNlKGVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlW2NsYXNzPSdwcm9kdWN0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3RhcmdldC1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3RhcmdldC10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG4gICAgICAgICAgICAndGFyZ2V0LXRleHQtb2Zmc2V0JzogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDYXJkaW5hbGl0eURpc3RhbmNlKGVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VsZWN0b3IoXCJlZGdlW2NsYXNzXVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1zaGFwZSc6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q3lBcnJvd1NoYXBlKGVsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3NvdXJjZS1hcnJvdy1zaGFwZSc6ICdub25lJyxcbiAgICAgICAgICAgICdzb3VyY2UtZW5kcG9pbnQnOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RW5kUG9pbnQoZWxlLCAnc291cmNlJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3RhcmdldC1lbmRwb2ludCc6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRFbmRQb2ludChlbGUsICd0YXJnZXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J2luaGliaXRpb24nXSxbY2xhc3M9J25lZ2F0aXZlIGluZmx1ZW5jZSddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWZpbGwnOiAnZmlsbGVkJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiZWRnZVtjbGFzcz0ncHJvZHVjdGlvbiddXCIpXG4gICAgICAgICAgLmNzcyh7XG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWZpbGwnOiAnZmlsbGVkJ1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNlbGVjdG9yKFwiY29yZVwiKVxuICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgJ3NlbGVjdGlvbi1ib3gtY29sb3InOiBzZWxlY3Rpb25Db2xvcixcbiAgICAgICAgICAgICdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAnMC4yJywgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogc2VsZWN0aW9uQ29sb3JcbiAgICAgICAgICB9KTtcbn07XG4iLCIvKlxuICogUmVuZGVyIHNiZ24gc3BlY2lmaWMgc2hhcGVzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGN5dG9zY2FwZS5qcyBjb3JlXG4gKi9cblxudmFyIHRydW5jYXRlVGV4dCA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy90ZXh0LXV0aWxpdGllcycpLnRydW5jYXRlVGV4dDtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIGN5dG9zY2FwZSA9IGxpYnMuY3l0b3NjYXBlO1xuXG52YXIgY3lNYXRoID0gbWF0aCA9IGN5dG9zY2FwZS5tYXRoO1xudmFyIGN5QmFzZU5vZGVTaGFwZXMgPSBjeXRvc2NhcGUuYmFzZU5vZGVTaGFwZXM7XG52YXIgY3lTdHlsZVByb3BlcnRpZXMgPSBjeXRvc2NhcGUuc3R5bGVQcm9wZXJ0aWVzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyICQkID0gY3l0b3NjYXBlO1xuICBcbiAgLy8gVGFrZW4gZnJvbSBjeXRvc2NhcGUuanMgYW5kIG1vZGlmaWVkXG4gIHZhciBkcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzICl7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG4gIFxuICAvLyBUYWtlbiBmcm9tIGN5dG9zY2FwZS5qc1xuICB2YXIgZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzICl7XG5cbiAgICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICBjb250ZXh0Lm1vdmVUbyggeCArIGhhbGZXICogcG9pbnRzWzBdLCB5ICsgaGFsZkggKiBwb2ludHNbMV0gKTtcblxuICAgIGZvciggdmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKyApe1xuICAgICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqIHBvaW50c1sgaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbIGkgKiAyICsgMV0gKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuICBcbiAgdmFyIHNiZ25TaGFwZXMgPSAkJC5zYmduLnNiZ25TaGFwZXMgPSB7XG4gICAgJ3NvdXJjZSBhbmQgc2luayc6IHRydWUsXG4gICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAnY29tcGxleCc6IHRydWUsXG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdzaW1wbGUgY2hlbWljYWwnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICB9O1xuXG4gIHZhciB0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlcyA9ICQkLnNiZ24udG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXMgPSB7XG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSc6IHRydWUsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICB9O1xuXG4gIGN5TWF0aC5jYWxjdWxhdGVEaXN0YW5jZSA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50Mikge1xuICAgIHZhciBkaXN0YW5jZSA9IE1hdGgucG93KHBvaW50MVswXSAtIHBvaW50MlswXSwgMikgKyBNYXRoLnBvdyhwb2ludDFbMV0gLSBwb2ludDJbMV0sIDIpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoZGlzdGFuY2UpO1xuICB9O1xuXG4gICQkLnNiZ24uY29sb3JzID0ge1xuICAgIGNsb25lOiBcIiNhOWE5YTlcIlxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3MgPSBmdW5jdGlvbiAobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgIHZhciBsYXlvdXRzID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpO1xuXG4gICAgZm9yICh2YXIgc2lkZSBpbiBsYXlvdXRzKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0c1tzaWRlXTtcbiAgICAgIGxheW91dC5kcmF3KGNvbnRleHQpO1xuICAgIH1cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5BZlNoYXBlRm4gPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgdHlwZSkge1xuICAgIFxuICAgIGlmICggdHlwZSA9PSBcIkJBIG1hY3JvbW9sZWN1bGVcIil7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydyb3VuZHJlY3RhbmdsZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCIpe1xuXHQgICAgY3lCYXNlTm9kZVNoYXBlc1snZWxsaXBzZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgvMiwgd2lkdGgvMik7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgbnVjbGVpYyBhY2lkIGZlYXR1cmVcIil7XG5cdCAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgeCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIHR5cGUgPT0gXCJCQSB1bnNwZWNpZmllZCBlbnRpdHlcIil7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydlbGxpcHNlJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIHR5cGUgPT0gXCJCQSBjb21wbGV4XCIpe1xuXHQgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVDb21wbGV4U2hhcGVQb2ludHMoaGVpZ2h0LzIsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCB0eXBlID09IFwiQkEgcGVydHVyYmluZyBhZ2VudFwiKXtcblx0ICAgIHZhciBwb2ludHMgPSBbLTEsIC0xLCAgIC0wLjUsIDAsICAtMSwgMSwgICAxLCAxLCAgIDAuNSwgMCwgMSwgLTFdO1xuXHQgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgfVxuICAgIGVsc2V7XG5cdCAgICBjeUJhc2VOb2RlU2hhcGVzWydyZWN0YW5nbGUnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLkFmU2hhcGVBcmdzRm4gPSBmdW5jdGlvbiAoc2VsZil7XG5cdCAgcmV0dXJuIFtzZWxmLmJib3gudywgc2VsZi5iYm94LmgsIHNlbGYucGFyZW50LmRhdGEoXCJjbGFzc1wiKV07XG4gIH1cblxuXG4gICQkLnNiZ24ubnVjbGVpY0FjaWRDaGVja1BvaW50ID0gZnVuY3Rpb24gKHgsIHksIGNlbnRlclgsIGNlbnRlclksIG5vZGUsIHRocmVzaG9sZCwgcG9pbnRzLCBjb3JuZXJSYWRpdXMpIHtcbiAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgdmFyIGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgIC8vY2hlY2sgcmVjdGFuZ2xlIGF0IHRvcFxuICAgIGlmIChjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHBvaW50cyxcbiAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclkgLSBjb3JuZXJSYWRpdXMgLyAyLCB3aWR0aCwgaGVpZ2h0IC0gY29ybmVyUmFkaXVzIC8gMywgWzAsIC0xXSxcbiAgICAgICAgICAgIHBhZGRpbmcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIHJlY3RhbmdsZSBhdCBib3R0b21cbiAgICBpZiAoY3lNYXRoLnBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBwb2ludHMsXG4gICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cyAvIDIsIHdpZHRoIC0gMiAqIGNvcm5lclJhZGl1cywgY29ybmVyUmFkaXVzLCBbMCwgLTFdLFxuICAgICAgICAgICAgcGFkZGluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgZWxsaXBzZXNcbiAgICB2YXIgY2hlY2tJbkVsbGlwc2UgPSBmdW5jdGlvbiAoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuICAgICAgeCAtPSBjZW50ZXJYO1xuICAgICAgeSAtPSBjZW50ZXJZO1xuXG4gICAgICB4IC89ICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHkgLz0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcblxuICAgICAgcmV0dXJuIChNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpIDw9IDEpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LFxuICAgICAgICAgICAgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICAgICAgY29ybmVyUmFkaXVzICogMiwgY29ybmVyUmFkaXVzICogMiwgcGFkZGluZykpIHtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSxcbiAgICAgICAgICAgIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNvcm5lclJhZGl1cyAqIDIsIGNvcm5lclJhZGl1cyAqIDIsIHBhZGRpbmcpKSB7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvL3dlIG5lZWQgdG8gZm9yY2Ugb3BhY2l0eSB0byAxIHNpbmNlIHdlIG1pZ2h0IGhhdmUgc3RhdGUgYW5kIGluZm8gYm94ZXMuXG4gIC8vaGF2aW5nIG9wYXF1ZSBub2RlcyB3aGljaCBoYXZlIHN0YXRlIGFuZCBpbmZvIGJveGVzIGdpdmVzIHVucGxlYXNlbnQgcmVzdWx0cy5cbiAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZSA9IGZ1bmN0aW9uIChub2RlLCBjb250ZXh0KSB7XG4gICAgdmFyIHBhcmVudE9wYWNpdHkgPSBub2RlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbiAgICBpZiAocGFyZW50T3BhY2l0eSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJyZ2JhKFwiXG4gICAgICAgICAgICArIG5vZGUuX3ByaXZhdGUuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLnZhbHVlWzBdICsgXCIsXCJcbiAgICAgICAgICAgICsgbm9kZS5fcHJpdmF0ZS5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0udmFsdWVbMV0gKyBcIixcIlxuICAgICAgICAgICAgKyBub2RlLl9wcml2YXRlLnN0eWxlW1wiYmFja2dyb3VuZC1jb2xvclwiXS52YWx1ZVsyXSArIFwiLFwiXG4gICAgICAgICAgICArICgxICogbm9kZS5jc3MoJ29wYWNpdHknKSAqIHBhcmVudE9wYWNpdHkpICsgXCIpXCI7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3U2ltcGxlQ2hlbWljYWxQYXRoID0gZnVuY3Rpb24gKFxuICAgICAgICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIC8vdmFyIGNvcm5lclJhZGl1cyA9ICQkLm1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9IE1hdGgubWluKGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKHgsIHktaGFsZkhlaWdodCk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aCwgeS1oYWxmSGVpZ2h0LCB4K2hhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGgsIHkraGFsZkhlaWdodCwgeCwgeStoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5K2hhbGZIZWlnaHQsIHgtaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5LWhhbGZIZWlnaHQsIHgsIHktaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBKb2luIGxpbmVcbiAgICBjb250ZXh0LmxpbmVUbyh4LCB5LWhhbGZIZWlnaHQpO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsID0gZnVuY3Rpb24gKFxuICAgICAgICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbFBhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgb3BhY2l0eSkge1xuICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG4gICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAgIHZhciBtYXJrZXJCZWdpblggPSBjZW50ZXJYIC0gd2lkdGgvMiAqIE1hdGguc2luKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJCZWdpblkgPSBjZW50ZXJZICsgaGVpZ2h0LzIgKiBNYXRoLmNvcyhNYXRoLlBJIC8gMyk7XG4gICAgICB2YXIgbWFya2VyRW5kWCA9IGNlbnRlclg7XG4gICAgICB2YXIgbWFya2VyRW5kWSA9IG1hcmtlckJlZ2luWTtcblxuICAgICAgY29udGV4dC5tb3ZlVG8obWFya2VyQmVnaW5YLCBtYXJrZXJCZWdpblkpO1xuICAgICAgY29udGV4dC5saW5lVG8obWFya2VyRW5kWCwgbWFya2VyRW5kWSk7XG4gICAgICBjb250ZXh0LmFyYyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aC8yLCAzICogTWF0aC5QSSAvIDYsIDUgKiBNYXRoLlBJIC8gNik7XG5cbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gIH1cbiAgO1xuXG4gIGZ1bmN0aW9uIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBvcGFjaXR5KSB7XG4gICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgdmFyIG1hcmtlckJlZ2luWCA9IGNlbnRlclg7XG4gICAgICB2YXIgbWFya2VyQmVnaW5ZID0gY2VudGVyWSArIGhlaWdodC8yICogTWF0aC5jb3MoTWF0aC5QSSAvIDMpO1xuICAgICAgdmFyIG1hcmtlckVuZFggPSBjZW50ZXJYICsgd2lkdGgvMiAqIE1hdGguc2luKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJFbmRZID0gbWFya2VyQmVnaW5ZO1xuXG4gICAgICBjb250ZXh0Lm1vdmVUbyhtYXJrZXJCZWdpblgsIG1hcmtlckJlZ2luWSk7XG4gICAgICBjb250ZXh0LmxpbmVUbyhtYXJrZXJFbmRYLCBtYXJrZXJFbmRZKTtcbiAgICAgIGNvbnRleHQuYXJjKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLzIsIE1hdGguUEkgLyA2LCAzICogTWF0aC5QSSAvIDYpO1xuXG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjeUJhc2VOb2RlU2hhcGVzWydlbGxpcHNlJ10uZHJhd1BhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUgPSBmdW5jdGlvbiAoY29udGV4dCwgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgbGVmdCA9IGNlbnRlclggLSBoYWxmV2lkdGgsIHJpZ2h0ID0gY2VudGVyWCArIGhhbGZXaWR0aDtcbiAgICB2YXIgYm90dG9tID0gY2VudGVyWSAtIGhhbGZIZWlnaHQsIHRvcCA9IGNlbnRlclkgKyBoYWxmSGVpZ2h0O1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICBjb250ZXh0Lm1vdmVUbyhsZWZ0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBjZW50ZXJZKTtcbiAgICBjb250ZXh0LmFyY1RvKHJpZ2h0LCB0b3AsIGNlbnRlclgsIHRvcCwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmFyY1RvKGxlZnQsIHRvcCwgbGVmdCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmxpbmVUbyhsZWZ0LCBib3R0b20pO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAvKlxuICAgKiBDb2RlIHRha2VuIGZyb20gaHR0cHM6Ly9qc3BlcmYuY29tL3N0cmluZy1wcm90b3R5cGUtZW5kc3dpdGhcbiAgICogRGlyZWN0IGltcGxlbWVudGF0aW9uIHNlZW1zIHRvIHdvcmsgYmV0dGVyLlxuICAgKiBVc2luZyB0aGlzIGltcHJvdmVzIGlzTXVsdGltZXIoKSBwZXJmb3JtYW5jZS5cbiAgICogTWFrZXMgaXQgdGFrZSAwLjEgb3IgMC4yJSBsZXNzIHRpbWUgZnJvbSB0aGUgd2hvbGVcbiAgICogbG9hZGluZyBwcm9jZXNzLCBkb3duIGZyb20gfjAuNCUgaW5pdGlhbGx5LlxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBwYXR0ZXJuKSB7XG4gICAgZm9yICh2YXIgaSA9IHBhdHRlcm4ubGVuZ3RoLCBsID0gc3RyLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKHN0ci5jaGFyQXQoLS1sKSAhPSBwYXR0ZXJuLmNoYXJBdChpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgJCQuc2Jnbi5pc011bHRpbWVyID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgc2JnbkNsYXNzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzO1xuICAgIGlmIChzYmduQ2xhc3MgJiYgZW5kc1dpdGgoc2JnbkNsYXNzLCBcIm11bHRpbWVyXCIpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBpcyBjcmVhdGVkIHRvIGhhdmUgc2FtZSBjb3JuZXIgbGVuZ3RoIHdoZW5cbiAgLy9jb21wbGV4J3Mgd2lkdGggb3IgaGVpZ2h0IGlzIGNoYW5nZWRcbiAgJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyA9IGZ1bmN0aW9uIChjb3JuZXJMZW5ndGgsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAvL2NwIHN0YW5kcyBmb3IgY29ybmVyIHByb3BvcnRpb25cbiAgICB2YXIgY3BYID0gTWF0aC5taW4oY29ybmVyTGVuZ3RoLCAwLjUgKiB3aWR0aCkgLyB3aWR0aDtcbiAgICB2YXIgY3BZID0gTWF0aC5taW4oY29ybmVyTGVuZ3RoLCAwLjUgKiBoZWlnaHQpIC8gaGVpZ2h0O1xuXG4gICAgdmFyIGNvbXBsZXhQb2ludHMgPSBbLTEgKyBjcFgsIC0xLCAtMSwgLTEgKyBjcFksIC0xLCAxIC0gY3BZLCAtMSArIGNwWCxcbiAgICAgIDEsIDEgLSBjcFgsIDEsIDEsIDEgLSBjcFksIDEsIC0xICsgY3BZLCAxIC0gY3BYLCAtMV07XG5cbiAgICByZXR1cm4gY29tcGxleFBvaW50cztcbiAgfTtcblxuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnc291cmNlIGFuZCBzaW5rJyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdudWNsZWljIGFjaWQgZmVhdHVyZScpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnY29tcGxleCcpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnbWFjcm9tb2xlY3VsZScpO1xuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaCgnc2ltcGxlIGNoZW1pY2FsJyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdiaW9sb2dpY2FsIGFjdGl2aXR5Jyk7XG4gIGN5U3R5bGVQcm9wZXJ0aWVzLnR5cGVzLm5vZGVTaGFwZS5lbnVtcy5wdXNoKCdjb21wYXJ0bWVudCcpO1xuXG4gICQkLnNiZ24ucmVnaXN0ZXJTYmduTm9kZVNoYXBlcyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0gPSB7XG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICAvL2FkZCBtdWx0aW1lciBzaGFwZVxuICAgICAgICAgICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsKGNvbnRleHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgICAkJC5zYmduLmNsb25lTWFya2VyLnNpbXBsZUNoZW1pY2FsKGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGggLSBwYWRkaW5nLCBoZWlnaHQgLSBwYWRkaW5nLCBjbG9uZU1hcmtlciwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuY3NzKCdiYWNrZ3JvdW5kLW9wYWNpdHknKSk7XG5cbiAgICAgICAgICAvL2NvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAkJC5zYmduLmNsb25lTWFya2VyLnNpbXBsZUNoZW1pY2FsKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLSBwYWRkaW5nLCBoZWlnaHQgLSBwYWRkaW5nLCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuLy8gICAgICAgIHZhciBub2RlUHJvcCA9IHsnbGFiZWwnOiBsYWJlbCwgJ2NlbnRlclgnOiBjZW50ZXJYLCAnY2VudGVyWSc6IGNlbnRlclksXG4vLyAgICAgICAgICAnb3BhY2l0eSc6IG5vZGUuX3ByaXZhdGUuc3R5bGVbJ3RleHQtb3BhY2l0eSddLnZhbHVlLCAnd2lkdGgnOiBub2RlLndpZHRoKCksICdoZWlnaHQnOiBub2RlLmhlaWdodCgpfTtcbi8vICAgICAgICAkJC5zYmduLmRyYXdEeW5hbWljTGFiZWxUZXh0KGNvbnRleHQsIG5vZGVQcm9wKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcblxuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wic2ltcGxlIGNoZW1pY2FsXCJdLm11bHRpbWVyUGFkZGluZztcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzID0gW107XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzID0gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMuY29uY2F0KG5vZGVJbnRlcnNlY3RMaW5lcywgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJzaW1wbGUgY2hlbWljYWxcIl0ubXVsdGltZXJQYWRkaW5nO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KHgsIHksXG4gICAgICAgICAgICAgICAgcGFkZGluZywgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZKTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckNoZWNrUG9pbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVyQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoeCwgeSxcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlQ2hlY2tQb2ludCB8fCBzdGF0ZUFuZEluZm9DaGVja1BvaW50IHx8IG11bHRpbWVyQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDQsIDApLFxuICAgICAgbXVsdGltZXJQYWRkaW5nOiA1LFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wibWFjcm9tb2xlY3VsZVwiXS5tdWx0aW1lclBhZGRpbmc7XG4gICAgICAgIHZhciBjbG9uZU1hcmtlciA9IG5vZGUuX3ByaXZhdGUuZGF0YS5jbG9uZW1hcmtlcjtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubWFjcm9tb2xlY3VsZShjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCB0cnVlLFxuICAgICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuICAgICAgICAgIC8vY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXdSb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubWFjcm9tb2xlY3VsZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBmYWxzZSxcbiAgICAgICAgICAgICAgICBub2RlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5JykpO1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICAkJC5zYmduLmZvcmNlT3BhY2l0eVRvT25lKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAkJC5zYmduLmRyYXdTdGF0ZUFuZEluZm9zKG5vZGUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuXG4vLyAgICAgICAgdmFyIG5vZGVQcm9wID0geydsYWJlbCc6IGxhYmVsLCAnY2VudGVyWCc6IGNlbnRlclgsICdjZW50ZXJZJzogY2VudGVyWSxcbi8vICAgICAgICAgICdvcGFjaXR5Jzogbm9kZS5fcHJpdmF0ZS5zdHlsZVsndGV4dC1vcGFjaXR5J10udmFsdWUsICd3aWR0aCc6IG5vZGUud2lkdGgoKSwgJ2hlaWdodCc6IG5vZGUuaGVpZ2h0KCl9O1xuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZVN0YXRlQW5kSW5mb0JveGVzKFxuICAgICAgICAgICAgICAgIG5vZGUsIHgsIHkpO1xuXG4gICAgICAgIHZhciBub2RlSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cywgcGFkZGluZyk7XG5cbiAgICAgICAgLy9jaGVjayB3aGV0aGVyIHNiZ24gY2xhc3MgaW5jbHVkZXMgbXVsdGltZXIgc3Vic3RyaW5nIG9yIG5vdFxuICAgICAgICB2YXIgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyA9IFtdO1xuICAgICAgICBpZiAoJCQuc2Jnbi5pc011bHRpbWVyKG5vZGUpKSB7XG4gICAgICAgICAgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyA9ICQkLnNiZ24ucm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKFxuICAgICAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cywgcGFkZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMsIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMpO1xuXG4gICAgICAgIHJldHVybiAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludChbeCwgeV0sIGludGVyc2VjdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uICh4LCB5LCBub2RlLCB0aHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm1hY3JvbW9sZWN1bGVcIl0ubXVsdGltZXJQYWRkaW5nO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KHgsIHksIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9DaGVja1BvaW50ID0gJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMoeCwgeSwgbm9kZSxcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVyQ2hlY2tQb2ludCA9IGZhbHNlO1xuICAgICAgICBpZiAoJCQuc2Jnbi5pc011bHRpbWVyKG5vZGUpKSB7XG4gICAgICAgICAgbXVsdGltZXJDaGVja1BvaW50ID0gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGVDaGVja1BvaW50IHx8IHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgfHwgbXVsdGltZXJDaGVja1BvaW50O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXSA9IHtcbiAgICAgIHBvaW50czogW10sXG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBjb3JuZXJMZW5ndGg6IDI0LFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCktIHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgICB2YXIgY29ybmVyTGVuZ3RoID0gY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0uY29ybmVyTGVuZ3RoO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgY2xvbmVNYXJrZXIgPSBub2RlLl9wcml2YXRlLmRhdGEuY2xvbmVtYXJrZXI7XG5cblxuICAgICAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5wb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKGNvcm5lckxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICAvL2FkZCBtdWx0aW1lciBzaGFwZVxuICAgICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyk7XG4gICAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5jb21wbGV4KGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuY3NzKCdiYWNrZ3JvdW5kLW9wYWNpdHknKSk7XG5cbiAgICAgICAgICAvL2NvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5jb21wbGV4KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgLy8kJC5zYmduLmRyYXdDb21wbGV4U3RhdGVBbmRJbmZvKGNvbnRleHQsIG5vZGUsIHN0YXRlQW5kSW5mb3MsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAkJC5zYmduLmRyYXdTdGF0ZUFuZEluZm9zKG5vZGUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgfSxcbi8vICAgICAgaW50ZXJzZWN0TGluZTogY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmludGVyc2VjdExpbmUsXG4vLyAgICAgIGNoZWNrUG9pbnQ6IGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50XG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5tdWx0aW1lclBhZGRpbmc7XG4gICAgICAgIHZhciBjb3JuZXJMZW5ndGggPSBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5jb3JuZXJMZW5ndGg7XG5cbiAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ucG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyhjb3JuZXJMZW5ndGgsXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMoXG4gICAgICAgICAgICAgICAgbm9kZSwgeCwgeSk7XG5cbiAgICAgICAgdmFyIG5vZGVJbnRlcnNlY3RMaW5lcyA9IGN5TWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLCBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgIHBhZGRpbmcpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBbXTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1tcImNvbXBsZXhcIl0ucG9pbnRzLFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICB3aWR0aCAvIDIsIGhlaWdodCAvIDIsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMuY29uY2F0KG5vZGVJbnRlcnNlY3RMaW5lcywgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IChub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSAobm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VGbG9hdChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpKSArIHRocmVzaG9sZDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcbiAgICAgICAgdmFyIG11bHRpbWVyUGFkZGluZyA9IGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIGNvcm5lckxlbmd0aCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLmNvcm5lckxlbmd0aDtcblxuICAgICAgICBjeUJhc2VOb2RlU2hhcGVzW1wiY29tcGxleFwiXS5wb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKGNvcm5lckxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB2YXIgbm9kZUNoZWNrUG9pbnQgPSBjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICAvL2NoZWNrIHdoZXRoZXIgc2JnbiBjbGFzcyBpbmNsdWRlcyBtdWx0aW1lciBzdWJzdHJpbmcgb3Igbm90XG4gICAgICAgIHZhciBtdWx0aW1lckNoZWNrUG9pbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVyQ2hlY2tQb2ludCA9IGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oeCwgeSxcbiAgICAgICAgICAgICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wbGV4XCJdLnBvaW50cyxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGVDaGVja1BvaW50IHx8IHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgfHwgbXVsdGltZXJDaGVja1BvaW50O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wibnVjbGVpYyBhY2lkIGZlYXR1cmVcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgICBtdWx0aW1lclBhZGRpbmc6IDUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIDtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGxhYmVsID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubnVjbGVpY0FjaWRGZWF0dXJlKGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIHRydWUsXG4gICAgICAgICAgICAgICAgICBub2RlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5JykpO1xuXG4gICAgICAgICAgLy9jb250ZXh0LnN0cm9rZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY2VudGVyWCxcbiAgICAgICAgICAgICAgICBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlci5udWNsZWljQWNpZEZlYXR1cmUoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgZmFsc2UsXG4gICAgICAgICAgICAgICAgbm9kZS5jc3MoJ2JhY2tncm91bmQtb3BhY2l0eScpKTtcblxuLy8gICAgICAgIHZhciBub2RlUHJvcCA9IHsnbGFiZWwnOiBsYWJlbCwgJ2NlbnRlclgnOiBjZW50ZXJYLCAnY2VudGVyWSc6IGNlbnRlclksXG4vLyAgICAgICAgICAnb3BhY2l0eSc6IG5vZGUuX3ByaXZhdGUuc3R5bGVbJ3RleHQtb3BhY2l0eSddLnZhbHVlLCAnd2lkdGgnOiBub2RlLndpZHRoKCksICdoZWlnaHQnOiBub2RlLmhlaWdodCgpfTtcblxuLy8gICAgICAgICQkLnNiZ24uZHJhd0R5bmFtaWNMYWJlbFRleHQoY29udGV4dCwgbm9kZVByb3ApO1xuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgIH0sXG4gICAgICBkcmF3UGF0aDogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcblxuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gY3lCYXNlTm9kZVNoYXBlc1tcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCJdLm11bHRpbWVyUGFkZGluZztcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gJCQuc2Jnbi5udWNsZWljQWNpZEludGVyc2VjdGlvbkxpbmUobm9kZSxcbiAgICAgICAgICAgICAgICB4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgIC8vY2hlY2sgd2hldGhlciBzYmduIGNsYXNzIGluY2x1ZGVzIG11bHRpbWVyIHN1YnN0cmluZyBvciBub3RcbiAgICAgICAgdmFyIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBbXTtcbiAgICAgICAgaWYgKCQkLnNiZ24uaXNNdWx0aW1lcihub2RlKSkge1xuICAgICAgICAgIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSAkJC5zYmduLm51Y2xlaWNBY2lkSW50ZXJzZWN0aW9uTGluZShub2RlLFxuICAgICAgICAgICAgICAgICAgeCwgeSwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIGNvcm5lclJhZGl1cyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMsXG4gICAgICAgICAgICAgICAgbXVsdGltZXJJbnRlcnNlY3Rpb25MaW5lcyk7XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9LFxuICAgICAgY2hlY2tQb2ludDogZnVuY3Rpb24gKHgsIHksIG5vZGUsIHRocmVzaG9sZCkge1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSBjeUJhc2VOb2RlU2hhcGVzW1wibnVjbGVpYyBhY2lkIGZlYXR1cmVcIl0ubXVsdGltZXJQYWRkaW5nO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9ICQkLnNiZ24ubnVjbGVpY0FjaWRDaGVja1BvaW50KHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgbm9kZSwgdGhyZXNob2xkLCB0aGlzLnBvaW50cywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0NoZWNrUG9pbnQgPSAkJC5zYmduLmNoZWNrUG9pbnRTdGF0ZUFuZEluZm9Cb3hlcyh4LCB5LCBub2RlLFxuICAgICAgICAgICAgICAgIHRocmVzaG9sZCk7XG5cbiAgICAgICAgLy9jaGVjayB3aGV0aGVyIHNiZ24gY2xhc3MgaW5jbHVkZXMgbXVsdGltZXIgc3Vic3RyaW5nIG9yIG5vdFxuICAgICAgICB2YXIgbXVsdGltZXJDaGVja1BvaW50ID0gZmFsc2U7XG4gICAgICAgIGlmICgkJC5zYmduLmlzTXVsdGltZXIobm9kZSkpIHtcbiAgICAgICAgICBtdWx0aW1lckNoZWNrUG9pbnQgPSAkJC5zYmduLm51Y2xlaWNBY2lkQ2hlY2tQb2ludCh4LCB5LFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgIG5vZGUsIHRocmVzaG9sZCwgdGhpcy5wb2ludHMsIGNvcm5lclJhZGl1cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCB8fCBtdWx0aW1lckNoZWNrUG9pbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgICBjeUJhc2VOb2RlU2hhcGVzW1wic291cmNlIGFuZCBzaW5rXCJdID0ge1xuICAgICAgcG9pbnRzOiBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50cyg0LCAwKSxcbiAgICAgIGRyYXc6IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcblxuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIHZhciBwdHMgPSBjeUJhc2VOb2RlU2hhcGVzW1wic291cmNlIGFuZCBzaW5rXCJdLnBvaW50cztcbiAgICAgICAgdmFyIGNsb25lTWFya2VyID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgICQkLnNiZ24uZHJhd0VsbGlwc2UoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuXG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIHZhciBzY2FsZVggPSB3aWR0aCAqIE1hdGguc3FydCgyKSAvIDIsIHNjYWxlWSA9ICBoZWlnaHQgKiBNYXRoLnNxcnQoMikgLyAyO1xuXG4gICAgICAgIGNvbnRleHQubW92ZVRvKGNlbnRlclggKyBzY2FsZVggKiBwdHNbMl0sIGNlbnRlclkgKyBzY2FsZVkgKiBwdHNbM10pO1xuICAgICAgICBjb250ZXh0LmxpbmVUbyhjZW50ZXJYICsgc2NhbGVYICogcHRzWzZdLCBjZW50ZXJZICsgc2NhbGVZICogcHRzWzddKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lLFxuICAgICAgY2hlY2tQb2ludDogY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uY2hlY2tQb2ludFxuICAgIH07XG4gICAgY3lCYXNlTm9kZVNoYXBlc1tcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIl0gPSB7XG4gICAgICBwb2ludHM6IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgICBkcmF3OiBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSkge1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBsYWJlbCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5sYWJlbDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuXG4gICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY3lCYXNlTm9kZVNoYXBlc1tcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIl0ucG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcblxuICAgICAgfSxcbiAgICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBwb3J0SWQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIHZhciBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUFmSW5mb0JveGVzKFxuICAgICAgICAgICAgICAgIG5vZGUsIHgsIHkpO1xuICAgICAgIHZhciBub2RlSW50ZXJzZWN0TGluZXMgPSBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50cyxcbiAgICAgICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgICAgIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLCBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgIHBhZGRpbmcpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzLmNvbmNhdChub2RlSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIHJldHVybiAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludChbeCwgeV0sIGludGVyc2VjdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uICh4LCB5LCBub2RlLCB0aHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLndpZHRoKCkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJjb21wYXJ0bWVudFwiXSA9IHtcblxuICAgICAgbmFtZTogJ2NvbXBhcnRtZW50JyxcbiAgICAgIHBvaW50czogbWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoIDQsIDAgKSxcbiAgICAgIGRyYXc6IGZ1bmN0aW9uKCBjb250ZXh0LCBub2RlKXtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhZGRpbmc7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5nO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgZHJhd0JhcnJlbFBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCApO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgJCQuc2Jnbi5mb3JjZU9wYWNpdHlUb09uZShub2RlLCBjb250ZXh0KTtcbiAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcblxuICAgICAgfSxcblxuICAgICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24obm9kZSwgeCwgeSl7XG5cbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBiUHRzID0gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMoIHdpZHRoICsgMipwYWRkaW5nLCBoZWlnaHQgKyAyKnBhZGRpbmcsIGNlbnRlclgsIGNlbnRlclkgKTtcblxuICAgICAgICB2YXIgcHRzID0gW10uY29uY2F0KGJQdHMudG9wTGVmdCwgYlB0cy50b3BSaWdodCwgYlB0cy5ib3R0b21SaWdodCwgYlB0cy5ib3R0b21MZWZ0KTtcblxuICAgICAgICByZXR1cm4gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgcHRzLCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgICB9LFxuXG4gICAgICBjaGVja1BvaW50OiBmdW5jdGlvbih4LCB5LCBub2RlLCB0aHJlc2hvbGQgKXtcbiAgICAgICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgKyB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IG1hdGguZ2V0QmFycmVsQ3VydmVDb25zdGFudHMoIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgICBpZiggbWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHRoaXMucG9pbnRzLFxuICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSAyICogIGhPZmZzZXQsIFswLCAtMV0sIHBhZGRpbmcgKSApe1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgICBpZiggbWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHRoaXMucG9pbnRzLFxuICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gMiAqIHdPZmZzZXQsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyApICl7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmFycmVsQ3VydmVQdHMgPSBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyggd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuXG4gICAgICAgIHZhciBnZXRDdXJ2ZVQgPSBmdW5jdGlvbiAoeCwgeSwgY3VydmVQdHMpIHtcbiAgICAgICAgICB2YXIgeDAgPSBjdXJ2ZVB0c1sgNCBdO1xuICAgICAgICAgIHZhciB4MSA9IGN1cnZlUHRzWyAyIF07XG4gICAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbIDAgXTtcbiAgICAgICAgICB2YXIgeTAgPSBjdXJ2ZVB0c1sgNSBdO1xuICAgICAgICAgIC8vIHZhciB5MSA9IGN1cnZlUHRzWyAzIF07XG4gICAgICAgICAgdmFyIHkyID0gY3VydmVQdHNbIDEgXTtcblxuICAgICAgICAgIHZhciB4TWluID0gTWF0aC5taW4oIHgwLCB4MiApO1xuICAgICAgICAgIHZhciB4TWF4ID0gTWF0aC5tYXgoIHgwLCB4MiApO1xuICAgICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oIHkwLCB5MiApO1xuICAgICAgICAgIHZhciB5TWF4ID0gTWF0aC5tYXgoIHkwLCB5MiApO1xuXG4gICAgICAgICAgaWYoIHhNaW4gPD0geCAmJiB4IDw9IHhNYXggICYmIHlNaW4gPD0geSAmJiB5IDw9IHlNYXggKXtcbiAgICAgICAgICAgIHZhciBjb2VmZiA9IG1hdGguYmV6aWVyUHRzVG9RdWFkQ29lZmYoIHgwLCB4MSwgeDIgKTtcbiAgICAgICAgICAgIHZhciByb290cyA9IG1hdGguc29sdmVRdWFkcmF0aWMoIGNvZWZmWzBdLCBjb2VmZlsxXSwgY29lZmZbMl0sIHggKTtcblxuICAgICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24oIHIgKXtcbiAgICAgICAgICAgICAgcmV0dXJuIDAgPD0gciAmJiByIDw9IDE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYoIHZhbGlkUm9vdHMubGVuZ3RoID4gMCApe1xuICAgICAgICAgICAgICByZXR1cm4gdmFsaWRSb290c1sgMCBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoIGJhcnJlbEN1cnZlUHRzICk7XG4gICAgICAgIGZvciggdmFyIGkgPSAwOyBpIDwgY3VydmVSZWdpb25zLmxlbmd0aDsgaSsrICl7XG4gICAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1sgaSBdO1xuICAgICAgICAgIHZhciBjb3JuZXJQdHMgPSBiYXJyZWxDdXJ2ZVB0c1sgY29ybmVyIF07XG4gICAgICAgICAgdmFyIHQgPSBnZXRDdXJ2ZVQoIHgsIHksIGNvcm5lclB0cyApO1xuXG4gICAgICAgICAgaWYoIHQgPT0gbnVsbCApeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgdmFyIHkwID0gY29ybmVyUHRzWyA1IF07XG4gICAgICAgICAgdmFyIHkxID0gY29ybmVyUHRzWyAzIF07XG4gICAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWyAxIF07XG4gICAgICAgICAgdmFyIGJlelkgPSBtYXRoLnFiZXppZXJBdCggeTAsIHkxLCB5MiwgdCApO1xuXG4gICAgICAgICAgaWYoIGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkgKXtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiggY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSApe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbXCJvbGRDb21wYXJ0bWVudFwiXSA9IHtcbiAgICAgIHBvaW50czogY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSggNCwgMCApLFxuICAgICAgZHJhdzogZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIHBhZGRpbmc7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBwYWRkaW5nO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgICQkLnNiZ24uZm9yY2VPcGFjaXR5VG9PbmUobm9kZSwgY29udGV4dCk7XG4gICAgICAgICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3Mobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG5cbiAgICAgIH0sXG4gICAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAobm9kZSwgeCwgeSwgcG9ydElkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyhcbiAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gY3lNYXRoLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgICBwYWRkaW5nICk7XG5cbiAgICAgICAgdmFyIGludGVyc2VjdGlvbnMgPSBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcy5jb25jYXQobm9kZUludGVyc2VjdExpbmVzKTtcblxuICAgICAgICByZXR1cm4gJCQuc2Jnbi5jbG9zZXN0SW50ZXJzZWN0aW9uUG9pbnQoW3gsIHldLCBpbnRlcnNlY3Rpb25zKTtcbiAgICAgIH0sXG4gICAgICBjaGVja1BvaW50OiBmdW5jdGlvbiAoeCwgeSwgbm9kZSwgdGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpICsgdGhyZXNob2xkO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSArIHRocmVzaG9sZDtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgICAgICB2YXIgbm9kZUNoZWNrUG9pbnQgPSBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludCA9ICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkKTtcblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrUG9pbnQgfHwgc3RhdGVBbmRJbmZvQ2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgLy8kJC5zYmduLmRyYXdFbGxpcHNlUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvL2NvbnRleHQuZmlsbCgpO1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2VsbGlwc2UnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9O1xuXG4gICQkLnNiZ24uY2xvbmVNYXJrZXIgPSB7XG4gICAgc2ltcGxlQ2hlbWljYWw6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG4gICAgICAgIHZhciBmaXJzdENpcmNsZUNlbnRlclggPSBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgZmlyc3RDaXJjbGVDZW50ZXJZID0gY2VudGVyWTtcbiAgICAgICAgdmFyIHNlY29uZENpcmNsZUNlbnRlclggPSBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgc2Vjb25kQ2lyY2xlQ2VudGVyWSA9IGNlbnRlclk7XG5cbiAgICAgICAgc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgZmlyc3RDaXJjbGVDZW50ZXJYLCBmaXJzdENpcmNsZUNlbnRlclksXG4gICAgICAgICAgICAgICAgMiAqIGNvcm5lclJhZGl1cywgMiAqIGNvcm5lclJhZGl1cywgY2xvbmVNYXJrZXIsIG9wYWNpdHkpO1xuXG4gICAgICAgIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBzZWNvbmRDaXJjbGVDZW50ZXJYLCBzZWNvbmRDaXJjbGVDZW50ZXJZLFxuICAgICAgICAgICAgICAgIDIgKiBjb3JuZXJSYWRpdXMsIDIgKiBjb3JuZXJSYWRpdXMsIGNsb25lTWFya2VyLCBvcGFjaXR5KTtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcbiAgICAgICAgdmFyIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgICAgdmFyIHJlY1BvaW50cyA9IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCk7XG4gICAgICAgIHZhciBjbG9uZVggPSBjZW50ZXJYO1xuICAgICAgICB2YXIgY2xvbmVZID0gY2VudGVyWSArIDMgLyA0ICogY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoIC0gMiAqIGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGNsb25lSGVpZ2h0ID0gY29ybmVyUmFkaXVzIC8gMjtcblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2xvbmVYLCBjbG9uZVksIGNsb25lV2lkdGgsIGNsb25lSGVpZ2h0LCByZWNQb2ludHMpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuICAgICAgfVxuICAgIH0sXG4gICAgbnVjbGVpY0FjaWRGZWF0dXJlOiBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KSB7XG4gICAgICBpZiAoY2xvbmVNYXJrZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBoZWlnaHQgLyA0O1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyAzICogaGVpZ2h0IC8gODtcblxuICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcbiAgICAgICAgdmFyIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICAkJC5zYmduLmRyYXdOdWNBY2lkRmVhdHVyZShjb250ZXh0LCBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCxcbiAgICAgICAgICAgICAgICBjbG9uZVgsIGNsb25lWSwgY29ybmVyUmFkaXVzLCBvcGFjaXR5KTtcblxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgICAgIC8vY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1hY3JvbW9sZWN1bGU6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgICQkLnNiZ24uY2xvbmVNYXJrZXIubnVjbGVpY0FjaWRGZWF0dXJlKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KTtcbiAgICB9LFxuICAgIGNvbXBsZXg6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyTGVuZ3RoLCBjbG9uZU1hcmtlciwgaXNNdWx0aW1lciwgb3BhY2l0eSkge1xuICAgICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGNwWCA9IGNvcm5lckxlbmd0aCAvIHdpZHRoO1xuICAgICAgICB2YXIgY3BZID0gY29ybmVyTGVuZ3RoIC8gaGVpZ2h0O1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBoZWlnaHQgKiBjcFkgLyAyO1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY2xvbmVIZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBtYXJrZXJQb2ludHMgPSBbLTEsIC0xLCAxLCAtMSwgMSAtIGNwWCwgMSwgLTEgKyBjcFgsIDFdO1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuICAgICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjbG9uZVgsIGNsb25lWSxcbiAgICAgICAgICAgICAgICBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCwgbWFya2VyUG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuXG4vLyAgICAgICAgICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLmNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludCA9IGZ1bmN0aW9uIChwb2ludCwgaW50ZXJzZWN0aW9ucykge1xuICAgIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA8PSAwKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgdmFyIGNsb3Nlc3RJbnRlcnNlY3Rpb24gPSBbXTtcbiAgICB2YXIgbWluRGlzdGFuY2UgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnRlcnNlY3Rpb25zLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICB2YXIgY2hlY2tQb2ludCA9IFtpbnRlcnNlY3Rpb25zW2ldLCBpbnRlcnNlY3Rpb25zW2kgKyAxXV07XG4gICAgICB2YXIgZGlzdGFuY2UgPSBjeU1hdGguY2FsY3VsYXRlRGlzdGFuY2UocG9pbnQsIGNoZWNrUG9pbnQpO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBjbG9zZXN0SW50ZXJzZWN0aW9uID0gY2hlY2tQb2ludDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvc2VzdEludGVyc2VjdGlvbjtcbiAgfTtcblxuICAkJC5zYmduLm51Y2xlaWNBY2lkSW50ZXJzZWN0aW9uTGluZSA9IGZ1bmN0aW9uIChub2RlLCB4LCB5LCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cykge1xuICAgIHZhciBub2RlWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICB2YXIgbm9kZVkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgdmFyIHdpZHRoID0gbm9kZS53aWR0aCgpO1xuICAgIHZhciBoZWlnaHQgPSBub2RlLmhlaWdodCgpO1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuXG4gICAgLy8gVG9wIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgdG9wU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciByaWdodFN0YXJ0WCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgICB2YXIgcmlnaHRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCByaWdodFN0YXJ0WCwgcmlnaHRTdGFydFksIHJpZ2h0RW5kWCwgcmlnaHRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVN0YXJ0WCwgYm90dG9tU3RhcnRZLCBib3R0b21FbmRYLCBib3R0b21FbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGVmdCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIGxlZnRTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgICB2YXIgbGVmdFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgbGVmdEVuZFggPSBsZWZ0U3RhcnRYO1xuICAgICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzLCB3ZSBoYXZlIG9ubHkgdHdvIGFyY3MgZm9yXG4gICAgLy9udWNsZWljIGFjaWQgZmVhdHVyZXNcbiAgICB2YXIgYXJjSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIEJvdHRvbSBSaWdodFxuICAgIHtcbiAgICAgIHZhciBib3R0b21SaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21SaWdodENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLFxuICAgICAgICAgICAgICBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvdHRvbSBMZWZ0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLFxuICAgICAgICAgICAgICBib3R0b21MZWZ0Q2VudGVyWCwgYm90dG9tTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSBib3R0b21MZWZ0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbUxlZnRDZW50ZXJZKSB7XG4gICAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgaW50ZXJzZWN0aW9ucyBvZiBhbnkgbGluZSB3aXRoIGEgcm91bmQgcmVjdGFuZ2xlIFxuICAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgICB2YXIgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IFtdO1xuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WDtcbiAgICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgICB2YXIgYXJjSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIFRvcCBMZWZ0XG4gICAge1xuICAgICAgdmFyIHRvcExlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGFyY0ludGVyc2VjdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvcCBSaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPj0gdG9wUmlnaHRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wUmlnaHRDZW50ZXJZKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChhcmNJbnRlcnNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3R0b20gUmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIExlZnRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MixcbiAgICAgICAgICAgICAgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMClcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xuICB9O1xuXG4gIC8vdGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgaW50ZXJzZWN0aW9ucyBvZiBhbnkgbGluZSB3aXRoIHRoZSB1cHBlciBoYWxmIG9mIHBlcnR1cmJpbmcgYWdlbnQgXG4gICQkLnNiZ24ucGVydHVyYmluZ0FnZW50SW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gICAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBbXTtcblxuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WCAtIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgcGFkZGluZztcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WCArIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbiAgfTtcbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lRWxsaXBzZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuXG4gICAgdmFyIHcgPSB3aWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBoID0gaGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGFuID0gY2VudGVyWDtcbiAgICB2YXIgYm4gPSBjZW50ZXJZO1xuXG4gICAgdmFyIGQgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG5cbiAgICB2YXIgbSA9IGRbMV0gLyBkWzBdO1xuICAgIHZhciBuID0gLTEgKiBtICogeDIgKyB5MjtcbiAgICB2YXIgYSA9IGggKiBoICsgdyAqIHcgKiBtICogbTtcbiAgICB2YXIgYiA9IC0yICogYW4gKiBoICogaCArIDIgKiBtICogbiAqIHcgKiB3IC0gMiAqIGJuICogbSAqIHcgKiB3O1xuICAgIHZhciBjID0gYW4gKiBhbiAqIGggKiBoICsgbiAqIG4gKiB3ICogdyAtIDIgKiBibiAqIHcgKiB3ICogbiArXG4gICAgICAgICAgICBibiAqIGJuICogdyAqIHcgLSBoICogaCAqIHcgKiB3O1xuXG4gICAgdmFyIGRpc2NyaW1pbmFudCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuXG4gICAgaWYgKGRpc2NyaW1pbmFudCA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuICAgIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG5cbiAgICB2YXIgeE1pbiA9IE1hdGgubWluKHQxLCB0Mik7XG4gICAgdmFyIHhNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuXG4gICAgdmFyIHlNaW4gPSBtICogeE1pbiAtIG0gKiB4MiArIHkyO1xuICAgIHZhciB5TWF4ID0gbSAqIHhNYXggLSBtICogeDIgKyB5MjtcblxuICAgIHJldHVybiBbeE1pbiwgeU1pbiwgeE1heCwgeU1heF07XG4gIH07XG5cbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMgPSBmdW5jdGlvbiAobm9kZSwgeCwgeSkge1xuICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgc3RhdGVBbmRJbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcblxuICAgIHZhciBzdGF0ZUNvdW50ID0gMCwgaW5mb0NvdW50ID0gMDtcblxuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlQW5kSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdGF0ZSA9IHN0YXRlQW5kSW5mb3NbaV07XG4gICAgICB2YXIgc3RhdGVXaWR0aCA9IHN0YXRlLmJib3gudztcbiAgICAgIHZhciBzdGF0ZUhlaWdodCA9IHN0YXRlLmJib3guaDtcbiAgICAgIHZhciBjb29yZCA9IHN0YXRlLmdldEFic29sdXRlQ29vcmQoKTtcbiAgICAgIHZhciBzdGF0ZUNlbnRlclggPSBjb29yZC54O1xuICAgICAgdmFyIHN0YXRlQ2VudGVyWSA9IGNvb3JkLnk7XG5cbiAgICAgIGlmIChzdGF0ZS5jbGF6eiA9PSBcInN0YXRlIHZhcmlhYmxlXCIgJiYgc3RhdGUuaXNEaXNwbGF5ZWQpIHsvL2RyYXcgZWxsaXBzZVxuICAgICAgICB2YXIgc3RhdGVJbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICBzdGF0ZUNlbnRlclgsIHN0YXRlQ2VudGVyWSwgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHBhZGRpbmcpO1xuXG4gICAgICAgIGlmIChzdGF0ZUludGVyc2VjdExpbmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KHN0YXRlSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIHN0YXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY2xhenogPT0gXCJ1bml0IG9mIGluZm9ybWF0aW9uXCIgJiYgc3RhdGUuaXNEaXNwbGF5ZWQpIHsvL2RyYXcgcmVjdGFuZ2xlXG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZLCBzdGF0ZVdpZHRoLCBzdGF0ZUhlaWdodCwgMCwgcGFkZGluZyk7XG5cbiAgICAgICAgaWYgKGluZm9JbnRlcnNlY3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgICAgIGludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLmNvbmNhdChpbmZvSW50ZXJzZWN0TGluZXMpO1xuXG4gICAgICAgIGluZm9Db3VudCsrO1xuICAgICAgfVxuXG4gICAgfVxuICAgIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgJCQuc2Jnbi5pbnRlcnNlY3RMaW5lQWZJbmZvQm94ZXMgPSBmdW5jdGlvbiAobm9kZSwgeCwgeSkge1xuICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgIHZhciBjZW50ZXJZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgIHZhciBwYWRkaW5nID0gcGFyc2VJbnQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKSAvIDI7XG5cbiAgICB2YXIgaW5mb0JveCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvc1swXTtcblxuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG5cbiAgICBpZiAoaW5mb0JveCAmJiBpbmZvQm94LmlzRGlzcGxheWVkKSB7XG4gICAgICB2YXIgaW5mb0JveFdpZHRoID0gaW5mb0JveC5iYm94Lnc7XG4gICAgICB2YXIgaW5mb0JveEhlaWdodCA9IGluZm9Cb3guYmJveC5oO1xuICAgICAgdmFyIGNvb3JkID0gaW5mb0JveC5nZXRBYnNvbHV0ZUNvb3JkKCk7XG4gICAgICB2YXIgaW5mb0JveENlbnRlclggPSBjb29yZC54O1xuICAgICAgdmFyIGluZm9Cb3hDZW50ZXJZID0gY29vcmQueTtcblxuICAgICAgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgbWFjcm9tb2xlY3VsZVwiIHx8IG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgbnVjbGVpYyBhY2lkIGZlYXR1cmVcIlxuICAgICAgICAgICAgICB8fCBub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIGNvbXBsZXhcIil7XG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICBpbmZvQm94Q2VudGVyWCwgaW5mb0JveENlbnRlclksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgNSwgcGFkZGluZyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIHVuc3BlY2lmaWVkIGVudGl0eVwiKXtcbiAgICAgICAgdmFyIGluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLCBpbmZvQm94Q2VudGVyWSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCBwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCIpe1xuICAgICAgICB2YXIgaW5mb0ludGVyc2VjdExpbmVzID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICB4LCB5LFxuICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLFxuICAgICAgICAgICAgaW5mb0JveENlbnRlclksXG4gICAgICAgICAgICBpbmZvQm94V2lkdGgvNCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIHBlcnR1cmJpbmcgYWdlbnRcIil7XG4gICAgICAgIHZhciBpbmZvSW50ZXJzZWN0TGluZXMgPSAkJC5zYmduLnBlcnR1cmJpbmdBZ2VudEludGVyc2VjdExpbmUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIGluZm9Cb3hDZW50ZXJYLCBpbmZvQm94Q2VudGVyWSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCAwLCBwYWRkaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZm9JbnRlcnNlY3RMaW5lcy5sZW5ndGggPiAwKVxuICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoaW5mb0ludGVyc2VjdExpbmVzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gIH07XG5cbiAgJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMgPSBmdW5jdGlvbiAoeCwgeSwgbm9kZSwgdGhyZXNob2xkKSB7XG4gICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgdmFyIHBhZGRpbmcgPXBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuICAgIHZhciBzdGF0ZUFuZEluZm9zID0gbm9kZS5fcHJpdmF0ZS5kYXRhLnN0YXRlc2FuZGluZm9zO1xuXG4gICAgdmFyIHN0YXRlQ291bnQgPSAwLCBpbmZvQ291bnQgPSAwO1xuLy8gICAgdGhyZXNob2xkID0gcGFyc2VGbG9hdCh0aHJlc2hvbGQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZUFuZEluZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3RhdGUgPSBzdGF0ZUFuZEluZm9zW2ldO1xuICAgICAgdmFyIHN0YXRlV2lkdGggPSBwYXJzZUZsb2F0KHN0YXRlLmJib3gudykgKyB0aHJlc2hvbGQ7XG4gICAgICB2YXIgc3RhdGVIZWlnaHQgPSBwYXJzZUZsb2F0KHN0YXRlLmJib3guaCkgKyB0aHJlc2hvbGQ7XG4gICAgICB2YXIgY29vcmQgPSBzdGF0ZS5nZXRBYnNvbHV0ZUNvb3JkKCk7XG4gICAgICB2YXIgc3RhdGVDZW50ZXJYID0gY29vcmQueDtcbiAgICAgIHZhciBzdGF0ZUNlbnRlclkgPSBjb29yZC55O1xuXG4gICAgICBpZiAoc3RhdGUuY2xhenogPT0gXCJzdGF0ZSB2YXJpYWJsZVwiICYmIHN0YXRlLmlzRGlzcGxheWVkKSB7Ly9kcmF3IGVsbGlwc2VcbiAgICAgICAgdmFyIHN0YXRlQ2hlY2tQb2ludCA9IGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoXG4gICAgICAgICAgICAgICAgeCwgeSwgcGFkZGluZywgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZKTtcblxuICAgICAgICBpZiAoc3RhdGVDaGVja1BvaW50ID09IHRydWUpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgc3RhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5jbGF6eiA9PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIiAmJiBzdGF0ZS5pc0Rpc3BsYXllZCkgey8vZHJhdyByZWN0YW5nbGVcbiAgICAgICAgdmFyIGluZm9DaGVja1BvaW50ID0gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoXG4gICAgICAgICAgICAgICAgeCwgeSwgcGFkZGluZywgc3RhdGVXaWR0aCwgc3RhdGVIZWlnaHQsIHN0YXRlQ2VudGVyWCwgc3RhdGVDZW50ZXJZKTtcblxuICAgICAgICBpZiAoaW5mb0NoZWNrUG9pbnQgPT0gdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBpbmZvQ291bnQrKztcbiAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgJCQuc2Jnbi5pc05vZGVTaGFwZVRvdGFsbHlPdmVycmlkZW4gPSBmdW5jdGlvbiAocmVuZGVyLCBub2RlKSB7XG4gICAgaWYgKHRvdGFsbHlPdmVycmlkZW5Ob2RlU2hhcGVzW3JlbmRlci5nZXROb2RlU2hhcGUobm9kZSldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBcbi8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCBiZSByZXBsYWNlZCBieSBDeXRvc2NhcGUgZnVuY3Rpb25zIG9uY2UgdjMuMS4yIGlzIHJlbGVhc2VkXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgXG5cbiAgdmFyIGRyYXdCYXJyZWxQYXRoID0gZnVuY3Rpb24oXG4gIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKXtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgdmFyIHhCZWdpbiA9IHggLSBoYWxmV2lkdGg7XG4gICAgdmFyIHhFbmQgPSB4ICsgaGFsZldpZHRoO1xuICAgIHZhciB5QmVnaW4gPSB5IC0gaGFsZkhlaWdodDtcbiAgICB2YXIgeUVuZCA9IHkgKyBoYWxmSGVpZ2h0O1xuXG4gICAgdmFyIGJhcnJlbEN1cnZlQ29uc3RhbnRzID0gbWF0aC5nZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyggd2lkdGgsIGhlaWdodCApO1xuICAgIHZhciB3T2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgdmFyIGhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3T2Zmc2V0O1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIGNvbnRleHQubW92ZVRvKCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQgKTtcblxuICAgIGNvbnRleHQubGluZVRvKCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0ICk7XG4gICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kICk7XG5cbiAgICBjb250ZXh0LmxpbmVUbyggeEVuZCAtIHdPZmZzZXQsIHlFbmQgKTtcbiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kLCB5RW5kIC0gaE9mZnNldCApXG5cbiAgICBjb250ZXh0LmxpbmVUbyggeEVuZCwgeUJlZ2luICsgaE9mZnNldCApO1xuICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyggeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCAtICB3T2Zmc2V0LCB5QmVnaW4gKTtcblxuICAgIGNvbnRleHQubGluZVRvKCB4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4gKTtcbiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oIHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0ICk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuXG4gIHZhciBnZW5lcmF0ZUJhcnJlbEJlemllclB0cyA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICl7XG4gICAgICB2YXIgaGggPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgICAgdmFyIHhCZWdpbiA9IGNlbnRlclggLSBodztcbiAgICAgIHZhciB4RW5kID0gY2VudGVyWCArIGh3O1xuICAgICAgdmFyIHlCZWdpbiA9IGNlbnRlclkgLSBoaDtcbiAgICAgIHZhciB5RW5kID0gY2VudGVyWSArIGhoO1xuXG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBtYXRoLmdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICB2YXIgaE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmhlaWdodE9mZnNldDtcbiAgICAgIHZhciB3T2Zmc2V0ID0gY3VydmVDb25zdGFudHMud2lkdGhPZmZzZXQ7XG4gICAgICB2YXIgY3RybFB0WE9mZnNldCA9IGN1cnZlQ29uc3RhbnRzLmN0cmxQdE9mZnNldFBjdCAqIHdpZHRoO1xuXG4gICAgICAvLyBwb2ludHMgYXJlIGluIGNsb2Nrd2lzZSBvcmRlciwgaW5uZXIgKGltYWdpbmFyeSkgY29udHJvbCBwdCBvbiBbNCwgNV1cbiAgICAgIHZhciBwdHMgPSB7XG4gICAgICAgIHRvcExlZnQ6IFsgeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbiBdLFxuICAgICAgICB0b3BSaWdodDogWyB4RW5kIC0gd09mZnNldCwgeUJlZ2luLCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0IF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbIHhFbmQsIHlFbmQgLSBoT2Zmc2V0LCB4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCAtIHdPZmZzZXQsIHlFbmQgXSxcbiAgICAgICAgYm90dG9tTGVmdDogWyB4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0IF1cbiAgICAgIH07XG5cbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgfTtcbiBcbiAgbWF0aC5iZXppZXJQdHNUb1F1YWRDb2VmZiA9IGZ1bmN0aW9uKCBwMCwgcDEsIHAyICl7XG4gICAgcmV0dXJuIFtcbiAgICAgIHAwIC0gMiAqIHAxICsgcDIsXG4gICAgICAyICogKCBwMSAtIHAwICksXG4gICAgICBwMF07XG4gIH07XG5cbiAgbWF0aC5nZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uKCB3aWR0aCwgaGVpZ2h0ICl7XG4gIC8vIGdldCBjdXJ2ZSB3aWR0aCwgaGVpZ2h0LCBhbmQgY29udHJvbCBwb2ludCBwb3NpdGlvbiBvZmZzZXRzIGFzIGEgcGVyY2VudGFnZSBvZiBub2RlIGhlaWdodCAvIHdpZHRoXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodE9mZnNldDogTWF0aC5taW4oMTUsIDAuMDUgKiBoZWlnaHQpLFxuICAgICAgd2lkdGhPZmZzZXQ6IE1hdGgubWluKDEwMCwgMC4yNSAqIHdpZHRoKSxcbiAgICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICAgIH07XG4gIH07XG5cbiAgbWF0aC5zb2x2ZVF1YWRyYXRpYyA9IGZ1bmN0aW9uKCBhLCBiLCBjLCB2YWwgKXtcbiAgICBjIC09IHZhbDtcblxuICAgIHZhciByID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgICBpZiggciA8IDAgKXsgcmV0dXJuIFtdOyB9XG5cbiAgICB2YXIgc3FydFIgPSBNYXRoLnNxcnQoIHIgKTtcbiAgICB2YXIgZGVub20gPSAyICogYTtcbiAgICB2YXIgcm9vdDEgPSAoIC1iICsgc3FydFIgKSAvIGRlbm9tO1xuICAgIHZhciByb290MiA9ICggLWIgLSBzcXJ0UiApIC8gZGVub207XG5cbiAgICByZXR1cm4gWyByb290MSwgcm9vdDIgXTtcbiAgfTtcbn07XG4iLCJ2YXIgY3lSZW5kZXJlciA9IHJlcXVpcmUoJy4uL3NiZ24tZXh0ZW5zaW9ucy9zYmduLWN5LXJlbmRlcmVyJyk7XG52YXIgbGlicyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBjeXRvc2NhcGUgPSBsaWJzLmN5dG9zY2FwZTtcbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcbnZhciB0cnVuY2F0ZSA9IHJlcXVpcmUoJy4vdGV4dC11dGlsaXRpZXMnKS50cnVuY2F0ZTtcblxudmFyIG5zID0ge307XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0gQXV4aWxpYXJ5VW5pdCAtLS0tLS0tLS0tLS0tLSAvL1xudmFyIEF1eGlsaWFyeVVuaXQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLmlkID0gbnVsbDtcbiAgdGhpcy5iYm94ID0gbnVsbDtcbiAgdGhpcy5jb29yZFR5cGUgPSBcInJlbGF0aXZlVG9DZW50ZXJcIjtcbiAgdGhpcy5hbmNob3JTaWRlID0gbnVsbDtcbiAgdGhpcy5pc0Rpc3BsYXllZCA9IGZhbHNlO1xufTtcbkF1eGlsaWFyeVVuaXQuZGVmYXVsdEJhY2tncm91bmRDb2xvciA9IFwiI2ZmZmZmZlwiO1xuXG4vKlxuICogUmV0dXJuIGEgbmV3IEF1eGlsaWFyeVVuaXQgb2JqZWN0LiBBIG5ldyBwYXJlbnQgcmVmZXJlbmNlIGFuZCBuZXcgaWQgY2FuXG4gKiBvcHRpb25uYWxseSBiZSBwYXNzZWQuXG4gKi9cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoZXhpc3RpbmdJbnN0YW5jZSwgbmV3UGFyZW50LCBuZXdJZCkge1xuICB2YXIgbmV3VW5pdCA9IGV4aXN0aW5nSW5zdGFuY2UgPyBleGlzdGluZ0luc3RhbmNlIDogbmV3IEF1eGlsaWFyeVVuaXQoKTtcbiAgbmV3VW5pdC5wYXJlbnQgPSBuZXdQYXJlbnQgPyBuZXdQYXJlbnQgOiB0aGlzLnBhcmVudDtcbiAgbmV3VW5pdC5pZCA9IG5ld0lkID8gbmV3SWQgOiB0aGlzLmlkO1xuICBuZXdVbml0LmJib3ggPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLmJib3gpO1xuICBuZXdVbml0LmNvb3JkVHlwZSA9IHRoaXMuY29vcmRUeXBlO1xuICBuZXdVbml0LmFuY2hvclNpZGUgPSB0aGlzLmFuY2hvclNpZGU7XG4gIG5ld1VuaXQuaXNEaXNwbGF5ZWQgPSB0aGlzLmlzRGlzcGxheWVkO1xuICByZXR1cm4gbmV3VW5pdDtcbn07XG5cbi8vIGRyYXcgdGhlIGF1eGlsaWFyeSB1bml0IGF0IGl0cyBwb3NpdGlvblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIGNvb3JkcyA9IHRoaXMuZ2V0QWJzb2x1dGVDb29yZCgpO1xuXG4gIHRoaXMuZHJhd1NoYXBlKGNvbnRleHQsIGNvb3Jkcy54LCBjb29yZHMueSk7XG4gIGlmICh0aGlzLmhhc1RleHQoKSkge1xuICAgIHRoaXMuZHJhd1RleHQoY29udGV4dCwgY29vcmRzLngsIGNvb3Jkcy55KTtcbiAgfVxuICB0aGlzLmlzRGlzcGxheWVkID0gdHJ1ZTtcbn07XG5cbi8vIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkcmVuXG5BdXhpbGlhcnlVbml0LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCFcIik7XG59O1xuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdCBtZXRob2QhXCIpO1xufTtcbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmRyYXdTaGFwZSA9IGZ1bmN0aW9uKGNvbnRleHQsIHgsIHkpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdHJhY3QgbWV0aG9kIVwiKTtcbn07XG5cbi8vIGRyYXcgdGhlIHN0YXRlc09ySW5mbydzIGxhYmVsIGF0IGdpdmVuIHBvc2l0aW9uXG5BdXhpbGlhcnlVbml0LnByb3RvdHlwZS5kcmF3VGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgdmFyIGZvbnRTaXplID0gOTsgLy8gcGFyc2VJbnQodGV4dFByb3AuaGVpZ2h0IC8gMS41KTtcblxuICAvLyBwYXJ0IG9mIDogJCQuc2Jnbi5kcmF3VGV4dChjb250ZXh0LCB0ZXh0UHJvcCk7XG4gIC8vIHNhdmUgc3R5bGUgYmVmb3JlIG1vZGlmaWNhdGlvblxuICB2YXIgb2xkRm9udCA9IGNvbnRleHQuZm9udDtcbiAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gIHZhciBvbGRPcGFjaXR5ID0gY29udGV4dC5nbG9iYWxBbHBoYTtcblxuICBjb250ZXh0LmZvbnQgPSBmb250U2l6ZSArIFwicHggQXJpYWxcIjtcbiAgY29udGV4dC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuICBjb250ZXh0LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gXCIjMGYwZjBmXCI7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSB0aGlzLnBhcmVudC5jc3MoJ3RleHQtb3BhY2l0eScpICogdGhpcy5wYXJlbnQuY3NzKCdvcGFjaXR5Jyk7IC8vID9cblxuICB2YXIgdGV4dDtcbiAgaWYob3B0aW9ucy5maXRMYWJlbHNUb0luZm9ib3hlcygpKXtcbiAgICAvLyBoZXJlIHdlIG1lbW9pemUgdGhlIHRydW5jYXRlZCB0ZXh0IGludG8gX3RleHRDYWNoZSxcbiAgICAvLyBhcyBpdCBpcyBub3Qgc29tZXRoaW5nIHRoYXQgY2hhbmdlcyBzbyBtdWNoXG4gICAgdGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBrZXkgPSB0ZXh0ICsgY29udGV4dC5mb250ICsgdGhpcy5iYm94Lnc7XG4gICAgaWYodGhpcy5fdGV4dENhY2hlICYmIHRoaXMuX3RleHRDYWNoZVtrZXldKSB7XG4gICAgICB0ZXh0ID0gdGhpcy5fdGV4dENhY2hlW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGV4dCA9IHRydW5jYXRlKHRoaXMuZ2V0VGV4dCgpLCBjb250ZXh0LmZvbnQsIHRoaXMuYmJveC53KTtcbiAgICAgIGlmKCF0aGlzLl90ZXh0Q2FjaGUpIHtcbiAgICAgICAgdGhpcy5fdGV4dENhY2hlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl90ZXh0Q2FjaGVba2V5XSA9IHRleHQ7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgfVxuXG4gIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2VudGVyWCwgY2VudGVyWSk7XG5cbiAgLy8gcmVzdG9yZSBzYXZlZCBzdHlsZVxuICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICBjb250ZXh0LmZvbnQgPSBvbGRGb250O1xuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkT3BhY2l0eTtcbn07XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmdldEFic29sdXRlQ29vcmQgPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvQ2VudGVyXCIpIHtcbiAgICB2YXIgYWJzWCA9IHRoaXMuYmJveC54ICogKHRoaXMucGFyZW50Lm91dGVyV2lkdGgoKSAtIHRoaXMucGFyZW50Ll9wcml2YXRlLmRhdGFbJ2JvcmRlci13aWR0aCddKSAvIDEwMCArIHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgdmFyIGFic1kgPSB0aGlzLmJib3gueSAqICh0aGlzLnBhcmVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICByZXR1cm4ge3g6IGFic1gsIHk6IGFic1l9O1xuICB9XG4gIGVsc2UgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvU2lkZVwiKSB7XG4gICAgaWYgKHRoaXMuYW5jaG9yU2lkZSA9PSBcInRvcFwiIHx8IHRoaXMuYW5jaG9yU2lkZSA9PSBcImJvdHRvbVwiKSB7XG4gICAgICB2YXIgYWJzWCA9IHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLnggLSAodGhpcy5wYXJlbnQub3V0ZXJXaWR0aCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMiArIHRoaXMuYmJveC54O1xuICAgICAgdmFyIGFic1kgPSB0aGlzLmJib3gueSAqICh0aGlzLnBhcmVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgYWJzWSA9IHRoaXMucGFyZW50Ll9wcml2YXRlLnBvc2l0aW9uLnkgLSAodGhpcy5wYXJlbnQub3V0ZXJIZWlnaHQoKSAtIHRoaXMucGFyZW50Ll9wcml2YXRlLmRhdGFbJ2JvcmRlci13aWR0aCddKSAvIDIgKyB0aGlzLmJib3gueTtcbiAgICAgIHZhciBhYnNYID0gdGhpcy5iYm94LnggKiAodGhpcy5wYXJlbnQub3V0ZXJXaWR0aCgpIC0gdGhpcy5wYXJlbnQuX3ByaXZhdGUuZGF0YVsnYm9yZGVyLXdpZHRoJ10pIC8gMTAwICsgdGhpcy5wYXJlbnQuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICB9XG5cbiAgLy8gZHVlIHRvIGNvcm5lciBvZiBiYXJyZWwgc2hhcGVkIGNvbXBhcnRtZW50IHNoaWZ0IGFic1ggdG8gcmlnaHRcbiAgaWYgKHRoaXMucGFyZW50LmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIpe1xuICAgICAgYWJzWCArPSB0aGlzLnBhcmVudC5vdXRlcldpZHRoKCkgKiAwLjE7XG4gIH07XG4gICAgcmV0dXJuIHt4OiBhYnNYLCB5OiBhYnNZfTtcbiAgfVxufTtcblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuc2V0QW5jaG9yU2lkZSA9IGZ1bmN0aW9uKHBhcmVudEJib3gpIHtcbiAgaWYodGhpcy5jb29yZFR5cGUgPT0gXCJyZWxhdGl2ZVRvQ2VudGVyXCIpIHtcbiAgICB2YXIgdGhpc1ggPSB0aGlzLmJib3gueDtcbiAgICB2YXIgdGhpc1kgPSB0aGlzLmJib3gueTtcbiAgICBpZih0aGlzWSA+IDQ1KSB7XG4gICAgICB0aGlzLmFuY2hvclNpZGUgPSBcImJvdHRvbVwiO1xuICAgICAgdGhpcy5iYm94LnkgPSA1MDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpc1kgPCAtNDUpIHtcbiAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwidG9wXCI7XG4gICAgICB0aGlzLmJib3gueSA9IC01MDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpc1kgPT4gMCkge1xuICAgICAgaWYgKHRoaXNYID4gNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJyaWdodFwiO1xuICAgICAgICB0aGlzLmJib3gueCA9IDUwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpc1ggPCAtNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgIHRoaXMuYmJveC54ID0gLTUwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwiYm90dG9tXCI7XG4gICAgICAgIHRoaXMuYmJveC55ID0gNTA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXNYID4gNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJyaWdodFwiO1xuICAgICAgICB0aGlzLmJib3gueCA9IDUwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpc1ggPCAtNDUpIHtcbiAgICAgICAgdGhpcy5hbmNob3JTaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgIHRoaXMuYmJveC54ID0gLTUwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuYW5jaG9yU2lkZSA9IFwidG9wXCI7XG4gICAgICAgIHRoaXMuYmJveC55ID0gLTUwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUuYWRkVG9QYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbG9jYXRpb24sIHBvc2l0aW9uLCBpbmRleCkge1xuXG4gIC8vIGFkZCBzdGF0ZSB2YXIgdG8gdGhlIHBhcmVudCdzIHN0YXRlc2FuZGluZm9zXG4gIGlmKHR5cGVvZiBpbmRleCAhPSBcInVuZGVmaW5lZFwiKSB7IC8vIHNwZWNpZmljIGluZGV4IHByb3ZpZGVkIChmb3IgdW5kby9yZWRvIGNvbnNpc3RlbmN5KVxuICAgIHBhcmVudE5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5zcGxpY2UoaW5kZXgsIDAsIHRoaXMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHBhcmVudE5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5wdXNoKHRoaXMpO1xuICB9XG5cbiAgaWYoIXBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKSkgeyAvLyBlbnN1cmUgbWluaW1hbCBpbml0aWFsaXphdGlvblxuICAgIHBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnLCB7fSk7XG4gIH1cbiAgaWYoIWxvY2F0aW9uKSB7IC8vIGxvY2F0aW9uIG5vdCBwcm92aWRlZCwgbmVlZCB0byBkZWZpbmUgaXQgYXV0b21hdGljYWxseVxuICAgIGxvY2F0aW9uID0gQXV4VW5pdExheW91dC5zZWxlY3ROZXh0QXZhaWxhYmxlKHBhcmVudE5vZGUpO1xuICB9XG4gIC8vIGhlcmUgd2UgYXJlIHN1cmUgdG8gaGF2ZSBhIGxvY2F0aW9uIGV2ZW4gaWYgaXQgd2FzIG5vdCBwcm92aWRlZCBhcyBhcmd1bWVudFxuICAvLyBnZXQgb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgbGF5b3V0XG4gIGlmKCFwYXJlbnROb2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbbG9jYXRpb25dKSB7XG4gICAgcGFyZW50Tm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXSA9IG5ldyBucy5BdXhVbml0TGF5b3V0KHBhcmVudE5vZGUsIGxvY2F0aW9uKTtcbiAgfVxuICB2YXIgbGF5b3V0ID0gcGFyZW50Tm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXTtcbiAgdGhpcy5hbmNob3JTaWRlID0gbG9jYXRpb247XG4gIHN3aXRjaChsb2NhdGlvbikge1xuICAgIGNhc2UgXCJ0b3BcIjogdGhpcy5iYm94LnkgPSAtNTA7IGJyZWFrO1xuICAgIGNhc2UgXCJib3R0b21cIjogdGhpcy5iYm94LnkgPSA1MDsgYnJlYWs7XG4gICAgY2FzZSBcImxlZnRcIjogdGhpcy5iYm94LnggPSAtNTA7IGJyZWFrO1xuICAgIGNhc2UgXCJyaWdodFwiOiB0aGlzLmJib3gueCA9IC01MDsgYnJlYWs7XG4gIH1cbiAgLy8gYWRkIHN0YXRlVmFyIHRvIGxheW91dCwgcHJlY29tcHV0aW5nIG9mIHJlbGF0aXZlIGNvb3JkcyB3aWxsIGJlIHRyaWdnZXJlZCBhY2NvcmRpbmdseVxuICB2YXIgaW5zZXJ0ZWRQb3NpdGlvbiA9IGxheW91dC5hZGRBdXhVbml0KHRoaXMsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGluc2VydGVkUG9zaXRpb247XG59XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLnJlbW92ZUZyb21QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJlbnRMYXlvdXQgPSB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpW3RoaXMuYW5jaG9yU2lkZV07XG4gIHBhcmVudExheW91dC5yZW1vdmVBdXhVbml0KHRoaXMpO1xuICBpZiAocGFyZW50TGF5b3V0LmlzRW1wdHkoKSl7XG4gICAgZGVsZXRlIHRoaXMucGFyZW50LmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbdGhpcy5hbmNob3JTaWRlXTtcbiAgfVxuICB2YXIgc3RhdGVzYW5kaW5mb3MgPSB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpO1xuICB2YXIgaW5kZXggID0gc3RhdGVzYW5kaW5mb3MuaW5kZXhPZih0aGlzKTtcbiAgc3RhdGVzYW5kaW5mb3Muc3BsaWNlKGluZGV4LCAxKTtcbn07XG5cbkF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmdldFBvc2l0aW9uSW5kZXggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50LmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbdGhpcy5hbmNob3JTaWRlXS51bml0cy5pbmRleE9mKHRoaXMpO1xufTtcblxubnMuQXV4aWxpYXJ5VW5pdCA9IEF1eGlsaWFyeVVuaXQ7XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgQXV4aWxpYXJ5VW5pdCAtLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyAtLS0tLS0tLS0tLS0tLSBTdGF0ZVZhcmlhYmxlIC0tLS0tLS0tLS0tLS0tIC8vXG4vKipcbiAqIHBhcmVudCBoYXMgdG8gYmUgYSBzdGF0ZWZ1bCBFUE4gKGNvbXBsZXgsIG1hY3JvbW9sZWN1bGUgb3IgbnVjbGVpYyBhY2lkKVxuICovXG52YXIgU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uICh2YWx1ZSwgc3RhdGVWYXJpYWJsZURlZmluaXRpb24sIHBhcmVudCkge1xuICBBdXhpbGlhcnlVbml0LmNhbGwodGhpcywgcGFyZW50KTtcbiAgdGhpcy5zdGF0ZSA9IHt9O1xuICB0aGlzLnN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuc3RhdGUudmFyaWFibGUgPSBudWxsO1xuICB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uID0gc3RhdGVWYXJpYWJsZURlZmluaXRpb247XG4gIHRoaXMuY2xhenogPSBcInN0YXRlIHZhcmlhYmxlXCI7XG59O1xuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF1eGlsaWFyeVVuaXQucHJvdG90eXBlKTtcblN0YXRlVmFyaWFibGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3RhdGVWYXJpYWJsZTtcblN0YXRlVmFyaWFibGUuc2hhcGVSYWRpdXMgPSAxNTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhdGVWYWx1ZSA9IHRoaXMuc3RhdGUudmFsdWUgfHwgJyc7XG4gIHZhciBzdGF0ZVZhcmlhYmxlID0gdGhpcy5zdGF0ZS52YXJpYWJsZSA/IFwiQFwiICsgdGhpcy5zdGF0ZS52YXJpYWJsZSA6IFwiXCI7XG5cbiAgcmV0dXJuIHN0YXRlVmFsdWUgKyBzdGF0ZVZhcmlhYmxlO1xufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKHRoaXMuc3RhdGUudmFsdWUgJiYgdGhpcy5zdGF0ZS52YWx1ZSAhPSBcIlwiKSB8fCAodGhpcy5zdGF0ZS52YXJpYWJsZSAmJiB0aGlzLnN0YXRlLnZhcmlhYmxlICE9IFwiXCIpO1xufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUuZHJhd1NoYXBlID0gZnVuY3Rpb24oY29udGV4dCwgeCwgeSkge1xuICBjeXRvc2NhcGUuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsXG4gICAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICAgIHRoaXMuYmJveC53LCB0aGlzLmJib3guaCxcbiAgICAgICAgICAgICAgTWF0aC5taW4odGhpcy5iYm94LncgLyAyLCB0aGlzLmJib3guaCAvIDIsIFN0YXRlVmFyaWFibGUuc2hhcGVSYWRpdXMpKTtcbiAgdmFyIHRtcF9jdHh0ID0gY29udGV4dC5maWxsU3R5bGU7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gQXV4aWxpYXJ5VW5pdC5kZWZhdWx0QmFja2dyb3VuZENvbG9yO1xuICBjb250ZXh0LmZpbGwoKTtcbiAgY29udGV4dC5maWxsU3R5bGUgPSB0bXBfY3R4dDtcbiAgY29udGV4dC5zdHJva2UoKTtcbn07XG5cblN0YXRlVmFyaWFibGUuY3JlYXRlID0gZnVuY3Rpb24ocGFyZW50Tm9kZSwgdmFsdWUsIHZhcmlhYmxlLCBiYm94LCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4KSB7XG4gIC8vIGNyZWF0ZSB0aGUgbmV3IHN0YXRlIHZhciBvZiBpbmZvXG4gIHZhciBzdGF0ZVZhciA9IG5ldyBucy5TdGF0ZVZhcmlhYmxlKCk7XG4gIHN0YXRlVmFyLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gIHN0YXRlVmFyLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlVmFyLnZhcmlhYmxlID0gdmFyaWFibGU7XG4gIHN0YXRlVmFyLnN0YXRlID0ge3ZhbHVlOiB2YWx1ZSwgdmFyaWFibGU6IHZhcmlhYmxlfTtcbiAgc3RhdGVWYXIuYmJveCA9IGJib3g7XG5cbiAgLy8gbGluayB0byBsYXlvdXRcbiAgcG9zaXRpb24gPSBzdGF0ZVZhci5hZGRUb1BhcmVudChwYXJlbnROb2RlLCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4KTtcblxuICByZXR1cm4ge1xuICAgIGluZGV4OiBzdGF0ZVZhci5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHN0YXRlVmFyKSxcbiAgICBsb2NhdGlvbjogc3RhdGVWYXIuYW5jaG9yU2lkZSxcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfVxufTtcblxuU3RhdGVWYXJpYWJsZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoKTtcbiAgdmFyIGluZGV4ID0gdGhpcy5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHRoaXMpO1xuICB0aGlzLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgLy9jb25zb2xlLmxvZyhcImFmdGVyIHJlbW92ZVwiLCB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpLCB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpKTtcbiAgcmV0dXJuIHtcbiAgICBjbGF6ejogXCJzdGF0ZSB2YXJpYWJsZVwiLFxuICAgIHN0YXRlOiB7XG4gICAgICB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgIHZhcmlhYmxlOiB0aGlzLnN0YXRlLnZhcmlhYmxlXG4gICAgfSxcbiAgICBiYm94OiB7XG4gICAgICB3OiB0aGlzLmJib3gudyxcbiAgICAgIGg6IHRoaXMuYmJveC5oXG4gICAgfSxcbiAgICBsb2NhdGlvbjogdGhpcy5hbmNob3JTaWRlLFxuICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICBpbmRleDogaW5kZXhcbiAgfTtcbn07XG5cblN0YXRlVmFyaWFibGUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihuZXdQYXJlbnQsIG5ld0lkKSB7XG4gIHZhciBuZXdTdGF0ZVZhciA9IEF1eGlsaWFyeVVuaXQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLCBuZXcgU3RhdGVWYXJpYWJsZSgpLCBuZXdQYXJlbnQsIG5ld0lkKTtcbiAgbmV3U3RhdGVWYXIuc3RhdGUgPSBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLnN0YXRlKTtcbiAgbmV3U3RhdGVWYXIuc3RhdGVWYXJpYWJsZURlZmluaXRpb24gPSB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uO1xuICBuZXdTdGF0ZVZhci5jbGF6eiA9IHRoaXMuY2xheno7XG4gIHJldHVybiBuZXdTdGF0ZVZhcjtcbn07XG5cbm5zLlN0YXRlVmFyaWFibGUgPSBTdGF0ZVZhcmlhYmxlO1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIFN0YXRlVmFyaWFibGUgLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gLS0tLS0tLS0tLS0tLS0gVW5pdE9mSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0gLy9cbi8qKlxuICogcGFyZW50IGNhbiBiZSBhbiBFUE4sIGNvbXBhcnRtZW50IG9yIHN1YnVuaXRcbiAqIFRoZSBzaGFwZSBjYW4gdmFyeSBhbmQgY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gQnkgZGVmYXVsdCwgaXQgd2lsbCBiZSByZW5kZXJlZCB3aXRoIHRoZSBzaGFwZSBcbiAqIG9mIFBEIHVuaXRzIG9mIGluZm9ybWF0aW9uLlxuICogVG8gcHJvdmlkZSBhIGN1c3RvbSBzaGFwZSwgMiBmdW5jdGlvbnMgbXVzdCBiZSBwYXNzZWQ6XG4gKiAgLSBzaGFwZUZuOiB0aGUgc2hhcGUgZnVuY3Rpb24gaXRzZWxmLCB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byByZW5kZXIgdGhlIHNoYXBlXG4gKiAgICAgICAgICAgICBUaGUgcHJvdG90eXBlIHNob3VsZCBiZTogZm4oY29udGV4dCwgeCwgeSwgW3NvbWUgb3RoZXIgYXJndW1lbnRzXSlcbiAqICAtIHNoYXBlQXJnc0ZuOiBwcm90b3R5cGUgZnVuY3Rpb24oc2VsZiksIGl0IHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gc2hhcGVGblxuICogICAgICAgICAgICAgICAgIFNlZSBleGFtcGxlIGFzIHRoZSBkZWZhdWx0IGJlbG93LlxuICogIFRvIHJlbmRlciB0aGUgc2hhcGUsIHdlIHdpbGwgc2ltcGx5IGRvOiBzaGFwZUZuLmFwcGx5KG51bGwsIFtjb250ZXh0LCB4LCB5XSArIHJlc3Qgb2YgdGhlIGxpc3QgcHJvdmlkZWQgYnkgc2hhcGVBcmdzRm4oKSApXG4gKi9cbnZhciBVbml0T2ZJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgcGFyZW50LCBzaGFwZUZuLCBzaGFwZUFyZ3NGbikge1xuICBBdXhpbGlhcnlVbml0LmNhbGwodGhpcywgcGFyZW50KTtcbiAgdGhpcy5sYWJlbCA9IHt0ZXh0OiB2YWx1ZX07IC8vIGZyb20gbGVnYWN5IGNvZGUsIGNvbnRhaW5zIHt0ZXh0OiB9XG4gIHRoaXMuY2xhenogPSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIjtcbiAgaWYoc2hhcGVGbiAmJiBzaGFwZUFyZ3NGbikge1xuICAgIHRoaXMuc2hhcGVGbiA9IHNoYXBlRm47XG4gICAgdGhpcy5zaGFwZUFyZ3NGbiA9IHNoYXBlQXJnc0ZuO1xuICB9XG4gIGVsc2UgeyAvLyBkZWZhdWx0IHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIHRoaXMuc2hhcGVGbiA9IGZ1bmN0aW9uKGMseCx5LHcsaCl7XG4gICAgICBjeXRvc2NhcGUuYmFzZU5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddLmRyYXcoYywgeCwgeSwgdywgaClcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFwZUFyZ3NGbiA9IGZ1bmN0aW9uIChzZWxmKSB7XG4gICAgICByZXR1cm4gW3NlbGYuYmJveC53LCBzZWxmLmJib3guaCwgMF07XG4gICAgfTtcbiAgfVxufTtcblVuaXRPZkluZm9ybWF0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXV4aWxpYXJ5VW5pdC5wcm90b3R5cGUpO1xuVW5pdE9mSW5mb3JtYXRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVW5pdE9mSW5mb3JtYXRpb247XG5Vbml0T2ZJbmZvcm1hdGlvbi5zaGFwZVJhZGl1cyA9IDQ7XG5cblVuaXRPZkluZm9ybWF0aW9uLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmxhYmVsLnRleHQ7XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUuaGFzVGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5sYWJlbC50ZXh0ICYmIHRoaXMubGFiZWwudGV4dCAhPSBcIlwiO1xufTtcblxuVW5pdE9mSW5mb3JtYXRpb24ucHJvdG90eXBlLmRyYXdTaGFwZSA9IGZ1bmN0aW9uKGNvbnRleHQsIHgsIHkpIHtcbiAgdmFyIGFyZ3MgPSBbY29udGV4dCwgeCwgeV0uY29uY2F0KHRoaXMuc2hhcGVBcmdzRm4odGhpcykpO1xuICB0aGlzLnNoYXBlRm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIHZhciB0bXBfY3R4dCA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IEF1eGlsaWFyeVVuaXQuZGVmYXVsdEJhY2tncm91bmRDb2xvcjtcbiAgY29udGV4dC5maWxsKCk7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gdG1wX2N0eHQ7XG4gIGNvbnRleHQuc3Ryb2tlKCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB1bml0IG9mIGluZm8gYW5kIGxpbmtzIGV2ZXJ5dGhpbmcgYWNjb3JkaW5nbHlcbiAqIEBwYXJhbSBwYXJlbnROb2RlIC0gdGhlIGN5dG9zY2FwZSBlbGVtZW50IGhvc3RpbmcgdGhlIHVuaXQgb2YgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB2YWx1ZSAtIGl0cyB0ZXh0XG4gKiBAcGFyYW0gW2xvY2F0aW9uXSAtIHRoZSBzaWRlIHdoZXJlIGl0IHdpbGwgYmUgcGxhY2VkIHRvcCwgYm90dG9tLCByaWdodCwgbGVmdCBvciB1bmRlZmluZWQgKGF1dG8gcGxhY2VtZW50KVxuICogQHBhcmFtIFtwb3NpdGlvbl0gLSBpdHMgcG9zaXRpb24gaW4gdGhlIG9yZGVyIG9mIGVsZW1lbnRzIHBsYWNlZCBvbiB0aGUgc2FtZSBsb2NhdGlvblxuICogQHBhcmFtIFtpbmRleF0gLSBpdHMgaW5kZXggaW4gdGhlIHN0YXRlc2FuZGluZm9zIGxpc3RcbiAqL1xuVW5pdE9mSW5mb3JtYXRpb24uY3JlYXRlID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHZhbHVlLCBiYm94LCBsb2NhdGlvbiwgcG9zaXRpb24sIGluZGV4LCBzaGFwZUZuLCBzaGFwZUFyZ3NGbikge1xuICAvLyBjcmVhdGUgdGhlIG5ldyB1bml0IG9mIGluZm9cbiAgdmFyIHVuaXQgPSBuZXcgbnMuVW5pdE9mSW5mb3JtYXRpb24odmFsdWUsIHBhcmVudE5vZGUsIHNoYXBlRm4sIHNoYXBlQXJnc0ZuKTtcbiAgdW5pdC5iYm94ID0gYmJveDtcblxuICAvL2NvbnNvbGUubG9nKFwid2lsbCBpbnNlcnQgb25cIiwgbG9jYXRpb24sIHBvc2l0aW9uKTtcbiAgcG9zaXRpb24gPSB1bml0LmFkZFRvUGFyZW50KHBhcmVudE5vZGUsIGxvY2F0aW9uLCBwb3NpdGlvbiwgaW5kZXgpO1xuXG4gIHJldHVybiB7XG4gICAgaW5kZXg6IHVuaXQucGFyZW50LmRhdGEoJ3N0YXRlc2FuZGluZm9zJykuaW5kZXhPZih1bml0KSxcbiAgICBsb2NhdGlvbjogdW5pdC5hbmNob3JTaWRlLFxuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoKTtcbiAgdmFyIGluZGV4ID0gdGhpcy5wYXJlbnQuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKS5pbmRleE9mKHRoaXMpO1xuICB0aGlzLnJlbW92ZUZyb21QYXJlbnQoKTtcbiAgLy9jb25zb2xlLmxvZyhcImFmdGVyIHJlbW92ZVwiLCB0aGlzLnBhcmVudC5kYXRhKCdhdXh1bml0bGF5b3V0cycpLCB0aGlzLnBhcmVudC5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpKTtcbiAgcmV0dXJuIHtcbiAgICBjbGF6ejogXCJ1bml0IG9mIGluZm9ybWF0aW9uXCIsXG4gICAgbGFiZWw6IHtcbiAgICAgIHRleHQ6IHRoaXMubGFiZWwudGV4dFxuICAgIH0sXG4gICAgYmJveDoge1xuICAgICAgdzogdGhpcy5iYm94LncsXG4gICAgICBoOiB0aGlzLmJib3guaFxuICAgIH0sXG4gICAgbG9jYXRpb246IHRoaXMuYW5jaG9yU2lkZSxcbiAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgaW5kZXg6IGluZGV4XG4gIH07XG59O1xuXG5Vbml0T2ZJbmZvcm1hdGlvbi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKG5ld1BhcmVudCwgbmV3SWQpIHtcbiAgdmFyIG5ld1VuaXRPZkluZm8gPSBBdXhpbGlhcnlVbml0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywgbmV3IFVuaXRPZkluZm9ybWF0aW9uKCksIG5ld1BhcmVudCwgbmV3SWQpO1xuICBuZXdVbml0T2ZJbmZvLmxhYmVsID0galF1ZXJ5LmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5sYWJlbCk7XG4gIG5ld1VuaXRPZkluZm8uY2xhenogPSB0aGlzLmNsYXp6O1xuICBuZXdVbml0T2ZJbmZvLnNoYXBlRm4gPSB0aGlzLnNoYXBlRm47XG4gIG5ld1VuaXRPZkluZm8uc2hhcGVBcmdzRm4gPSB0aGlzLnNoYXBlQXJnc0ZuO1xuICByZXR1cm4gbmV3VW5pdE9mSW5mbztcbn07XG5cbm5zLlVuaXRPZkluZm9ybWF0aW9uID0gVW5pdE9mSW5mb3JtYXRpb247XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgVW5pdE9mSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gLS0tLS0tLS0tLS0tLS0gRW50aXR5VHlwZSAtLS0tLS0tLS0tLS0tLSAvL1xuLyoqXG4gKiBUaGUgdHlwZSBvZiB0aGUgRVBOLCBmb3IgZXhhbXBsZSB0aGVyZSBjYW4gYmUgc2V2ZXJhbHMgbXlvc2luIEVQTiwgYnV0IG9ubHkgb25lIG15b3NpbiBFbnRpdHlUeXBlXG4gKiBUaGlzIGNsYXNzIHdpbGwgaG9sZCB0aGUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHN0YXRlIHZhcmlhYmxlLCB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgbXlvc2luc1xuICovXG52YXIgRW50aXR5VHlwZSA9IGZ1bmN0aW9uIChuYW1lLCBFUE4pIHtcbiAgdGhpcy5uYW1lID0gbmFtZTsgLy8gbm9ybWFsbHkgdGhlIHNhbWUgYXMgaXRzIEVQTnNcbiAgdGhpcy5zdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbnMgPSBbXTsgLy8gMCBvciBtYW55IHNoYXJlZCBzdGF0ZSBkZWZpbml0aW9uc1xuICB0aGlzLkVQTnMgPSBbXTsgLy8gdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCAxIGVsZW1lbnQsIGVsc2Ugbm8gcmVhc29uIHRvIGV4aXN0XG59O1xuXG5FbnRpdHlUeXBlLnByb3RvdHlwZS5jcmVhdGVOZXdEZWZpbml0aW9uRm9yID0gZnVuY3Rpb24gKHN0YXRlVmFyKSB7XG4gIHZhciBuZXdEZWZpbml0aW9uID0gbmV3IG5zLlN0YXRlVmFyaWFibGVEZWZpbml0aW9uKCk7XG4gIG5ld0RlZmluaXRpb24uZW50aXR5VHlwZSA9IHRoaXM7XG4gIG5ld0RlZmluaXRpb24uc3RhdGVWYXJpYWJsZXMucHVzaChzdGF0ZVZhcik7XG5cbiAgc3RhdGVWYXIuc3RhdGVWYXJpYWJsZURlZmluaXRpb24gPSBuZXdEZWZpbml0aW9uO1xuICBzdGF0ZVZhci5wYXJlbnQuZGF0YSgnZW50aXR5VHlwZScsIHRoaXMpO1xuICB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9ucy5wdXNoKG5ld0RlZmluaXRpb24pO1xufTtcblxuRW50aXR5VHlwZS5wcm90b3R5cGUuYXNzaWduU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uIChzdGF0ZVZhcikge1xuICAvLyBmaXJzdCB0cml2aWFsIGNhc2UsIG5vIHN0YXRlRGVmaW5pdGlvbiB5ZXQgZm9yIHRoaXMgZW50aXR5VHlwZSwgc28gdGhpcyBpcyBhIG5ldyBvbmVcbiAgaWYgKHRoaXMuc3RhdGVWYXJpYWJsZURlZmluaXRpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5jcmVhdGVOZXdEZWZpbml0aW9uRm9yKHN0YXRlVmFyKTtcbiAgfVxuICBlbHNlIHsgLy8gaWYgZGVmaW5pdGlvbnMgYXJlIGFscmVhZHkgcHJlc2VudCwgd2UgbmVlZCB0byBtYXRjaCB0aG9zZSB0byB0aGUgY3VycmVudCBzdGF0ZVZhcmlhYmxlXG4gICAgZm9yKHZhciBpPTA7IGkgPCB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hdGNoU3RhdGVEZWYgPSB0aGlzLnN0YXRlVmFyaWFibGVEZWZpbml0aW9uc1tpXTtcbiAgICAgIGlmIChtYXRjaFN0YXRlRGVmLm1hdGNoU3RhdGVWYXJpYWJsZShzdGF0ZVZhcikpe1xuICAgICAgICBtYXRjaFN0YXRlRGVmLnN0YXRlVmFyaWFibGVzLnB1c2goc3RhdGVWYXIpO1xuICAgICAgICBzdGF0ZVZhci5zdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IG1hdGNoU3RhdGVEZWY7XG4gICAgICAgIHN0YXRlVmFyLnBhcmVudC5kYXRhKCdlbnRpdHlUeXBlJywgdGhpcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm90aGluZyB3YXMgbWF0Y2hlZCBhbW9uZyB0aGUgY3VycmVudCBzdGF0ZVZhckRlZiBvZiB0aGlzIGVudGl0eVR5cGUsIGNyZWF0ZSBuZXcgb25lXG4gICAgdGhpcy5jcmVhdGVOZXdEZWZpbml0aW9uRm9yKHN0YXRlVmFyKTtcbiAgfVxufTtcblxubnMuRW50aXR5VHlwZSA9IEVudGl0eVR5cGU7XG4vLyAtLS0tLS0tLS0tLS0tLSBFTkQgRW50aXR5VHlwZSAtLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyAtLS0tLS0tLS0tLS0tLSBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiAtLS0tLS0tLS0tLS0tLSAvL1xuLyoqXG4gKiBUaGUgc3RhdGUgdmFyaWFibGUgZGVmaW5pdGlvbiBpcyBzb21ldGhpbmcgc2hhcmVkIGFjcm9zcyBkaWZmZXJlbnQgRVBOc1xuICogVGhlIGNvbmNlcm5lZCBFUE5zIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUgZW50aXR5cGUgcmVmZXJlbmNlXG4gKi9cbnZhciBTdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCBlbnRpdHlUeXBlKSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuZW50aXR5VHlwZSA9IGVudGl0eVR5cGU7IC8vIHJlZmVyZW5jZSB0byBvd25pbmcgZW50aXR5IHR5cGVcbiAgdGhpcy5zdGF0ZVZhcmlhYmxlcyA9IFtdOyAvLyB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IDEgZWxlbWVudCwgZWxzZSBubyByZWFzb24gdG8gZXhpc3Rcbn07XG5cbi8qKlxuICogcmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNoYXJlIHRoaXMgc3RhdGUgZGVmaW5pdGlvblxuICovXG5TdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbi5wcm90b3R5cGUuZ2V0Q29uY2VybmVkRVBOcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbnRpdHlUeXBlLkVQTnM7XG59O1xuXG4vKipcbiAqIEd1ZXNzIGlmIHRoZSBwcm92aWRlZCBzdGF0ZVZhcmlhYmxlIGJlbG9uZ3MgdG8gdGhpcyBzdGF0ZVZhckRlZmluaXRpb25cbiAqIFdlIGNvbnNpZGVyIGl0IGRvZXMsIGlmIGVpdGhlciB0aGUgc3RhdGV2YXIudmFsdWUgb3Igc3RhdGV2YXIudmFyaWFibGUgYXJlIG1hdGNoaW5nIG9uZSBcbiAqIGlmIHRoZSBzdGF0ZXZhciBpbiB0aGUgc2V0IG9mIHRoZSBTdGF0ZVZhckRlZlxuICogVGhpcyBpcyBiZWNhdXNlIHdlIG5vcm1hbGx5IGNvbXBhcmUgb25seSBzdGF0ZVZhcmlhYmxlcyBmcm9tIHRoZSBzYW1lIGVudGl0eVR5cGVcbiAqL1xuU3RhdGVWYXJpYWJsZURlZmluaXRpb24ucHJvdG90eXBlLm1hdGNoU3RhdGVWYXJpYWJsZSA9IGZ1bmN0aW9uKHN0YXRlVmFyKSB7XG4gIGZvcih2YXIgaT0wOyBpIDwgdGhpcy5zdGF0ZVZhcmlhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtYXRjaFN0YXRlVmFyID0gdGhpcy5zdGF0ZVZhcmlhYmxlc1tpXTtcbiAgICAvLyBEb24ndCBtYXRjaCBhIHN0YXRlVmFyIGFnYWluc3QgYW5vdGhlciBvbmUgZnJvbSB0aGUgc2FtZSBlbGVtZW50LlxuICAgIC8vIElmIDIgc3RhdGV2YXIgb24gdGhlIHNhbWUgZWxlbWVudCwgdGhlbiB0aGV5IGhhdmUgdG8gYmVsb25nIHRvIDIgZGlmZmVyZW50IHN0YXRlVmFyRGVmaW5pdGlvbnNcbiAgICBpZihtYXRjaFN0YXRlVmFyLnBhcmVudCA9PT0gc3RhdGVWYXIucGFyZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy9jb25zb2xlLmxvZyhcInRyeVwiLCBbbWF0Y2hTdGF0ZVZhci52YWx1ZSwgbWF0Y2hTdGF0ZVZhci52YXJpYWJsZV0sIFtzdGF0ZVZhci52YWx1ZSwgc3RhdGVWYXIudmFyaWFibGVdKTtcbiAgICAvLyBub3JtYWwgc3VyZSBjYXNlLiBFeGFtcGxlOlxuICAgIC8vIFAgVDEzNCAtIHVuZGVmaW5lZCBUMTM0XG4gICAgLy8gUCB1bmRlZiAtIFAgdW5kZWZcbiAgICBpZiAoLy8obWF0Y2hTdGF0ZVZhci52YWx1ZSAmJiBzdGF0ZVZhci52YWx1ZSAmJiBtYXRjaFN0YXRlVmFyLnZhbHVlID09IHN0YXRlVmFyLnZhbHVlICkgfHxcbiAgICAgICAgKG1hdGNoU3RhdGVWYXIudmFyaWFibGUgJiYgc3RhdGVWYXIudmFyaWFibGUgJiYgbWF0Y2hTdGF0ZVZhci52YXJpYWJsZSA9PSBzdGF0ZVZhci52YXJpYWJsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBtb3JlIHN1YnRsZSBjYXNlLCB3aXRoIGVtcHR5IHN0YXRlVmFyLiBMb29rIG9ubHkgYXQgdmFsdWUgYW5kIGRpc2NhcmQgdmFyaWFibGVcbiAgICAvLyBleGFtcGxlOiB1bmRlZiB1bmRlZiAtIFAgdW5kZWZcbiAgICBlbHNlIGlmICgoIW1hdGNoU3RhdGVWYXIudmFyaWFibGUgJiYgIXN0YXRlVmFyLnZhcmlhYmxlKSAmJiAobWF0Y2hTdGF0ZVZhci52YWx1ZSB8fCBzdGF0ZVZhci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5ucy5TdGF0ZVZhcmlhYmxlRGVmaW5pdGlvbiA9IFN0YXRlVmFyaWFibGVEZWZpbml0aW9uO1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIFN0YXRlVmFyaWFibGVEZWZpbml0aW9uIC0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIC0tLS0tLS0tLS0tLS0tIEF1eFVuaXRMYXlvdXQgLS0tLS0tLS0tLS0tLS0gLy9cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIGxheWluZyBvdXQgdGhlIGF1eGlsaWFyeSB1bml0cyBjb250YWluZWQgb24gYSBzYW1lIGVkZ2VcbiAqL1xudmFyIEF1eFVuaXRMYXlvdXQgPSBmdW5jdGlvbiAocGFyZW50Tm9kZSwgbG9jYXRpb24sIGFsaWdubWVudCkge1xuICB0aGlzLnVuaXRzID0gW107XG4gIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQgfHwgXCJsZWZ0XCI7IC8vIHRoaXMgd2FzIGludGVuZGVkIHRvIGJlIHVzZWQsIGJ1dCBpdCBpc24ndCBmb3Igbm93XG4gIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG4gIHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGUgPSBbXTtcbiAgdGhpcy5sZW5ndGhVc2VkID0gMDtcblxuICAvLyBzcGVjaWZpYyBydWxlcyBmb3IgdGhlIGxheW91dFxuICBpZihwYXJlbnROb2RlLmRhdGEoJ2NsYXNzJykgPT0gXCJzaW1wbGUgY2hlbWljYWxcIikge1xuICAgIHRoaXMub3V0ZXJNYXJnaW4gPSAzO1xuICB9XG59O1xuLyoqXG4gKiBvdXRlck1hcmdpbjogdGhlIGxlZnQgYW5kIHJpZ2h0IHNwYWNlIGxlZnQgYmV0d2VlbiB0aGUgc2lkZSBvZiB0aGUgbm9kZSwgYW5kIHRoZSBmaXJzdCAoYW5kIGxhc3QpIGJveFxuICogdW5pdEdhcDogdGhlIHNwYWNlIGJldHdlZW4gdGhlIGF1eGlsaWFyeSB1bml0c1xuICogYWx3YXlzU2hvd0F1eFVuaXRzOiBieXBhc3NlcyBhbnkgbGltaXQgb2YgdW5pdHMgZGlzcGxheWVkLCBhbmQgcHJldmVudCB1bml0cyBmcm9tIGRpc2FwcGVhcmluZyxcbiAqIGZvcmNpbmcgYSBtaW5pbXVtIHNpemUgZm9yIHRoZSBub2RlXG4gKiBtYXhVbml0RGlzcGxheWVkOiBzaG93IGF0IG1vc3QgdGhpcyBhbW91bnQgb2YgdW5pdHMsIGV2ZW4gd2hlbiB0aGVyZSBpcyBlbm91Z2ggc3BhY2VcbiAqXG4gKiBUaGVzZSBvcHRpb25zIGNhbiBiZSBkZWZpbmVkIGF0IHRoZSBpbnN0YW5jZSBsZXZlbC4gSWYgaXQgaXMgZm91bmQgaW4gYW4gaW5zdGFuY2UsIHRoZW4gaXQgXG4gKiB0YWtlcyBwcmVjZWRlbmNlLiBJZiBub3QgZm91bmQsIHRoZSBmb2xsb3dpbmcgY2xhc3MnIHZhbHVlcyBhcmUgdXNlZC5cbiAqL1xuQXV4VW5pdExheW91dC5vdXRlck1hcmdpbiA9IDEwO1xuQXV4VW5pdExheW91dC51bml0R2FwID0gNTtcbkF1eFVuaXRMYXlvdXQuYWx3YXlzU2hvd0F1eFVuaXRzID0gZmFsc2U7XG5BdXhVbml0TGF5b3V0Lm1heFVuaXREaXNwbGF5ZWQgPSAtMTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oZG9Gb3JjZVVwZGF0ZSkge1xuICB0aGlzLnByZWNvbXB1dGVDb29yZHMoZG9Gb3JjZVVwZGF0ZSk7XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5hZGRBdXhVbml0ID0gZnVuY3Rpb24odW5pdCwgcG9zaXRpb24pIHtcbiAgaWYodHlwZW9mIHBvc2l0aW9uICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiYWRkIHVuaXQgYXQgcG9zaXRpaW9uXCIsIHBvc2l0aW9uKTtcbiAgICB0aGlzLnVuaXRzLnNwbGljZShwb3NpdGlvbiwgMCwgdW5pdCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy51bml0cy5wdXNoKHVuaXQpO1xuICAgIHBvc2l0aW9uID0gdGhpcy51bml0cy5sZW5ndGggLSAxO1xuICB9XG5cbiAgdGhpcy51cGRhdGVMZW5ndGhDYWNoZSgpO1xuICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgaWYgKHRoaXMuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzKCkpIHtcbiAgICAvLyBzZXQgYSBtaW5pbXVtIHNpemUgYWNjb3JkaW5nIHRvIGJvdGggc2lkZXMgb24gdGhlIHNhbWUgb3JpZW50YXRpb25cbiAgICB0aGlzLnNldFBhcmVudE1pbkxlbmd0aCgpO1xuICAgIC8vIG5lZWQgdG8gcmVzaXplIHRoZSBwYXJlbnQgaW4gY2FzZSB0aGUgc3BhY2Ugd2FzIHRvbyBzbWFsbFxuICAgIHRoaXMucmVzaXplUGFyZW50KHRoaXMubGVuZ3RoVXNlZCk7XG4gIH1cbiAgLy9jeS5zdHlsZSgpLnVwZGF0ZSgpOyAvLyA8LSB3YXMgaXQgcmVhbGx5IG5lY2Vzc2FyeSA/XG4gIHJldHVybiBwb3NpdGlvbjtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLnJlbW92ZUF1eFVuaXQgPSBmdW5jdGlvbih1bml0KSB7XG4gIHZhciBpbmRleCA9IHRoaXMudW5pdHMuaW5kZXhPZih1bml0KTtcbiAgdGhpcy51bml0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB0aGlzLnVwZGF0ZUxlbmd0aENhY2hlKCk7XG4gIHRoaXMudXBkYXRlKHRydWUpO1xuICBpZiAodGhpcy5nZXRBbHdheXNTaG93QXV4VW5pdHMoKSkge1xuICAgIC8vIHNldCBhIG1pbmltdW0gc2l6ZSBhY2NvcmRpbmcgdG8gYm90aCBzaWRlcyBvbiB0aGUgc2FtZSBvcmllbnRhdGlvblxuICAgIHRoaXMuc2V0UGFyZW50TWluTGVuZ3RoKCk7XG4gIH1cbiAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbn07XG5cbi8qKlxuICogcmVvcmRlciBib3hlcyB1c2luZyB0aGVpciBkZWZpbmVkIHBvc2l0aW9ucy4gRnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCB0b3AgdG8gYm90dG9tLlxuICogdGhpcyBlbnN1cmVzIHRoYXQgdGhlaXIgb3JkZXIgaW4gdGhlIGxheW91dCdzIGxpc3QgY29ycmVzcG9uZHMgdG8gdGhlIHJlYWxpdHkgb2YgdGhlIG1hcC5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUucmVvcmRlckZyb21Qb3NpdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLnVuaXRzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIGlmKHNlbGYubG9jYXRpb24gPT0gXCJ0b3BcIiB8fCBzZWxmLmxvY2F0aW9uID09IFwiYm90dG9tXCIpIHtcbiAgICAgIGlmIChhLmJib3gueCA8IGIuYmJveC54KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmJib3gueCA+IGIuYmJveC54KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChhLmJib3gueSA8IGIuYmJveC55KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmJib3gueSA+IGIuYmJveC55KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG4gIC8vY29uc29sZS5sb2coXCJ1bml0cyBhZnRlciByZW9hcmRlclwiLCB0aGlzLnVuaXRzKTtcbiAgdGhpcy51cGRhdGVMZW5ndGhDYWNoZSgpO1xuICB0aGlzLnVwZGF0ZSh0cnVlKTtcbn07XG5cbi8qKlxuICogdXNlIGEgY2FjaGVkIGxpc3QgdG8gZGV0ZXJtaW5lIHdoYXQgaXMgdGhlIGxlbmd0aCBuZWVkZWQgdG8gZHJhdyB4IGF1eCB1bml0cy5cbiAqIGNhbiB0aGVuIGJlIGNvbXBhcmVkIGFnYWluc3QgdGhlIHBhcmVudCBub2RlJ3MgZGltZW5zaW9ucywgdG8gZGVjaWRlIGhvdyBtYW55XG4gKiBhdXggdW5pdHMgdG8gZHJhdy5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUudXBkYXRlTGVuZ3RoQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZW5kZXJMZW5ndGhDYWNoZSA9IFswXTtcbiAgdmFyIHByZXZpb3VzID0gdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudExlbmd0aDtcbiAgICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgICBjdXJyZW50TGVuZ3RoID0gdGhpcy51bml0c1tpXS5iYm94Lnc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3VycmVudExlbmd0aCA9IHRoaXMudW5pdHNbaV0uYmJveC5oO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckxlbmd0aENhY2hlLnB1c2gocHJldmlvdXMgKyBjdXJyZW50TGVuZ3RoICsgdGhpcy5nZXRPdXRlck1hcmdpbigpKTtcbiAgICBwcmV2aW91cyArPSBjdXJyZW50TGVuZ3RoICsgdGhpcy5nZXRVbml0R2FwKCk7XG4gIH1cbn07XG5cbi8qKlxuICogVXNlIHRoZSBjYWNoZWQgcHJlY29tcHV0ZWQgbGVuZ3RocyB0byBkZWNpZGUgaG93IG1hbnkgdW5pdHMgd2UgYXJlIGNhcGFibGUgb2YgZHJhd2luZyxcbiAqIGNvbnNpZGVyaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAqIFRoZSBudW1iZXIgcmV0dXJuZWQgc2F5czogd2UgYXJlIGFibGUgdG8gZHJhdyB0aGUgTiBmaXJzdCB1bml0cyBvZiB0aGUgbGlzdHMuXG4gKiBVbnVzZWQgZm9yIG5vdy5cbiAqL1xuQXV4VW5pdExheW91dC5wcm90b3R5cGUuZ2V0RHJhd2FibGVVbml0QW1vdW50ID0gZnVuY3Rpb24oKSB7XG4gIGlmKHRoaXMuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzKCkpIHtcbiAgICAvLyBieXBhc3MgYWxsIHRoaXNcbiAgICByZXR1cm4gdGhpcy51bml0cy5sZW5ndGg7XG4gIH1cblxuICAvLyBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc2lkZSBvbiB3aGljaCB3ZSBkcmF3XG4gIHZhciBhdmFpbGFibGVTcGFjZTtcbiAgaWYgKHRoaXMuaXNUb3JCKCkpIHtcbiAgICBhdmFpbGFibGVTcGFjZSA9IHRoaXMucGFyZW50Tm9kZS5vdXRlcldpZHRoKCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgYXZhaWxhYmxlU3BhY2UgPSB0aGlzLnBhcmVudE5vZGUub3V0ZXJIZWlnaHQoKTtcbiAgfVxuICAvLyBsb29wIG92ZXIgdGhlIGNhY2hlZCBwcmVjb21wdXRlZCBsZW5ndGhzXG4gIGZvcih2YXIgaT0wOyBpIDwgdGhpcy5yZW5kZXJMZW5ndGhDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGlmKHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGVbaV0gPiBhdmFpbGFibGVTcGFjZSkge1xuICAgICAgLy8gc3RvcCBpZiB3ZSBvdmVyZmxvd1xuICAgICAgcmV0dXJuIGkgLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy51bml0cy5sZW5ndGg7XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5zZXREaXNwbGF5ZWRVbml0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gZ2V0IHRoZSBsZW5ndGggb2YgdGhlIHNpZGUgb24gd2hpY2ggd2UgZHJhd1xuICB2YXIgYXZhaWxhYmxlU3BhY2U7XG4gIGlmICh0aGlzLmlzVG9yQigpKSB7XG4gICAgYXZhaWxhYmxlU3BhY2UgPSB0aGlzLnBhcmVudE5vZGUub3V0ZXJXaWR0aCgpO1xuICAgIC8vIGR1ZSB0byBjb3JuZXIgb2YgYmFycmVsIHNoYXBlZCBjb21wYXJ0bWVudCBkZWNyZWFzZSBhdmFpbGFibGVTcGFjZSAtLSBubyBpbmZvYm94IG9uIGNvcm5lcnNcbiAgICBpZiAodGhpcy5wYXJlbnROb2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIpXG4gICAgICAgIGF2YWlsYWJsZVNwYWNlICo9IDAuODtcbiAgfVxuICBlbHNlIHtcbiAgICBhdmFpbGFibGVTcGFjZSA9IHRoaXMucGFyZW50Tm9kZS5vdXRlckhlaWdodCgpO1xuICB9XG5cbiAgLy8gdGhlcmUgaXMgYWx3YXlzIG4rMSBlbGVtZW50cyBpbiB0aGUgY2FjaGVkTGVuZ3RoIGZvciBuIHVuaXRzXG4gIHZhciBhbHdheXNTaG93QXV4VW5pdHMgPSB0aGlzLmdldEFsd2F5c1Nob3dBdXhVbml0cygpO1xuICB2YXIgbWF4VW5pdERpc3BsYXllZCA9IHRoaXMuZ2V0TWF4VW5pdERpc3BsYXllZCgpO1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZigodGhpcy5yZW5kZXJMZW5ndGhDYWNoZVtpKzFdIDw9IGF2YWlsYWJsZVNwYWNlIC8vIGRvIHdlIGhhdmUgZW5vdWdoIHNwYWNlP1xuICAgICAgJiYgKG1heFVuaXREaXNwbGF5ZWQgPT0gLTEgfHwgaSA8IG1heFVuaXREaXNwbGF5ZWQpKSAvLyBpcyB0aGVyZSBubyBsaW1pdD8gb3IgYXJlIHdlIHVuZGVyIHRoYXQgbGltaXQ/XG4gICAgICB8fCBhbHdheXNTaG93QXV4VW5pdHMpIHsgLy8gZG8gd2UgYWx3YXlzIHdhbnQgdG8gc2hvdyBldmVyeXRoaW5nIHJlZ2FyZGxlc3M/XG4gICAgICB0aGlzLnVuaXRzW2ldLmlzRGlzcGxheWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuaXRzW2ldLmlzRGlzcGxheWVkID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuXG4vLyBUT0RPIGZpbmQgYSB3YXkgdG8gcmVmYWN0b3IsIHJlbW92ZSB1Z2xpbmVzcyBvZiB0b3AtYm90dG9tL2xlZnQtcmlnaHQuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5wcmVjb21wdXRlQ29vcmRzID0gZnVuY3Rpb24gKGRvRm9yY2VVcGRhdGUpIHtcbiAgdGhpcy5zZXREaXNwbGF5ZWRVbml0cygpO1xuXG4gIHZhciBsZW5ndGhVc2VkID0gdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuICB2YXIgZmluYWxMZW5ndGhVc2VkID0gbGVuZ3RoVXNlZDtcbiAgdmFyIHVuaXRHYXAgPSB0aGlzLmdldFVuaXRHYXAoKTtcbiAgZm9yKHZhciBpPTA7IGkgPCB0aGlzLnVuaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gY2hhbmdlIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgYXV4aWxpYXJ5IHVuaXQgYWNjb3JkaW5nIHRvIHRoZSBjaG9zZW4gbGF5b3V0XG4gICAgdmFyIGF1eFVuaXQgPSB0aGlzLnVuaXRzW2ldO1xuICAgIGlmIChhdXhVbml0LmNvb3JkVHlwZSAhPSBcInJlbGF0aXZlVG9TaWRlXCIgfHwgZG9Gb3JjZVVwZGF0ZSkge1xuICAgICAgaWYgKGF1eFVuaXQuY29vcmRUeXBlID09IFwicmVsYXRpdmVUb0NlbnRlclwiIHx8IGRvRm9yY2VVcGRhdGUpIHtcbiAgICAgICAgaWYodGhpcy5pc1RvckIoKSkge1xuICAgICAgICAgIC8vYXV4VW5pdC5iYm94LnkgPSAwO1xuICAgICAgICAgIGF1eFVuaXQuYmJveC54ID0gbGVuZ3RoVXNlZCArIGF1eFVuaXQuYmJveC53IC8gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvL2F1eFVuaXQuYmJveC54ID0gMDtcbiAgICAgICAgICBhdXhVbml0LmJib3gueSA9IGxlbmd0aFVzZWQgKyBhdXhVbml0LmJib3guaCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF1eFVuaXQuY29vcmRUeXBlID0gXCJyZWxhdGl2ZVRvU2lkZVwiOyBcbiAgICB9XG5cbiAgICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgICAvL2F1eFVuaXQuYmJveC55ID0gMDtcbiAgICAgIGxlbmd0aFVzZWQgKz0gYXV4VW5pdC5iYm94LncgKyB1bml0R2FwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vYXV4VW5pdC5iYm94LnggPSAwO1xuICAgICAgbGVuZ3RoVXNlZCArPSBhdXhVbml0LmJib3guaCArIHVuaXRHYXA7XG4gICAgfVxuXG4gICAgaWYoYXV4VW5pdC5pc0Rpc3BsYXllZCkge1xuICAgICAgZmluYWxMZW5ndGhVc2VkID0gbGVuZ3RoVXNlZDtcbiAgICB9XG4gIH1cbiAgLy8gYWRqdXN0IHRoZSBsZW5ndGgsIHNob3VsZCBiZSBjb21wb3NlZCBvZiBvdXRlck1hcmdpbiBvbiB0aGUgZW5kLCBub3QgdW5pdEdhcFxuICBmaW5hbExlbmd0aFVzZWQgPSBmaW5hbExlbmd0aFVzZWQgLSB1bml0R2FwICsgdGhpcy5nZXRPdXRlck1hcmdpbigpO1xuXG4gIHRoaXMubGVuZ3RoVXNlZCA9IGZpbmFsTGVuZ3RoVXNlZDtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBmb3IodmFyIGk9MDsgaSA8IHRoaXMudW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXV4VW5pdCA9IHRoaXMudW5pdHNbaV07XG4gICAgaWYgKGF1eFVuaXQuaXNEaXNwbGF5ZWQpIHtcbiAgICAgIC8vIG1ha2UgZWFjaCB1bml0IGRyYXcgaXRzZWxmXG4gICAgICBhdXhVbml0LmRyYXcoY29udGV4dCk7XG4gICAgfVxuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnVuaXRzLmxlbmd0aCA9PSAwO1xufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUudW5pdENvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnVuaXRzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQXV0byBjaG9vc2UgdGhlIG5leHQgbGF5b3V0LiBUbyBhZGQgYSBuZXcgYXV4IHVuaXQsIGZvciBleGFtcGxlLlxuICovXG5BdXhVbml0TGF5b3V0LnNlbGVjdE5leHRBdmFpbGFibGUgPSBmdW5jdGlvbihub2RlKSB7XG4gIHZhciB0b3AgPSBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJykudG9wO1xuICB2YXIgYm90dG9tID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpLmJvdHRvbTtcbiAgdmFyIHJlc3VsdExvY2F0aW9uID0gXCJ0b3BcIjtcblxuICAvLyBzdGFydCBieSBhZGRpbmcgb24gdG9wIGlmIGZyZWVcbiAgaWYoIXRvcCB8fCB0b3AuaXNFbXB0eSgpKSB7XG4gICAgcmVzdWx0TG9jYXRpb24gPSBcInRvcFwiO1xuICB9XG4gIGVsc2UgaWYoIWJvdHRvbSB8fCBib3R0b20uaXNFbXB0eSgpKSB7XG4gICAgcmVzdWx0TG9jYXRpb24gPSBcImJvdHRvbVwiO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIHNlYXJjaCBmb3IgdGhlIHNpZGUgd2l0aCB0aGUgZmV3ZXIgdW5pdHMgb24gaXRcbiAgICBpZih0b3AudW5pdENvdW50KCkgPD0gYm90dG9tLnVuaXRDb3VudCgpKSB7XG4gICAgICByZXN1bHRMb2NhdGlvbiA9IFwidG9wXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVzdWx0TG9jYXRpb24gPSBcImJvdHRvbVwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0TG9jYXRpb247XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5yZXNpemVQYXJlbnQgPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gIGlmKHRoaXMuaXNUb3JCKCkpIHtcbiAgICBpZih0aGlzLnBhcmVudE5vZGUuZGF0YSgnYmJveCcpLncgPCBsZW5ndGgpIHtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZXN0YXJ0XCIsIFtcImNlbnRlcnJpZ2h0XCIsIHRoaXMucGFyZW50Tm9kZV0pO1xuICAgICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ2Jib3gnKS53ID0gbGVuZ3RoO1xuICAgICAgY3kudHJpZ2dlcihcIm5vZGVyZXNpemUucmVzaXplZW5kXCIsIFtcImNlbnRlcnJpZ2h0XCIsIHRoaXMucGFyZW50Tm9kZV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZih0aGlzLnBhcmVudE5vZGUuZGF0YSgnYmJveCcpLmggPCBsZW5ndGgpIHtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZXN0YXJ0XCIsIFtcImJvdHRvbWNlbnRlclwiLCB0aGlzLnBhcmVudE5vZGVdKTtcbiAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhKCdiYm94JykuaCA9IGxlbmd0aDtcbiAgICAgIGN5LnRyaWdnZXIoXCJub2RlcmVzaXplLnJlc2l6ZWVuZFwiLCBbXCJib3R0b21jZW50ZXJcIiwgdGhpcy5wYXJlbnROb2RlXSk7XG4gICAgfVxuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5pc1RvckIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxvY2F0aW9uID09IFwidG9wXCIgfHwgdGhpcy5sb2NhdGlvbiA9PSBcImJvdHRvbVwiO1xufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUuaXNMb3JSID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sb2NhdGlvbiA9PSBcImxlZnRcIiB8fCB0aGlzLmxvY2F0aW9uID09IFwicmlnaHRcIjtcbn07XG5cbkF1eFVuaXRMYXlvdXQucHJvdG90eXBlLnNldFBhcmVudE1pbkxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmVudExheW91dHMgPSB0aGlzLnBhcmVudE5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKTtcbiAgc3dpdGNoKHRoaXMubG9jYXRpb24pIHtcbiAgICBjYXNlIFwidG9wXCI6XG4gICAgICB2YXIgY29tcGFyZVZhbCA9IHBhcmVudExheW91dHMuYm90dG9tID8gcGFyZW50TGF5b3V0cy5ib3R0b20ubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICB2YXIgY29tcGFyZVZhbCA9IHBhcmVudExheW91dHMudG9wID8gcGFyZW50TGF5b3V0cy50b3AubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgdmFyIGNvbXBhcmVWYWwgPSBwYXJlbnRMYXlvdXRzLnJpZ2h0ID8gcGFyZW50TGF5b3V0cy5yaWdodC5sZW5ndGhVc2VkIDogMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgdmFyIGNvbXBhcmVWYWwgPSBwYXJlbnRMYXlvdXRzLmxlZnQgPyBwYXJlbnRMYXlvdXRzLmxlZnQubGVuZ3RoVXNlZCA6IDA7XG4gICAgICBicmVhaztcbiAgfVxuICBpZih0aGlzLmlzVG9yQigpKSB7XG4gICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ3Jlc2l6ZU1pbldpZHRoJywgTWF0aC5tYXgodGhpcy5sZW5ndGhVc2VkLCBjb21wYXJlVmFsKSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5wYXJlbnROb2RlLmRhdGEoJ3Jlc2l6ZU1pbkhlaWdodCcsIE1hdGgubWF4KHRoaXMubGVuZ3RoVXNlZCwgY29tcGFyZVZhbCkpO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRPdXRlck1hcmdpbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYodHlwZW9mIHRoaXMub3V0ZXJNYXJnaW4gIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5vdXRlck1hcmdpbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm91dGVyTWFyZ2luO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBBdXhVbml0TGF5b3V0Lm91dGVyTWFyZ2luO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRVbml0R2FwID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy51bml0R2FwICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMudW5pdEdhcCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnVuaXRHYXA7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQudW5pdEdhcDtcbiAgfVxufTtcblxuQXV4VW5pdExheW91dC5wcm90b3R5cGUuZ2V0QWx3YXlzU2hvd0F1eFVuaXRzID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy5hbHdheXNTaG93QXV4VW5pdHMgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5hbHdheXNTaG93QXV4VW5pdHMgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5hbHdheXNTaG93QXV4VW5pdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQuYWx3YXlzU2hvd0F1eFVuaXRzO1xuICB9XG59O1xuXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5nZXRNYXhVbml0RGlzcGxheWVkID0gZnVuY3Rpb24gKCkge1xuICBpZih0eXBlb2YgdGhpcy5tYXhVbml0RGlzcGxheWVkICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMubWF4VW5pdERpc3BsYXllZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLm1heFVuaXREaXNwbGF5ZWQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIEF1eFVuaXRMYXlvdXQubWF4VW5pdERpc3BsYXllZDtcbiAgfVxufTtcblxuLypcbiAqICBEdXBsaWNhdGUgYSBsYXlvdXQuIERvZXNuJ3QgY29weSB0aGUgdW5pdHMgYXR0cmlidXRlLCByZXNldCBpdCBpbnN0ZWFkLlxuICovXG5BdXhVbml0TGF5b3V0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24obmV3UGFyZW50KSB7XG4gIHZhciBuZXdMYXlvdXQgPSBuZXcgQXV4VW5pdExheW91dChuZXdQYXJlbnQpO1xuICAvLyBDb3B5aW5nIHRoZSBzYW1lIHJlZmVyZW5jZSB0byB1bml0cyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQuXG4gIC8vIER1cGxpY2F0aW5nIG93bmVkIHVuaXRzIGdvZXMgYmV5b25uZCB0aGUgc2NvcGUsIGJlY2F1c2Ugd2UgbmVlZCB0byBhc3NpZ25cbiAgLy8gaWRzIHRoYXQgYXJlIHRpZWQgdG8gdGhlIGdsb2JhbCBjb3VuZCBvZiB1bml0cyBvZiBhIG5vZGUuXG4gIC8vIFNvIGR1cGxpY2F0aW5nIHVuaXRzIGlzIHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBwcm9wZXJseSBkb25lIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cbiAgLy8gVE9ETyB0aGF0IGlzIGEgYml0IGRpcnR5LCBmaW5kIGEgbmljZSBtb2R1bGFyIHdheSB0byBhcnJhbmdlIHRoYXRcbiAgbmV3TGF5b3V0LnVuaXRzID0gW107XG4gIG5ld0xheW91dC5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb247XG4gIG5ld0xheW91dC5hbGlnbm1lbnQgPSB0aGlzLmFsaWdubWVudDtcbiAgbmV3TGF5b3V0LnBhcmVudE5vZGUgPSBuZXdQYXJlbnQ7XG4gIG5ld0xheW91dC5yZW5kZXJMZW5ndGhDYWNoZSA9IHRoaXMucmVuZGVyTGVuZ3RoQ2FjaGU7XG4gIG5ld0xheW91dC5sZW5ndGhVc2VkID0gdGhpcy5sZW5ndGhVc2VkO1xuICBpZih0eXBlb2YgdGhpcy5vdXRlck1hcmdpbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC5vdXRlck1hcmdpbiA9IHRoaXMub3V0ZXJNYXJnaW47XG4gIH1cbiAgaWYodHlwZW9mIHRoaXMudW5pdEdhcCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC51bml0R2FwID0gdGhpcy51bml0R2FwO1xuICB9XG4gIGlmKHR5cGVvZiB0aGlzLmFsd2F5c1Nob3dBdXhVbml0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG5ld0xheW91dC5hbHdheXNTaG93QXV4VW5pdHMgPSB0aGlzLmFsd2F5c1Nob3dBdXhVbml0cztcbiAgfVxuICBpZih0eXBlb2YgdGhpcy5tYXhVbml0RGlzcGxheWVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbmV3TGF5b3V0Lm1heFVuaXREaXNwbGF5ZWQgPSB0aGlzLm1heFVuaXREaXNwbGF5ZWQ7XG4gIH1cbiAgcmV0dXJuIG5ld0xheW91dDtcbn07XG5cbm5zLkF1eFVuaXRMYXlvdXQgPSBBdXhVbml0TGF5b3V0O1xuLy8gLS0tLS0tLS0tLS0tLS0gRU5EIEF1eFVuaXRMYXlvdXQgLS0tLS0tLS0tLS0tLS0gLy9cblxubW9kdWxlLmV4cG9ydHMgPSBucztcbiIsIi8qXG4gKiBDb21tb24gdXRpbGl0aWVzIGZvciBlbGVtZW50cyBpbmNsdWRlcyBib3RoIGdlbmVyYWwgdXRpbGl0aWVzIGFuZCBzYmduIHNwZWNpZmljIHV0aWxpdGllcyBcbiAqL1xuXG52YXIgdHJ1bmNhdGVUZXh0ID0gcmVxdWlyZSgnLi90ZXh0LXV0aWxpdGllcycpLnRydW5jYXRlVGV4dDtcbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBncmFwaFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vZ3JhcGgtdXRpbGl0aWVzJyk7XG5cbnZhciBlbGVtZW50VXRpbGl0aWVzID0ge1xuXG4gICAgbWFwVHlwZTogdW5kZWZpbmVkLCAvLyBpbml0aWFsaXplIG1hcCB0eXBlXG5cbiAgICAvL3RoZSBsaXN0IG9mIHRoZSBlbGVtZW50IGNsYXNzZXMgaGFuZGxlZCBieSB0aGUgdG9vbFxuICAgIGhhbmRsZWRFbGVtZW50czoge1xuICAgICAgICAndW5zcGVjaWZpZWQgZW50aXR5JzogdHJ1ZSxcbiAgICAgICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgICAgICdtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAgICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAgICAgJ3BlcnR1cmJpbmcgYWdlbnQnOiB0cnVlLFxuICAgICAgICAnc291cmNlIGFuZCBzaW5rJzogdHJ1ZSxcbiAgICAgICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICAgICAncHJvY2Vzcyc6IHRydWUsXG4gICAgICAgICdvbWl0dGVkIHByb2Nlc3MnOiB0cnVlLFxuICAgICAgICAndW5jZXJ0YWluIHByb2Nlc3MnOiB0cnVlLFxuICAgICAgICAnYXNzb2NpYXRpb24nOiB0cnVlLFxuICAgICAgICAnZGlzc29jaWF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ3BoZW5vdHlwZSc6IHRydWUsXG4gICAgICAgICd0YWcnOiB0cnVlLFxuICAgICAgICAnY29uc3VtcHRpb24nOiB0cnVlLFxuICAgICAgICAncHJvZHVjdGlvbic6IHRydWUsXG4gICAgICAgICdtb2R1bGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ3N0aW11bGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ2NhdGFseXNpcyc6IHRydWUsXG4gICAgICAgICdpbmhpYml0aW9uJzogdHJ1ZSxcbiAgICAgICAgJ25lY2Vzc2FyeSBzdGltdWxhdGlvbic6IHRydWUsXG4gICAgICAgICdsb2dpYyBhcmMnOiB0cnVlLFxuICAgICAgICAnZXF1aXZhbGVuY2UgYXJjJzogdHJ1ZSxcbiAgICAgICAgJ2FuZCBvcGVyYXRvcic6IHRydWUsXG4gICAgICAgICdvciBvcGVyYXRvcic6IHRydWUsXG4gICAgICAgICdub3Qgb3BlcmF0b3InOiB0cnVlLFxuICAgICAgICAnYW5kJzogdHJ1ZSxcbiAgICAgICAgJ29yJzogdHJ1ZSxcbiAgICAgICAgJ25vdCc6IHRydWUsXG4gICAgICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSBtdWx0aW1lcic6IHRydWUsXG4gICAgICAgICdtYWNyb21vbGVjdWxlIG11bHRpbWVyJzogdHJ1ZSxcbiAgICAgICAgJ3NpbXBsZSBjaGVtaWNhbCBtdWx0aW1lcic6IHRydWUsXG4gICAgICAgICdjb21wbGV4IG11bHRpbWVyJzogdHJ1ZSxcbiAgICAgICAgJ2NvbXBhcnRtZW50JzogdHJ1ZSxcbiAgICAgICAgJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknOiB0cnVlLFxuICAgICAgICAnQkEgcGxhaW4nOiB0cnVlLFxuICAgICAgICAnQkEgdW5zcGVjaWZpZWQgZW50aXR5JzogdHJ1ZSxcbiAgICAgICAgJ0JBIHNpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgICAgICdCQSBtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAgICAgJ0JBIG51Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAgICAgJ0JBIHBlcnR1cmJpbmcgYWdlbnQnOiB0cnVlLFxuICAgICAgICAnQkEgY29tcGxleCc6IHRydWUsXG4gICAgICAgICdkZWxheSc6IHRydWUsXG4gICAgICAgICd1bmtub3duIGluZmx1ZW5jZSc6IHRydWUsXG4gICAgICAgICdwb3NpdGl2ZSBpbmZsdWVuY2UnOiB0cnVlLFxuICAgICAgICAnbmVnYXRpdmUgaW5mbHVlbmNlJzogdHJ1ZSxcbiAgICAgICAgJ3N1Ym1hcCc6IHRydWUsXG4gICAgfSxcbiAgICAvL3RoZSBmb2xsb3dpbmcgd2VyZSBtb3ZlZCBoZXJlIGZyb20gd2hhdCB1c2VkIHRvIGJlIHV0aWxpdGllcy9zYmduLWZpbHRlcmluZy5qc1xuICAgIHByb2Nlc3NUeXBlcyA6IFsncHJvY2VzcycsICdvbWl0dGVkIHByb2Nlc3MnLCAndW5jZXJ0YWluIHByb2Nlc3MnLFxuICAgICAgICAnYXNzb2NpYXRpb24nLCAnZGlzc29jaWF0aW9uJ10sXG4gICAgXG4gICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IG9yIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIGNsYXNzIGNhbiBoYXZlIHBvcnRzLlxuICAgIGNhbkhhdmVQb3J0cyA6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgdmFyIHNiZ25jbGFzcyA9IHR5cGVvZiBlbGUgPT09ICdzdHJpbmcnID8gZWxlIDogZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICByZXR1cm4gKCQuaW5BcnJheShzYmduY2xhc3MsIHRoaXMucHJvY2Vzc1R5cGVzKSA+PSAwIHx8ICBzYmduY2xhc3MgPT0gJ2FuZCcgfHwgc2JnbmNsYXNzID09ICdvcicgfHwgc2JnbmNsYXNzID09ICdub3QnKTtcbiAgICB9LFxuICAgICAgXG4gICAgLy8gU2VjdGlvbiBTdGFydFxuICAgIC8vIEdlbmVyYWwgRWxlbWVudCBVdGlsaXRpZXNcblxuICAgIC8vdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZXMgbm9uIG9mIHdob3NlIGFuY2VzdG9ycyBpcyBub3QgaW4gZ2l2ZW4gbm9kZXNcbiAgICBnZXRUb3BNb3N0Tm9kZXM6IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbm9kZXNNYXBbbm9kZXNbaV0uaWQoKV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByb290cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgICAgICAgICAgd2hpbGUocGFyZW50ICE9IG51bGwpe1xuICAgICAgICAgICAgICBpZihub2Rlc01hcFtwYXJlbnQuaWQoKV0pe1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJvb3RzO1xuICAgIH0sXG4gICAgLy9UaGlzIG1ldGhvZCBjaGVja3MgaWYgYWxsIG9mIHRoZSBnaXZlbiBub2RlcyBoYXZlIHRoZSBzYW1lIHBhcmVudCBhc3N1bWluZyB0aGF0IHRoZSBzaXplIFxuICAgIC8vb2YgIG5vZGVzIGlzIG5vdCAwXG4gICAgYWxsSGF2ZVRoZVNhbWVQYXJlbnQ6IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnQgPSBub2Rlc1swXS5kYXRhKFwicGFyZW50XCIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGF0YShcInBhcmVudFwiKSAhPSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBtb3ZlTm9kZXM6IGZ1bmN0aW9uKHBvc2l0aW9uRGlmZiwgbm9kZXMsIG5vdENhbGNUb3BNb3N0Tm9kZXMpIHtcbiAgICAgIHZhciB0b3BNb3N0Tm9kZXMgPSBub3RDYWxjVG9wTW9zdE5vZGVzID8gbm9kZXMgOiB0aGlzLmdldFRvcE1vc3ROb2Rlcyhub2Rlcyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcE1vc3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IHRvcE1vc3ROb2Rlc1tpXTtcbiAgICAgICAgdmFyIG9sZFggPSBub2RlLnBvc2l0aW9uKFwieFwiKTtcbiAgICAgICAgdmFyIG9sZFkgPSBub2RlLnBvc2l0aW9uKFwieVwiKTtcbiAgICAgICAgbm9kZS5wb3NpdGlvbih7XG4gICAgICAgICAgeDogb2xkWCArIHBvc2l0aW9uRGlmZi54LFxuICAgICAgICAgIHk6IG9sZFkgKyBwb3NpdGlvbkRpZmYueVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbigpO1xuICAgICAgICB0aGlzLm1vdmVOb2Rlcyhwb3NpdGlvbkRpZmYsIGNoaWxkcmVuLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbnZlcnRUb01vZGVsUG9zaXRpb246IGZ1bmN0aW9uIChyZW5kZXJlZFBvc2l0aW9uKSB7XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcblxuICAgICAgdmFyIHggPSAocmVuZGVyZWRQb3NpdGlvbi54IC0gcGFuLngpIC8gem9vbTtcbiAgICAgIHZhciB5ID0gKHJlbmRlcmVkUG9zaXRpb24ueSAtIHBhbi55KSAvIHpvb207XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH07XG4gICAgfSxcbiAgICBcbiAgICAvLyBTZWN0aW9uIEVuZFxuICAgIC8vIEdlbmVyYWwgRWxlbWVudCBVdGlsaXRpZXNcblxuICAgIC8vIFNlY3Rpb24gU3RhcnRcbiAgICAvLyBFbGVtZW50IEZpbHRlcmluZyBVdGlsaXRpZXNcbiAgICBcbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGdldFByb2Nlc3Nlc09mU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzZWxlY3RlZEVsZXMgPSBjeS5lbGVtZW50cyhcIjpzZWxlY3RlZFwiKTtcbiAgICAgICAgc2VsZWN0ZWRFbGVzID0gdGhpcy5leHRlbmROb2RlTGlzdChzZWxlY3RlZEVsZXMpO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRFbGVzO1xuICAgIH0sXG4gICAgZ2V0TmVpZ2hib3Vyc09mU2VsZWN0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBzZWxlY3RlZEVsZXMgPSBjeS5lbGVtZW50cyhcIjpzZWxlY3RlZFwiKTtcbiAgICAgICAgdmFyIGVsZXNUb0hpZ2hsaWdodCA9IHRoaXMuZ2V0TmVpZ2hib3Vyc09mTm9kZXMoc2VsZWN0ZWRFbGVzKTtcbiAgICAgICAgcmV0dXJuIGVsZXNUb0hpZ2hsaWdodDtcbiAgICB9LFxuICAgIGdldE5laWdoYm91cnNPZk5vZGVzOiBmdW5jdGlvbihfbm9kZXMpe1xuICAgICAgICB2YXIgbm9kZXMgPSBfbm9kZXMubm9kZXMoKTsgLy8gRW5zdXJlIHRoYXQgbm9kZXMgbGlzdCBqdXN0IGluY2x1ZGUgbm9kZXNcbiAgICAgICAgbm9kZXMgPSBub2Rlcy5hZGQobm9kZXMucGFyZW50cyhcIm5vZGVbY2xhc3NePSdjb21wbGV4J11cIikpO1xuICAgICAgICBub2RlcyA9IG5vZGVzLmFkZChub2Rlcy5kZXNjZW5kYW50cygpKTtcbiAgICAgICAgdmFyIG5laWdoYm9yaG9vZEVsZXMgPSBub2Rlcy5uZWlnaGJvcmhvb2QoKTtcbiAgICAgICAgdmFyIGVsZXNUb1JldHVybiA9IG5vZGVzLmFkZChuZWlnaGJvcmhvb2RFbGVzKTtcbiAgICAgICAgZWxlc1RvUmV0dXJuID0gZWxlc1RvUmV0dXJuLmFkZChlbGVzVG9SZXR1cm4uZGVzY2VuZGFudHMoKSk7XG4gICAgICAgIHJldHVybiBlbGVzVG9SZXR1cm47XG4gICAgfSxcbiAgICBleHRlbmROb2RlTGlzdDogZnVuY3Rpb24obm9kZXNUb1Nob3cpe1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vYWRkIGNoaWxkcmVuXG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5vZGVzVG9TaG93Lm5vZGVzKCkuZGVzY2VuZGFudHMoKSk7XG4gICAgICAgIC8vYWRkIHBhcmVudHNcbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobm9kZXNUb1Nob3cucGFyZW50cygpKTtcbiAgICAgICAgLy9hZGQgY29tcGxleCBjaGlsZHJlblxuICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChub2Rlc1RvU2hvdy5ub2RlcyhcIm5vZGVbY2xhc3NePSdjb21wbGV4J11cIikuZGVzY2VuZGFudHMoKSk7XG5cbiAgICAgICAgLy8gdmFyIHByb2Nlc3NlcyA9IG5vZGVzVG9TaG93Lm5vZGVzKFwibm9kZVtjbGFzcz0ncHJvY2VzcyddXCIpO1xuICAgICAgICAvLyB2YXIgbm9uUHJvY2Vzc2VzID0gbm9kZXNUb1Nob3cubm9kZXMoXCJub2RlW2NsYXNzIT0ncHJvY2VzcyddXCIpO1xuICAgICAgICAvLyB2YXIgbmVpZ2hib3JQcm9jZXNzZXMgPSBub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKFwibm9kZVtjbGFzcz0ncHJvY2VzcyddXCIpO1xuICAgICAgICBcbiAgICAgICAgZXh0ZW5kTm9kZVR5cGVzID0gWydwcm9jZXNzJywgJ29taXR0ZWQgcHJvY2VzcycsICd1bmNlcnRhaW4gcHJvY2VzcycsXG4gICAgICAgICdhc3NvY2lhdGlvbicsICdkaXNzb2NpYXRpb24nLCAncGhlbm90eXBlJywgJ2FuZCcsICdvcicsICdub3QnLCAnZGVsYXknXTtcbiAgICBcbiAgICAgICAgLy9IZXJlLCBsb2dpY2FsIG9wZXJhdG9ycyBhcmUgYWxzbyBjb25zaWRlcmVkIGFzIHByb2Nlc3Nlcywgc2luY2UgdGhleSBhbHNvIGdldCBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICAgICAgdmFyIHByb2Nlc3NlcyA9IG5vZGVzVG9TaG93LmZpbHRlcihmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShlbGUuX3ByaXZhdGUuZGF0YS5jbGFzcywgZXh0ZW5kTm9kZVR5cGVzKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG5vblByb2Nlc3NlcyA9IG5vZGVzVG9TaG93LmZpbHRlcihmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICQuaW5BcnJheShlbGUuX3ByaXZhdGUuZGF0YS5jbGFzcywgZXh0ZW5kTm9kZVR5cGVzKSA9PT0gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgbmVpZ2hib3JQcm9jZXNzZXMgPSBub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKCkudW5pb24ocHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpKS5maWx0ZXIoZnVuY3Rpb24oZWxlLCBpKXtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgZWxlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkLmluQXJyYXkoZWxlLl9wcml2YXRlLmRhdGEuY2xhc3MsIGV4dGVuZE5vZGVUeXBlcykgPj0gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vRm9yIEFGIHN1cHBvcnQsIHN1YmplY3QgdG8gY2hhbmdlXG4gICAgICAgIHZhciBuZWlnaGJvck5vblByb2Nlc3NlcyA9IG5vblByb2Nlc3Nlcy51bmlvbihub25Qcm9jZXNzZXMubmVpZ2hib3Job29kKFwiOmhpZGRlblwiKSkuZmlsdGVyKGZ1bmN0aW9uKGVsZSwgaSl7XG4gICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJC5pbkFycmF5KGVsZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLCBleHRlbmROb2RlVHlwZXMpID09PSAtMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQocHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpKTtcbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobmVpZ2hib3JQcm9jZXNzZXMpO1xuICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChuZWlnaGJvclByb2Nlc3Nlcy5uZWlnaGJvcmhvb2QoKSk7XG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5laWdoYm9yTm9uUHJvY2Vzc2VzKTtcbiAgICAgICAgXG4gICAgICAgIG5laWdoYm9yUHJvY2Vzc2VzLm5laWdoYm9yaG9vZCgpLmZvckVhY2goZnVuY3Rpb24oZWxlKXtcbiAgICAgICAgICAgIGlmKGpRdWVyeS5pbkFycmF5KGVsZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLCBleHRlbmROb2RlVHlwZXMpID49IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBub2Rlc1RvU2hvdyA9IG5vZGVzVG9TaG93LmFkZChlbGUubmVpZ2hib3Job29kKCkpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvL2FkZCBwYXJlbnRzXG4gICAgICAgIG5vZGVzVG9TaG93ID0gbm9kZXNUb1Nob3cuYWRkKG5vZGVzVG9TaG93Lm5vZGVzKCkucGFyZW50cygpKTtcbiAgICAgICAgLy9hZGQgY2hpbGRyZW5cbiAgICAgICAgbm9kZXNUb1Nob3cgPSBub2Rlc1RvU2hvdy5hZGQobm9kZXNUb1Nob3cubm9kZXMoXCJub2RlW2NsYXNzXj0nY29tcGxleCddXCIpLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgIHJldHVybiBub2Rlc1RvU2hvdztcbiAgICB9LFxuICAgIGV4dGVuZFJlbWFpbmluZ05vZGVzIDogZnVuY3Rpb24obm9kZXNUb0ZpbHRlciwgYWxsTm9kZXMpe1xuICAgICAgICBub2Rlc1RvRmlsdGVyID0gdGhpcy5leHRlbmROb2RlTGlzdChub2Rlc1RvRmlsdGVyKTtcbiAgICAgICAgdmFyIG5vZGVzVG9TaG93ID0gYWxsTm9kZXMubm90KG5vZGVzVG9GaWx0ZXIpO1xuICAgICAgICBub2Rlc1RvU2hvdyA9IHRoaXMuZXh0ZW5kTm9kZUxpc3Qobm9kZXNUb1Nob3cpO1xuICAgICAgICByZXR1cm4gbm9kZXNUb1Nob3c7XG4gICAgfSxcbiAgICBnZXRQcm9jZXNzZXNPZk5vZGVzOiBmdW5jdGlvbihub2Rlcykge1xuICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kTm9kZUxpc3Qobm9kZXMpO1xuICAgIH0sXG4gICAgLy8gZ2VuZXJhbCB1dGlsaXRpZXNcbiAgICBub25lSXNOb3RIaWdobGlnaHRlZDogZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIGhpZ2hsaWdodGVkTm9kZXMgPSBjeS5ub2RlcyhcIjp2aXNpYmxlXCIpLm5vZGVzKFwiLmhpZ2hsaWdodGVkXCIpO1xuICAgICAgICB2YXIgaGlnaGxpZ2h0ZWRFZGdlcyA9IGN5LmVkZ2VzKFwiOnZpc2libGVcIikuZWRnZXMoXCIuaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgcmV0dXJuIGhpZ2hsaWdodGVkTm9kZXMubGVuZ3RoICsgaGlnaGxpZ2h0ZWRFZGdlcy5sZW5ndGggPT09IDA7XG4gICAgfSxcbiAgICBcbiAgICAvLyBTZWN0aW9uIEVuZFxuICAgIC8vIEVsZW1lbnQgRmlsdGVyaW5nIFV0aWxpdGllc1xuXG4gICAgLy8gU2VjdGlvbiBTdGFydFxuICAgIC8vIEFkZCByZW1vdmUgdXRpbGl0aWVzXG5cbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGRlbGV0ZU5vZGVzU21hcnQ6IGZ1bmN0aW9uIChfbm9kZXMpIHtcbiAgICAgIHZhciBub2RlcyA9IF9ub2Rlcy5ub2RlcygpOyAvLyBFbnN1cmUgdGhhdCBub2RlcyBsaXN0IGp1c3QgaW5jbHVkZSBub2Rlc1xuICAgICAgXG4gICAgICB2YXIgYWxsTm9kZXMgPSBjeS5ub2RlcygpO1xuICAgICAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xuICAgICAgdmFyIG5vZGVzVG9LZWVwID0gdGhpcy5leHRlbmRSZW1haW5pbmdOb2Rlcyhub2RlcywgYWxsTm9kZXMpO1xuICAgICAgdmFyIG5vZGVzTm90VG9LZWVwID0gYWxsTm9kZXMubm90KG5vZGVzVG9LZWVwKTtcbiAgICAgIHJldHVybiBub2Rlc05vdFRvS2VlcC5yZW1vdmUoKTtcbiAgICB9LFxuICAgIGRlbGV0ZUVsZXNTaW1wbGU6IGZ1bmN0aW9uIChlbGVzKSB7XG4gICAgICBjeS5lbGVtZW50cygpLnVuc2VsZWN0KCk7XG4gICAgICByZXR1cm4gZWxlcy5yZW1vdmUoKTtcbiAgICB9LFxuICAgIC8vIGdlbmVyYWwgdXRpbGl0aWVzXG4gICAgcmVzdG9yZUVsZXM6IGZ1bmN0aW9uIChlbGVzKSB7XG4gICAgICAgIGVsZXMucmVzdG9yZSgpO1xuICAgICAgICByZXR1cm4gZWxlcztcbiAgICB9LFxuICAgIFxuICAgIC8vIFNlY3Rpb24gRW5kXG4gICAgLy8gQWRkIHJlbW92ZSB1dGlsaXRpZXNcblxuICAgIC8vIFNlY3Rpb24gU3RhcnRcbiAgICAvLyBTdHlsZXNoZWV0IGhlbHBlcnNcbiAgICBcbiAgICAvLyBTQkdOIHNwZWNpZmljIHV0aWxpdGllc1xuICAgIGdldEN5U2hhcGU6IGZ1bmN0aW9uKGVsZSkge1xuICAgICAgICB2YXIgX2NsYXNzID0gZWxlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgIC8vIEdldCByaWQgb2YgcmVjdGFuZ2xlIHBvc3RmaXggdG8gaGF2ZSB0aGUgYWN0dWFsIG5vZGUgY2xhc3NcbiAgICAgICAgaWYgKF9jbGFzcy5lbmRzV2l0aCgnIG11bHRpbWVyJykpIHtcbiAgICAgICAgICAgIF9jbGFzcyA9IF9jbGFzcy5yZXBsYWNlKCcgbXVsdGltZXInLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NsYXNzID09ICdjb21wYXJ0bWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiAnY29tcGFydG1lbnQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3BoZW5vdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybiAnaGV4YWdvbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAncGVydHVyYmluZyBhZ2VudCcgfHwgX2NsYXNzID09ICd0YWcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jbGFzcy5zdGFydHNXaXRoKCdCQScpKXtcbiAgICAgICAgICAgIHJldHVybiAnYmlvbG9naWNhbCBhY3Rpdml0eSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NsYXNzID09ICdzdWJtYXAnKXtcbiAgICAgICAgICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZpbmUgbmV3IG5vZGUgc2hhcGVzIHdpdGggdGhlaXIgY2xhc3MgbmFtZXMgZm9yIHRoZXNlIG5vZGVzXG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3NvdXJjZSBhbmQgc2luaycgfHwgX2NsYXNzID09ICdudWNsZWljIGFjaWQgZmVhdHVyZScgfHwgX2NsYXNzID09ICdtYWNyb21vbGVjdWxlJyBcbiAgICAgICAgICAgICAgICB8fCBfY2xhc3MgPT0gJ3NpbXBsZSBjaGVtaWNhbCcgfHwgX2NsYXNzID09ICdjb21wbGV4JyB8fCBfY2xhc3MgPT0gJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBUaGVzZSBzaGFwZXMgY2FuIGhhdmUgcG9ydHMuIElmIHRoZXkgaGF2ZSBwb3J0cyB3ZSByZXByZXNlbnQgdGhlbSBieSBwb2x5Z29ucywgZWxzZSB0aGV5IGFyZSByZXByZXNlbnRlZCBieSBlbGxpcHNlcyBvciByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNvbmRpdGlvbmFsbHkuXG4gICAgICAgIGlmICggdGhpcy5jYW5IYXZlUG9ydHMoX2NsYXNzKSApIHtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmIGVsZS5kYXRhKCdwb3J0cycpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuICdwb2x5Z29uJzsgLy8gVGhlIG5vZGUgaGFzIHBvcnRzIHJlcHJlc2VudCBpdCBieSBwb2x5Z29uXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAncHJvY2VzcycgfHwgX2NsYXNzID09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IF9jbGFzcyA9PSAndW5jZXJ0YWluIHByb2Nlc3MnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JlY3RhbmdsZSc7IC8vIElmIG5vZGUgaGFzIG5vIHBvcnQgYW5kIGhhcyBvbmUgb2YgdGhlc2UgY2xhc3NlcyBpdCBzaG91bGQgYmUgaW4gYSByZWN0YW5nbGUgc2hhcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuICdlbGxpcHNlJzsgLy8gT3RoZXIgbm9kZXMgd2l0aCBubyBwb3J0IHNob3VsZCBiZSBpbiBhbiBlbGxpcHNlIHNoYXBlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRoZSByZW1haW5pbmcgbm9kZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGluIGVsbGlwc2Ugc2hhcGVcbiAgICAgICAgcmV0dXJuICdlbGxpcHNlJztcbiAgICB9LFxuICAgIGdldEN5QXJyb3dTaGFwZTogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAgIHZhciBfY2xhc3MgPSBlbGUuZGF0YSgnY2xhc3MnKTtcbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnbmVjZXNzYXJ5IHN0aW11bGF0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICd0cmlhbmdsZS1jcm9zcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnaW5oaWJpdGlvbicgfHwgX2NsYXNzID09ICduZWdhdGl2ZSBpbmZsdWVuY2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RlZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnY2F0YWx5c2lzJykge1xuICAgICAgICAgICAgcmV0dXJuICdjaXJjbGUnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfY2xhc3MgPT0gJ3N0aW11bGF0aW9uJyB8fCBfY2xhc3MgPT0gJ3Byb2R1Y3Rpb24nIHx8IF9jbGFzcyA9PSAncG9zaXRpdmUgaW5mbHVlbmNlJykge1xuICAgICAgICAgICAgcmV0dXJuICd0cmlhbmdsZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9jbGFzcyA9PSAnbW9kdWxhdGlvbicgfHwgX2NsYXNzID09ICd1bmtub3duIGluZmx1ZW5jZScpIHtcbiAgICAgICAgICAgIHJldHVybiAnZGlhbW9uZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdub25lJztcbiAgICB9LFxuICAgIGdldEVsZW1lbnRDb250ZW50OiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgdmFyIF9jbGFzcyA9IGVsZS5kYXRhKCdjbGFzcycpO1xuXG4gICAgICAgIGlmIChfY2xhc3MuZW5kc1dpdGgoJyBtdWx0aW1lcicpKSB7XG4gICAgICAgICAgICBfY2xhc3MgPSBfY2xhc3MucmVwbGFjZSgnIG11bHRpbWVyJywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgICBpZiAoX2NsYXNzID09ICdtYWNyb21vbGVjdWxlJyB8fCBfY2xhc3MgPT0gJ3NpbXBsZSBjaGVtaWNhbCdcbiAgICAgICAgICAgIHx8IF9jbGFzcyA9PSAncGhlbm90eXBlJ1xuICAgICAgICAgICAgfHwgX2NsYXNzID09ICd1bnNwZWNpZmllZCBlbnRpdHknIHx8IF9jbGFzcyA9PSAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnXG4gICAgICAgICAgICB8fCBfY2xhc3MgPT0gJ3BlcnR1cmJpbmcgYWdlbnQnIHx8IF9jbGFzcyA9PSAndGFnJ1xuICAgICAgICAgICAgfHwgX2NsYXNzID09ICdiaW9sb2dpY2FsIGFjdGl2aXR5JyB8fCBfY2xhc3Muc3RhcnRzV2l0aCgnQkEnKVxuICAgICAgICAgICAgfHwgX2NsYXNzID09ICdzdWJtYXAnKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2xhYmVsJykgPyBlbGUuZGF0YSgnbGFiZWwnKSA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihfY2xhc3MgPT0gJ2NvbXBhcnRtZW50Jyl7XG4gICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2xhYmVsJykgPyBlbGUuZGF0YSgnbGFiZWwnKSA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihfY2xhc3MgPT0gJ2NvbXBsZXgnKXtcbiAgICAgICAgICAgIGlmKGVsZS5jaGlsZHJlbigpLmxlbmd0aCA9PSAwIHx8IG9wdGlvbnMuc2hvd0NvbXBsZXhOYW1lKXtcbiAgICAgICAgICAgICAgICBpZihlbGUuZGF0YSgnbGFiZWwnKSl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBlbGUuZGF0YSgnbGFiZWwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZihlbGUuZGF0YSgnaW5mb0xhYmVsJykpe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZWxlLmRhdGEoJ2luZm9MYWJlbCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdhbmQnKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gJ0FORCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdvcicpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnT1InO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnbm90Jykge1xuICAgICAgICAgICAgY29udGVudCA9ICdOT1QnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnb21pdHRlZCBwcm9jZXNzJykge1xuICAgICAgICAgICAgY29udGVudCA9ICdcXFxcXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICd1bmNlcnRhaW4gcHJvY2VzcycpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnPyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzID09ICdkaXNzb2NpYXRpb24nKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gJ28nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9jbGFzcyA9PSAnZGVsYXknKXtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAnXFx1MDNDNCc7IC8vIHRhdVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRXaWR0aCA9IGVsZS5vdXRlcldpZHRoKCkgfHwgZWxlLmRhdGEoJ2Jib3gnKS53O1xuXG4gICAgICAgIHZhciB0ZXh0UHJvcCA9IHtcbiAgICAgICAgICAgIGxhYmVsOiBjb250ZW50LFxuICAgICAgICAgICAgd2lkdGg6ICggX2NsYXNzID09ICdwZXJ0dXJiaW5nIGFnZW50JyA/IHRleHRXaWR0aCAvIDIgOiB0ZXh0V2lkdGgpXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGZvbnQgPSBwYXJzZUludChlbGUuY3NzKCdmb250LXNpemUnKSkgKyBcInB4IEFyaWFsXCI7XG4gICAgICAgIHJldHVybiB0cnVuY2F0ZVRleHQodGV4dFByb3AsIGZvbnQpOyAvL2Z1bmMuIGluIHRoZSBjeXRvc2NhcGUucmVuZGVyZXIuY2FudmFzLnNiZ24tcmVuZGVyZXIuanNcbiAgICB9LFxuICAgIGdldExhYmVsVGV4dFNpemU6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHZhciBfY2xhc3MgPSBlbGUuZGF0YSgnY2xhc3MnKTtcbiAgICAgIC8vIFRoZXNlIHR5cGVzIG9mIG5vZGVzIGNhbm5vdCBoYXZlIGxhYmVsIGJ1dCB0aGlzIGlzIHN0YXRlbWVudCBpcyBuZWVkZWQgYXMgYSB3b3JrYXJvdW5kXG4gICAgICBpZiAoX2NsYXNzID09PSAnYXNzb2NpYXRpb24nKSB7XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2FuSGF2ZVBvcnRzKF9jbGFzcykpIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMTsgLy8gVGhlIGR5bmFtaWMgbGFiZWwgc2l6ZSBjb2VmZmljaWVudCBmb3IgdGhlc2UgcHNldWRvIGxhYmVscywgaXQgaXMgMSBmb3IgbG9naWNhbCBvcGVyYXRvcnNcbiAgICAgICAgXG4gICAgICAgIC8vIENvZWZmIGlzIHN1cHBvc2VkIHRvIGJlIDIgZm9yIGRpc3NvY2lhdGlvbiBhbmQgMS41IGZvciBvdGhlciBwcm9jZXNzZXNcbiAgICAgICAgaWYgKF9jbGFzcyA9PT0gJ2Rpc3NvY2lhdGlvbicpIHtcbiAgICAgICAgICBjb2VmZiA9IDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoX2NsYXNzLmVuZHNXaXRoKCdwcm9jZXNzJykpIHtcbiAgICAgICAgICBjb2VmZiA9IDEuNTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHBvcnRzID0gZWxlLmRhdGEoJ3BvcnRzJyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmIHBvcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwb3J0cyBhcmUgc3ltbWV0cmljIHRvIHRoZSBub2RlIGNlbnRlciBzbyB1c2luZyBqdXN0IG9uZSBvZiB0aGUgcG9ydHMgaXMgZW5vdWdoXG4gICAgICAgICAgdmFyIHBvcnQgPSBwb3J0c1swXTtcbiAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBwb3J0LnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJhdGlvIG9mIHRoZSBhcmVhIG9jY3VwaWVkIHdpdGggcG9ydHMgb3ZlciB3aXRob3V0IHBvcnRzXG4gICAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0LnkpIC8gNTAgOiBNYXRoLmFicyhwb3J0LngpIC8gNTA7XG4gICAgICAgICAgY29lZmYgLz0gcmF0aW87IC8vIERpdmlkZSB0aGUgY29lZmYgYnkgcmF0aW8gdG8gZml0IGludG8gdGhlIGJib3ggb2YgdGhlIGFjdHVhbCBzaGFwZSAoZGlzY2x1ZGluZyBwb3J0cylcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RHluYW1pY0xhYmVsVGV4dFNpemUoZWxlLCBjb2VmZik7XG4gICAgICB9XG5cbiAgICAgIGlmIChfY2xhc3MgPT09ICdkZWxheScpe1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREeW5hbWljTGFiZWxUZXh0U2l6ZShlbGUsIDIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXREeW5hbWljTGFiZWxUZXh0U2l6ZShlbGUpO1xuICAgIH0sXG4gICAgZ2V0Q2FyZGluYWxpdHlEaXN0YW5jZTogZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIHNyY1BvcyA9IGVsZS5zb3VyY2UoKS5wb3NpdGlvbigpO1xuICAgICAgdmFyIHRndFBvcyA9IGVsZS50YXJnZXQoKS5wb3NpdGlvbigpO1xuXG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coKHNyY1Bvcy54IC0gdGd0UG9zLngpLCAyKSArIE1hdGgucG93KChzcmNQb3MueSAtIHRndFBvcy55KSwgMikpO1xuICAgICAgcmV0dXJuIGRpc3RhbmNlICogMC4xNTtcbiAgICB9LFxuICAgIGdldEluZm9MYWJlbDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLyogSW5mbyBsYWJlbCBvZiBhIGNvbGxhcHNlZCBub2RlIGNhbm5vdCBiZSBjaGFuZ2VkIGlmXG4gICAgICAqIHRoZSBub2RlIGlzIGNvbGxhcHNlZCByZXR1cm4gdGhlIGFscmVhZHkgZXhpc3RpbmcgaW5mbyBsYWJlbCBvZiBpdFxuICAgICAgKi9cbiAgICAgIGlmIChub2RlLl9wcml2YXRlLmRhdGEuY29sbGFwc2VkQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5kYXRhLmluZm9MYWJlbDtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIElmIHRoZSBub2RlIGlzIHNpbXBsZSB0aGVuIGl0J3MgaW5mb2xhYmVsIGlzIGVxdWFsIHRvIGl0J3MgbGFiZWxcbiAgICAgICAqL1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4oKSA9PSBudWxsIHx8IG5vZGUuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gbm9kZS5fcHJpdmF0ZS5kYXRhLmxhYmVsO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKCk7XG4gICAgICB2YXIgaW5mb0xhYmVsID0gXCJcIjtcbiAgICAgIC8qXG4gICAgICAgKiBHZXQgdGhlIGluZm8gbGFiZWwgb2YgdGhlIGdpdmVuIG5vZGUgYnkgaXQncyBjaGlsZHJlbiBpbmZvIHJlY3Vyc2l2ZWx5XG4gICAgICAgKi9cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHZhciBjaGlsZEluZm8gPSB0aGlzLmdldEluZm9MYWJlbChjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZEluZm8gPT0gbnVsbCB8fCBjaGlsZEluZm8gPT0gXCJcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm9MYWJlbCAhPSBcIlwiKSB7XG4gICAgICAgICAgaW5mb0xhYmVsICs9IFwiOlwiO1xuICAgICAgICB9XG4gICAgICAgIGluZm9MYWJlbCArPSBjaGlsZEluZm87XG4gICAgICB9XG5cbiAgICAgIC8vcmV0dXJuIGluZm8gbGFiZWxcbiAgICAgIHJldHVybiBpbmZvTGFiZWw7XG4gICAgfSxcbiAgICBnZXRRdGlwQ29udGVudDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgLyogQ2hlY2sgdGhlIGxhYmVsIG9mIHRoZSBub2RlIGlmIGl0IGlzIG5vdCB2YWxpZFxuICAgICAgKiB0aGVuIGNoZWNrIHRoZSBpbmZvbGFiZWwgaWYgaXQgaXMgYWxzbyBub3QgdmFsaWQgZG8gbm90IHNob3cgcXRpcFxuICAgICAgKi9cbiAgICAgIHZhciBsYWJlbCA9IG5vZGUuZGF0YSgnbGFiZWwnKTtcbiAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsID09IFwiXCIpIHtcbiAgICAgICAgbGFiZWwgPSB0aGlzLmdldEluZm9MYWJlbChub2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbCA9PSBudWxsIHx8IGxhYmVsID09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY29udGVudEh0bWwgPSBcIjxiIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTZweDsnPlwiICsgbGFiZWwgKyBcIjwvYj5cIjtcbiAgICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVzYW5kaW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNiZ25zdGF0ZWFuZGluZm8gPSBzdGF0ZXNhbmRpbmZvc1tpXTtcbiAgICAgICAgaWYgKHNiZ25zdGF0ZWFuZGluZm8uY2xhenogPT0gXCJzdGF0ZSB2YXJpYWJsZVwiKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gc2JnbnN0YXRlYW5kaW5mby5zdGF0ZS52YWx1ZTtcbiAgICAgICAgICB2YXIgdmFyaWFibGUgPSBzYmduc3RhdGVhbmRpbmZvLnN0YXRlLnZhcmlhYmxlO1xuICAgICAgICAgIHZhciBzdGF0ZUxhYmVsID0gKHZhcmlhYmxlID09IG51bGwgLyp8fCB0eXBlb2Ygc3RhdGVWYXJpYWJsZSA9PT0gdW5kZWZpbmVkICovKSA/IHZhbHVlIDpcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgXCJAXCIgKyB2YXJpYWJsZTtcbiAgICAgICAgICBpZiAoc3RhdGVMYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZUxhYmVsID0gXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGVudEh0bWwgKz0gXCI8ZGl2IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTRweDsnPlwiICsgc3RhdGVMYWJlbCArIFwiPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2JnbnN0YXRlYW5kaW5mby5jbGF6eiA9PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIikge1xuICAgICAgICAgIHZhciBzdGF0ZUxhYmVsID0gc2JnbnN0YXRlYW5kaW5mby5sYWJlbC50ZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZUxhYmVsID09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlTGFiZWwgPSBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50SHRtbCArPSBcIjxkaXYgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxNHB4Oyc+XCIgKyBzdGF0ZUxhYmVsICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnRIdG1sO1xuICAgIH0sXG4gICAgLy8gZ2VuZXJhbCB1dGlsaXRpZXNcbiAgICBnZXREeW5hbWljTGFiZWxUZXh0U2l6ZTogZnVuY3Rpb24gKGVsZSwgZHluYW1pY0xhYmVsU2l6ZUNvZWZmaWNpZW50KSB7XG4gICAgICB2YXIgZHluYW1pY0xhYmVsU2l6ZSA9IG9wdGlvbnMuZHluYW1pY0xhYmVsU2l6ZTtcbiAgICAgIGR5bmFtaWNMYWJlbFNpemUgPSB0eXBlb2YgZHluYW1pY0xhYmVsU2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IGR5bmFtaWNMYWJlbFNpemUuY2FsbCgpIDogZHluYW1pY0xhYmVsU2l6ZTtcblxuICAgICAgaWYgKGR5bmFtaWNMYWJlbFNpemVDb2VmZmljaWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChkeW5hbWljTGFiZWxTaXplID09ICdzbWFsbCcpIHtcbiAgICAgICAgICBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKS5zdGFydHNXaXRoKFwiY29tcGxleFwiKSlcbiAgICAgICAgICAgIHJldHVybiAxMDtcbiAgICAgICAgICBlbHNlIGlmIChlbGUuZGF0YShcImNsYXNzXCIpID09IFwiY29tcGFydG1lbnRcIiB8fCBlbGUuZGF0YShcImNsYXNzXCIpID09IFwic3VibWFwXCIpXG4gICAgICAgICAgICByZXR1cm4gMTI7XG5cbiAgICAgICAgICBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQgPSAwLjc1O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWNMYWJlbFNpemUgPT0gJ3JlZ3VsYXInKSB7XG4gICAgICAgICAgaWYgKGVsZS5kYXRhKFwiY2xhc3NcIikuc3RhcnRzV2l0aChcImNvbXBsZXhcIikpXG4gICAgICAgICAgICByZXR1cm4gMTE7XG4gICAgICAgICAgZWxzZSBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKSA9PSBcImNvbXBhcnRtZW50XCIgfHwgZWxlLmRhdGEoXCJjbGFzc1wiKSA9PSBcInN1Ym1hcFwiKVxuICAgICAgICAgICAgcmV0dXJuIDE0O1xuXG4gICAgICAgICAgZHluYW1pY0xhYmVsU2l6ZUNvZWZmaWNpZW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkeW5hbWljTGFiZWxTaXplID09ICdsYXJnZScpIHtcbiAgICAgICAgICBpZiAoZWxlLmRhdGEoXCJjbGFzc1wiKS5zdGFydHNXaXRoKFwiY29tcGxleFwiKSlcbiAgICAgICAgICAgIHJldHVybiAxMjtcbiAgICAgICAgICBlbHNlIGlmIChlbGUuZGF0YShcImNsYXNzXCIpID09IFwiY29tcGFydG1lbnRcIiB8fCBlbGUuZGF0YShcImNsYXNzXCIpID09IFwic3VibWFwXCIpXG4gICAgICAgICAgICByZXR1cm4gMTY7XG5cbiAgICAgICAgICBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQgPSAxLjI1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciBoID0gZWxlLmhlaWdodCgpO1xuICAgICAgdmFyIHRleHRIZWlnaHQgPSBwYXJzZUludChoIC8gMi40NSkgKiBkeW5hbWljTGFiZWxTaXplQ29lZmZpY2llbnQ7XG5cbiAgICAgIHJldHVybiB0ZXh0SGVpZ2h0O1xuICAgIH0sXG4gICAgLypcbiAgICAqIEdldCBzb3VyY2UvdGFyZ2V0IGVuZCBwb2ludCBvZiBlZGdlIGluICd4LXZhbHVlJSB5LXZhbHVlJScgZm9ybWF0LiBJdCByZXR1cm5zICdvdXRzaWRlLXRvLW5vZGUnIGlmIHRoZXJlIGlzIG5vIHNvdXJjZS90YXJnZXQgcG9ydC5cbiAgICAqL1xuICAgIGdldEVuZFBvaW50OiBmdW5jdGlvbihlZGdlLCBzb3VyY2VPclRhcmdldCkge1xuICAgICAgdmFyIHBvcnRJZCA9IHNvdXJjZU9yVGFyZ2V0ID09PSAnc291cmNlJyA/IGVkZ2UuZGF0YSgncG9ydHNvdXJjZScpIDogZWRnZS5kYXRhKCdwb3J0dGFyZ2V0Jyk7XG5cbiAgICAgIGlmIChwb3J0SWQgPT0gbnVsbCB8fCAhZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybiAnb3V0c2lkZS10by1ub2RlJzsgLy8gSWYgdGhlcmUgaXMgbm8gcG9ydHNvdXJjZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgJ291dHNpZGUtdG8tbm9kZSdcbiAgICAgIH1cblxuICAgICAgdmFyIGVuZE5vZGUgPSBzb3VyY2VPclRhcmdldCA9PT0gJ3NvdXJjZScgPyBlZGdlLnNvdXJjZSgpIDogZWRnZS50YXJnZXQoKTtcbiAgICAgIHZhciBwb3J0cyA9IGVuZE5vZGUuZGF0YSgncG9ydHMnKTtcbiAgICAgIHZhciBwb3J0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9ydHNbaV0uaWQgPT09IHBvcnRJZCkge1xuICAgICAgICAgIHBvcnQgPSBwb3J0c1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnb3V0c2lkZS10by1ub2RlJzsgLy8gSWYgcG9ydCBpcyBub3QgZm91bmQgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHdoaWNoIGlzICdvdXRzaWRlLXRvLW5vZGUnXG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciB4LCB5O1xuICAgICAgLy8gTm90ZSB0aGF0IGZvciBkcmF3aW5nIHBvcnRzIHdlIHJlcHJlc2VudCB0aGUgd2hvbGUgc2hhcGUgYnkgYSBwb2x5Z29uIGFuZCBwb3J0cyBhcmUgYWx3YXlzIDUwJSBhd2F5IGZyb20gdGhlIG5vZGUgY2VudGVyXG4gICAgICBpZiAocG9ydC54ICE9IDApIHtcbiAgICAgICAgeCA9IE1hdGguc2lnbihwb3J0LngpICogNTA7XG4gICAgICAgIHkgPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHggPSAwO1xuICAgICAgICB5ID0gTWF0aC5zaWduKHBvcnQueSkgKiA1MDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuICcnICsgeCArICclICcgKyB5ICsgJyUnO1xuICAgIH0sXG4gICAgLypcbiAgICAgKiBSZXR1cm4gb3JkZXJpbmcgb2YgcG9ydHMgb2YgYSBub2RlLlxuICAgICAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlICdMLXRvLVInLCAnUi10by1MJywgJ1QtdG8tQicsICdCLXRvLVQnLCAnbm9uZSdcbiAgICAgKi9cbiAgICBnZXRQb3J0c09yZGVyaW5nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCBwb3J0c29yZGVyaW5nIGlmIGV4aXN0c1xuICAgICAgaWYgKG5vZGUuZGF0YSgncG9ydHNvcmRlcmluZycpKSB7XG4gICAgICAgIHJldHVybiBub2RlLmRhdGEoJ3BvcnRzb3JkZXJpbmcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIHBvcnRzID0gbm9kZS5kYXRhKCdwb3J0cycpO1xuICAgICAgaWYgKHBvcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBub2RlLmRhdGEoJ3BvcnRzb3JkZXJpbmcnLCAnbm9uZScpOyAvLyBDYWNoZSB0aGUgcG9ydHMgb3JkZXJpbmdcbiAgICAgICAgcmV0dXJuICdub25lJzsgLy8gTm9kZXMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgMiBub2RlcyBvciBub25lXG4gICAgICB9XG4gICAgICBcbiAgICAgIC8qXG4gICAgICAgKiBSZXR1cnNuIGlmIHRoZSBnaXZlbiBwb3J0SWQgaXMgcG9ydHRhcmdldCBvZiBhbnkgb2YgdGhlIGdpdmVuIGVkZ2VzLlxuICAgICAgICogVGhlc2UgZWRnZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHRoZSBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcG9ydC5cbiAgICAgICAqL1xuICAgICAgdmFyIGlzUG9ydFRhcmdldE9mQW55RWRnZSA9IGZ1bmN0aW9uKGVkZ2VzLCBwb3J0SWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlZGdlc1tpXS5kYXRhKCdwb3J0dGFyZ2V0JykgPT09IHBvcnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBJZiB0aGUgcG9ydHMgYXJlIGxvY2F0ZWQgYWJvdmUvYmVsb3cgb2YgdGhlIG5vZGUgdGhlbiB0aGUgb3JpZW50YXRpb24gaXMgJ3ZlcnRpY2FsJyBlbHNlIGl0IGlzICdob3Jpem9udGFsJy5cbiAgICAgIHZhciBvcmllbnRhdGlvbiA9IHBvcnRzWzBdLnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgLy8gV2UgbmVlZCB0aGUgY29ubmVjdGVkIGVkZ2VzIG9mIHRoZSBub2RlIHRvIGZpbmQgb3V0IGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBwb3J0IG9yIGFuIG91dHB1dCBwb3J0XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBcbiAgICAgIHZhciBwb3J0c29yZGVyaW5nO1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgdmFyIGxlZnRQb3J0SWQgPSBwb3J0c1swXS54IDwgMCA/IHBvcnRzWzBdLmlkIDogcG9ydHNbMV0uaWQ7IC8vIExlZnQgcG9ydCBpcyB0aGUgcG9ydCB3aG9zZSB4IHZhbHVlIGlzIG5lZ2F0aXZlXG4gICAgICAgIC8vIElmIGxlZnQgcG9ydCBpcyBwb3J0IHRhcmdldCBmb3IgYW55IG9mIGNvbm5lY3RlZCBlZGdlcyB0aGVuIHRoZSBvcmRlcmluZyBpcyAnTC10by1SJyBlbHNlIGl0IGlzICdSLXRvLUwnXG4gICAgICAgIGlmIChpc1BvcnRUYXJnZXRPZkFueUVkZ2UoY29ubmVjdGVkRWRnZXMsIGxlZnRQb3J0SWQpKSB7XG4gICAgICAgICAgcG9ydHNvcmRlcmluZyA9ICdMLXRvLVInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHBvcnRzb3JkZXJpbmcgPSAnUi10by1MJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB0b3BQb3J0SWQgPSBwb3J0c1swXS55IDwgMCA/IHBvcnRzWzBdLmlkIDogcG9ydHNbMV0uaWQ7IC8vIFRvcCBwb3J0IGlzIHRoZSBwb3J0IHdob3NlIHkgdmFsdWUgaXMgbmVnYXRpdmVcbiAgICAgICAgLy8gSWYgdG9wICBwb3J0IGlzIHBvcnQgdGFyZ2V0IGZvciBhbnkgb2YgY29ubmVjdGVkIGVkZ2VzIHRoZW4gdGhlIG9yZGVyaW5nIGlzICdULXRvLUInIGVsc2UgaXQgaXMgJ0ItdG8tVCdcbiAgICAgICAgaWYgKGlzUG9ydFRhcmdldE9mQW55RWRnZShjb25uZWN0ZWRFZGdlcywgdG9wUG9ydElkKSkge1xuICAgICAgICAgIHBvcnRzb3JkZXJpbmcgPSAnVC10by1CJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBwb3J0c29yZGVyaW5nID0gJ0ItdG8tVCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2FjaGUgdGhlIHBvcnRzb3JkZXJpbmcgYW5kIHJldHVybiBpdC5cbiAgICAgIG5vZGUuZGF0YSgncG9ydHNvcmRlcmluZycsIHBvcnRzb3JkZXJpbmcpO1xuICAgICAgcmV0dXJuIHBvcnRzb3JkZXJpbmc7XG4gICAgfSxcbiAgICBcbiAgICAvKlxuICAgICogU2V0cyB0aGUgb3JkZXJpbmcgb2YgdGhlIGdpdmVuIG5vZGVzLlxuICAgICogT3JkZXJpbmcgb3B0aW9ucyBhcmUgJ0wtdG8tUicsICdSLXRvLUwnLCAnVC10by1CJywgJ0ItdG8tVCcsICdub25lJy5cbiAgICAqIElmIGEgbm9kZSBkb2VzIG5vdCBoYXZlIGFueSBwb3J0IGJlZm9yZSB0aGUgb3BlcmF0aW9uIGFuZCBpdCBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgYWZ0ZXIgb3BlcmF0aW9uIHRoZSBwb3J0RGlzdGFuY2UgcGFyYW1ldGVyIGlzIFxuICAgICogdXNlZCB0byBzZXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGUgY2VudGVyIGFuZCB0aGUgcG9ydHMuIFRoZSBkZWZhdWx0IHBvcnQgZGlzdGFuY2UgaXMgNjAuXG4gICAgKi9cbiAgICBzZXRQb3J0c09yZGVyaW5nOiBmdW5jdGlvbiggbm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UgKSB7XG4gICAgICAvKlxuICAgICAgKiBSZXR1cnNuIGlmIHRoZSBnaXZlbiBwb3J0SWQgaXMgcG9ydHRhcmdldCBvZiBhbnkgb2YgdGhlIGdpdmVuIGVkZ2VzLlxuICAgICAgKiBUaGVzZSBlZGdlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgdGhlIGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwb3J0LlxuICAgICAgKi9cbiAgICAgIHZhciBpc1BvcnRUYXJnZXRPZkFueUVkZ2UgPSBmdW5jdGlvbihlZGdlcywgcG9ydElkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZWRnZXNbaV0uZGF0YSgncG9ydHRhcmdldCcpID09PSBwb3J0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIHBvcnREaXN0YW5jZSA9IHBvcnREaXN0YW5jZSA/IHBvcnREaXN0YW5jZSA6IDcwOyAvLyBUaGUgZGVmYXVsdCBwb3J0IGRpc3RhbmNlIGlzIDYwXG5cbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcblxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBjdXJyZW50T3JkZXJpbmcgPSBzYmdudml6LmVsZW1lbnRVdGlsaXRpZXMuZ2V0UG9ydHNPcmRlcmluZyhub2RlKTsgLy8gVGhlIGN1cnJlbnQgcG9ydHMgb3JkZXJpbmcgb2YgdGhlIG5vZGVcblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBvcmRlcmluZyBpcyBhbHJlYWR5IGVxdWFsIHRvIHRoZSBkZXNpcmVkIG9yZGVyaW5nIHBhc3MgdGhpcyBub2RlIGRpcmVjdGx5XG4gICAgICAgIGlmICggb3JkZXJpbmcgPT09IGN1cnJlbnRPcmRlcmluZyApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggb3JkZXJpbmcgPT09ICdub25lJyApIHsgLy8gSWYgdGhlIG9yZGVyaW5nIGlzICdub25lJyByZW1vdmUgdGhlIHBvcnRzIG9mIHRoZSBub2RlXG4gICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5yZW1vdmVQb3J0cyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICggY3VycmVudE9yZGVyaW5nID09PSAnbm9uZScgKSB7IC8vIElmIHRoZSBkZXNpcmVkIG9yZGVyaW5nIGlzIG5vdCAnbm9uZScgYnV0IHRoZSBjdXJyZW50IG9uZSBpcyAnbm9uZScgYWRkIHBvcnRzIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuXG4gICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRQb3J0cyhub2RlLCBvcmRlcmluZywgcG9ydERpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gRWxzZSBjaGFuZ2UgdGhlIG9yZGVyaW5nIGJ5IGFsdGVyaW5nIG5vZGUgJ3BvcnRzJ1xuICAgICAgICAgIHZhciBwb3J0cyA9IG5vZGUuZGF0YSgncG9ydHMnKTsgLy8gUG9ydHMgb2YgdGhlIG5vZGVcbiAgICAgICAgICAvLyBJZiBjdXJyZW50T3JkZXJpbmcgaXMgJ25vbmUnIHVzZSB0aGUgcG9ydERpc3RhbmNlIGdpdmVuIGJ5IHBhcmFtZXRlciBlbHNlIHVzZSB0aGUgZXhpc3Rpbmcgb25lXG4gICAgICAgICAgdmFyIGRpc3QgPSBjdXJyZW50T3JkZXJpbmcgPT09ICdub25lJyA/IHBvcnREaXN0YW5jZSA6ICggTWF0aC5hYnMoIHBvcnRzWzBdLnggKSB8fCBNYXRoLmFicyggcG9ydHNbMF0ueSApICk7XG4gICAgICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpOyAvLyBUaGUgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBub2RlXG4gICAgICAgICAgdmFyIHBvcnRzb3VyY2UsIHBvcnR0YXJnZXQ7IC8vIFRoZSBwb3J0cyB3aGljaCBhcmUgcG9ydHNvdXJjZS9wb3J0dGFyZ2V0IG9mIHRoZSBjb25uZWN0ZWQgZWRnZXNcblxuICAgICAgICAgIC8vIERldGVybWluZSB0aGUgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldFxuICAgICAgICAgIGlmICggaXNQb3J0VGFyZ2V0T2ZBbnlFZGdlKGNvbm5lY3RlZEVkZ2VzLCBwb3J0c1swXS5pZCkgKSB7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0ID0gcG9ydHNbMF07XG4gICAgICAgICAgICBwb3J0c291cmNlID0gcG9ydHNbMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9ydHRhcmdldCA9IHBvcnRzWzFdO1xuICAgICAgICAgICAgcG9ydHNvdXJjZSA9IHBvcnRzWzBdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICggb3JkZXJpbmcgPT09ICdMLXRvLVInICkge1xuICAgICAgICAgICAgLy8gSWYgb3JkZXJpbmcgaXMgJ0wtdG8tUicgdGhlIHBvcnR0YXJnZXQgc2hvdWxkIGJlIHRoZSBsZWZ0IG1vc3QgcG9ydCBhbmQgdGhlIHBvcnRzb3VyY2Ugc2hvdWxkIGJlIHRoZSByaWdodCBtb3N0IHBvcnRcbiAgICAgICAgICAgIHBvcnR0YXJnZXQueCA9IC0xICogZGlzdDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueCA9IGRpc3Q7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnkgPSAwO1xuICAgICAgICAgICAgcG9ydHNvdXJjZS55ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIG9yZGVyaW5nID09PSAnUi10by1MJyApIHtcbiAgICAgICAgICAgIC8vIElmIG9yZGVyaW5nIGlzICdSLXRvLUwnIHRoZSBwb3J0dGFyZ2V0IHNob3VsZCBiZSB0aGUgcmlnaHQgbW9zdCBwb3J0IGFuZCB0aGUgcG9ydHNvdXJjZSBzaG91bGQgYmUgdGhlIGxlZnQgbW9zdCBwb3J0XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnggPSBkaXN0O1xuICAgICAgICAgICAgcG9ydHNvdXJjZS54ID0gLTEgKiBkaXN0O1xuICAgICAgICAgICAgcG9ydHRhcmdldC55ID0gMDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCBvcmRlcmluZyA9PT0gJ1QtdG8tQicgKSB7XG4gICAgICAgICAgICAvLyBJZiBvcmRlcmluZyBpcyAnVC10by1CJyB0aGUgcG9ydHRhcmdldCBzaG91bGQgYmUgdGhlIHRvcCBtb3N0IHBvcnQgYW5kIHRoZSBwb3J0c291cmNlIHNob3VsZCBiZSB0aGUgYm90dG9tIG1vc3QgcG9ydFxuICAgICAgICAgICAgcG9ydHRhcmdldC54ID0gMDtcbiAgICAgICAgICAgIHBvcnRzb3VyY2UueCA9IDA7XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnkgPSAtMSAqIGRpc3Q7XG4gICAgICAgICAgICBwb3J0c291cmNlLnkgPSBkaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlICB7IC8vaWYgb3JkZXJpbmcgaXMgJ0ItdG8tVCdcbiAgICAgICAgICAgIC8vIElmIG9yZGVyaW5nIGlzICdCLXRvLVQnIHRoZSBwb3J0dGFyZ2V0IHNob3VsZCBiZSB0aGUgYm90dG9tIG1vc3QgcG9ydCBhbmQgdGhlIHBvcnRzb3VyY2Ugc2hvdWxkIGJlIHRoZSB0b3AgbW9zdCBwb3J0XG4gICAgICAgICAgICBwb3J0dGFyZ2V0LnggPSAwO1xuICAgICAgICAgICAgcG9ydHNvdXJjZS54ID0gMDtcbiAgICAgICAgICAgIHBvcnR0YXJnZXQueSA9IGRpc3Q7XG4gICAgICAgICAgICBwb3J0c291cmNlLnkgPSAtMSAqIGRpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5kYXRhKCdwb3J0cycsIHBvcnRzKTsgLy8gUmVzZXQgdGhlIG5vZGUgcG9ydHNcbiAgICAgIH1cblxuICAgICAgbm9kZXMuZGF0YSgncG9ydHNvcmRlcmluZycsIG9yZGVyaW5nKTsgLy8gVXBkYXRlIHRoZSBjYWNoZWQgb3JkZXJpbmdzIG9mIHRoZSBub2Rlc1xuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuICAgIFxuICAgIC8qXG4gICAgKiBBZGQgcG9ydHMgdG8gdGhlIGdpdmVuIG5vZGUsIHdpdGggZ2l2ZW4gb3JkZXJpbmcgYW5kIHBvcnQgZGlzdGFuY2UuXG4gICAgKi9cbiAgICBhZGRQb3J0czogZnVuY3Rpb24obm9kZSwgb3JkZXJpbmcsIHBvcnREaXN0YW5jZSkge1xuICAgICAgdmFyIGZpcnN0UG9ydElkID0gbm9kZS5pZCgpICsgXCIuMVwiOyAvLyBJZCBvZiBmaXJzdCBwb3J0XG4gICAgICB2YXIgc2Vjb25kUG9ydElkID0gbm9kZS5pZCgpICsgXCIuMlwiOyAvLyBJZCBvZiBzZWNvbmYgcG9ydFxuICAgICAgLy8gRmlyc3QgcG9ydCBvYmplY3QgeCBhbmQgeSB3aWxsIGJlIGZpbGxlZCBhY2NvcmRpbmcgdG8gb3JkZXJpbmcsIHRoZSBmaXJzdCBwb3J0IGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBsZWZ0IG1vc3Qgb3IgdGhlIHRvcCBtb3N0IG9uZVxuICAgICAgdmFyIGZpcnN0UG9ydCA9IHsgaWQ6IGZpcnN0UG9ydElkIH07XG4gICAgICAvLyBTZWNvbmQgcG9ydCBvYmplY3QgeCBhbmQgeSB3aWxsIGJlIGZpbGxlZCBhY2NvcmRpbmcgdG8gb3JkZXJpbmcsIHRoZSBzZWNvbmQgcG9ydCBpcyBzdXBwb3NlZCB0byBiZSB0aGUgcmlnaHQgbW9zdCBvciB0aGUgYm90dG9tIG1vc3Qgb25lXG4gICAgICB2YXIgc2Vjb25kUG9ydCA9IHsgaWQ6IHNlY29uZFBvcnRJZCB9O1xuXG4gICAgICAvLyBDb21wbGV0ZSBwb3J0IG9iamVjdHMgYWNjb3JkaW5nIHRvIG9yZGVyaW5nXG4gICAgICBpZiAoIG9yZGVyaW5nID09PSAnTC10by1SJyB8fCBvcmRlcmluZyA9PT0gJ1ItdG8tTCcgKSB7XG4gICAgICAgIC8vIElmIG9yZGVyaW5nIGlzIGluIGhvcml6b250YWwgYXhpcyBmaXJzdCBwb3J0IGlzIHRoZSBsZWZ0IG1vc3Qgb25lIGFuZCB0aGUgc2Vjb25kIHBvcnQgaXMgdGhlIHJpZ2h0IG1vc3Qgb25lXG4gICAgICAgIGZpcnN0UG9ydC54ID0gLTEgKiBwb3J0RGlzdGFuY2U7XG4gICAgICAgIHNlY29uZFBvcnQueCA9IHBvcnREaXN0YW5jZTtcbiAgICAgICAgZmlyc3RQb3J0LnkgPSAwO1xuICAgICAgICBzZWNvbmRQb3J0LnkgPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSB7IC8vIElmIG9yZGVyaW5nIGlzICdULXRvLUInIG9yICdCLXRvLVQnXG4gICAgICAgICAvLyBJZiBvcmRlcmluZyBpcyBpbiB2ZXJ0aWNhbCBheGlzIGZpcnN0IHBvcnQgaXMgdGhlIHRvcCBtb3N0IG9uZSBhbmQgdGhlIHNlY29uZCBwb3J0IGlzIHRoZSBib3R0b20gbW9zdCBvbmVcbiAgICAgICAgZmlyc3RQb3J0LnkgPSAtMSAqIHBvcnREaXN0YW5jZTtcbiAgICAgICAgc2Vjb25kUG9ydC55ID0gcG9ydERpc3RhbmNlO1xuICAgICAgICBmaXJzdFBvcnQueCA9IDA7XG4gICAgICAgIHNlY29uZFBvcnQueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBmcm9tTG9yVCA9IG9yZGVyaW5nID09PSAnTC10by1SJyB8fCBvcmRlcmluZyA9PT0gJ1QtdG8tQic7IC8vIENoZWNrIGlmIG9yZGVyaW5nIHN0YXJ0cyBmcm9tIGxlZnQgb3IgdG9wXG4gICAgICB2YXIgcG9ydHMgPSBbZmlyc3RQb3J0LCBzZWNvbmRQb3J0XTsgLy8gUG9ydHMgYXJyYXkgZm9yIHRoZSBub2RlXG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7IC8vIFRoZSBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIG5vZGVcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICBub2RlLmRhdGEoJ3BvcnRzJywgcG9ydHMpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldCBmb3IgZWFjaCBlZGdlIGNvbm5lY3RlZCB0byB0aGUgbm9kZVxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkRWRnZXNbaV07XG4gICAgICAgIHZhciBlZGdlQ2xhc3MgPSBlZGdlLmRhdGEoJ2NsYXNzJyk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIElmIHRoZSBub2RlIGlzIHRoZSBlZGdlIHRhcmdldCB3ZSBtYXkgbmVlZCB0byBzZXQgdGhlIHBvcnR0YXJnZXQgb2YgdGhlIGVkZ2UgdG8gdGhlIGlucHV0IHBvcnQgb2YgdGhlIG5vZGUgKEZpcnN0IG9yIHNlY29uZCBwb3J0IGFjY29yaW5nIHRvIHRoZSBvcmllbnRhdGlvbilcbiAgICAgICAgICogaWYgaXQgaXMgdGhlIGVkZ2Ugc29ydWNlIHdlIG1heSBuZWVkIHRvIHNldCB0aGUgcG9ydHNvdXJjZSBvZiB0aGUgZWRnZSB0byB0aGUgb3V0cHV0IHBvcnQgc2ltaWxhcmx5LlxuICAgICAgICAgKiBOb3RlIHRoYXQgaWYgZnJvbiBsZWZ0IG9yIHRvcCAoZnJvbUxvclQpIGlzIHRydWUgdGhlbiB0aGUgZmlyc3QgcG9ydCBpcyB0aGUgc291cmNlIHBvcnQgYW5kIHNlY29uZCBwb3J0IGlzIHRoZSB0YXJnZXQgcG9ydCxcbiAgICAgICAgICogZWxzZSBpdCBpcyB2aWNlIHZlcnNhLlxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgICAgIGlmICggZWRnZS5kYXRhKCd0YXJnZXQnKSA9PT0gbm9kZS5pZCgpICkge1xuICAgICAgICAgIGlmIChlZGdlQ2xhc3MgPT09ICdwcm9kdWN0aW9uJyB8fCB0aGlzLmlzTW9kdWxhdGlvbkFyY0NsYXNzKGVkZ2VDbGFzcykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBwcm9kdWN0aW9uIG9yIG1vZHVsYXRpb24gdHlwZSBvZiBlZGdlcyBjYW5ub3QgYmUgY29ubmVjdGVkIHRvIGFueSBwb3J0IG9mIHRhcmdldCBub2RlIChBIHByb2R1Y3Rpb24gY2FuIGhhdmUgYSBwcm9jZXNzIGFzIHRhcmdldCBub2RlIGJ1dCBpdCBpcyBzdXBwb3NlZCB0byBiZSBjb25uZWN0ZWQgdG8gdGhhdCBub2RlIGZyb20gaXRzIGJvZHksIG5vdCBmcm9tIGEgcG9ydClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCBmcm9tTG9yVCApIHtcbiAgICAgICAgICAgIGVkZ2UuZGF0YSgncG9ydHRhcmdldCcsIGZpcnN0UG9ydElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnR0YXJnZXQnLCBzZWNvbmRQb3J0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoZWRnZUNsYXNzID09PSAnY29uc3VtcHRpb24nKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gY29uc3VtcGl0b24gZWRnZSBjYW5ub3QgYmUgY29ubmVjdGVkIHRvIGFueSBwb3J0IG9mIHNvdXJjZSBub2RlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICggZnJvbUxvclQgKSB7XG4gICAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnRzb3VyY2UnLCBzZWNvbmRQb3J0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVkZ2UuZGF0YSgncG9ydHNvdXJjZScsIGZpcnN0UG9ydElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAqIFJlbW92ZSB0aGUgcG9ydHMgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAqL1xuICAgIHJlbW92ZVBvcnRzOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZCgpO1xuXG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG5cbiAgICAgIC8vIFJlc2V0IHBvcnRzb3VyY2Ugb3IgcG9ydHRhcmdldCBvZiB0aGUgY29ubmVjdGVkIGVkZ2VzIHRvIHRoZSBub2RlIGlkXG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcbiAgICAgICAgaWYgKCBlZGdlLmRhdGEoJ3NvdXJjZScpID09PSBub2RlSWQgKSB7XG4gICAgICAgICAgZWRnZS5kYXRhKCdwb3J0c291cmNlJywgbm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBlZGdlLmRhdGEoJ3BvcnR0YXJnZXQnLCBub2RlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUuZGF0YSgncG9ydHMnLCBbXSk7IC8vIENsZWFyIHBvcnRzIGRhdGFcblxuICAgICAgY3kuZW5kQmF0Y2goKTtcbiAgICB9LFxuXG4gICAgY2hhbmdlUG9ydHNPcmllbnRhdGlvbkFmdGVyTGF5b3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy9DaGVjayBhbGwgcHJvY2Vzc2VzIGFuZCBsb2dpY2FsIG9wZXJhdG9ycyB3aXRoIHBvcnRzXG4gICAgICAgIGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgICAgICAgICAgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAncHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAndW5jZXJ0YWluIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnYXNzb2NpYXRpb24nIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnZGlzc29jaWF0aW9uJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ2FuZCcgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvcicgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdub3QnKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmICggZWxlLmRhdGEoJ3BvcnRzJykubGVuZ3RoID09PSAyIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiZXN0T3JpZW50YXRpb24gPSBlbGVtZW50VXRpbGl0aWVzLmNoYW5nZVBvcnRzT3JpZW50YXRpb24oZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zZXRQb3J0c09yZGVyaW5nKGVsZSwgYmVzdE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaW1wcm92ZS1mbG93IGlzIGNoZWNrZWQgd2UgZG8gdGhlIHN3YXBpbmcgb2Ygc2ltcGxlIG5vZGVzIHdpdGggZWFjaCBvdGhlclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wcm92ZUZsb3cgPSBvcHRpb25zLmltcHJvdmVGbG93O1xuICAgICAgICAgICAgICAgICAgICBpbXByb3ZlRmxvdyA9IHR5cGVvZiBpbXByb3ZlRmxvdyA9PT0gJ2Z1bmN0aW9uJyA/IGltcHJvdmVGbG93LmNhbGwoKSA6IGltcHJvdmVGbG93O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wcm92ZUZsb3cpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMucG9zdENoYW5nZVBvcnRzT3JpZW50YXRpb24oZWxlLCBiZXN0T3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbiAgICB9LFxuICAgIC8qXG4gICAgIENhbGN1bGF0ZXMgdGhlIGJlc3Qgb3JpZW50YXRpb24gZm9yIGFuICdlbGUnIHdpdGggcG9ydCAocHJvY2VzcyBvciBsb2dpY2FsIG9wZXJhdG9yKSBhbmQgcmV0dXJucyBpdC5cbiAgICAgKi9cbiAgICBjaGFuZ2VQb3J0c09yaWVudGF0aW9uOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NJZCA9IGVsZS5pZCgpO1xuICAgICAgICB2YXIgb3JpZW50YXRpb24gPSB7J0wtdG8tUic6IDAsICdSLXRvLUwnIDogMCwgJ1QtdG8tQicgOiAwLCAnQi10by1UJyA6IDB9O1xuICAgICAgICB2YXIgdGFyZ2V0aW5nRWRnZXMgPSBjeS5lZGdlcyhcIlt0YXJnZXQ9J1wiK3Byb2Nlc3NJZCtcIiddXCIpOyAvLyBIb2xkcyBlZGdlcyB3aG8gaGF2ZSB0aGUgaW5wdXQgcG9ydCBhcyBhIHRhcmdldFxuICAgICAgICB2YXIgc291cmNpbmdFZGdlcyA9IGN5LmVkZ2VzKFwiW3NvdXJjZT0nXCIrcHJvY2Vzc0lkK1wiJ11cIik7IC8vIEhvbGRzIGVkZ2VzIHdobyBoYXZlIHRoZSBvdXRwdXQgcG9ydCBhcyBhIHNvdXJjZVxuICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBvcnRzIGJlbG9uZyB0byBhIHByb2Nlc3Mgb3IgbG9naWFsIG9wZXJhdG9yLCBpdCBkb2VzIHRoZSBjYWxjdWxhdGlvbnMgYmFzZWQgb24gdGhlIGVkZ2VzIGNvbm5lY3RlZCB0byBpdHMgcG9ydHNcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAncHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdvbWl0dGVkIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAndW5jZXJ0YWluIHByb2Nlc3MnIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnYXNzb2NpYXRpb24nIHx8IGVsZS5kYXRhKCdjbGFzcycpID09PSAnZGlzc29jaWF0aW9uJylcbiAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0aW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbihlZGdlKXtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY29uc3VtcHRpb24nKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgnc291cmNlJykpOyAvL0hvbGRzIHRoZSBlbGVtZW50IGZyb20gdGhlIG90aGVyIHNpZGUgb2YgZWRnZVxuICAgICAgICAgICAgICAgICAgICB2YXIgc2ltcGxlID0gZmFsc2U7IC8vQ2hlY2tzIGlmIGl0IGlzIGEgc2ltcGxlIG5vZGUgLSBjb25uZWN0ZWQgd2l0aCBvbmx5IDEgZWRnZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgc291cmNlLCBvcmllbnRhdGlvbiwgJ0wtdG8tUicsICdSLXRvLUwnLCAneCcsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHNvdXJjZSwgb3JpZW50YXRpb24sICdULXRvLUInLCAnQi10by1UJywgJ3knLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc291cmNpbmdFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgdGFyZ2V0LCBvcmllbnRhdGlvbiwgJ1ItdG8tTCcsICdMLXRvLVInLCAneCcsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHRhcmdldCwgb3JpZW50YXRpb24sICdCLXRvLVQnLCAnVC10by1CJywgJ3knLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAnYW5kJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29yJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ25vdCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldGluZ0VkZ2VzLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2xvZ2ljIGFyYycpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gY3kuZ2V0RWxlbWVudEJ5SWQoZWRnZS5kYXRhKCdzb3VyY2UnKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzaW1wbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuY2FsY3VsYXRlT3JpZW50YXRpb25TY29yZShlbGUsIHNvdXJjZSwgb3JpZW50YXRpb24sICdMLXRvLVInLCAnUi10by1MJywgJ3gnLCBzaW1wbGUpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNhbGN1bGF0ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBzb3VyY2UsIG9yaWVudGF0aW9uLCAnVC10by1CJywgJ0ItdG8tVCcsICd5Jywgc2ltcGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIGlmIChlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdtb2R1bGF0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdzdGltdWxhdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY2F0YWx5c2lzJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdpbmhpYml0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICduZWNlc3Nhcnkgc3RpbXVsYXRpb24nIHx8IGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2xvZ2ljIGFyYycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgndGFyZ2V0JykpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2ltcGxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLmNhbGN1bGF0ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCB0YXJnZXQsIG9yaWVudGF0aW9uLCAnUi10by1MJywgJ0wtdG8tUicsICd4Jywgc2ltcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5jYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlKGVsZSwgdGFyZ2V0LCBvcmllbnRhdGlvbiwgJ0ItdG8tVCcsICdULXRvLUInLCAneScsIHNpbXBsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DYWxjdWxhdGVzIHRoZSBiZXN0IG9yaWVudGF0aW9uIGZyb20gYWxsIG9yaWVudGF0aW9uIHNjb3Jlc1xuICAgICAgICB2YXIgYmVzdE9yaWVudGF0aW9uID0gXCJMLXRvLVJcIjtcbiAgICAgICAgdmFyIGJlc3RTY29yZSA9IG9yaWVudGF0aW9uWydMLXRvLVInXTsvL1RoZSBzY29yZSBvZiB0aGUgYmVzdCBvcmllbnRhdGlvbiBpcyBhbHdheXMgcG9zaXRpdmVcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbltwcm9wZXJ0eV0gPiBiZXN0U2NvcmUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gb3JpZW50YXRpb25bcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGJlc3RPcmllbnRhdGlvbiA9IHByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0T3JpZW50YXRpb247XG4gICAgfSxcbiAgICAvKlxuICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNjb3JlcyBmb3IgZWFjaCBvcmllbnRhdGlvblxuICAgICBAcGFyYW0gZWxlIC0gaXMgdGhlIG5vZGUgKHByb2Nlc3MsIGxvZ2ljYWwgb3BlcmF0b3IpIHdob3NlIG9yaWVudGF0aW9uIHdpbGwgYmUgY2hhbmdlZC4gSXQgY2FuIGJlIHByb2Nlc3Msb21pdHRlZCBwcm9jZXNzLFxuICAgICB1bmNlcnRhaW4gcHJvY2VzcywgYXNzb2NpYXRpb24sIGRpc3NvY2lhdGlvbiwgbG9naWNhbCBvcGVyYXRvclxuICAgICBAcGFyYW0gb3RoZXIgLSBpcyB0aGUgb3RoZXIgbm9kZSwgYW5kIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBzY29yZXMgYXJlIGdpdmVuIHRvIG9yaWVudGF0aW9uc1xuICAgICBAcGFyYW0gb3JpZW50YXRpb24gLSBob2xkcyBzY29yZXMgZm9yIGVhY2ggb3JpZW50YXRpb25cbiAgICAgQHBhcmFtIGZpcnN0T3JpZW50YXRpb24gLSBjYW4gYmUgTC10by1SIG9yIFQtdG8tQlxuICAgICBAcGFyYW0gb3Bwb3NpdGVPcmllbnRhdGlvbiAtIG9wcG9zaXRlIG9mIHRoZSB1cHBlciBvcmllbnRhdGlvbiAoUi10by1MICwgQi10by1UKVxuICAgICBAcGFyYW0gcG9zIC0gY2FuIGJlICd4JyBvciAneScgKGJhc2VkIG9uIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZGlyZWN0aW9uIG9mIHBvcnRzKVxuICAgICBAcGFyYW0gc2ltcGxlIC0gY2hlY2tzIGlmICdvdGhlcicgbm9kZSBpcyBzaW1wbGUgbm9kZSAod2l0aCBkZWdyZWUgMSlcbiAgICAgKi9cbiAgICBjYWxjdWxhdGVPcmllbnRhdGlvblNjb3JlOiBmdW5jdGlvbihlbGUsIG90aGVyLCBvcmllbnRhdGlvbiwgZmlyc3RPcmllbnRhdGlvbiwgb3Bwb3NpdGVPcmllbnRhdGlvbiwgcG9zLCBzaW1wbGUpIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMC41O1xuICAgICAgICB2YXIgc2NvcmUgPSAyO1xuICAgICAgICBpZiAoc2ltcGxlKVxuICAgICAgICAgICAgc2NvcmUgPSAxOyAvLyBJZiBpdCBpcyBhIHNpbXBsZSBub2RlLCBpdHMgc2NvcmUgc2hvdWxkIGFmZmVjdCBsZXNzXG4gICAgICAgIHZhciBub2RlV2lkdGhPckhlaWdodCA9IDA7XG4gICAgICAgIGlmIChwb3MgPT09ICd4JylcbiAgICAgICAgICAgIG5vZGVXaWR0aE9ySGVpZ2h0ID0gZWxlLndpZHRoKCkvMjtcbiAgICAgICAgZWxzZSBpZiAocG9zID09PSd5JylcbiAgICAgICAgICAgIG5vZGVXaWR0aE9ySGVpZ2h0ID0gZWxlLmhlaWdodCgpLzI7XG4gICAgICAgIGlmIChvdGhlci5wb3NpdGlvbihwb3MpIDwgZWxlLnBvc2l0aW9uKHBvcykgLSBub2RlV2lkdGhPckhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgb3JpZW50YXRpb25bZmlyc3RPcmllbnRhdGlvbl0gKz0gc2NvcmU7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltvcHBvc2l0ZU9yaWVudGF0aW9uXSAtPSBzY29yZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbihwb3MpID49IGVsZS5wb3NpdGlvbihwb3MpIC0gbm9kZVdpZHRoT3JIZWlnaHQgJiYgb3RoZXIucG9zaXRpb24ocG9zKSA8PSBlbGUucG9zaXRpb24ocG9zKSArIG5vZGVXaWR0aE9ySGVpZ2h0KVxuICAgICAgICB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltmaXJzdE9yaWVudGF0aW9uXSArPSAoZWxlLnBvc2l0aW9uKHBvcykgLSBvdGhlci5wb3NpdGlvbihwb3MpKS9ub2RlV2lkdGhPckhlaWdodCpjb2VmZjtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uW29wcG9zaXRlT3JpZW50YXRpb25dIC09IChlbGUucG9zaXRpb24ocG9zKSAtIG90aGVyLnBvc2l0aW9uKHBvcykpL25vZGVXaWR0aE9ySGVpZ2h0KmNvZWZmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG90aGVyLnBvc2l0aW9uKHBvcykgPiAgZWxlLnBvc2l0aW9uKHBvcykgKyBub2RlV2lkdGhPckhlaWdodClcbiAgICAgICAge1xuICAgICAgICAgICAgb3JpZW50YXRpb25bZmlyc3RPcmllbnRhdGlvbl0gLT0gc2NvcmU7XG4gICAgICAgICAgICBvcmllbnRhdGlvbltvcHBvc2l0ZU9yaWVudGF0aW9uXSArPSBzY29yZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLypcbiAgICAgQWZ0ZXIgYSBwcm9jZXNzIGlzIG9yaWVudGVkLCBmb3IgZWFjaCBzaW1wbGUgbm9kZSB0aGF0IGlzIG9uIHRoZSB3cm9uZyBzaWRlIG9mIHRoZSBwb3J0LFxuICAgICB3ZSB0cnkgdG8gZmluZCBhbm90aGVyIHNpbXBsZSBub2RlIG9mIGRlZ3JlZSAwIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIGFuZCBzd2FwIHRoZW0gYWZ0ZXJ3YXJkcy5cbiAgICAgSWYgZnJvbSB0aGUgb3Bwb3NpZGUgc2lkZSB3ZSBjYW5ub3QgZmluZCBzdWNoIGEgbm9kZSB0aGVuIHdlIHRyeSB0byBzd2FwIGl0IHdpdGggYW4gZWZmZWN0b3Igbm9kZSBvZiBkZWdyZWUgMVxuICAgICAqL1xuICAgIHBvc3RDaGFuZ2VQb3J0c09yaWVudGF0aW9uOiBmdW5jdGlvbihlbGUsIGJlc3RPcmllbnRhdGlvbikge1xuICAgICAgICB2YXIgcHJvY2Vzc0lkID0gZWxlLmlkKCk7XG4gICAgICAgIHZhciBpbnB1dFBvcnQgPSBbXTsgLy8gSG9sZHMgYWxsIHNpbXBsZSBub2RlcyBjb25uZWN0ZWQgd2l0aCBpbnB1dCBwb3J0XG4gICAgICAgIHZhciBvdXRwdXRQb3J0ID0gW107IC8vIEhvbGRzIGFsbCBzaW1wbGUgbm9kZXMgY29ubmVjdGVkIHdpdGggb3V0cHV0IHBvcnRcbiAgICAgICAgdmFyIG5vdENvbm5lY3RlZFRvUG9ydCA9IFtdOyAvLyBIb2xkcyBhbGwgc2ltcGxlIG5vZGVzIG5vdCBjb25uZWN0ZWQgd2l0aCBpbnB1dCBvciBvdXRwdXQgcG9ydFxuICAgICAgICB2YXIgdGFyZ2V0aW5nRWRnZXMgPSBjeS5lZGdlcyhcIlt0YXJnZXQ9J1wiK3Byb2Nlc3NJZCtcIiddXCIpO1xuICAgICAgICB2YXIgc291cmNpbmdFZGdlcyA9IGN5LmVkZ2VzKFwiW3NvdXJjZT0nXCIrcHJvY2Vzc0lkK1wiJ11cIik7XG4gICAgICAgIC8vIENoZWNrcyBzaW1wbGUgbm9kZXMgYW5kIGFkZCB0aGVtIHRvIG9uZSBvZiB0aGUgYXJyYXlzIG1lbnRpb25lZCBhYm92ZVxuICAgICAgICBpZiAoZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdwcm9jZXNzJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29taXR0ZWQgcHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICd1bmNlcnRhaW4gcHJvY2VzcycgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdhc3NvY2lhdGlvbicgfHwgZWxlLmRhdGEoJ2NsYXNzJykgPT09ICdkaXNzb2NpYXRpb24nKVxuICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXRpbmdFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3NvdXJjZScpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnY29uc3VtcHRpb24nKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHNvdXJjZSwgYmVzdE9yaWVudGF0aW9uLCBpbnB1dFBvcnQsIFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuYWRkU2ltcGxlTm9kZVRvQXJyYXkoZWxlLCBzb3VyY2UsIGJlc3RPcmllbnRhdGlvbiwgbm90Q29ubmVjdGVkVG9Qb3J0LCBcIm5vdENvbm5lY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBvdXRwdXRQb3J0LCBcIm91dHB1dFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBub3RDb25uZWN0ZWRUb1BvcnQsIFwibm90Q29ubmVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVsZS5kYXRhKCdjbGFzcycpID09PSAnYW5kJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ29yJyB8fCBlbGUuZGF0YSgnY2xhc3MnKSA9PT0gJ25vdCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldGluZ0VkZ2VzLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVkZ2UuZGF0YSgnc291cmNlJykpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdsb2dpYyBhcmMnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHNvdXJjZSwgYmVzdE9yaWVudGF0aW9uLCBpbnB1dFBvcnQsIFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuYWRkU2ltcGxlTm9kZVRvQXJyYXkoZWxlLCBzb3VyY2UsIGJlc3RPcmllbnRhdGlvbiwgbm90Q29ubmVjdGVkVG9Qb3J0LCBcIm5vdENvbm5lY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjaW5nRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjeS5nZXRFbGVtZW50QnlJZChlZGdlLmRhdGEoJ3RhcmdldCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZS5kYXRhKCdjbGFzcycpID09PSAnbW9kdWxhdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnc3RpbXVsYXRpb24nIHx8IGVkZ2UuZGF0YSgnY2xhc3MnKSA9PT0gJ2NhdGFseXNpcycgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnaW5oaWJpdGlvbicgfHwgZWRnZS5kYXRhKCdjbGFzcycpID09PSAnbmVjZXNzYXJ5IHN0aW11bGF0aW9uJyB8fCBlZGdlLmRhdGEoJ2NsYXNzJykgPT09ICdsb2dpYyBhcmMnKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBvdXRwdXRQb3J0LCBcIm91dHB1dFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5hZGRTaW1wbGVOb2RlVG9BcnJheShlbGUsIHRhcmdldCwgYmVzdE9yaWVudGF0aW9uLCBub3RDb25uZWN0ZWRUb1BvcnQsIFwibm90Q29ubmVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vVGhlIGFycmF5cyBhcmUgc29ydGVkIGluIG9yZGVyIHRvIGtlZXAgdGhlIGhpZ2ggcHJpb3JpdHkgb2Ygbm9kZXMgcG9zaXRpb25lZCBjb21wbGV0ZWx5IHRvIHRoZSBvdGhlciBzaWRlXG4gICAgICAgIGlucHV0UG9ydC5zb3J0KGZ1bmN0aW9uKGEsIGIpe3JldHVybiBiLnNjb3JlIC0gYS5zY29yZX0pO1xuICAgICAgICBvdXRwdXRQb3J0LnNvcnQoZnVuY3Rpb24oYSwgYil7cmV0dXJuIGIuc2NvcmUgLSBhLnNjb3JlfSk7XG4gICAgICAgIG5vdENvbm5lY3RlZFRvUG9ydC5zb3J0KGZ1bmN0aW9uKGEsIGIpe3JldHVybiBhLnNjb3JlIC0gYi5zY29yZX0pO1xuICAgICAgICAvL0ZpcnN0IHdlIGNoZWNrIGZvciBkaXJlY3Qgc3dhcGluZyBiZXR3ZWVuIG5vZGVzIGZyb20gZGlmZmVyZW50IHBvcnRzIHBvc2l0aW9uZWQgdG8gdGhlIHdyb25nIHNpZGVcbiAgICAgICAgdmFyIG1pbkxlbmd0aCA9IGlucHV0UG9ydC5sZW5ndGg7XG4gICAgICAgIGlmIChvdXRwdXRQb3J0Lmxlbmd0aCA8IG1pbkxlbmd0aClcbiAgICAgICAgICAgIG1pbkxlbmd0aCA9IG91dHB1dFBvcnQubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluTGVuZ3RoOyBpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBpbnB1dFBvcnRFbGUgPSBpbnB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICB2YXIgb3V0cHV0UG9ydEVsZSA9IG91dHB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICAvL0NoZWNrcyBpZiBmcmVlIG5vZGVzIGJlbG9uZyB0byB0aGUgc2FtZSBjb21wb3VuZFxuICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlucHV0UG9ydEVsZS5pZCk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKG91dHB1dFBvcnRFbGUuaWQpO1xuICAgICAgICAgICAgaWYgKGZpcnN0Tm9kZS5kYXRhKCdwYXJlbnQnKSAhPT0gc2Vjb25kTm9kZS5kYXRhKCdwYXJlbnQnKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuc3dhcEVsZW1lbnRzKGlucHV0UG9ydEVsZSwgb3V0cHV0UG9ydEVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgIEFmdGVyIHRoYXQgd2UgaXRlcmF0ZSBvdmVyIGVhY2ggZWxlbWVudCBvZiBlZmZlY3RvciBub2RlcyBhbmQgc2VlIHRoZSBzY29yZXMgaXQgcHJvZHVjZXMgYnkgc3dhcGluZ1xuICAgICAgICAgd2l0aCBub2RlcyBjb25uZWN0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0IHBvcnRzXG4gICAgICAgICAqL1xuICAgICAgICBmb3IgKGkgPSBub3RDb25uZWN0ZWRUb1BvcnQubGVuZ3RoIC0xOyBpID49IDAgOyBpLS0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBlZmZlY3RvciA9IG5vdENvbm5lY3RlZFRvUG9ydFtpXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRQb3J0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0T3V0cHV0ID0gb3V0cHV0UG9ydFtvdXRwdXRQb3J0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIC8vQ2hlY2tzIGlmIGZyZWUgbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIGNvbXBvdW5kXG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVmZmVjdG9yLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGZpcnN0T3V0cHV0LmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb2RlLmRhdGEoJ3BhcmVudCcpICE9PSBzZWNvbmROb2RlLmRhdGEoJ3BhcmVudCcpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zd2FwRWxlbWVudHMoZWZmZWN0b3IsIGZpcnN0T3V0cHV0KTtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RPdXRwdXRTY29yZSA9IC1lbGVtZW50VXRpbGl0aWVzLmNoZWNrTmVnYXRpdmVPcmllbnRhdGlvblNjb3JlKGVsZSwgY3kuZ2V0RWxlbWVudEJ5SWQoZmlyc3RPdXRwdXQuaWQpLCBiZXN0T3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIGlmICggZmlyc3RPdXRwdXRTY29yZSA+IGZpcnN0T3V0cHV0LnNjb3JlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLnN3YXBFbGVtZW50cyhlZmZlY3RvciwgZmlyc3RPdXRwdXQpOyAvL3N3YXAgYmFja1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRQb3J0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0SW5wdXQgPSBpbnB1dFBvcnRbaW5wdXRQb3J0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIC8vQ2hlY2tzIGlmIGZyZWUgbm9kZXMgYmVsb25nIHRvIHRoZSBzYW1lIGNvbXBvdW5kXG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGVmZmVjdG9yLmlkKTtcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGZpcnN0SW5wdXQuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdE5vZGUuZGF0YSgncGFyZW50JykgIT09IHNlY29uZE5vZGUuZGF0YSgncGFyZW50JykpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50VXRpbGl0aWVzLnN3YXBFbGVtZW50cyhlZmZlY3RvciwgZmlyc3RJbnB1dCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0SW5wdXRTY29yZSA9IGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBjeS5nZXRFbGVtZW50QnlJZChmaXJzdElucHV0LmlkKSwgYmVzdE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoIGZpcnN0SW5wdXRTY29yZSA+IGZpcnN0SW5wdXQuc2NvcmUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFBvcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFV0aWxpdGllcy5zd2FwRWxlbWVudHMoZWZmZWN0b3IsIGZpcnN0SW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKlxuICAgICAqIEFkZHMgc2ltcGxlIG5vZGVzIHdoZW4gdGhleSBoYXZlIG5lZ2F0aXZlIHNjb3JlIHRvIGlucHV0UG9ydCwgb3V0cHV0UG9ydCBvciBub3RDb25uZWN0ZWRQb3J0IGFycmF5c1xuICAgICAqICovXG4gICAgYWRkU2ltcGxlTm9kZVRvQXJyYXk6IGZ1bmN0aW9uKGVsZSwgb3RoZXIsIG9yaWVudGF0aW9uLCBhcnJheSwgY29ubmVjdGVkVG8pIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoID09PSAxKVxuICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbm9kZVNjb3JlO1xuICAgICAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFRvID09PSBcIm5vdENvbm5lY3RlZFwiKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5vZGVTY29yZSA9IE1hdGguYWJzKGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBvdGhlciwgb3JpZW50YXRpb24pKTtcbiAgICAgICAgICAgICAgICBvYmpbJ2lkJ10gPSBvdGhlci5pZCgpO1xuICAgICAgICAgICAgICAgIG9ialsnc2NvcmUnXSA9IG5vZGVTY29yZTtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFRvID09PSBcImlucHV0XCIpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY29yZSA9IGVsZW1lbnRVdGlsaXRpZXMuY2hlY2tOZWdhdGl2ZU9yaWVudGF0aW9uU2NvcmUoZWxlLCBvdGhlciwgb3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbm5lY3RlZFRvID09PSBcIm91dHB1dFwiKVxuICAgICAgICAgICAgICAgICAgICBub2RlU2NvcmUgPSAtZWxlbWVudFV0aWxpdGllcy5jaGVja05lZ2F0aXZlT3JpZW50YXRpb25TY29yZShlbGUsIG90aGVyLCBvcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVTY29yZSA8IDApIC8vaWYgaXQgaXMgaW4gdGhlIHdyb25nIHNpZGUgd2UgYWRkIGl0IHRvIHRoZSBpbnB1dCBhcnJheVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydpZCddID0gb3RoZXIuaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgb2JqWydzY29yZSddID0gbm9kZVNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKlxuICAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNjb3JlIG9mIGEgbm9kZSBiYXNlZCBvbiBpdHMgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIGEgcHJvY2Vzcy9sb2dpY2FsIG9wZXJhdG9yXG4gICAgIEBwYXJhbSBlbGUgLSBpcyB0aGUgbm9kZSB3aXRoIHRoZSBwb3J0cy4gSXQgY2FuIGJlIHByb2Nlc3Msb21pdHRlZCBwcm9jZXNzLFxuICAgICB1bmNlcnRhaW4gcHJvY2VzcywgYXNzb2NpYXRpb24sIGRpc3NvY2lhdGlvbiwgbG9naWNhbCBvcGVyYXRvclxuICAgICBAcGFyYW0gb3RoZXIgLSBpcyB0aGUgb3RoZXIgbm9kZSwgYW5kIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBzY29yZSBvZiBhIG5vZGUgaXMgY2FsY3VsYXRlZFxuICAgICBAcGFyYW0gb3JpZW50YXRpb24gLSBBIHN0cmluZyB3aGljaCBob2xkcyBjdXJyZW50IGJlc3Qgb3JpZW50YXRpb25cbiAgICAgKi9cbiAgICBjaGVja05lZ2F0aXZlT3JpZW50YXRpb25TY29yZTogZnVuY3Rpb24oZWxlLCBvdGhlciwgb3JpZW50YXRpb24pIHtcbiAgICAgICAgdmFyIGNvZWZmID0gMC41O1xuICAgICAgICB2YXIgc2NvcmUgPSAxO1xuICAgICAgICBpZiAob3JpZW50YXRpb24gPT09ICdMLXRvLVInIHx8IG9yaWVudGF0aW9uID09PSAnUi10by1MJylcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIG5vZGVXaWR0aCA9IGVsZS53aWR0aCgpLzI7XG4gICAgICAgICAgICBpZiAob3RoZXIucG9zaXRpb24oJ3gnKSA8IGVsZS5wb3NpdGlvbigneCcpIC0gbm9kZVdpZHRoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0wtdG8tUicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzY29yZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmllbnRhdGlvbiA9PT0gJ1ItdG8tTCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbigneCcpID49IGVsZS5wb3NpdGlvbigneCcpIC0gbm9kZVdpZHRoICYmIG90aGVyLnBvc2l0aW9uKCd4JykgPD0gZWxlLnBvc2l0aW9uKCd4JykgKyBub2RlV2lkdGgpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnTC10by1SJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGUucG9zaXRpb24oJ3gnKSAtIG90aGVyLnBvc2l0aW9uKCd4JykpL25vZGVXaWR0aCpjb2VmZjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmllbnRhdGlvbiA9PT0gJ1ItdG8tTCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtKGVsZS5wb3NpdGlvbigneCcpIC0gb3RoZXIucG9zaXRpb24oJ3gnKSkvbm9kZVdpZHRoKmNvZWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIucG9zaXRpb24oJ3gnKSA+IGVsZS5wb3NpdGlvbigneCcpICsgbm9kZVdpZHRoKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ0wtdG8tUicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdSLXRvLUwnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnVC10by1CJyB8fCBvcmllbnRhdGlvbiA9PT0gJ0ItdG8tVCcpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHZhciBub2RlSGVpZ2h0ID0gZWxlLmhlaWdodCgpLzI7XG4gICAgICAgICAgICBpZiAob3RoZXIucG9zaXRpb24oJ3knKSA8IGVsZS5wb3NpdGlvbigneScpIC0gbm9kZUhlaWdodClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT09ICdULXRvLUInKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLXNjb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIucG9zaXRpb24oJ3knKSA+PSBlbGUucG9zaXRpb24oJ3knKSAtIG5vZGVIZWlnaHQgJiYgb3RoZXIucG9zaXRpb24oJ3knKSA8PSBlbGUucG9zaXRpb24oJ3knKSArIG5vZGVIZWlnaHQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnVC10by1CJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGUucG9zaXRpb24oJ3knKSAtIG90aGVyLnBvc2l0aW9uKCd5JykpL25vZGVIZWlnaHQqY29lZmY7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLShlbGUucG9zaXRpb24oJ3knKSAtIG90aGVyLnBvc2l0aW9uKCd5JykpL25vZGVIZWlnaHQqY29lZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdGhlci5wb3NpdGlvbigneScpID4gZWxlLnBvc2l0aW9uKCd5JykgKyBub2RlSGVpZ2h0KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ1QtdG8tQicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtc2NvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZW50YXRpb24gPT09ICdCLXRvLVQnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qXG4gICAgIFN3YXBzIHRoZSBwb3NpdGlvbnMgb2YgMiBlbGVtZW50c1xuICAgICAqL1xuICAgIHN3YXBFbGVtZW50czogZnVuY3Rpb24oZmlyc3RFbGUsIHNlY29uZEVsZSkge1xuICAgICAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoZmlyc3RFbGUuaWQpO1xuICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKHNlY29uZEVsZS5pZCk7XG4gICAgICAgIHZhciB0ZW1weCA9IGZpcnN0Tm9kZS5wb3NpdGlvbigneCcpO1xuICAgICAgICB2YXIgdGVtcHkgPSBmaXJzdE5vZGUucG9zaXRpb24oJ3knKTtcbiAgICAgICAgZmlyc3ROb2RlLnBvc2l0aW9uKCd4Jywgc2Vjb25kTm9kZS5wb3NpdGlvbigneCcpKTtcbiAgICAgICAgZmlyc3ROb2RlLnBvc2l0aW9uKCd5Jywgc2Vjb25kTm9kZS5wb3NpdGlvbigneScpKTtcbiAgICAgICAgc2Vjb25kTm9kZS5wb3NpdGlvbigneCcsIHRlbXB4KTtcbiAgICAgICAgc2Vjb25kTm9kZS5wb3NpdGlvbigneScsIHRlbXB5KTtcbiAgICB9LFxuXG4gICAgLy8gdXNlZCBmb3IgaGFuZGxpbmcgdGhlIHZhcmlhYmxlIHByb3BlcnR5IG9mIGNvbXBsZXhlc1xuICAgIGdldENvbXBsZXhQYWRkaW5nOiBmdW5jdGlvbihlbGUpIHtcbiAgICAgIC8vIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gdGFrZSBpbnRvIGFjY291bnQ6XG4gICAgICAvLyAtIHByZXNlbmNlIG9mIGEgbGFiZWxcbiAgICAgIC8vIC0gb3B0aW9uIHRvIGRpc3BsYXkgY29tcGxleCBsYWJlbHNcbiAgICAgIC8vIC0gcHJlc2VuY2Ugb2Ygc3RhdGVzIGFuZCBpbmZvIGJveCBvbiB0aGUgYm90dG9tXG4gICAgICB2YXIgcGFkZGluZyA9IGdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MoKTtcbiAgICAgIGlmIChvcHRpb25zLnNob3dDb21wbGV4TmFtZSAmJiBlbGVtZW50VXRpbGl0aWVzLmdldEVsZW1lbnRDb250ZW50KGVsZSkpIHtcbiAgICAgICAgcGFkZGluZyArPSBvcHRpb25zLmV4dHJhQ29tcGxleFBhZGRpbmcgKiAwLjU7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBvbiB0aGUgYm90dG9tIHNpZGVcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpICYmIGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpLmJvdHRvbSAmJiBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20udW5pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhZGRpbmcgKz0gb3B0aW9ucy5leHRyYUNvbXBsZXhQYWRkaW5nICogMC41O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHBhZGRpbmcgaXMgdGhlIHRpZ2h0ZXN0LCB3ZSBuZWVkIGEgYml0IG9mIGV4dHJhIHNwYWNlXG4gICAgICAvLyB0byBhdm9pZCB0b3VjaGluZyB0aGUgaW5mb2JveGVzIG9mIHRoZSBjb21wbGV4XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGVsZS5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYWRkaW5nICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwYWRkaW5nO1xuICAgIH0sXG5cbiAgICAvLyB1c2VkIGZvciBoYW5kbGluZyB0aGUgdmFyaWFibGUgcHJvcGVydHkgb2YgY29tcGxleGVzXG4gICAgZ2V0Q29tcGxleE1hcmdpbjogZnVuY3Rpb24oZWxlKSB7XG4gICAgICAvLyB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50OlxuICAgICAgLy8gLSBwcmVzZW5jZSBvZiBhIGxhYmVsXG4gICAgICAvLyAtIG9wdGlvbiB0byBkaXNwbGF5IGNvbXBsZXggbGFiZWxzXG4gICAgICAvLyAtIHByZXNlbmNlIG9mIHN0YXRlcyBhbmQgaW5mbyBib3ggb24gdGhlIGJvdHRvbVxuICAgICAgdmFyIG1hcmdpbiA9ICAtMSAqIG9wdGlvbnMuZXh0cmFDb21wbGV4UGFkZGluZztcbiAgICAgIGlmIChvcHRpb25zLnNob3dDb21wbGV4TmFtZSAmJlxuICAgICAgICAgIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RWxlbWVudENvbnRlbnQoZWxlKSAmJlxuICAgICAgICAgIGVsZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpICYmIC8vIGNoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBvbiB0aGUgYm90dG9tIHNpZGVcbiAgICAgICAgICBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20gJiZcbiAgICAgICAgICBlbGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKS5ib3R0b20udW5pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBtYXJnaW4gLT0gb3B0aW9ucy5leHRyYUNvbXBsZXhQYWRkaW5nICogMC41O1xuICAgICAgfVxuICAgIGlmIChlbGUuY3NzKFwiZm9udC1zaXplXCIpID09IFwiMTRweFwiKVxuICAgICAgICAgIG1hcmdpbiAtPSAyO1xuICAgICAgcmV0dXJuIG1hcmdpbjtcbiAgICB9XG4gICAgXG4gICAgLy8gU2VjdGlvbiBFbmRcbiAgICAvLyBTdHlsZXNoZWV0IGhlbHBlcnNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZWxlbWVudFV0aWxpdGllcztcbiIsIi8qXG4gKiBGaWxlIFV0aWxpdGllczogVG8gYmUgdXNlZCBvbiByZWFkL3dyaXRlIGZpbGUgb3BlcmF0aW9uXG4gKi9cblxudmFyIHNiZ25tbFRvSnNvbiA9IHJlcXVpcmUoJy4vc2Jnbm1sLXRvLWpzb24tY29udmVydGVyJyk7XG52YXIganNvblRvU2Jnbm1sID0gcmVxdWlyZSgnLi9qc29uLXRvLXNiZ25tbC1jb252ZXJ0ZXInKTtcbnZhciB1aVV0aWxpdGllcyA9IHJlcXVpcmUoJy4vdWktdXRpbGl0aWVzJyk7XG52YXIgZ3JhcGhVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIHVwZGF0ZUdyYXBoID0gZ3JhcGhVdGlsaXRpZXMudXBkYXRlR3JhcGguYmluZChncmFwaFV0aWxpdGllcyk7XG5cbnZhciBsaWJzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBzYXZlQXMgPSBsaWJzLnNhdmVBcztcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBTdGFydFxuLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTYyNDU3NjcvY3JlYXRpbmctYS1ibG9iLWZyb20tYS1iYXNlNjQtc3RyaW5nLWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGI2NHRvQmxvYihiNjREYXRhLCBjb250ZW50VHlwZSwgc2xpY2VTaXplKSB7XG4gIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgfHwgJyc7XG4gIHNsaWNlU2l6ZSA9IHNsaWNlU2l6ZSB8fCA1MTI7XG5cbiAgdmFyIGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgdmFyIGJ5dGVBcnJheXMgPSBbXTtcblxuICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IG9mZnNldCArPSBzbGljZVNpemUpIHtcbiAgICB2YXIgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICB2YXIgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgdmFyIGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcblxuICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICB9XG5cbiAgdmFyIGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7dHlwZTogY29udGVudFR5cGV9KTtcbiAgcmV0dXJuIGJsb2I7XG59XG5cbmZ1bmN0aW9uIGxvYWRYTUxEb2MoZnVsbEZpbGVQYXRoKSB7XG4gIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICB4aHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICB9XG4gIGVsc2Uge1xuICAgIHhodHRwID0gbmV3IEFjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MSFRUUFwiKTtcbiAgfVxuICB4aHR0cC5vcGVuKFwiR0VUXCIsIGZ1bGxGaWxlUGF0aCwgZmFsc2UpO1xuICB4aHR0cC5zZW5kKCk7XG4gIHJldHVybiB4aHR0cC5yZXNwb25zZVhNTDtcbn1cblxuLy8gU2hvdWxkIHRoaXMgYmUgZXhwb3NlZCBvciBzaG91bGQgdGhpcyBiZSBtb3ZlZCB0byB0aGUgaGVscGVyIGZ1bmN0aW9ucyBzZWN0aW9uP1xuZnVuY3Rpb24gdGV4dFRvWG1sT2JqZWN0KHRleHQpIHtcbiAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgdmFyIGRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7XG4gICAgZG9jLmFzeW5jID0gJ2ZhbHNlJztcbiAgICBkb2MubG9hZFhNTCh0ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xuICB9XG4gIHJldHVybiBkb2M7XG59XG4vLyBIZWxwZXIgZnVuY3Rpb25zIEVuZFxuXG5mdW5jdGlvbiBmaWxlVXRpbGl0aWVzKCkge31cbmZpbGVVdGlsaXRpZXMubG9hZFhNTERvYyA9IGxvYWRYTUxEb2M7XG5cbmZpbGVVdGlsaXRpZXMuc2F2ZUFzUG5nID0gZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgdmFyIHBuZ0NvbnRlbnQgPSBjeS5wbmcoe3NjYWxlOiAzLCBmdWxsOiB0cnVlfSk7XG5cbiAgLy8gdGhpcyBpcyB0byByZW1vdmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgcG5nQ29udGVudDogZGF0YTppbWcvcG5nO2Jhc2U2NCxcbiAgdmFyIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG4gIHNhdmVBcyhiNjR0b0Jsb2IoYjY0ZGF0YSwgXCJpbWFnZS9wbmdcIiksIGZpbGVuYW1lIHx8IFwibmV0d29yay5wbmdcIik7XG59O1xuXG5maWxlVXRpbGl0aWVzLnNhdmVBc0pwZyA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHZhciBqcGdDb250ZW50ID0gY3kuanBnKHtzY2FsZTogMywgZnVsbDogdHJ1ZX0pO1xuXG4gIC8vIHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBuZ0NvbnRlbnQ6IGRhdGE6aW1nL3BuZztiYXNlNjQsXG4gIHZhciBiNjRkYXRhID0ganBnQ29udGVudC5zdWJzdHIoanBnQ29udGVudC5pbmRleE9mKFwiLFwiKSArIDEpO1xuICBzYXZlQXMoYjY0dG9CbG9iKGI2NGRhdGEsIFwiaW1hZ2UvanBnXCIpLCBmaWxlbmFtZSB8fCBcIm5ldHdvcmsuanBnXCIpO1xufTtcblxuZmlsZVV0aWxpdGllcy5zYXZlQXNTdmcgPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICB2YXIgc3ZnQ29udGVudCA9IGN5LnN2Zyh7c2NhbGU6IDEsIGZ1bGw6IHRydWV9KTtcbiAgc2F2ZUFzKG5ldyBCbG9iKFtzdmdDb250ZW50XSwge3R5cGU6XCJpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLThcIn0pLCBmaWxlbmFtZSB8fCBcIm5ldHdvcmsuc3ZnXCIpO1xufTtcblxuZmlsZVV0aWxpdGllcy5sb2FkU2FtcGxlID0gZnVuY3Rpb24oZmlsZW5hbWUsIGZvbGRlcnBhdGgpIHtcbiAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICBcbiAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYSBzYW1wbGUgaXMgYmVpbmcgbG9hZGVkXG4gIC8vIFRyaWdnZXIgYW4gZXZlbnQgZm9yIHRoaXMgcHVycG9zZSBhbmQgc3BlY2lmeSB0aGUgJ2ZpbGVuYW1lJyBhcyBhbiBldmVudCBwYXJhbWV0ZXJcbiAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInNiZ252aXpMb2FkU2FtcGxlXCIsIFsgZmlsZW5hbWUgXSApOyAvLyBBbGlhc2VzIGZvciBzYmdudml6TG9hZFNhbXBsZVN0YXJ0XG4gICQoIGRvY3VtZW50ICkudHJpZ2dlciggXCJzYmdudml6TG9hZFNhbXBsZVN0YXJ0XCIsIFsgZmlsZW5hbWUgXSApO1xuICBcbiAgLy8gbG9hZCB4bWwgZG9jdW1lbnQgdXNlIGRlZmF1bHQgZm9sZGVyIHBhdGggaWYgaXQgaXMgbm90IHNwZWNpZmllZFxuICB2YXIgeG1sT2JqZWN0ID0gbG9hZFhNTERvYygoZm9sZGVycGF0aCB8fCAnc2FtcGxlLWFwcC9zYW1wbGVzLycpICsgZmlsZW5hbWUpO1xuICBcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlR3JhcGgoc2Jnbm1sVG9Kc29uLmNvbnZlcnQoeG1sT2JqZWN0KSk7XG4gICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwic2JnbnZpekxvYWRTYW1wbGVFbmRcIiwgWyBmaWxlbmFtZSBdICk7IC8vIFRyaWdnZXIgYW4gZXZlbnQgc2lnbmFsaW5nIHRoYXQgYSBzYW1wbGUgaXMgbG9hZGVkXG4gIH0sIDApO1xufTtcblxuLypcbiAgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiByZW1vdGVseSBkZWZpbmVkIHRvIGFkZCBzcGVjaWZpYyBiZWhhdmlvciB0aGF0IGlzbid0IGltcGxlbWVudGVkIGhlcmUuXG4gIGl0IGlzIGNvbXBsZXRlbHkgb3B0aW9uYWwuXG4gIHNpZ25hdHVyZTogY2FsbGJhY2sodGV4dFhtbClcbiovXG5maWxlVXRpbGl0aWVzLmxvYWRTQkdOTUxGaWxlID0gZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2sxLCBjYWxsYmFjazIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB1aVV0aWxpdGllcy5zdGFydFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgXG4gIHZhciB0ZXh0VHlwZSA9IC90ZXh0LiovO1xuXG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciB0ZXh0ID0gdGhpcy5yZXN1bHQ7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sxICE9PSAndW5kZWZpbmVkJykgY2FsbGJhY2sxKHRleHQpO1xuICAgICAgdmFyIGN5R3JhcGg7XG4gICAgICB0cnkge1xuICAgICAgICBjeUdyYXBoID0gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHQpKTtcbiAgICAgICAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYW4gZXh0ZXJuYWwgZmlsZSBpcyBiZWluZyBsb2FkZWRcbiAgICAgICAgLy8gVHJpZ2dlciBhbiBldmVudCBmb3IgdGhpcyBwdXJwb3NlIGFuZCBzcGVjaWZ5IHRoZSAnZmlsZW5hbWUnIGFzIGFuIGV2ZW50IHBhcmFtZXRlclxuICAgICAgICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwic2JnbnZpekxvYWRGaWxlXCIsIFsgZmlsZS5uYW1lIF0gKTsgLy8gQWxpYXNlcyBmb3Igc2JnbnZpekxvYWRGaWxlU3RhcnRcbiAgICAgICAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInNiZ252aXpMb2FkRmlsZVN0YXJ0XCIsIFsgZmlsZS5uYW1lIF0gKTsgXG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazIgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVHcmFwaChjeUdyYXBoKTtcbiAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICAgICQoIGRvY3VtZW50ICkudHJpZ2dlciggXCJzYmdudml6TG9hZEZpbGVFbmRcIiwgWyBmaWxlLm5hbWUgXSApOyAvLyBUcmlnZ2VyIGFuIGV2ZW50IHNpZ25hbGluZyB0aGF0IGEgZmlsZSBpcyBsb2FkZWRcbiAgICB9LCAwKTtcbiAgfTtcblxuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbn07XG5maWxlVXRpbGl0aWVzLmxvYWRTQkdOTUxUZXh0ID0gZnVuY3Rpb24odGV4dERhdGEpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB1cGRhdGVHcmFwaChzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dERhdGEpKSk7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLWZpbGUtc3Bpbm5lclwiKTtcbiAgICB9LCAwKTtcblxufTtcblxuZmlsZVV0aWxpdGllcy5zYXZlQXNTYmdubWwgPSBmdW5jdGlvbihmaWxlbmFtZSwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcykge1xuICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoZmlsZW5hbWUsIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMpO1xuICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzYmdubWxUZXh0XSwge1xuICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICB9KTtcbiAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbn07XG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUZXh0VG9Kc29uID0gZnVuY3Rpb24oc2Jnbm1sVGV4dCl7XG4gICAgcmV0dXJuIHNiZ25tbFRvSnNvbi5jb252ZXJ0KHRleHRUb1htbE9iamVjdChzYmdubWxUZXh0KSk7XG59O1xuXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb24gPSBmdW5jdGlvbihqc29uKXtcbiAgICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoKTtcbiAgICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHNiZ25tbFRleHQpKTtcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWxlVXRpbGl0aWVzO1xuIiwiLypcbiAqIENvbW1vbiB1dGlsaXRpZXMgZm9yIHNiZ252aXogZ3JhcGhzXG4gKi9cblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xudmFyIGxpYnMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG5mdW5jdGlvbiBncmFwaFV0aWxpdGllcygpIHt9XG5cbi8vIFRPRE8gbWFrZSB0aGVzZSBpbml0aWFsIHZhbHVlcyB1c2VyIG9wdGlvbnMgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZW0gaGVyZVxuZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID0gdHJ1ZTtcbmdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkID0gZmFsc2U7XG5cbmdyYXBoVXRpbGl0aWVzLmRpc2FibGVQb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5wb3J0c0VuYWJsZWQgPSBmYWxzZTtcbiAgY3kuc3R5bGUoKS51cGRhdGUoKTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmVuYWJsZVBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCA9IHRydWU7XG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG5ncmFwaFV0aWxpdGllcy5hcmVQb3J0c0VuYWJsZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZDtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmNvbnNpZGVyQ29tcG91bmRTaXplcyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5jb21wb3VuZFNpemVzQ29uc2lkZXJlZCA9IHRydWU7XG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG5ncmFwaFV0aWxpdGllcy5vbWl0Q29tcG91bmRTaXplcyA9IGZ1bmN0aW9uKCkge1xuICBncmFwaFV0aWxpdGllcy5jb21wb3VuZFNpemVzQ29uc2lkZXJlZCA9IGZhbHNlO1xuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xufTtcblxuZ3JhcGhVdGlsaXRpZXMuYXJlQ29tcG91bmRTaXplc0NvbnNpZGVyZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkID0gdHJ1ZTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLnVwZGF0ZUdyYXBoID0gZnVuY3Rpb24oY3lHcmFwaCkge1xuICBjb25zb2xlLmxvZygnY3kgdXBkYXRlIGNhbGxlZCcpO1xuICAkKCBkb2N1bWVudCApLnRyaWdnZXIoIFwidXBkYXRlR3JhcGhTdGFydFwiICk7XG4gIC8vIFJlc2V0IHVuZG8vcmVkbyBzdGFjayBhbmQgYnV0dG9ucyB3aGVuIGEgbmV3IGdyYXBoIGlzIGxvYWRlZFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkucmVzZXQoKTtcbi8vICAgIHRoaXMucmVzZXRVbmRvUmVkb0J1dHRvbnMoKTtcbiAgfVxuXG4gIGN5LnN0YXJ0QmF0Y2goKTtcbiAgLy8gY2xlYXIgZGF0YVxuICBjeS5yZW1vdmUoJyonKTtcbiAgY3kuYWRkKGN5R3JhcGgpO1xuXG4gIC8vYWRkIHBvc2l0aW9uIGluZm9ybWF0aW9uIHRvIGRhdGEgZm9yIHByZXNldCBsYXlvdXRcbiAgdmFyIHBvc2l0aW9uTWFwID0ge307XG4gIGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgdmFyIHhQb3MgPSBub2RlLmRhdGEoJ2Jib3gnKS54O1xuICAgIHZhciB5UG9zID0gbm9kZS5kYXRhKCdiYm94JykueTtcbiAgICBwb3NpdGlvbk1hcFtub2RlLmRhdGEoJ2lkJyldID0geyd4JzogeFBvcywgJ3knOiB5UG9zfTtcblxuICAgIC8vIGFzc2lnbiBjb3JyZWN0IHBhcmVudHMgdG8gaW5mbyBib3hlc1xuICAgIHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKTtcbiAgICBmb3IgKHZhciBqPTA7IGogPCBzdGF0ZXNhbmRpbmZvcy5sZW5ndGg7IGorKykge1xuICAgICAgc3RhdGVzYW5kaW5mb3Nbal0ucGFyZW50ID0gbm9kZTtcbiAgICB9XG4gIH0pO1xuXG5cbiAgdGhpcy5yZWZyZXNoUGFkZGluZ3MoKTsgLy8gUmVjYWxjdWxhdGVzL3JlZnJlc2hlcyB0aGUgY29tcG91bmQgcGFkZGluZ3NcbiAgY3kuZW5kQmF0Y2goKTtcbiAgXG4gIHZhciBsYXlvdXQgPSBjeS5sYXlvdXQoe1xuICAgIG5hbWU6ICdwcmVzZXQnLFxuICAgIHBvc2l0aW9uczogcG9zaXRpb25NYXAsXG4gICAgZml0OiB0cnVlLFxuICAgIHBhZGRpbmc6IDUwXG4gIH0pO1xuICBcbiAgLy8gQ2hlY2sgdGhpcyBmb3IgY3l0b3NjYXBlLmpzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgaWYgKGxheW91dCAmJiBsYXlvdXQucnVuKSB7XG4gICAgbGF5b3V0LnJ1bigpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBzdHlsZVxuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xuICAvLyBJbml0aWxpemUgdGhlIGJlbmQgcG9pbnRzIG9uY2UgdGhlIGVsZW1lbnRzIGFyZSBjcmVhdGVkXG4gIGlmIChjeS5lZGdlQmVuZEVkaXRpbmcgJiYgY3kuZWRnZUJlbmRFZGl0aW5nKCdpbml0aWFsaXplZCcpKSB7XG4gICAgY3kuZWRnZUJlbmRFZGl0aW5nKCdnZXQnKS5pbml0QmVuZFBvaW50cyhjeS5lZGdlcygpKTtcbiAgfVxuICBcbiAgJCggZG9jdW1lbnQgKS50cmlnZ2VyKCBcInVwZGF0ZUdyYXBoRW5kXCIgKTtcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZVBhZGRpbmdzID0gZnVuY3Rpb24ocGFkZGluZ1BlcmNlbnQpIHtcbiAgLy9BcyBkZWZhdWx0IHVzZSB0aGUgY29tcG91bmQgcGFkZGluZyB2YWx1ZVxuICBpZiAoIXBhZGRpbmdQZXJjZW50KSB7XG4gICAgdmFyIGNvbXBvdW5kUGFkZGluZyA9IG9wdGlvbnMuY29tcG91bmRQYWRkaW5nO1xuICAgIHBhZGRpbmdQZXJjZW50ID0gdHlwZW9mIGNvbXBvdW5kUGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IGNvbXBvdW5kUGFkZGluZy5jYWxsKCkgOiBjb21wb3VuZFBhZGRpbmc7XG4gIH1cblxuICB2YXIgbm9kZXMgPSBjeS5ub2RlcygpO1xuICB2YXIgdG90YWwgPSAwO1xuICB2YXIgbnVtT2ZTaW1wbGVzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aGVOb2RlID0gbm9kZXNbaV07XG4gICAgaWYgKHRoZU5vZGUuY2hpbGRyZW4oKSA9PSBudWxsIHx8IHRoZU5vZGUuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdG90YWwgKz0gTnVtYmVyKHRoZU5vZGUud2lkdGgoKSk7XG4gICAgICB0b3RhbCArPSBOdW1iZXIodGhlTm9kZS5oZWlnaHQoKSk7XG4gICAgICBudW1PZlNpbXBsZXMrKztcbiAgICB9XG4gIH1cblxuICB2YXIgY2FsY19wYWRkaW5nID0gKHBhZGRpbmdQZXJjZW50IC8gMTAwKSAqIE1hdGguZmxvb3IodG90YWwgLyAoMiAqIG51bU9mU2ltcGxlcykpO1xuICBpZiAoY2FsY19wYWRkaW5nIDwgNSkge1xuICAgIGNhbGNfcGFkZGluZyA9IDU7XG4gIH1cblxuICByZXR1cm4gY2FsY19wYWRkaW5nO1xufTtcblxuZ3JhcGhVdGlsaXRpZXMucmVjYWxjdWxhdGVQYWRkaW5ncyA9IGdyYXBoVXRpbGl0aWVzLnJlZnJlc2hQYWRkaW5ncyA9IGZ1bmN0aW9uKCkge1xuICAvLyB0aGlzLmNhbGN1bGF0ZWRQYWRkaW5ncyBpcyBub3Qgd29ya2luZyBoZXJlIFxuICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgcmVmZXJlbmNlIHdpdGggdGhpcy5jYWxjdWxhdGVkUGFkZGluZ3Mgb25jZSB0aGUgcmVhc29uIGlzIGZpZ3VyZWQgb3V0XG4gIGdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZWRQYWRkaW5ncyA9IHRoaXMuY2FsY3VsYXRlUGFkZGluZ3MoKTtcbiAgcmV0dXJuIGdyYXBoVXRpbGl0aWVzLmNhbGN1bGF0ZWRQYWRkaW5ncztcbn07XG5cbmdyYXBoVXRpbGl0aWVzLmdldENvbXBvdW5kUGFkZGluZ3MgPSBmdW5jdGlvbigpIHtcbiAgLy8gUmV0dXJuIGNhbGN1bGF0ZWQgcGFkZGluZ3MgaW4gY2FzZSBvZiB0aGF0IGRhdGEgaXMgaW52YWxpZCByZXR1cm4gNVxuICByZXR1cm4gZ3JhcGhVdGlsaXRpZXMuY2FsY3VsYXRlZFBhZGRpbmdzIHx8IDU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdyYXBoVXRpbGl0aWVzOyIsInZhciB0eHRVdGlsID0gcmVxdWlyZSgnLi90ZXh0LXV0aWxpdGllcycpO1xudmFyIGVsZW1lbnRVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2VsZW1lbnQtdXRpbGl0aWVzJyk7XG52YXIgbGlic2JnbmpzID0gcmVxdWlyZSgnbGlic2Jnbi5qcycpO1xudmFyIHJlbmRlckV4dGVuc2lvbiA9IGxpYnNiZ25qcy5yZW5kZXI7XG52YXIgYW5ub3QgPSBsaWJzYmduanMuYW5ub3Q7XG52YXIgcGtnVmVyc2lvbiA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247IC8vIG5lZWQgaW5mbyBhYm91dCBzYmdudml6IHRvIHB1dCBpbiB4bWxcbnZhciBwa2dOYW1lID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykubmFtZTtcbnZhciBwcmV0dHlwcmludCA9IHJlcXVpcmUoJ3ByZXR0eS1kYXRhJykucGQ7XG52YXIgZ3JhcGhVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2dyYXBoLXV0aWxpdGllcycpO1xudmFyIHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpO1xudmFyIG1hcFByb3BlcnRpZXNCdWlsZGVyID0gbmV3IHhtbDJqcy5CdWlsZGVyKHtyb290TmFtZTogXCJtYXBQcm9wZXJ0aWVzXCJ9KTtcblxudmFyIGpzb25Ub1NiZ25tbCA9IHtcbiAgICAvKlxuICAgICAgICB0YWtlcyByZW5kZXJJbmZvIGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LiBJdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBzYXZlXG4gICAgICAgIHRoZSBzdHlsZSBhbmQgY29sb3JzIHRvIHRoZSByZW5kZXIgZXh0ZW5zaW9uLiBTZWUgbmV3dC9hcHAtdXRpbGl0aWVzIGdldEFsbFN0eWxlcygpXG4gICAgICAgIFN0cnVjdHVyZToge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogdGhlIG1hcCBiYWNrZ3JvdW5kIGNvbG9yLFxuICAgICAgICAgICAgY29sb3JzOiB7XG4gICAgICAgICAgICAgIHZhbGlkWG1sVmFsdWU6IGNvbG9yX2lkXG4gICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgIHN0eWxlS2V5MToge1xuICAgICAgICAgICAgICAgICAgICBpZExpc3Q6IGxpc3Qgb2YgdGhlIG5vZGVzIGlkcyB0aGF0IGhhdmUgdGhpcyBzdHlsZVxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlS2V5MjogLi4uXG4gICAgICAgICAgICAgICAgLi4uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAqL1xuICAgIGNyZWF0ZVNiZ25tbCA6IGZ1bmN0aW9uKGZpbGVuYW1lLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgbWFwSUQgPSB0eHRVdGlsLmdldFhNTFZhbGlkSWQoZmlsZW5hbWUpO1xuICAgICAgICB2YXIgaGFzRXh0ZW5zaW9uID0gZmFsc2U7XG4gICAgICAgIHZhciBoYXNSZW5kZXJFeHRlbnNpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiByZW5kZXJJbmZvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaGFzRXh0ZW5zaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGhhc1JlbmRlckV4dGVuc2lvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWFwTGFuZ3VhZ2U7XG4gICAgICAgIGlmKGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSA9PSBcIlBEXCIpIHtcbiAgICAgICAgICAgIG1hcExhbmd1YWdlID0gXCJwcm9jZXNzIGRlc2NyaXB0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGUgPT0gXCJBRlwiKSB7XG4gICAgICAgICAgICBtYXBMYW5ndWFnZSA9IFwiYWN0aXZpdHkgZmxvd1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2FzZSBvZiBhIG1peGVkIG1hcCB3aXRoIGJpdHMgb2YgQUYgYW5kIFBEIGZvciBleGFtcGxlXG4gICAgICAgICAgICBtYXBMYW5ndWFnZSA9IFwidW5rbm93blwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgaGVhZGVyc1xuICAgICAgICB4bWxIZWFkZXIgPSBcIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyBzdGFuZGFsb25lPSd5ZXMnPz5cXG5cIjtcbiAgICAgICAgdmFyIHNiZ24gPSBuZXcgbGlic2JnbmpzLlNiZ24oe3htbG5zOiAnaHR0cDovL3NiZ24ub3JnL2xpYnNiZ24vMC4zJ30pO1xuICAgICAgICB2YXIgbWFwID0gbmV3IGxpYnNiZ25qcy5NYXAoe2xhbmd1YWdlOiBtYXBMYW5ndWFnZSwgaWQ6IG1hcElEfSk7XG4gICAgICAgIGlmIChoYXNFeHRlbnNpb24pIHsgLy8gZXh0ZW5zaW9uIGlzIHRoZXJlXG4gICAgICAgICAgICB2YXIgZXh0ZW5zaW9uID0gbmV3IGxpYnNiZ25qcy5FeHRlbnNpb24oKTtcbiAgICAgICAgICAgIGlmIChoYXNSZW5kZXJFeHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkKHNlbGYuZ2V0UmVuZGVyRXh0ZW5zaW9uU2Jnbm1sKHJlbmRlckluZm8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcC5zZXRFeHRlbnNpb24oZXh0ZW5zaW9uKTtcbiAgICAgICAgICAgIGlmIChtYXBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHhtbCA9IG1hcFByb3BlcnRpZXNCdWlsZGVyLmJ1aWxkT2JqZWN0KG1hcFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIG1hcC5leHRlbnNpb24uYWRkKHhtbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChtYXBQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBtYXAuc2V0RXh0ZW5zaW9uKG5ldyBsaWJzYmduanMuRXh0ZW5zaW9uKCkpO1xuICAgICAgICAgICAgbWFwLmV4dGVuc2lvbi5hZGQobWFwUHJvcGVydGllc0J1aWxkZXIuYnVpbGRPYmplY3QobWFwUHJvcGVydGllcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IGFsbCBnbHlwaHNcbiAgICAgICAgdmFyIGdseXBoTGlzdCA9IFtdO1xuICAgICAgICAvLyBiZSBjYXJlZnVsIHRoYXQgOnZpc2libGUgaXMgYWxzbyB1c2VkIGR1cmluZyByZWN1cnNpdmUgc2VhcmNoIG9mIG5vZGVzXG4gICAgICAgIC8vIGluIHRoZSBnZXRHbHlwaFNiZ25tbCBmdW5jdGlvbi4gSWYgbm90IHNldCBhY2NvcmRpbmdseSwgZGlzY3JlcGFuY2llcyB3aWxsIG9jY3VyLlxuICAgICAgICBjeS5ub2RlcyhcIjp2aXNpYmxlXCIpLmVhY2goZnVuY3Rpb24oZWxlLCBpKXtcbiAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgZWxlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKCFlbGUuaXNDaGlsZCgpKVxuICAgICAgICAgICAgICAgIGdseXBoTGlzdCA9IGdseXBoTGlzdC5jb25jYXQoc2VsZi5nZXRHbHlwaFNiZ25tbChlbGUpKTsgLy8gcmV0dXJucyBwb3RlbnRpYWxseSBtb3JlIHRoYW4gMSBnbHlwaFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIG1hcFxuICAgICAgICBmb3IodmFyIGk9MDsgaTxnbHlwaExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG1hcC5hZGRHbHlwaChnbHlwaExpc3RbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IGFsbCBhcmNzXG4gICAgICAgIGN5LmVkZ2VzKFwiOnZpc2libGVcIikuZWFjaChmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgaWYodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFwLmFkZEFyYyhzZWxmLmdldEFyY1NiZ25tbChlbGUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2Jnbi5hZGRNYXAobWFwKTtcbiAgICAgICAgcmV0dXJuIHByZXR0eXByaW50LnhtbCh4bWxIZWFkZXIgKyBzYmduLnRvWE1MKCkpO1xuICAgIH0sXG5cbiAgICAvLyBzZWUgY3JlYXRlU2Jnbm1sIGZvciBpbmZvIG9uIHRoZSBzdHJ1Y3R1cmUgb2YgcmVuZGVySW5mb1xuICAgIGdldFJlbmRlckV4dGVuc2lvblNiZ25tbCA6IGZ1bmN0aW9uKHJlbmRlckluZm8pIHtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWFpbiBjb250YWluZXJcbiAgICAgICAgdmFyIHJlbmRlckluZm9ybWF0aW9uID0gbmV3IHJlbmRlckV4dGVuc2lvbi5SZW5kZXJJbmZvcm1hdGlvbih7IGlkOiAncmVuZGVySW5mb3JtYXRpb24nLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogcmVuZGVySW5mby5iYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbU5hbWU6IHBrZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtVmVyc2lvbjogcGtnVmVyc2lvbiB9KTtcblxuICAgICAgICAvLyBwb3B1bGF0ZSBsaXN0IG9mIGNvbG9yc1xuICAgICAgICB2YXIgbGlzdE9mQ29sb3JEZWZpbml0aW9ucyA9IG5ldyByZW5kZXJFeHRlbnNpb24uTGlzdE9mQ29sb3JEZWZpbml0aW9ucygpO1xuICAgICAgICBmb3IgKHZhciBjb2xvciBpbiByZW5kZXJJbmZvLmNvbG9ycykge1xuICAgICAgICAgICAgdmFyIGNvbG9yRGVmaW5pdGlvbiA9IG5ldyByZW5kZXJFeHRlbnNpb24uQ29sb3JEZWZpbml0aW9uKHtpZDogcmVuZGVySW5mby5jb2xvcnNbY29sb3JdLCB2YWx1ZTogY29sb3J9KTtcbiAgICAgICAgICAgIGxpc3RPZkNvbG9yRGVmaW5pdGlvbnMuYWRkQ29sb3JEZWZpbml0aW9uKGNvbG9yRGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVySW5mb3JtYXRpb24uc2V0TGlzdE9mQ29sb3JEZWZpbml0aW9ucyhsaXN0T2ZDb2xvckRlZmluaXRpb25zKTtcblxuICAgICAgICAvLyBwb3B1bGF0ZXMgc3R5bGVzXG4gICAgICAgIHZhciBsaXN0T2ZTdHlsZXMgPSBuZXcgcmVuZGVyRXh0ZW5zaW9uLkxpc3RPZlN0eWxlcygpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVuZGVySW5mby5zdHlsZXMpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHJlbmRlckluZm8uc3R5bGVzW2tleV07XG4gICAgICAgICAgICB2YXIgeG1sU3R5bGUgPSBuZXcgcmVuZGVyRXh0ZW5zaW9uLlN0eWxlKHtpZDogdHh0VXRpbC5nZXRYTUxWYWxpZElkKGtleSksIGlkTGlzdDogc3R5bGUuaWRMaXN0LmpvaW4oJyAnKX0pO1xuICAgICAgICAgICAgdmFyIGcgPSBuZXcgcmVuZGVyRXh0ZW5zaW9uLlJlbmRlckdyb3VwKHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUucHJvcGVydGllcy5mb250U2l6ZSxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBzdHlsZS5wcm9wZXJ0aWVzLmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGUucHJvcGVydGllcy5mb250V2VpZ2h0LFxuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogc3R5bGUucHJvcGVydGllcy5mb250U3R5bGUsXG4gICAgICAgICAgICAgICAgZmlsbDogc3R5bGUucHJvcGVydGllcy5maWxsLCAvLyBmaWxsIGNvbG9yXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBzdHlsZS5wcm9wZXJ0aWVzLnN0cm9rZSwgLy8gc3Ryb2tlIGNvbG9yXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IHN0eWxlLnByb3BlcnRpZXMuc3Ryb2tlV2lkdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeG1sU3R5bGUuc2V0UmVuZGVyR3JvdXAoZyk7XG4gICAgICAgICAgICBsaXN0T2ZTdHlsZXMuYWRkU3R5bGUoeG1sU3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckluZm9ybWF0aW9uLnNldExpc3RPZlN0eWxlcyhsaXN0T2ZTdHlsZXMpO1xuXG4gICAgICAgIHJldHVybiByZW5kZXJJbmZvcm1hdGlvbjtcbiAgICB9LFxuXG4gICAgZ2V0QW5ub3RhdGlvbkV4dGVuc2lvbjogZnVuY3Rpb24oY3lFbGVtZW50KSB7XG4gICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IGN5RWxlbWVudC5kYXRhKCdhbm5vdGF0aW9ucycpO1xuICAgICAgICB2YXIgYW5ub3RFeHQgPSBuZXcgYW5ub3QuQW5ub3RhdGlvbigpO1xuICAgICAgICB2YXIgcmRmRWxlbWVudCA9IG5ldyBhbm5vdC5SZGZFbGVtZW50KCk7XG4gICAgICAgIGZvciAodmFyIGFubm90SUQgaW4gYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50QW5ub3QgPSBhbm5vdGF0aW9uc1thbm5vdElEXTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgdmFsaWRpdHkgb2YgYW5ub3RhdGlvblxuICAgICAgICAgICAgaWYoY3VycmVudEFubm90LnN0YXR1cyAhPSAndmFsaWRhdGVkJyB8fCAhY3VycmVudEFubm90LnNlbGVjdGVkREIgfHwgIWN1cnJlbnRBbm5vdC5hbm5vdGF0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdW5jb250cm9sbGVkIHZvY2FidWxhcnlcbiAgICAgICAgICAgIGlmKGN1cnJlbnRBbm5vdC5zZWxlY3RlZFJlbGF0aW9uID09IFwic2lvOlNJT18wMDAyMjNcIikge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSB7fTtcbiAgICAgICAgICAgICAgICBvYmpbY3VycmVudEFubm90LnNlbGVjdGVkREJdID0gY3VycmVudEFubm90LmFubm90YXRpb25WYWx1ZTtcbiAgICAgICAgICAgICAgICByZGZFbGVtZW50LmFkZEN1c3RvbVByb3BlcnR5KCcjJytjeUVsZW1lbnQuZGF0YSgnaWQnKSAsIG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgICAgICAgICAgb2JqW2N1cnJlbnRBbm5vdC5zZWxlY3RlZFJlbGF0aW9uXSA9IGN1cnJlbnRBbm5vdC5hbm5vdGF0aW9uVmFsdWU7XG4gICAgICAgICAgICAgICAgcmRmRWxlbWVudC5hZGRSZXNvdXJjZSgnIycrY3lFbGVtZW50LmRhdGEoJ2lkJykgLCBvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFubm90RXh0LnNldFJkZkVsZW1lbnQocmRmRWxlbWVudCk7XG4gICAgICAgIHJldHVybiBhbm5vdEV4dDtcbiAgICB9LFxuXG4gICAgZ2V0R2x5cGhTYmdubWwgOiBmdW5jdGlvbihub2RlKXtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZUNsYXNzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzO1xuICAgICAgICB2YXIgZ2x5cGhMaXN0ID0gW107XG5cbiAgICAgICAgaWYoIG5vZGVDbGFzcy5zdGFydHNXaXRoKCdCQScpKSB7XG4gICAgICAgICAgICBub2RlQ2xhc3MgPSBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBnbHlwaCA9IG5ldyBsaWJzYmduanMuR2x5cGgoe2lkOiBub2RlLl9wcml2YXRlLmRhdGEuaWQsIGNsYXNzXzogbm9kZUNsYXNzfSk7XG5cbiAgICAgICAgLy8gYXNzaWduIGNvbXBhcnRtZW50UmVmXG4gICAgICAgIGlmKG5vZGUucGFyZW50KCkuaXNQYXJlbnQoKSl7XG4gICAgICAgICAgICBpZihub2RlQ2xhc3MgPT09IFwiY29tcGFydG1lbnRcIil7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgZ2x5cGguY29tcGFydG1lbnRSZWYgPSBub2RlLl9wcml2YXRlLmRhdGEucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50KClbMF07XG4gICAgICAgICAgICAgICAgaWYocGFyZW50Ll9wcml2YXRlLmRhdGEuY2xhc3MgPT0gXCJjb21wYXJ0bWVudFwiKVxuICAgICAgICAgICAgICAgICAgICBnbHlwaC5jb21wYXJ0bWVudFJlZiA9IHBhcmVudC5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWlzYyBpbmZvcm1hdGlvblxuICAgICAgICB2YXIgbGFiZWwgPSBub2RlLl9wcml2YXRlLmRhdGEubGFiZWw7XG4gICAgICAgIGlmKHR5cGVvZiBsYWJlbCAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIGdseXBoLnNldExhYmVsKG5ldyBsaWJzYmduanMuTGFiZWwoe3RleHQ6IGxhYmVsfSkpO1xuICAgICAgICAvL2FkZCBjbG9uZSBpbmZvcm1hdGlvblxuICAgICAgICBpZih0eXBlb2Ygbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyICE9ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgZ2x5cGguc2V0Q2xvbmUobmV3IGxpYnNiZ25qcy5DbG9uZVR5cGUoKSk7XG4gICAgICAgIC8vYWRkIGJib3ggaW5mb3JtYXRpb25cbiAgICAgICAgZ2x5cGguc2V0QmJveCh0aGlzLmFkZEdseXBoQmJveChub2RlKSk7XG4gICAgICAgIC8vYWRkIHBvcnQgaW5mb3JtYXRpb25cbiAgICAgICAgdmFyIHBvcnRzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLnBvcnRzO1xuICAgICAgICBmb3IodmFyIGkgPSAwIDsgaSA8IHBvcnRzLmxlbmd0aCA7IGkrKyl7XG4gICAgICAgICAgICB2YXIgb3JpZW50YXRpb24gPSBwb3J0c1tpXS54ID09PSAwID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJhdGlvIG9mIHRoZSBhcmVhIG9jY3VwaWVkIGZvciBwb3J0cyBvdmVyIHRoZSB3aG9sZSBzaGFwZVxuICAgICAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0c1tpXS55KSAvIDUwIDogTWF0aC5hYnMocG9ydHNbaV0ueCkgLyA1MDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRGl2aWRlIHRoZSBub2RlIHNpemVzIGJ5IHRoZSByYXRpbyBiZWNhdXNlIHRoYXQgc2l6ZXMgaW5jbHVkZXMgcG9ydHMgYXMgd2VsbFxuICAgICAgICAgICAgdmFyIHggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnggKyBwb3J0c1tpXS54ICogKCBub2RlLndpZHRoKCkgLyByYXRpbyApIC8gMTAwO1xuICAgICAgICAgICAgdmFyIHkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnkgKyBwb3J0c1tpXS55ICogKCBub2RlLmhlaWdodCgpIC8gcmF0aW8gKSAvIDEwMDtcblxuICAgICAgICAgICAgZ2x5cGguYWRkUG9ydChuZXcgbGlic2JnbmpzLlBvcnQoe2lkOiBwb3J0c1tpXS5pZCwgeDogeCwgeTogeX0pKTtcbiAgICAgICAgfVxuICAgICAgICAvL2FkZCBzdGF0ZSBhbmQgaW5mbyBib3ggaW5mb3JtYXRpb25cbiAgICAgICAgZm9yKHZhciBpID0gMCA7IGkgPCBub2RlLl9wcml2YXRlLmRhdGEuc3RhdGVzYW5kaW5mb3MubGVuZ3RoIDsgaSsrKXtcbiAgICAgICAgICAgIHZhciBib3hHbHlwaCA9IG5vZGUuX3ByaXZhdGUuZGF0YS5zdGF0ZXNhbmRpbmZvc1tpXTtcbiAgICAgICAgICAgIHZhciBzdGF0ZXNhbmRpbmZvc0lkID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmlkK1wiX1wiK2k7XG4gICAgICAgICAgICBpZihib3hHbHlwaC5jbGF6eiA9PT0gXCJzdGF0ZSB2YXJpYWJsZVwiKXtcbiAgICAgICAgICAgICAgICBnbHlwaC5hZGRHbHlwaE1lbWJlcih0aGlzLmFkZFN0YXRlQm94R2x5cGgoYm94R2x5cGgsIHN0YXRlc2FuZGluZm9zSWQsIG5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoYm94R2x5cGguY2xhenogPT09IFwidW5pdCBvZiBpbmZvcm1hdGlvblwiKXtcbiAgICAgICAgICAgICAgICBnbHlwaC5hZGRHbHlwaE1lbWJlcih0aGlzLmFkZEluZm9Cb3hHbHlwaChib3hHbHlwaCwgc3RhdGVzYW5kaW5mb3NJZCwgbm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGZvciBhbm5vdGF0aW9uc1xuICAgICAgICBpZiAobm9kZS5kYXRhKCdhbm5vdGF0aW9ucycpICYmICEkLmlzRW1wdHlPYmplY3Qobm9kZS5kYXRhKCdhbm5vdGF0aW9ucycpKSkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IHNlbGYuZ2V0T3JDcmVhdGVFeHRlbnNpb24oZ2x5cGgpO1xuICAgICAgICAgICAgdmFyIGFubm90RXh0ID0gc2VsZi5nZXRBbm5vdGF0aW9uRXh0ZW5zaW9uKG5vZGUpO1xuICAgICAgICAgICAgZXh0ZW5zaW9uLmFkZChhbm5vdEV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgZ2x5cGggbWVtYmVycyB0aGF0IGFyZSBub3Qgc3RhdGUgdmFyaWFibGVzIG9yIHVuaXQgb2YgaW5mbzogc3VidW5pdHNcbiAgICAgICAgaWYobm9kZUNsYXNzID09PSBcImNvbXBsZXhcIiB8fCBub2RlQ2xhc3MgPT09IFwic3VibWFwXCIpe1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oZWxlLCBpKXtcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZ2x5cGhNZW1iZXJMaXN0ID0gc2VsZi5nZXRHbHlwaFNiZ25tbChlbGUpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaSA8IGdseXBoTWVtYmVyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaC5hZGRHbHlwaE1lbWJlcihnbHlwaE1lbWJlckxpc3RbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld3RFeHRTdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgaGFzTmV3dEV4dCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGFkZCBpbmZvIGZvciBjb2xsYXBzZWQgbm9kZXNcbiAgICAgICAgaWYobm9kZS5kYXRhKCdjb2xsYXBzZWRDaGlsZHJlbicpKSB7XG4gICAgICAgICAgICBuZXd0RXh0U3RyaW5nICs9IFwiPGNvbGxhcHNlZC8+XCI7XG4gICAgICAgICAgICBoYXNOZXd0RXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBpbmZvIGZvciBoaWRkZW4gbm9kZXNcbiAgICAgICAgaWYobm9kZS5oaWRkZW4oKSkge1xuICAgICAgICAgICAgbmV3dEV4dFN0cmluZyArPSBcIjxoaWRkZW4vPlwiO1xuICAgICAgICAgICAgaGFzTmV3dEV4dCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgc3RyaW5nIHRvIGEgbmV3IGV4dGVuc2lvbiBmb3IgdGhpcyBnbHlwaFxuICAgICAgICBpZihoYXNOZXd0RXh0KSB7XG4gICAgICAgICAgICB2YXIgZXh0ZW5zaW9uID0gc2VsZi5nZXRPckNyZWF0ZUV4dGVuc2lvbihnbHlwaCk7XG4gICAgICAgICAgICBleHRlbnNpb24uYWRkKFwiPG5ld3Q+XCIrbmV3dEV4dFN0cmluZytcIjwvbmV3dD5cIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleHRlbnNpb24udG9YTUwoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjdXJyZW50IGdseXBoIGlzIGRvbmVcbiAgICAgICAgZ2x5cGhMaXN0LnB1c2goZ2x5cGgpO1xuXG4gICAgICAgIC8vIGtlZXAgZ29pbmcgd2l0aCBhbGwgdGhlIGluY2x1ZGVkIGdseXBoc1xuICAgICAgICBpZihub2RlQ2xhc3MgPT09IFwiY29tcGFydG1lbnRcIil7XG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuKFwiOnZpc2libGVcIikuZWFjaChmdW5jdGlvbihlbGUsIGkpe1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdseXBoTGlzdCA9IGdseXBoTGlzdC5jb25jYXQoc2VsZi5nZXRHbHlwaFNiZ25tbChlbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICBnbHlwaExpc3Q7XG4gICAgfSxcblxuICAgIC8vIGVsZW1lbnQ6IGEgbGlic2Jnbi5qcyBnbHlwaCBvciBlZGdlIG9iamVjdFxuICAgIGdldE9yQ3JlYXRlRXh0ZW5zaW9uOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHZhciBleHRlbnNpb247XG4gICAgICAgIGlmKGVsZW1lbnQuZXh0ZW5zaW9uKSB7IC8vIGFuIGV4dGVuc2lvbiBpcyBhbHJlYWR5IHRoZXJlIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgIGV4dGVuc2lvbiA9IGVsZW1lbnQuZXh0ZW5zaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXh0ZW5zaW9uID0gbmV3IGxpYnNiZ25qcy5FeHRlbnNpb24oKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjtcbiAgICB9LFxuXG4gICAgZ2V0QXJjU2Jnbm1sIDogZnVuY3Rpb24oZWRnZSl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgLy9UZW1wb3JhcnkgaGFjayB0byByZXNvbHZlIFwidW5kZWZpbmVkXCIgYXJjIHNvdXJjZSBhbmQgdGFyZ2V0c1xuICAgICAgICB2YXIgYXJjVGFyZ2V0ID0gZWRnZS5fcHJpdmF0ZS5kYXRhLnBvcnR0YXJnZXQ7XG4gICAgICAgIHZhciBhcmNTb3VyY2UgPSBlZGdlLl9wcml2YXRlLmRhdGEucG9ydHNvdXJjZTtcblxuICAgICAgICBpZiAoYXJjU291cmNlID09IG51bGwgfHwgYXJjU291cmNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIGFyY1NvdXJjZSA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgaWYgKGFyY1RhcmdldCA9PSBudWxsIHx8IGFyY1RhcmdldC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICBhcmNUYXJnZXQgPSBlZGdlLl9wcml2YXRlLmRhdGEudGFyZ2V0O1xuXG4gICAgICAgIHZhciBhcmNJZCA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGFyYyA9IG5ldyBsaWJzYmduanMuQXJjKHtpZDogYXJjSWQsIHNvdXJjZTogYXJjU291cmNlLCB0YXJnZXQ6IGFyY1RhcmdldCwgY2xhc3NfOiBlZGdlLl9wcml2YXRlLmRhdGEuY2xhc3N9KTtcblxuICAgICAgICBhcmMuc2V0U3RhcnQobmV3IGxpYnNiZ25qcy5TdGFydFR5cGUoe3g6IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2guc3RhcnRYLCB5OiBlZGdlLl9wcml2YXRlLnJzY3JhdGNoLnN0YXJ0WX0pKTtcblxuICAgICAgICAvLyBFeHBvcnQgYmVuZCBwb2ludHMgaWYgZWRnZUJlbmRFZGl0aW5nRXh0ZW5zaW9uIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgaWYgKGN5LmVkZ2VCZW5kRWRpdGluZyAmJiBjeS5lZGdlQmVuZEVkaXRpbmcoJ2luaXRpYWxpemVkJykpIHtcbiAgICAgICAgICB2YXIgc2VncHRzID0gY3kuZWRnZUJlbmRFZGl0aW5nKCdnZXQnKS5nZXRTZWdtZW50UG9pbnRzKGVkZ2UpO1xuICAgICAgICAgIGlmKHNlZ3B0cyl7XG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBzZWdwdHMgJiYgaSA8IHNlZ3B0cy5sZW5ndGg7IGkgPSBpICsgMil7XG4gICAgICAgICAgICAgIHZhciBiZW5kWCA9IHNlZ3B0c1tpXTtcbiAgICAgICAgICAgICAgdmFyIGJlbmRZID0gc2VncHRzW2kgKyAxXTtcblxuICAgICAgICAgICAgICBhcmMuYWRkTmV4dChuZXcgbGlic2JnbmpzLk5leHRUeXBlKHt4OiBiZW5kWCwgeTogYmVuZFl9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXJjLnNldEVuZChuZXcgbGlic2JnbmpzLkVuZFR5cGUoe3g6IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2guZW5kWCwgeTogZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lbmRZfSkpO1xuXG4gICAgICAgIHZhciBjYXJkaW5hbGl0eSA9IGVkZ2UuX3ByaXZhdGUuZGF0YS5jYXJkaW5hbGl0eTtcbiAgICAgICAgaWYodHlwZW9mIGNhcmRpbmFsaXR5ICE9ICd1bmRlZmluZWQnICYmIGNhcmRpbmFsaXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFyYy5hZGRHbHlwaChuZXcgbGlic2JnbmpzLkdseXBoKHtcbiAgICAgICAgICAgICAgICBpZDogYXJjLmlkKydfY2FyZCcsXG4gICAgICAgICAgICAgICAgY2xhc3NfOiAnY2FyZGluYWxpdHknLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgbGlic2JnbmpzLkxhYmVsKHt0ZXh0OiBjYXJkaW5hbGl0eX0pLFxuICAgICAgICAgICAgICAgIGJib3g6IG5ldyBsaWJzYmduanMuQmJveCh7eDogMCwgeTogMCwgdzogMCwgaDogMH0pIC8vIGR1bW15IGJib3gsIG5lZWRlZCBmb3IgZm9ybWF0IGNvbXBsaWFuY2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBmb3IgYW5ub3RhdGlvbnNcbiAgICAgICAgaWYgKGVkZ2UuZGF0YSgnYW5ub3RhdGlvbnMnKSAmJiAhJC5pc0VtcHR5T2JqZWN0KGVkZ2UuZGF0YSgnYW5ub3RhdGlvbnMnKSkpIHtcbiAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBzZWxmLmdldE9yQ3JlYXRlRXh0ZW5zaW9uKGFyYyk7XG4gICAgICAgICAgICB2YXIgYW5ub3RFeHQgPSB0aGlzLmdldEFubm90YXRpb25FeHRlbnNpb24oZWRnZSk7XG4gICAgICAgICAgICBleHRlbnNpb24uYWRkKGFubm90RXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBpbmZvIGZvciBoaWRkZW4gZWRnZXNcbiAgICAgICAgaWYoZWRnZS5oaWRkZW4oKSkge1xuICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IHNlbGYuZ2V0T3JDcmVhdGVFeHRlbnNpb24oYXJjKTtcbiAgICAgICAgICAgIGV4dGVuc2lvbi5hZGQoXCI8bmV3dD48aGlkZGVuLz48L25ld3Q+XCIpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXh0ZW5zaW9uLnRvWE1MKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgYWRkR2x5cGhCYm94IDogZnVuY3Rpb24obm9kZSl7XG4gICAgICAgIHZhciB3aWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gICAgICAgIFxuICAgICAgICB2YXIgX2NsYXNzID0gbm9kZS5kYXRhKCdjbGFzcycpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgdGhlIG5vZGUgY2FuIGhhdmUgcG9ydHMgYW5kIGl0IGhhcyBleGFjdGx5IDIgcG9ydHMgdGhlbiBpdCBpcyByZXByZXNlbnRlZCBieSBhIGJpZ2dlciBiYm94LlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgcmVwcmVzZW50IGl0IGFzIGEgcG9seWdvbiBhbmQgc28gdGhlIHdob2xlIHNoYXBlIGluY2x1ZGluZyB0aGUgcG9ydHMgYXJlIHJlbmRlcmVkIGluIHRoZSBub2RlIGJib3guXG4gICAgICAgIGlmIChlbGVtZW50VXRpbGl0aWVzLmNhbkhhdmVQb3J0cyhfY2xhc3MpKSB7XG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSgncG9ydHMnKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwb3J0cyBhcmUgc3ltbWV0cmljIHRvIHRoZSBub2RlIGNlbnRlciBzbyB1c2luZyBqdXN0IG9uZSBvZiB0aGUgcG9ydHMgaXMgZW5vdWdoXG4gICAgICAgICAgICB2YXIgcG9ydCA9IG5vZGUuZGF0YSgncG9ydHMnKVswXTtcbiAgICAgICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHBvcnQueCA9PT0gMCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByYXRpbyBvZiB0aGUgYXJlYSBvY2N1cGllZCB3aXRoIHBvcnRzIG92ZXIgd2l0aG91dCBwb3J0c1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0LnkpIC8gNTAgOiBNYXRoLmFicyhwb3J0LngpIC8gNTA7XG4gICAgICAgICAgICAvLyBEaXZpZGUgdGhlIGJib3ggdG8gdGhlIGNhbGN1bGF0ZWQgcmF0aW8gdG8gZ2V0IHRoZSBiYm94IG9mIHRoZSBhY3R1YWwgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHNcbiAgICAgICAgICAgIHdpZHRoIC89IHJhdGlvO1xuICAgICAgICAgICAgaGVpZ2h0IC89IHJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnggLSB3aWR0aC8yO1xuICAgICAgICB2YXIgeSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueSAtIGhlaWdodC8yO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBsaWJzYmduanMuQmJveCh7eDogeCwgeTogeSwgdzogd2lkdGgsIGg6IGhlaWdodH0pO1xuICAgIH0sXG5cbiAgICBhZGRTdGF0ZUFuZEluZm9CYm94IDogZnVuY3Rpb24obm9kZSwgYm94R2x5cGgpe1xuICAgICAgICBib3hCYm94ID0gYm94R2x5cGguYmJveDtcblxuICAgICAgICB2YXIgeCA9IGJveEJib3gueCAvIDEwMCAqIG5vZGUud2lkdGgoKTtcbiAgICAgICAgdmFyIHkgPSBib3hCYm94LnkgLyAxMDAgKiBub2RlLmhlaWdodCgpO1xuXG4gICAgICAgIHggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnggKyAoeCAtIGJveEJib3gudy8yKTtcbiAgICAgICAgeSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueSArICh5IC0gYm94QmJveC5oLzIpO1xuXG4gICAgICAgIHJldHVybiBuZXcgbGlic2JnbmpzLkJib3goe3g6IHgsIHk6IHksIHc6IGJveEJib3gudywgaDogYm94QmJveC5ofSk7XG4gICAgfSxcblxuICAgIGFkZFN0YXRlQm94R2x5cGggOiBmdW5jdGlvbihub2RlLCBpZCwgbWFpbkdseXBoKXtcblxuICAgICAgICB2YXIgZ2x5cGggPSBuZXcgbGlic2JnbmpzLkdseXBoKHtpZDogaWQsIGNsYXNzXzogJ3N0YXRlIHZhcmlhYmxlJ30pO1xuICAgICAgICB2YXIgc3RhdGUgPSBuZXcgbGlic2JnbmpzLlN0YXRlVHlwZSgpO1xuICAgICAgICBpZih0eXBlb2Ygbm9kZS5zdGF0ZS52YWx1ZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlID0gbm9kZS5zdGF0ZS52YWx1ZTtcbiAgICAgICAgaWYodHlwZW9mIG5vZGUuc3RhdGUudmFyaWFibGUgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICBzdGF0ZS52YXJpYWJsZSA9IG5vZGUuc3RhdGUudmFyaWFibGU7XG4gICAgICAgIGdseXBoLnNldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgZ2x5cGguc2V0QmJveCh0aGlzLmFkZFN0YXRlQW5kSW5mb0Jib3gobWFpbkdseXBoLCBub2RlKSk7XG5cbiAgICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH0sXG5cbiAgICBhZGRJbmZvQm94R2x5cGggOiBmdW5jdGlvbihub2RlLCBpZCwgbWFpbkdseXBoKXtcbiAgICAgICAgdmFyIGdseXBoID0gbmV3IGxpYnNiZ25qcy5HbHlwaCh7aWQ6IGlkLCBjbGFzc186ICd1bml0IG9mIGluZm9ybWF0aW9uJ30pO1xuICAgICAgICB2YXIgbGFiZWwgPSBuZXcgbGlic2JnbmpzLkxhYmVsKCk7XG4gICAgICAgIGlmKHR5cGVvZiBub2RlLmxhYmVsLnRleHQgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICBsYWJlbC50ZXh0ID0gbm9kZS5sYWJlbC50ZXh0O1xuICAgICAgICBnbHlwaC5zZXRMYWJlbChsYWJlbCk7XG4gICAgICAgIGdseXBoLnNldEJib3godGhpcy5hZGRTdGF0ZUFuZEluZm9CYm94KG1haW5HbHlwaCwgbm9kZSkpO1xuXG4gICAgICAgIC8vIGFzc2lnbiBjb3JyZWN0IGVudGl0eSB0YWcgZm9yIEFGIGNhc2VcbiAgICAgICAgdmFyIGVudGl0eU5hbWUgPSBudWxsO1xuICAgICAgICBzd2l0Y2gobWFpbkdseXBoLl9wcml2YXRlLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ0JBIHVuc3BlY2lmaWVkIGVudGl0eSc6ICAgZW50aXR5TmFtZSA9IFwidW5zcGVjaWZpZWQgZW50aXR5XCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkEgc2ltcGxlIGNoZW1pY2FsJzogICAgICBlbnRpdHlOYW1lID0gXCJzaW1wbGUgY2hlbWljYWxcIjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQSBtYWNyb21vbGVjdWxlJzogICAgICAgIGVudGl0eU5hbWUgPSBcIm1hY3JvbW9sZWN1bGVcIjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQSBudWNsZWljIGFjaWQgZmVhdHVyZSc6IGVudGl0eU5hbWUgPSBcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkEgcGVydHVyYmluZyBhZ2VudCc6ICAgICBlbnRpdHlOYW1lID0gXCJwZXJ0dXJiYXRpb25cIjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQSBjb21wbGV4JzogICAgICAgICAgICAgIGVudGl0eU5hbWUgPSBcImNvbXBsZXhcIjsgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW50aXR5IHRhZyBhcmVuJ3QgYWx3YXlzIHRoZXJlLCBvbmx5IGZvciBBRlxuICAgICAgICAvLyBidXQgd2Ugc3RpbGwgbmVlZCB0byBrZWVwIHRoaXMgaW5mb3JtYXRpb24gZm9yIHVua25vd24gbWFwIHR5cGVcbiAgICAgICAgaWYoZW50aXR5TmFtZSkge1xuICAgICAgICAgICAgZ2x5cGguc2V0RW50aXR5KG5ldyBsaWJzYmduanMuRW50aXR5VHlwZSh7bmFtZTogZW50aXR5TmFtZX0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnbHlwaDtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25Ub1NiZ25tbDtcbiIsIi8qXG4gKiBMaXN0ZW4gZG9jdW1lbnQgZm9yIGtleWJvYXJkIGlucHV0cyBhbmQgZXhwb3J0cyB0aGUgdXRpbGl0aWVzIHRoYXQgaXQgbWFrZXMgdXNlIG9mXG4gKi9cbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcblxudmFyIGxpYnMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG52YXIga2V5Ym9hcmRJbnB1dFV0aWxpdGllcyA9IHtcbiAgaXNOdW1iZXJLZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gKCBlLmtleUNvZGUgPj0gNDggJiYgZS5rZXlDb2RlIDw9IDU3ICkgfHwgKCBlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSApO1xuICB9LFxuICBpc0RvdEtleTogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBlLmtleUNvZGUgPT09IDE5MDtcbiAgfSxcbiAgaXNNaW51c1NpZ25LZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS5rZXlDb2RlID09PSAxMDkgfHwgZS5rZXlDb2RlID09PSAxODk7XG4gIH0sXG4gIGlzTGVmdEtleTogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBlLmtleUNvZGUgPT09IDM3O1xuICB9LFxuICBpc1JpZ2h0S2V5OiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMzk7XG4gIH0sXG4gIGlzQmFja3NwYWNlS2V5OiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUua2V5Q29kZSA9PT0gODtcbiAgfSxcbiAgaXNUYWJLZXk6IGZ1bmN0aW9uKGUpIHtcbiAgICByZXR1cm4gZS5rZXlDb2RlID09PSA5O1xuICB9LFxuICBpc0VudGVyS2V5OiBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGUua2V5Q29kZSA9PT0gMTM7XG4gIH0sXG4gIGlzSW50ZWdlckZpZWxkSW5wdXQ6IGZ1bmN0aW9uKHZhbHVlLCBlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDdHJsT3JDb21tYW5kUHJlc3NlZChlKSB8fCB0aGlzLmlzTWludXNTaWduS2V5KGUpIHx8IHRoaXMuaXNOdW1iZXJLZXkoZSkgXG4gICAgICAgICAgICB8fCB0aGlzLmlzQmFja3NwYWNlS2V5KGUpIHx8IHRoaXMuaXNUYWJLZXkoZSkgfHwgdGhpcy5pc0xlZnRLZXkoZSkgfHwgdGhpcy5pc1JpZ2h0S2V5KGUpIHx8IHRoaXMuaXNFbnRlcktleShlKTtcbiAgfSxcbiAgaXNGbG9hdEZpZWxkSW5wdXQ6IGZ1bmN0aW9uKHZhbHVlLCBlKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyRmllbGRJbnB1dCh2YWx1ZSwgZSkgfHwgdGhpcy5pc0RvdEtleShlKTtcbiAgfSxcbiAgaXNDdHJsT3JDb21tYW5kUHJlc3NlZDogZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5O1xuICB9XG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgJy5pbnRlZ2VyLWlucHV0JywgZnVuY3Rpb24oZSl7XG4gICAgdmFyIHZhbHVlID0gJCh0aGlzKS5hdHRyKCd2YWx1ZScpO1xuICAgIHJldHVybiBrZXlib2FyZElucHV0VXRpbGl0aWVzLmlzSW50ZWdlckZpZWxkSW5wdXQodmFsdWUsIGUpO1xuICB9KTtcbiAgXG4gICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgJy5mbG9hdC1pbnB1dCcsIGZ1bmN0aW9uKGUpe1xuICAgIHZhciB2YWx1ZSA9ICQodGhpcykuYXR0cigndmFsdWUnKTtcbiAgICByZXR1cm4ga2V5Ym9hcmRJbnB1dFV0aWxpdGllcy5pc0Zsb2F0RmllbGRJbnB1dCh2YWx1ZSwgZSk7XG4gIH0pO1xuICBcbiAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcuaW50ZWdlci1pbnB1dCwuZmxvYXQtaW5wdXQnLCBmdW5jdGlvbihlKXtcbiAgICB2YXIgbWluICAgPSAkKHRoaXMpLmF0dHIoJ21pbicpO1xuICAgIHZhciBtYXggICA9ICQodGhpcykuYXR0cignbWF4Jyk7XG4gICAgdmFyIHZhbHVlID0gcGFyc2VGbG9hdCgkKHRoaXMpLnZhbCgpKTtcbiAgICBcbiAgICBpZihtaW4gIT0gbnVsbCkge1xuICAgICAgbWluID0gcGFyc2VGbG9hdChtaW4pO1xuICAgIH1cbiAgICBcbiAgICBpZihtYXggIT0gbnVsbCkge1xuICAgICAgbWF4ID0gcGFyc2VGbG9hdChtYXgpO1xuICAgIH1cbiAgICBcbiAgICBpZihtaW4gIT0gbnVsbCAmJiB2YWx1ZSA8IG1pbikge1xuICAgICAgdmFsdWUgPSBtaW47XG4gICAgfVxuICAgIGVsc2UgaWYobWF4ICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHtcbiAgICAgIHZhbHVlID0gbWF4O1xuICAgIH1cbiAgICBcbiAgICBpZihpc05hTih2YWx1ZSkpIHtcbiAgICAgIGlmKG1pbiAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gbWluO1xuICAgICAgfVxuICAgICAgZWxzZSBpZihtYXggIT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IG1heDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgICQodGhpcykudmFsKFwiXCIgKyB2YWx1ZSk7XG4gIH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5Ym9hcmRJbnB1dFV0aWxpdGllcztcbiIsIi8qIFxuICogVXRpbGl0eSBmaWxlIHRvIGdldCBhbmQgc2V0IHRoZSBsaWJyYXJpZXMgdG8gd2hpY2ggc2JnbnZpeiBpcyBkZXBlbmRlbnQgZnJvbSBhbnkgZmlsZS5cbiAqL1xuXG52YXIgbGliVXRpbGl0aWVzID0gZnVuY3Rpb24oKXtcbn07XG5cbmxpYlV0aWxpdGllcy5zZXRMaWJzID0gZnVuY3Rpb24obGlicykge1xuICB0aGlzLmxpYnMgPSBsaWJzO1xufTtcblxubGliVXRpbGl0aWVzLmdldExpYnMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubGlicztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbGliVXRpbGl0aWVzO1xuXG4iLCIvKiBcbiAqIFRoZXNlIGFyZSB0aGUgbWFpbiB1dGlsaXRpZXMgdG8gYmUgZGlyZWN0bHkgdXRpbGl6ZWQgYnkgdGhlIHVzZXIgaW50ZXJhY3Rpb25zLlxuICogSWRlYWx5LCB0aGlzIGZpbGUgaXMganVzdCByZXF1aXJlZCBieSBpbmRleC5qc1xuICovXG5cbnZhciBlbGVtZW50VXRpbGl0aWVzID0gcmVxdWlyZSgnLi9lbGVtZW50LXV0aWxpdGllcycpO1xudmFyIGpzb25Ub1NiZ25tbCA9IHJlcXVpcmUoJy4vanNvbi10by1zYmdubWwtY29udmVydGVyJyk7XG52YXIgc2Jnbm1sVG9Kc29uID0gcmVxdWlyZSgnLi9zYmdubWwtdG8tanNvbi1jb252ZXJ0ZXInKTtcbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBncmFwaFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vZ3JhcGgtdXRpbGl0aWVzJyk7XG5cbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcblxuLy8gSGVscGVycyBzdGFydFxuZnVuY3Rpb24gYmVmb3JlUGVyZm9ybUxheW91dCgpIHtcbiAgdmFyIHBhcmVudHMgPSBjeS5ub2RlcygnOnBhcmVudCcpO1xuICB2YXIgZWRnZXMgPSBjeS5lZGdlcygpO1xuICBcbiAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gIC8vIGdyYXBoVXRpbGl0aWVzLmRpc2FibGVQb3J0cygpO1xuXG4gIC8vIFRPRE8gZG8gdGhpcyBieSB1c2luZyBleHRlbnNpb24gQVBJXG4gIGN5LiQoJy5lZGdlYmVuZGVkaXRpbmctaGFzYmVuZHBvaW50cycpLnJlbW92ZUNsYXNzKCdlZGdlYmVuZGVkaXRpbmctaGFzYmVuZHBvaW50cycpO1xuICBlZGdlcy5zY3JhdGNoKCdjeWVkZ2ViZW5kZWRpdGluZ1dlaWdodHMnLCBbXSk7XG4gIGVkZ2VzLnNjcmF0Y2goJ2N5ZWRnZWJlbmRlZGl0aW5nRGlzdGFuY2VzJywgW10pO1xuICBcbiAgcGFyZW50cy5yZW1vdmVEYXRhKCdtaW5XaWR0aCcpO1xuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbkhlaWdodCcpO1xuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbldpZHRoQmlhc0xlZnQnKTtcbiAgcGFyZW50cy5yZW1vdmVEYXRhKCdtaW5XaWR0aEJpYXNSaWdodCcpO1xuICBwYXJlbnRzLnJlbW92ZURhdGEoJ21pbkhlaWdodEJpYXNUb3AnKTtcbiAgcGFyZW50cy5yZW1vdmVEYXRhKCdtaW5IZWlnaHRCaWFzQm90dG9tJyk7XG4gIFxuICBjeS5lbmRCYXRjaCgpO1xuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xufTtcbi8vIEhlbHBlcnMgZW5kXG5cbmZ1bmN0aW9uIG1haW5VdGlsaXRpZXMoKSB7fVxuXG4vLyBFeHBhbmQgZ2l2ZW4gbm9kZXMuIFJlcXVpcmVzIGV4cGFuZENvbGxhcHNlIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzIHVuZG9hYmxlIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuZXhwYW5kTm9kZXMgPSBmdW5jdGlvbihub2Rlcykge1xuICAvLyBHZXQgZXhwYW5kQ29sbGFwc2UgYXBpXG4gIHZhciBleHBhbmRDb2xsYXBzZSA9IGN5LmV4cGFuZENvbGxhcHNlKCdnZXQnKTtcbiAgXG4gIHZhciBub2Rlc1RvRXhwYW5kID0gZXhwYW5kQ29sbGFwc2UuZXhwYW5kYWJsZU5vZGVzKG5vZGVzKTtcbiAgaWYgKG5vZGVzVG9FeHBhbmQubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJleHBhbmRcIiwge1xuICAgICAgbm9kZXM6IG5vZGVzVG9FeHBhbmQsXG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZXhwYW5kQ29sbGFwc2UuZXhwYW5kKG5vZGVzKTtcbiAgfVxufTtcblxuLy8gQ29sbGFwc2UgZ2l2ZW4gbm9kZXMuIFJlcXVpcmVzIGV4cGFuZENvbGxhcHNlIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzIHVuZG9hYmxlIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuY29sbGFwc2VOb2RlcyA9IGZ1bmN0aW9uKG5vZGVzKSB7XG4gIC8vIEdldCBleHBhbmRDb2xsYXBzZSBhcGlcbiAgdmFyIGV4cGFuZENvbGxhcHNlID0gY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpO1xuICBcbiAgaWYgKGV4cGFuZENvbGxhcHNlLmNvbGxhcHNpYmxlTm9kZXMobm9kZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImNvbGxhcHNlXCIsIHtcbiAgICAgIG5vZGVzOiBub2Rlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGV4cGFuZENvbGxhcHNlLmNvbGxhcHNlKG5vZGVzKTtcbiAgfVxufTtcblxuLy8gQ29sbGFwc2UgYWxsIGNvbXBsZXhlcyByZWN1cnNpdmVseS4gUmVxdWlyZXMgZXhwYW5kQ29sbGFwc2UgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxubWFpblV0aWxpdGllcy5jb2xsYXBzZUNvbXBsZXhlcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBHZXQgZXhwYW5kQ29sbGFwc2UgYXBpXG4gIHZhciBleHBhbmRDb2xsYXBzZSA9IGN5LmV4cGFuZENvbGxhcHNlKCdnZXQnKTtcbiAgXG4gIHZhciBjb21wbGV4ZXMgPSBjeS5ub2RlcyhcIltjbGFzc149J2NvbXBsZXgnXVwiKTtcbiAgaWYgKGV4cGFuZENvbGxhcHNlLmNvbGxhcHNpYmxlTm9kZXMoY29tcGxleGVzKS5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiY29sbGFwc2VSZWN1cnNpdmVseVwiLCB7XG4gICAgICBub2RlczogY29tcGxleGVzXG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZXhwYW5kQ29sbGFwc2UuY29sbGFwc2VSZWN1cnNpdmVseShjb21wbGV4ZXMpO1xuICB9XG59O1xuXG4vLyBFeHBhbmQgYWxsIGNvbXBsZXhlcyByZWN1cnNpdmVseS4gUmVxdWlyZXMgZXhwYW5kQ29sbGFwc2UgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxubWFpblV0aWxpdGllcy5leHBhbmRDb21wbGV4ZXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gR2V0IGV4cGFuZENvbGxhcHNlIGFwaVxuICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBjeS5leHBhbmRDb2xsYXBzZSgnZ2V0Jyk7XG4gIFxuICB2YXIgbm9kZXMgPSBleHBhbmRDb2xsYXBzZS5leHBhbmRhYmxlTm9kZXMoY3kubm9kZXMoKS5maWx0ZXIoXCJbY2xhc3NePSdjb21wbGV4J11cIikpO1xuICBpZiAobm9kZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImV4cGFuZFJlY3Vyc2l2ZWx5XCIsIHtcbiAgICAgIG5vZGVzOiBub2Rlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGV4cGFuZENvbGxhcHNlLmV4cGFuZFJlY3Vyc2l2ZWx5KG5vZGVzKTtcbiAgfVxufTtcblxuLy8gQ29sbGFwc2UgYWxsIG5vZGVzIHJlY3Vyc2l2ZWx5LiBSZXF1aXJlcyBleHBhbmRDb2xsYXBzZSBleHRlbnNpb24gYW5kIGNvbnNpZGVycyB1bmRvYWJsZSBvcHRpb24uXG5tYWluVXRpbGl0aWVzLmNvbGxhcHNlQWxsID0gZnVuY3Rpb24oKSB7XG4gIC8vIEdldCBleHBhbmRDb2xsYXBzZSBhcGlcbiAgdmFyIGV4cGFuZENvbGxhcHNlID0gY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpO1xuICBcbiAgdmFyIG5vZGVzID0gY3kubm9kZXMoJzp2aXNpYmxlJyk7XG4gIGlmIChleHBhbmRDb2xsYXBzZS5jb2xsYXBzaWJsZU5vZGVzKG5vZGVzKS5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiY29sbGFwc2VSZWN1cnNpdmVseVwiLCB7XG4gICAgICBub2Rlczogbm9kZXNcbiAgICB9KTtcbiAgfVxuICBlbHNlIHtcbiAgICBleHBhbmRDb2xsYXBzZS5jb2xsYXBzZVJlY3Vyc2l2ZWx5KG5vZGVzKTtcbiAgfVxufTtcblxuLy8gRXhwYW5kIGFsbCBub2RlcyByZWN1cnNpdmVseS4gUmVxdWlyZXMgZXhwYW5kQ29sbGFwc2UgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxubWFpblV0aWxpdGllcy5leHBhbmRBbGwgPSBmdW5jdGlvbigpIHtcbiAgLy8gR2V0IGV4cGFuZENvbGxhcHNlIGFwaVxuICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBjeS5leHBhbmRDb2xsYXBzZSgnZ2V0Jyk7XG4gIFxuICB2YXIgbm9kZXMgPSBleHBhbmRDb2xsYXBzZS5leHBhbmRhYmxlTm9kZXMoY3kubm9kZXMoJzp2aXNpYmxlJykpO1xuICBpZiAobm9kZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImV4cGFuZFJlY3Vyc2l2ZWx5XCIsIHtcbiAgICAgIG5vZGVzOiBub2Rlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGV4cGFuZENvbGxhcHNlLmV4cGFuZFJlY3Vyc2l2ZWx5KG5vZGVzKTtcbiAgfVxufTtcblxuLy8gSW5jcmVhc2UgYm9yZGVyIHdpZHRoIHRvIHNob3cgbm9kZXMgd2l0aCBoaWRkZW4gbmVpZ2hib3JzXG5tYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIgPSBmdW5jdGlvbihlbGVzKXtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGUgKXtcbiAgICB2YXIgZGVmYXVsdEJvcmRlcldpZHRoID0gTnVtYmVyKGVsZS5kYXRhKFwiYm9yZGVyLXdpZHRoXCIpKTtcbiAgICBlbGUuZGF0YShcImJvcmRlci13aWR0aFwiLCBkZWZhdWx0Qm9yZGVyV2lkdGggKyAyKTtcbiAgfSk7XG4gIGVsZXMuZGF0YShcInRoaWNrQm9yZGVyXCIsIHRydWUpO1xuICByZXR1cm4gZWxlcztcbn1cbi8vIERlY3JlYXNlIGJvcmRlciB3aWR0aCB3aGVuIGhpZGRlbiBuZWlnaGJvcnMgb2YgdGhlIG5vZGVzIGJlY29tZSB2aXNpYmxlXG5tYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIgPSBmdW5jdGlvbihlbGVzKXtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uKCBlbGUgKXtcbiAgICB2YXIgZGVmYXVsdEJvcmRlcldpZHRoID0gTnVtYmVyKGVsZS5kYXRhKFwiYm9yZGVyLXdpZHRoXCIpKTtcbiAgICBlbGUuZGF0YShcImJvcmRlci13aWR0aFwiLCBkZWZhdWx0Qm9yZGVyV2lkdGggLSAyKTtcbiAgfSk7XG4gIGVsZXMucmVtb3ZlRGF0YShcInRoaWNrQm9yZGVyXCIpO1xuICByZXR1cm4gZWxlcztcbn1cblxuLy8gRXh0ZW5kcyB0aGUgZ2l2ZW4gbm9kZXMgbGlzdCBpbiBhIHNtYXJ0IHdheSB0byBsZWF2ZSB0aGUgbWFwIGludGFjdCBhbmQgaGlkZXMgdGhlIHJlc3VsdGluZyBsaXN0LiBcbi8vIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLmhpZGVOb2Rlc1NtYXJ0ID0gZnVuY3Rpb24oX25vZGVzKSB7XG4gIC8vIElmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIHdlIGNhbiBhc3N1bWUgdGhhdCB2aWV3IHV0aWxpdGllcyBleHRlbnNpb24gaXMgb24gdXNlXG4gIHZhciB2aWV3VXRpbGl0aWVzID0gY3kudmlld1V0aWxpdGllcygnZ2V0Jyk7XG4gIHZhciBub2RlcyA9IF9ub2Rlcy5ub2RlcygpOyAvLyBFbnN1cmUgdGhhdCBub2RlcyBsaXN0IGp1c3QgaW5jbHVkZSBub2Rlc1xuICBcbiAgdmFyIGFsbE5vZGVzID0gY3kubm9kZXMoXCI6dmlzaWJsZVwiKTtcbiAgdmFyIG5vZGVzVG9TaG93ID0gZWxlbWVudFV0aWxpdGllcy5leHRlbmRSZW1haW5pbmdOb2Rlcyhub2RlcywgYWxsTm9kZXMpO1xuICB2YXIgbm9kZXNUb0hpZGUgPSBhbGxOb2Rlcy5ub3Qobm9kZXNUb1Nob3cpO1xuXG4gIGlmIChub2Rlc1RvSGlkZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBcbiAgICB2YXIgdXIgPSBjeS51bmRvUmVkbygpO1xuICAgIHVyLmFjdGlvbihcInRoaWNrZW5Cb3JkZXJcIiwgbWFpblV0aWxpdGllcy50aGlja2VuQm9yZGVyLCBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIpO1xuICAgIHVyLmFjdGlvbihcInRoaW5Cb3JkZXJcIiwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyLCBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIpO1xuICAgIFxuICAgIC8vIEJhdGNoaW5nXG4gICAgdmFyIGFjdGlvbnMgPSBbXTsgXG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCkuaW50ZXJzZWN0aW9uKG5vZGVzVG9IaWRlKTtcbiAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwidGhpbkJvcmRlclwiLCBwYXJhbTogbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3J9KTsgXG4gICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcImhpZGVcIiwgcGFyYW06IG5vZGVzVG9IaWRlfSk7XG4gICAgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBub2Rlc1RvSGlkZS5uZWlnaGJvcmhvb2QoXCI6dmlzaWJsZVwiKVxuICAgICAgICAgICAgLm5vZGVzKCkuZGlmZmVyZW5jZShub2Rlc1RvSGlkZSkuZGlmZmVyZW5jZShjeS5ub2RlcyhcIlt0aGlja0JvcmRlcl1cIikpO1xuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJ0aGlja2VuQm9yZGVyXCIsIHBhcmFtOiBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcn0pOyAgXG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImJhdGNoXCIsIGFjdGlvbnMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIobm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IpO1xuICAgIHZpZXdVdGlsaXRpZXMuaGlkZShub2Rlc1RvSGlkZSk7XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCc6dmlzaWJsZScpO1xuICAgIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gIH1cbn07XG5cbi8vIEV4dGVuZHMgdGhlIGdpdmVuIG5vZGVzIGxpc3QgaW4gYSBzbWFydCB3YXkgdG8gbGVhdmUgdGhlIG1hcCBpbnRhY3QuIFxuLy8gVGhlbiB1bmhpZGVzIHRoZSByZXN1bHRpbmcgbGlzdCBhbmQgaGlkZXMgb3RoZXJzLiBSZXF1aXJlcyB2aWV3VXRpbGl0aWVzIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5zaG93Tm9kZXNTbWFydCA9IGZ1bmN0aW9uKF9ub2Rlcykge1xuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICB2YXIgbm9kZXMgPSBfbm9kZXMubm9kZXMoKTsgLy8gRW5zdXJlIHRoYXQgbm9kZXMgbGlzdCBqdXN0IGluY2x1ZGUgbm9kZXNcbiAgXG4gIHZhciBhbGxOb2RlcyA9IGN5LmVsZW1lbnRzKCk7XG4gIHZhciBub2Rlc1RvU2hvdyA9IGVsZW1lbnRVdGlsaXRpZXMuZXh0ZW5kTm9kZUxpc3Qobm9kZXMpO1xuICB2YXIgbm9kZXNUb0hpZGUgPSBhbGxOb2Rlcy5ub3Qobm9kZXNUb1Nob3cpO1xuICBcbiAgaWYgKG5vZGVzVG9IaWRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgaWYob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIHZhciB1ciA9IGN5LnVuZG9SZWRvKCk7XG4gICAgdXIuYWN0aW9uKFwidGhpY2tlbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcik7XG4gICAgdXIuYWN0aW9uKFwidGhpbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcik7XG4gICAgXG4gICAgLy8gQmF0Y2hpbmdcbiAgICB2YXIgYWN0aW9ucyA9IFtdOyAgICBcbiAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoJzp2aXNpYmxlJyk7XG4gICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInRoaW5Cb3JkZXJcIiwgcGFyYW06IG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yfSk7ICBcbiAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwiaGlkZVwiLCBwYXJhbTogbm9kZXNUb0hpZGV9KTtcbiAgICBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IG5vZGVzVG9IaWRlLm5laWdoYm9yaG9vZChcIjp2aXNpYmxlXCIpXG4gICAgICAgICAgICAubm9kZXMoKS5kaWZmZXJlbmNlKG5vZGVzVG9IaWRlKTtcbiAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwidGhpY2tlbkJvcmRlclwiLCBwYXJhbTogbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3J9KTsgIFxuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJiYXRjaFwiLCBhY3Rpb25zKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoJzp2aXNpYmxlJyk7XG4gICAgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yKTtcbiAgICB2aWV3VXRpbGl0aWVzLmhpZGUobm9kZXNUb0hpZGUpO1xuICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICBtYWluVXRpbGl0aWVzLnRoaWNrZW5Cb3JkZXIobm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IpO1xuICB9XG59O1xuXG4vLyBVbmhpZGVzIGVsZW1lbnRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNob3dFbGVzID0gZnVuY3Rpb24oZWxlcykge1xuICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIHdlIGNhbiBhc3N1bWUgdGhhdCB2aWV3IHV0aWxpdGllcyBleHRlbnNpb24gaXMgb24gdXNlXG4gICAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKCc6aGlkZGVuJyk7XG4gICAgaWYgKGhpZGRlbkVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYob3B0aW9ucy51bmRvYWJsZSkge1xuICAgICAgICB2YXIgdXIgPSBjeS51bmRvUmVkbygpO1xuICAgICAgICB1ci5hY3Rpb24oXCJ0aGlja2VuQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKTtcbiAgICAgICAgdXIuYWN0aW9uKFwidGhpbkJvcmRlclwiLCBtYWluVXRpbGl0aWVzLnRoaW5Cb3JkZXIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBCYXRjaGluZ1xuICAgICAgICB2YXIgYWN0aW9ucyA9IFtdO1xuICAgICAgICB2YXIgbm9kZXNUb1RoaW5Cb3JkZXIgPSAoaGlkZGVuRWxlcy5uZWlnaGJvcmhvb2QoXCI6dmlzaWJsZVwiKS5ub2RlcyhcIlt0aGlja0JvcmRlcl1cIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kaWZmZXJlbmNlKGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5kaWZmZXJlbmNlKGhpZGRlbkVsZXMuZWRnZXMoKS51bmlvbihoaWRkZW5FbGVzLm5vZGVzKCkuY29ubmVjdGVkRWRnZXMoKSkpLmNvbm5lY3RlZE5vZGVzKCkpO1xuICAgICAgICBhY3Rpb25zLnB1c2goe25hbWU6IFwidGhpbkJvcmRlclwiLCBwYXJhbTogbm9kZXNUb1RoaW5Cb3JkZXJ9KTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInNob3dcIiwgcGFyYW06IGhpZGRlbkVsZXN9KTtcbiAgICAgICAgdmFyIG5vZGVzVG9UaGlja2VuQm9yZGVyID0gaGlkZGVuRWxlcy5ub2RlcygpLmVkZ2VzV2l0aChjeS5ub2RlcyhcIjpoaWRkZW5cIikuZGlmZmVyZW5jZShoaWRkZW5FbGVzLm5vZGVzKCkpKVxuXHQgICAgICAgICAgICAuY29ubmVjdGVkTm9kZXMoKS5pbnRlcnNlY3Rpb24oaGlkZGVuRWxlcy5ub2RlcygpKTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInRoaWNrZW5Cb3JkZXJcIiwgcGFyYW06IG5vZGVzVG9UaGlja2VuQm9yZGVyfSk7XG4gICAgICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJiYXRjaFwiLCBhY3Rpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvciA9IGN5LmVkZ2VzKFwiOmhpZGRlblwiKS5jb25uZWN0ZWROb2RlcygnOnZpc2libGUnKTtcbiAgICAgICAgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yKTtcbiAgICAgICAgdmlld1V0aWxpdGllcy5zaG93KGVsZXMpO1xuICAgICAgICB2YXIgbm9kZXNXaXRoSGlkZGVuTmVpZ2hib3IgPSBjeS5lZGdlcyhcIjpoaWRkZW5cIikuY29ubmVjdGVkTm9kZXMoJzp2aXNpYmxlJyk7XG4gICAgICAgIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gICAgfVxufTtcblxuLy8gVW5oaWRlcyBhbGwgZWxlbWVudHMuIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNob3dBbGwgPSBmdW5jdGlvbigpIHtcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgXG4gIGlmIChjeS5lbGVtZW50cygpLmxlbmd0aCA9PT0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgdmFyIHVyID0gY3kudW5kb1JlZG8oKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGlja2VuQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpY2tlbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGluQm9yZGVyKTtcbiAgICB1ci5hY3Rpb24oXCJ0aGluQm9yZGVyXCIsIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlciwgbWFpblV0aWxpdGllcy50aGlja2VuQm9yZGVyKTtcbiAgICBcbiAgICAvLyBCYXRjaGluZyAgIFxuICAgIHZhciBhY3Rpb25zID0gW107XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kubm9kZXMoXCJbdGhpY2tCb3JkZXJdXCIpO1xuICAgIGFjdGlvbnMucHVzaCh7bmFtZTogXCJ0aGluQm9yZGVyXCIsIHBhcmFtOiBub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcn0pOyAgXG4gICAgYWN0aW9ucy5wdXNoKHtuYW1lOiBcInNob3dcIiwgcGFyYW06IGN5LmVsZW1lbnRzKCl9KTtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiYmF0Y2hcIiwgYWN0aW9ucyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmFyIG5vZGVzV2l0aEhpZGRlbk5laWdoYm9yID0gY3kuZWRnZXMoXCI6aGlkZGVuXCIpLmNvbm5lY3RlZE5vZGVzKCc6dmlzaWJsZScpO1xuICAgIG1haW5VdGlsaXRpZXMudGhpbkJvcmRlcihub2Rlc1dpdGhIaWRkZW5OZWlnaGJvcik7XG4gICAgdmlld1V0aWxpdGllcy5zaG93KGN5LmVsZW1lbnRzKCkpO1xuICB9XG59O1xuXG4vLyBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50cyBpbiBhIHNpbXBsZSB3YXkuIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuZGVsZXRlRWxlc1NpbXBsZSA9IGZ1bmN0aW9uKGVsZXMpIHtcbiAgaWYgKGVsZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImRlbGV0ZUVsZXNTaW1wbGVcIiwge1xuICAgICAgZWxlczogZWxlc1xuICAgIH0pO1xuICB9XG4gIGVsc2Uge1xuICAgIGVsZXMucmVtb3ZlKCk7XG4gIH1cbn07XG5cbi8vIEV4dGVuZHMgdGhlIGdpdmVuIG5vZGVzIGxpc3QgaW4gYSBzbWFydCB3YXkgdG8gbGVhdmUgdGhlIG1hcCBpbnRhY3QgYW5kIHJlbW92ZXMgdGhlIHJlc3VsdGluZyBsaXN0LiBcbi8vIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuZGVsZXRlTm9kZXNTbWFydCA9IGZ1bmN0aW9uKF9ub2Rlcykge1xuICB2YXIgbm9kZXMgPSBfbm9kZXMubm9kZXMoKTtcbiAgaWYgKG5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZihvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImRlbGV0ZU5vZGVzU21hcnRcIiwge1xuICAgICAgZmlyc3RUaW1lOiB0cnVlLFxuICAgICAgZWxlczogbm9kZXNcbiAgICB9KTtcbiAgfVxuICBlbHNlIHtcbiAgICBlbGVtZW50VXRpbGl0aWVzLmRlbGV0ZU5vZGVzU21hcnQobm9kZXMpO1xuICB9XG59O1xuXG4vLyBIaWdobGlnaHRzIHNlbGVjdGVkIGVsZW1lbnRzLiBSZXF1aXJlcyB2aWV3VXRpbGl0aWVzIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5oaWdobGlnaHRTZWxlY3RlZCA9IGZ1bmN0aW9uKF9lbGVzKSB7XG5cbiAgdmFyIGVsZXNUb0hpZ2hsaWdodCA9IF9lbGVzO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbm90SGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoXCIubm90aGlnaGxpZ2h0ZWRcIikuZmlsdGVyKFwiOnZpc2libGVcIik7XG4gIHZhciBoaWdobGlnaHRlZEVsZXMgPSBjeS5lbGVtZW50cygnOnZpc2libGUnKS5kaWZmZXJlbmNlKG5vdEhpZ2hsaWdodGVkRWxlcyk7XG4gIGlmIChlbGVzVG9IaWdobGlnaHQuc2FtZShoaWdobGlnaHRlZEVsZXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwiaGlnaGxpZ2h0XCIsIGVsZXNUb0hpZ2hsaWdodCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmlld1V0aWxpdGllcy5oaWdobGlnaHQoZWxlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBcbiAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xufTtcblxuLy8gSGlnaGxpZ2h0cyBuZWlnaGJvdXJzIG9mIHRoZSBnaXZlbiBub2Rlcy4gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMuaGlnaGxpZ2h0TmVpZ2hib3VycyA9IGZ1bmN0aW9uKF9ub2Rlcykge1xuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgdmFyIG5vZGVzID0gX25vZGVzLm5vZGVzKCk7IC8vIEVuc3VyZSB0aGF0IG5vZGVzIGxpc3QganVzdCBpbmNsdWRlIG5vZGVzXG4gIHZhciBlbGVzVG9IaWdobGlnaHQgPSBlbGVtZW50VXRpbGl0aWVzLmdldE5laWdoYm91cnNPZk5vZGVzKG5vZGVzKTtcbiAgaWYgKGVsZXNUb0hpZ2hsaWdodC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdEhpZ2hsaWdodGVkRWxlcyA9IGN5LmVsZW1lbnRzKFwiLm5vdGhpZ2hsaWdodGVkXCIpLmZpbHRlcihcIjp2aXNpYmxlXCIpO1xuICB2YXIgaGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykuZGlmZmVyZW5jZShub3RIaWdobGlnaHRlZEVsZXMpO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0LnNhbWUoaGlnaGxpZ2h0ZWRFbGVzKSAmJiAhY3kuZWxlbWVudHMoXCI6dW5zZWxlY3RlZFwiKS5lbXB0eSgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAob3B0aW9ucy51bmRvYWJsZSkge1xuICAgIGN5LnVuZG9SZWRvKCkuZG8oXCJoaWdobGlnaHRcIiwgZWxlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLmhpZ2hsaWdodChlbGVzVG9IaWdobGlnaHQpO1xuICB9XG4gIFxuICBjeS5lbGVtZW50cygpLnVuc2VsZWN0KCk7XG59O1xuXG4vLyBGaW5kcyB0aGUgZWxlbWVudHMgd2hvc2UgbGFiZWwgaW5jbHVkZXMgdGhlIGdpdmVuIGxhYmVsIGFuZCBoaWdobGlnaHRzIHByb2Nlc3NlcyBvZiB0aG9zZSBlbGVtZW50cy5cbi8vIFJlcXVpcmVzIHZpZXdVdGlsaXRpZXMgZXh0ZW5zaW9uIGFuZCBjb25zaWRlcnMgJ3VuZG9hYmxlJyBvcHRpb24uXG5tYWluVXRpbGl0aWVzLnNlYXJjaEJ5TGFiZWwgPSBmdW5jdGlvbihsYWJlbCkge1xuICBpZiAobGFiZWwubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIHZhciBub2Rlc1RvSGlnaGxpZ2h0ID0gY3kubm9kZXMoXCI6dmlzaWJsZVwiKS5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGVsZSA9IGk7XG4gICAgfVxuICAgIGlmIChlbGUuZGF0YShcImxhYmVsXCIpICYmIGVsZS5kYXRhKFwibGFiZWxcIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKGxhYmVsKSA+PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcblxuICBpZiAobm9kZXNUb0hpZ2hsaWdodC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcblxuICBub2Rlc1RvSGlnaGxpZ2h0ID0gZWxlbWVudFV0aWxpdGllcy5leHRlbmROb2RlTGlzdChub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImhpZ2hsaWdodFwiLCBub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLmhpZ2hsaWdodChub2Rlc1RvSGlnaGxpZ2h0KTtcbiAgfVxuICBcbiAgY3kuZWxlbWVudHMoKS51bnNlbGVjdCgpO1xufTtcblxuLy8gSGlnaGxpZ2h0cyBwcm9jZXNzZXMgb2YgdGhlIGdpdmVuIG5vZGVzLiBSZXF1aXJlcyB2aWV3VXRpbGl0aWVzIGV4dGVuc2lvbiBhbmQgY29uc2lkZXJzICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5oaWdobGlnaHRQcm9jZXNzZXMgPSBmdW5jdGlvbihfbm9kZXMpIHtcbiAgdmFyIG5vZGVzID0gX25vZGVzLm5vZGVzKCk7IC8vIEVuc3VyZSB0aGF0IG5vZGVzIGxpc3QganVzdCBpbmNsdWRlIG5vZGVzXG4gIHZhciBlbGVzVG9IaWdobGlnaHQgPSBlbGVtZW50VXRpbGl0aWVzLmV4dGVuZE5vZGVMaXN0KG5vZGVzKTtcbiAgaWYgKGVsZXNUb0hpZ2hsaWdodC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vdEhpZ2hsaWdodGVkRWxlcyA9IGN5LmVsZW1lbnRzKFwiLm5vdGhpZ2hsaWdodGVkXCIpLmZpbHRlcihcIjp2aXNpYmxlXCIpO1xuICB2YXIgaGlnaGxpZ2h0ZWRFbGVzID0gY3kuZWxlbWVudHMoJzp2aXNpYmxlJykuZGlmZmVyZW5jZShub3RIaWdobGlnaHRlZEVsZXMpO1xuICBpZiAoZWxlc1RvSGlnaGxpZ2h0LnNhbWUoaGlnaGxpZ2h0ZWRFbGVzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBcbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgd2UgY2FuIGFzc3VtZSB0aGF0IHZpZXcgdXRpbGl0aWVzIGV4dGVuc2lvbiBpcyBvbiB1c2VcbiAgdmFyIHZpZXdVdGlsaXRpZXMgPSBjeS52aWV3VXRpbGl0aWVzKCdnZXQnKTtcbiAgXG4gIGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG4gICAgY3kudW5kb1JlZG8oKS5kbyhcImhpZ2hsaWdodFwiLCBlbGVzVG9IaWdobGlnaHQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZpZXdVdGlsaXRpZXMuaGlnaGxpZ2h0KGVsZXNUb0hpZ2hsaWdodCk7XG4gIH1cbiAgXG4gIGN5LmVsZW1lbnRzKCkudW5zZWxlY3QoKTtcbn07XG5cbi8vIFVuaGlnaGxpZ2h0cyBhbnkgaGlnaGxpZ2h0ZWQgZWxlbWVudC4gUmVxdWlyZXMgdmlld1V0aWxpdGllcyBleHRlbnNpb24gYW5kIGNvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi5cbm1haW5VdGlsaXRpZXMucmVtb3ZlSGlnaGxpZ2h0cyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoZWxlbWVudFV0aWxpdGllcy5ub25lSXNOb3RIaWdobGlnaHRlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3ZSBjYW4gYXNzdW1lIHRoYXQgdmlldyB1dGlsaXRpZXMgZXh0ZW5zaW9uIGlzIG9uIHVzZVxuICB2YXIgdmlld1V0aWxpdGllcyA9IGN5LnZpZXdVdGlsaXRpZXMoJ2dldCcpO1xuICBcbiAgaWYgKG9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwicmVtb3ZlSGlnaGxpZ2h0c1wiKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2aWV3VXRpbGl0aWVzLnJlbW92ZUhpZ2hsaWdodHMoKTtcbiAgfVxuICBjeS5zdHlsZSgpLnVwZGF0ZSgpO1xufTtcblxuLy8gUGVyZm9ybXMgbGF5b3V0IGJ5IGdpdmVuIGxheW91dE9wdGlvbnMuIENvbnNpZGVycyAndW5kb2FibGUnIG9wdGlvbi4gSG93ZXZlciwgYnkgc2V0dGluZyBub3RVbmRvYWJsZSBwYXJhbWV0ZXJcbi8vIHRvIGEgdHJ1dGh5IHZhbHVlIHlvdSBjYW4gZm9yY2UgYW4gdW5kYWJsZSBsYXlvdXQgb3BlcmF0aW9uIGluZGVwZW5kYW50IG9mICd1bmRvYWJsZScgb3B0aW9uLlxubWFpblV0aWxpdGllcy5wZXJmb3JtTGF5b3V0ID0gZnVuY3Rpb24obGF5b3V0T3B0aW9ucywgbm90VW5kb2FibGUpIHtcbiAgLy8gVGhpbmdzIHRvIGRvIGJlZm9yZSBwZXJmb3JtaW5nIGxheW91dFxuICBiZWZvcmVQZXJmb3JtTGF5b3V0KCk7XG4gIFxuICBpZiAoIW9wdGlvbnMudW5kb2FibGUgfHwgbm90VW5kb2FibGUpIHsgLy8gJ25vdFVuZG9hYmxlJyBmbGFnIGNhbiBiZSB1c2VkIHRvIGhhdmUgY29tcG9zaXRlIGFjdGlvbnMgaW4gdW5kby9yZWRvIHN0YWNrXG4gICAgdmFyIGxheW91dCA9IGN5LmVsZW1lbnRzKCkuZmlsdGVyKCc6dmlzaWJsZScpLmxheW91dChsYXlvdXRPcHRpb25zKTtcbiAgICBcbiAgICAvLyBDaGVjayB0aGlzIGZvciBjeXRvc2NhcGUuanMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChsYXlvdXQgJiYgbGF5b3V0LnJ1bikge1xuICAgICAgbGF5b3V0LnJ1bigpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBjeS51bmRvUmVkbygpLmRvKFwibGF5b3V0XCIsIHtcbiAgICAgIG9wdGlvbnM6IGxheW91dE9wdGlvbnMsXG4gICAgICBlbGVzOiBjeS5lbGVtZW50cygpLmZpbHRlcignOnZpc2libGUnKVxuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGVzIGFuIHNiZ25tbCBmaWxlIGNvbnRlbnQgZnJvbSB0aGUgZXhpc2luZyBncmFwaCBhbmQgcmV0dXJucyBpdC5cbm1haW5VdGlsaXRpZXMuY3JlYXRlU2Jnbm1sID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKCk7XG59O1xuXG4vLyBDb252ZXJ0cyBnaXZlbiBzYmdubWwgZGF0YSB0byBhIGpzb24gb2JqZWN0IGluIGEgc3BlY2lhbCBmb3JtYXQgXG4vLyAoaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI25vdGF0aW9uL2VsZW1lbnRzLWpzb24pIGFuZCByZXR1cm5zIGl0LlxubWFpblV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9Kc29uID0gZnVuY3Rpb24oZGF0YSkge1xuICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQoZGF0YSk7XG59O1xuXG4vLyBDcmVhdGUgdGhlIHF0aXAgY29udGVudHMgb2YgdGhlIGdpdmVuIG5vZGUgYW5kIHJldHVybnMgaXQuXG5tYWluVXRpbGl0aWVzLmdldFF0aXBDb250ZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRRdGlwQ29udGVudChub2RlKTtcbn07XG5cbi8vIENoYW5nZSBvcHRpb25cbm1haW5VdGlsaXRpZXMuc2V0U2hvd0NvbXBsZXhOYW1lID0gZnVuY3Rpb24oc2hvd0NvbXBsZXhOYW1lKSB7XG4gIG9wdGlvbnMuc2hvd0NvbXBsZXhOYW1lID0gc2hvd0NvbXBsZXhOYW1lO1xuICAvLyBtYWtlIGNoYW5nZSBhY3RpdmUgYnkgdHJpZ2dlcmluZyBkYXRhIHdoaWNoIHdpbGwgdHJpZ2dlciBzdHlsZSB1cGRhdGVcbiAgY3kubm9kZXMoJ1tjbGFzc149XCJjb21wbGV4XCJdJykuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgIGVsZS50cmlnZ2VyKFwiZGF0YVwiKTtcbiAgfSk7XG59O1xuXG4vKlxuICogU2V0cyB0aGUgb3JkZXJpbmcgb2YgdGhlIGdpdmVuIG5vZGVzLlxuICogT3JkZXJpbmcgb3B0aW9ucyBhcmUgJ0wtdG8tUicsICdSLXRvLUwnLCAnVC10by1CJywgJ0ItdG8tVCcsICdub25lJy5cbiAqIElmIGEgbm9kZSBkb2VzIG5vdCBoYXZlIGFueSBwb3J0IGJlZm9yZSB0aGUgb3BlcmF0aW9uIGFuZCBpdCBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgYWZ0ZXIgb3BlcmF0aW9uIHRoZSBwb3J0RGlzdGFuY2UgcGFyYW1ldGVyIGlzIFxuICogdXNlZCB0byBzZXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGUgY2VudGVyIGFuZCB0aGUgcG9ydHMuIFRoZSBkZWZhdWx0IHBvcnQgZGlzdGFuY2UgaXMgNjAuXG4gKiBDb25zaWRlcnMgdW5kb2FibGUgb3B0aW9uLlxuICovXG5tYWluVXRpbGl0aWVzLnNldFBvcnRzT3JkZXJpbmcgPSBmdW5jdGlvbiAobm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UpIHtcbiAgaWYgKCBub2Rlcy5sZW5ndGggPT09IDAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICBpZiAoIW9wdGlvbnMudW5kb2FibGUpIHtcbiAgICBlbGVtZW50VXRpbGl0aWVzLnNldFBvcnRzT3JkZXJpbmcobm9kZXMsIG9yZGVyaW5nLCBwb3J0RGlzdGFuY2UpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBwYXJhbSA9IHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIG9yZGVyaW5nOiBvcmRlcmluZyxcbiAgICAgIHBvcnREaXN0YW5jZTogcG9ydERpc3RhbmNlXG4gICAgfTtcbiAgICBcbiAgICBjeS51bmRvUmVkbygpLmRvKFwic2V0UG9ydHNPcmRlcmluZ1wiLCBwYXJhbSk7XG4gIH1cbiAgXG4gIGN5LnN0eWxlKCkudXBkYXRlKCk7XG59O1xuXG4vKipcbiAqIEdldCBtYXAgcHJvcGVydGllcyBmcm9tIFNCR05NTCBmaWxlXG4gKiBOZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZmlsZSBpcyBsb2FkZWQgLSBzYmdudml6TG9hZEZpbGVFbmQgZXZlbnRcbiAqIHJldHVybjogbWFwIHByb3BlcnRpZXMgYXMgb2JqZWN0XG4gKi9cbm1haW5VdGlsaXRpZXMuZ2V0TWFwUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gc2Jnbm1sVG9Kc29uLm1hcFByb3BlcnRpZXNUb09iaigpO1xuIH1cblxubW9kdWxlLmV4cG9ydHMgPSBtYWluVXRpbGl0aWVzO1xuIiwiLypcbiAqICBFeHRlbmQgZGVmYXVsdCBvcHRpb25zIGFuZCBnZXQgY3VycmVudCBvcHRpb25zIGJ5IHVzaW5nIHRoaXMgZmlsZSBcbiAqL1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbnZhciBkZWZhdWx0cyA9IHtcbiAgLy8gVGhlIHBhdGggb2YgY29yZSBsaWJyYXJ5IGltYWdlcyB3aGVuIHNiZ252aXogaXMgcmVxdWlyZWQgZnJvbSBucG0gYW5kIHRoZSBpbmRleCBodG1sIFxuICAvLyBmaWxlIGFuZCBub2RlX21vZHVsZXMgYXJlIHVuZGVyIHRoZSBzYW1lIGZvbGRlciB0aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGZpbmVcbiAgaW1nUGF0aDogJ25vZGVfbW9kdWxlcy9zYmdudml6L3NyYy9pbWcnLFxuICAvLyBXaGV0aGVyIHRvIGZpdCBsYWJlbHMgdG8gbm9kZXNcbiAgZml0TGFiZWxzVG9Ob2RlczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZml0TGFiZWxzVG9JbmZvYm94ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGR5bmFtaWMgbGFiZWwgc2l6ZSBpdCBtYXkgYmUgJ3NtYWxsJywgJ3JlZ3VsYXInLCAnbGFyZ2UnXG4gIGR5bmFtaWNMYWJlbFNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ3JlZ3VsYXInO1xuICB9LFxuICAvLyBwZXJjZW50YWdlIHVzZWQgdG8gY2FsY3VsYXRlIGNvbXBvdW5kIHBhZGRpbmdzXG4gIGNvbXBvdW5kUGFkZGluZzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAxMDtcbiAgfSxcbiAgaW1wcm92ZUZsb3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBleHRyYSBwYWRkaW5nIGZvciBjb21wYXJ0bWVudCBhbmQgY29tcGxleGVzXG4gIGV4dHJhQ29tcGFydG1lbnRQYWRkaW5nOiAxMCxcbiAgZXh0cmFDb21wbGV4UGFkZGluZzogMTAsXG4gIC8vIFdldGhlciB0byBkaXNwbGF5IHRoZSBjb21wbGV4J3MgbGFiZWxzLCBsaWtlIGNvbXBhcnRtZW50cy5cbiAgLy8gV2lsbCBhbHNvIGluY3JlYXNlIHRoZSBwYWRkaW5ncyBieSBleHRyYUNvbXBvdW5kUGFkZGluZyB0byBtYWtlIHJvb20gZm9yIHRoZSBuYW1lLlxuICBzaG93Q29tcGxleE5hbWU6IGZhbHNlLFxuICAvLyBUaGUgc2VsZWN0b3Igb2YgdGhlIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBzYmduIG5ldHdvcmtcbiAgbmV0d29ya0NvbnRhaW5lclNlbGVjdG9yOiAnI3NiZ24tbmV0d29yay1jb250YWluZXInLFxuICAvLyBXaGV0aGVyIHRoZSBhY3Rpb25zIGFyZSB1bmRvYWJsZSwgcmVxdWlyZXMgY3l0b3NjYXBlLXVuZG8tcmVkbyBleHRlbnNpb25cbiAgdW5kb2FibGU6IHRydWVcbn07XG5cbnZhciBvcHRpb25VdGlsaXRpZXMgPSBmdW5jdGlvbiAoKSB7XG59O1xuXG4vLyBFeHRlbmQgdGhlIGRlZmF1bHRzIG9wdGlvbnMgd2l0aCB0aGUgdXNlciBvcHRpb25zXG5vcHRpb25VdGlsaXRpZXMuZXh0ZW5kT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRzKSB7XG4gICAgcmVzdWx0W3Byb3BdID0gZGVmYXVsdHNbcHJvcF07XG4gIH1cbiAgXG4gIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykge1xuICAgIHJlc3VsdFtwcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gIH1cblxuICBvcHRpb25VdGlsaXRpZXMub3B0aW9ucyA9IHJlc3VsdDtcblxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbm9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gb3B0aW9uVXRpbGl0aWVzLm9wdGlvbnM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGlvblV0aWxpdGllcztcbiIsInZhciBlbGVtZW50VXRpbGl0aWVzID0gcmVxdWlyZSgnLi9lbGVtZW50LXV0aWxpdGllcycpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xudmFyIGdyYXBoVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9ncmFwaC11dGlsaXRpZXMnKTtcbnZhciBsaWJzYmduanMgPSByZXF1aXJlKCdsaWJzYmduLmpzJyk7XG52YXIgbGlicyA9IHJlcXVpcmUoJy4vbGliLXV0aWxpdGllcycpLmdldExpYnMoKTtcbnZhciBwYXJzZVN0cmluZyA9IHJlcXVpcmUoJ3htbDJqcycpLnBhcnNlU3RyaW5nO1xuXG52YXIgc2Jnbm1sVG9Kc29uID0ge1xuICBpbnNlcnRlZE5vZGVzOiB7fSxcbiAgbWFwOiB1bmRlZmluZWQsXG4gIGdldEFsbENvbXBhcnRtZW50czogZnVuY3Rpb24gKGdseXBoTGlzdCkge1xuICAgIHZhciBjb21wYXJ0bWVudHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZ2x5cGhMaXN0W2ldLmNsYXNzXyA9PSAnY29tcGFydG1lbnQnKSB7XG4gICAgICAgIHZhciBjb21wYXJ0bWVudCA9IGdseXBoTGlzdFtpXTtcbiAgICAgICAgdmFyIGJib3ggPSBjb21wYXJ0bWVudC5iYm94O1xuICAgICAgICBjb21wYXJ0bWVudHMucHVzaCh7XG4gICAgICAgICAgJ3gnOiBwYXJzZUZsb2F0KGJib3gueCksXG4gICAgICAgICAgJ3knOiBwYXJzZUZsb2F0KGJib3gueSksXG4gICAgICAgICAgJ3cnOiBwYXJzZUZsb2F0KGJib3gudyksXG4gICAgICAgICAgJ2gnOiBwYXJzZUZsb2F0KGJib3guaCksXG4gICAgICAgICAgJ2lkJzogY29tcGFydG1lbnQuaWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzLnNvcnQoZnVuY3Rpb24gKGMxLCBjMikge1xuICAgICAgaWYgKGMxLmggKiBjMS53IDwgYzIuaCAqIGMyLncpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGMxLmggKiBjMS53ID4gYzIuaCAqIGMyLncpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wYXJ0bWVudHM7XG4gIH0sXG4gIGlzSW5Cb3VuZGluZ0JveDogZnVuY3Rpb24gKGJib3gxLCBiYm94Mikge1xuICAgIGlmIChiYm94MS54ID4gYmJveDIueCAmJlxuICAgICAgICBiYm94MS55ID4gYmJveDIueSAmJlxuICAgICAgICBiYm94MS54ICsgYmJveDEudyA8IGJib3gyLnggKyBiYm94Mi53ICYmXG4gICAgICAgIGJib3gxLnkgKyBiYm94MS5oIDwgYmJveDIueSArIGJib3gyLmgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGJib3hQcm9wOiBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGJib3ggPSB7fTtcbiAgICBiYm94LnggPSBlbGUuYmJveC54O1xuICAgIGJib3gueSA9IGVsZS5iYm94Lnk7XG4gICAgYmJveC53ID0gZWxlLmJib3gudztcbiAgICBiYm94LmggPSBlbGUuYmJveC5oO1xuICAgIFxuICAgIHZhciBjaGlsZE5vZGVzID0gZWxlLmdseXBoTWVtYmVycztcbiAgICB2YXIgbWluTGVmdCwgbWF4UmlnaHQsIG1pblRvcCwgbWF4Qm90dG9tLCBjaGlsZHJlbkJib3hXLCBjaGlsZHJlbkJib3hIO1xuICAgIHZhciBjb21wb3VuZDtcblxuICAgIC8vIFRyYXZlcnNlIHRoZSBvdGhlciBjaGlsZHJlbiBhbmQgdXBkYXRlIHRoZSBleHRyZW1lIHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZE5vZGUuY2xhc3NfID09PSAnc3RhdGUgdmFyaWFibGUnIHx8IGNoaWxkTm9kZS5jbGFzc18gPT09ICd1bml0IG9mIGluZm9ybWF0aW9uJykge1xuICAgICAgICBjb250aW51ZTsgLy8gRWxlbWluYXRlIHN0YXRlIHZhcmlhYmxlcyBhbmQgaW5mbyBib3hlc1xuICAgICAgfVxuXG4gICAgICBjb21wb3VuZCA9IHRydWU7XG5cbiAgICAgIHZhciBjaGlsZE5vZGVCYm94ID0gY2hpbGROb2RlLmJib3g7XG4gICAgICB2YXIgbGVmdCA9IGNoaWxkTm9kZUJib3gueDtcbiAgICAgIHZhciByaWdodCA9IGNoaWxkTm9kZUJib3gueCArIGNoaWxkTm9kZUJib3gudztcbiAgICAgIHZhciB0b3AgPSBjaGlsZE5vZGVCYm94Lnk7XG4gICAgICB2YXIgYm90dG9tID0gY2hpbGROb2RlQmJveC55ICsgY2hpbGROb2RlQmJveC5oO1xuXG4gICAgICBpZiAobWluTGVmdCA9PT0gdW5kZWZpbmVkIHx8IGxlZnQgPCBtaW5MZWZ0KSB7XG4gICAgICAgIG1pbkxlZnQgPSBsZWZ0O1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4UmlnaHQgPT09IHVuZGVmaW5lZCB8fCByaWdodCA+IG1heFJpZ2h0KSB7XG4gICAgICAgIG1heFJpZ2h0ID0gcmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChtaW5Ub3AgPT09IHVuZGVmaW5lZCB8fCB0b3AgPCBtaW5Ub3ApIHtcbiAgICAgICAgbWluVG9wID0gdG9wO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4Qm90dG9tID09PSB1bmRlZmluZWQgfHwgYm90dG9tID4gbWF4Qm90dG9tKSB7XG4gICAgICAgIG1heEJvdHRvbSA9IGJvdHRvbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29tcG91bmQpIHtcbiAgICAgIC8vIFRoZSBzaXplcyBvZiBjaGlsZHJlbiBiYm94IGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGV4dHJlbWUgY29vcmRpbmF0ZXNcbiAgICAgIGNoaWxkcmVuQmJveFcgPSBtYXhSaWdodCAtIG1pbkxlZnQ7XG4gICAgICBjaGlsZHJlbkJib3hIID0gbWF4Qm90dG9tIC0gbWluVG9wO1xuXG4gICAgICAvLyBJZiBjaGlsZHJlbiBiYm94IHdpZHRoIGlzIGJpZ2dlciB0aGFuIG5vZGUgYmJveCB3aWR0aCBzZXQgbWluV2lkdGgsIGFuZCBob3Jpem9udGFsIGJpYXNlc1xuICAgICAgaWYgKGNoaWxkcmVuQmJveFcgPCBiYm94LncpIHtcbiAgICAgICAgZWxlLm1pbldpZHRoID0gYmJveC53O1xuICAgICAgICB2YXIgZXh0cmFMZWZ0ID0gIG1pbkxlZnQgLSBiYm94Lng7XG4gICAgICAgIHZhciBleHRyYVJpZ2h0ID0gKGJib3gueCArIGJib3gudykgLSBtYXhSaWdodDtcblxuICAgICAgICBlbGUubWluV2lkdGhCaWFzTGVmdCA9IGV4dHJhTGVmdCAvIChleHRyYUxlZnQgKyBleHRyYVJpZ2h0KSAqIDEwMDtcbiAgICAgICAgZWxlLm1pbldpZHRoQmlhc1JpZ2h0ID0gMTAwIC0gZWxlLm1pbldpZHRoQmlhc0xlZnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGNoaWxkcmVuIGJib3ggaGVpZ2h0IGlzIGJpZ2dlciB0aGFuIG5vZGUgYmJveCBoZWlnaHQgc2V0IG1pbkhlaWdodCwgYW5kIHZlcnRpY2FsIGJpYXNlc1xuICAgICAgaWYgKGNoaWxkcmVuQmJveEggPCBiYm94LmgpIHtcbiAgICAgICAgZWxlLm1pbkhlaWdodCA9IGJib3guaDtcbiAgICAgICAgdmFyIGV4dHJhVG9wID0gbWluVG9wIC0gYmJveC55O1xuICAgICAgICB2YXIgZXh0cmFCb3R0b20gPSAoYmJveC55ICsgYmJveC5oKSAtIG1heEJvdHRvbTtcblxuICAgICAgICBlbGUubWluSGVpZ2h0Qmlhc1RvcCA9IGV4dHJhVG9wIC8gKGV4dHJhVG9wICsgZXh0cmFCb3R0b20pICogMTAwO1xuICAgICAgICBlbGUubWluSGVpZ2h0Qmlhc0JvdHRvbSA9IDEwMCAtIGVsZS5taW5IZWlnaHRCaWFzVG9wO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCBwb3NpdGlvbnMgYXMgY2VudGVyXG4gICAgYmJveC54ID0gcGFyc2VGbG9hdChiYm94LngpICsgcGFyc2VGbG9hdChiYm94LncpIC8gMjtcbiAgICBiYm94LnkgPSBwYXJzZUZsb2F0KGJib3gueSkgKyBwYXJzZUZsb2F0KGJib3guaCkgLyAyO1xuXG4gICAgcmV0dXJuIGJib3g7XG4gIH0sXG4gIHN0YXRlQW5kSW5mb0Jib3hQcm9wOiBmdW5jdGlvbiAoZWxlLCBwYXJlbnRCYm94KSB7XG4gICAgdmFyIHhQb3MgPSBwYXJzZUZsb2F0KHBhcmVudEJib3gueCk7XG4gICAgdmFyIHlQb3MgPSBwYXJzZUZsb2F0KHBhcmVudEJib3gueSk7XG5cbiAgICAvLyBkb24ndCBjb3B5IGRpcmVjdGx5IGVsZS5ib3ggYmVjYXVzZSBpdCBjb250YWlucyBvdGhlciB0aGluZ3MgdGhhbiB4IHkgdyBoXG4gICAgdmFyIGJib3ggPSB7fTtcbiAgICBiYm94LnggPSBlbGUuYmJveC54O1xuICAgIGJib3gueSA9IGVsZS5iYm94Lnk7XG4gICAgYmJveC53ID0gZWxlLmJib3gudztcbiAgICBiYm94LmggPSBlbGUuYmJveC5oO1xuXG4gICAgLy8gc2V0IHBvc2l0aW9ucyBhcyBjZW50ZXJcbiAgICBiYm94LnggPSBwYXJzZUZsb2F0KGJib3gueCkgKyBwYXJzZUZsb2F0KGJib3gudykgLyAyIC0geFBvcztcbiAgICBiYm94LnkgPSBwYXJzZUZsb2F0KGJib3gueSkgKyBwYXJzZUZsb2F0KGJib3guaCkgLyAyIC0geVBvcztcblxuICAgIGJib3gueCA9IGJib3gueCAvIHBhcnNlRmxvYXQocGFyZW50QmJveC53KSAqIDEwMDtcbiAgICBiYm94LnkgPSBiYm94LnkgLyBwYXJzZUZsb2F0KHBhcmVudEJib3guaCkgKiAxMDA7XG5cbiAgICByZXR1cm4gYmJveDtcbiAgfSxcbiAgZmluZENoaWxkTm9kZXM6IGZ1bmN0aW9uIChlbGUsIGNoaWxkVGFnTmFtZSkge1xuICAgIC8vIGZpbmQgY2hpbGQgbm9kZXMgYXQgZGVwdGggbGV2ZWwgb2YgMSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudFxuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IGVsZS5jaGlsZE5vZGVzW2ldO1xuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmIGNoaWxkLnRhZ05hbWUgPT09IGNoaWxkVGFnTmFtZSkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9LFxuICBmaW5kQ2hpbGROb2RlOiBmdW5jdGlvbiAoZWxlLCBjaGlsZFRhZ05hbWUpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmZpbmRDaGlsZE5vZGVzKGVsZSwgY2hpbGRUYWdOYW1lKTtcbiAgICByZXR1cm4gbm9kZXMubGVuZ3RoID4gMCA/IG5vZGVzWzBdIDogdW5kZWZpbmVkO1xuICB9LFxuICBzdGF0ZUFuZEluZm9Qcm9wOiBmdW5jdGlvbiAoZWxlLCBwYXJlbnQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHBhcmVudEJib3ggPSBwYXJlbnQuYmJveDtcbiAgICB2YXIgc3RhdGVBbmRJbmZvQXJyYXkgPSBbXTtcblxuICAgIHZhciBjaGlsZEdseXBocyA9IGVsZS5nbHlwaE1lbWJlcnM7IC8vIHRoaXMuZmluZENoaWxkTm9kZXMoZWxlLCAnZ2x5cGgnKTtcblxuICAgIC8vIGlmIGEgYmlvbG9naWNhbCBhY3Rpdml0eSBub2RlIGhhcyBubyB1bml0IG9mIGluZm8sIGl0IG11c3QgYmUgYSBCQSBwbGFpblxuICAgIGlmKHBhcmVudC5jbGFzcyA9PSBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIiAmJiBjaGlsZEdseXBocy5sZW5ndGggPT0gMCkge1xuICAgICAgcGFyZW50LmNsYXNzID0gXCJCQSBwbGFpblwiO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRHbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGNoaWxkR2x5cGhzW2ldO1xuICAgICAgdmFyIGluZm8gPSB7fTtcblxuICAgICAgaWYgKGdseXBoLmNsYXNzXyA9PT0gJ3VuaXQgb2YgaW5mb3JtYXRpb24nKSB7XG4gICAgICAgIHZhciB1bml0T2ZJbmZvcm1hdGlvbiA9IG5ldyBjbGFzc2VzLlVuaXRPZkluZm9ybWF0aW9uKCk7XG4gICAgICAgIGlmKGdseXBoLmVudGl0eSkge1xuICAgICAgICAgIC8vIGNoYW5nZSB0aGUgcGFyZW50IGNsYXNzIGFjY29yZGluZyB0byBpdHMgdHJ1ZSBjbGFzcyBvZiBiaW9sb2dpY2FsIGFjdGl2aXR5XG4gICAgICAgICAgc3dpdGNoKGdseXBoLmVudGl0eS5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICd1bnNwZWNpZmllZCBlbnRpdHknOiAgICBwYXJlbnQuY2xhc3MgPSBcIkJBIHVuc3BlY2lmaWVkIGVudGl0eVwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NpbXBsZSBjaGVtaWNhbCc6ICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWFjcm9tb2xlY3VsZSc6ICAgICAgICAgcGFyZW50LmNsYXNzID0gXCJCQSBtYWNyb21vbGVjdWxlXCI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnOiAgcGFyZW50LmNsYXNzID0gXCJCQSBudWNsZWljIGFjaWQgZmVhdHVyZVwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BlcnR1cmJhdGlvbic6ICAgICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgcGVydHVyYmluZyBhZ2VudFwiOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXgnOiAgICAgICAgICAgICAgIHBhcmVudC5jbGFzcyA9IFwiQkEgY29tcGxleFwiOyBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5pdE9mSW5mb3JtYXRpb24uc2hhcGVGbiA9IGxpYnMuY3l0b3NjYXBlLnNiZ24uQWZTaGFwZUZuO1xuICAgICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLnNoYXBlQXJnc0ZuID0gbGlicy5jeXRvc2NhcGUuc2Jnbi5BZlNoYXBlQXJnc0ZuO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pdE9mSW5mb3JtYXRpb24uaWQgPSBnbHlwaC5pZCB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLmxhYmVsID0ge1xuICAgICAgICAgICd0ZXh0JzogKGdseXBoLmxhYmVsICYmIGdseXBoLmxhYmVsLnRleHQpIHx8IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB1bml0T2ZJbmZvcm1hdGlvbi5iYm94ID0gc2VsZi5zdGF0ZUFuZEluZm9CYm94UHJvcChnbHlwaCwgcGFyZW50QmJveCk7XG4gICAgICAgIHVuaXRPZkluZm9ybWF0aW9uLnNldEFuY2hvclNpZGUoKTtcbiAgICAgICAgc3RhdGVBbmRJbmZvQXJyYXkucHVzaCh1bml0T2ZJbmZvcm1hdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKGdseXBoLmNsYXNzXyA9PT0gJ3N0YXRlIHZhcmlhYmxlJykge1xuICAgICAgICB2YXIgc3RhdGVWYXJpYWJsZSA9IG5ldyBjbGFzc2VzLlN0YXRlVmFyaWFibGUoKTtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5pZCA9IGdseXBoLmlkIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2x5cGguc3RhdGU7XG4gICAgICAgIHN0YXRlVmFyaWFibGUuc3RhdGUudmFsdWUgPSAoc3RhdGUgJiYgc3RhdGUudmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5zdGF0ZS52YXJpYWJsZSA9IChzdGF0ZSAmJiBzdGF0ZS52YXJpYWJsZSkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBzdGF0ZVZhcmlhYmxlLmJib3ggPSBzZWxmLnN0YXRlQW5kSW5mb0Jib3hQcm9wKGdseXBoLCBwYXJlbnRCYm94KTtcbiAgICAgICAgc3RhdGVWYXJpYWJsZS5zZXRBbmNob3JTaWRlKCk7XG4gICAgICAgIHN0YXRlQW5kSW5mb0FycmF5LnB1c2goc3RhdGVWYXJpYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlQW5kSW5mb0FycmF5O1xuICB9LFxuICBhZGRQYXJlbnRJbmZvVG9Ob2RlOiBmdW5jdGlvbiAoZWxlLCBub2RlT2JqLCBwYXJlbnQsIGNvbXBhcnRtZW50cykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY29tcGFydG1lbnRSZWYgPSBlbGUuY29tcGFydG1lbnRSZWY7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBub2RlT2JqLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFydG1lbnRSZWYpIHtcbiAgICAgIG5vZGVPYmoucGFyZW50ID0gY29tcGFydG1lbnRSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVPYmoucGFyZW50ID0gJyc7XG5cbiAgICAgIC8vIGFkZCBjb21wYXJ0bWVudCBhY2NvcmRpbmcgdG8gZ2VvbWV0cnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcGFydG1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiYm94ID0ge1xuICAgICAgICAgICd4JzogcGFyc2VGbG9hdChlbGUuYmJveC54KSxcbiAgICAgICAgICAneSc6IHBhcnNlRmxvYXQoZWxlLmJib3gueSksXG4gICAgICAgICAgJ3cnOiBwYXJzZUZsb2F0KGVsZS5iYm94LncpLFxuICAgICAgICAgICdoJzogcGFyc2VGbG9hdChlbGUuYmJveC5oKSxcbiAgICAgICAgICAnaWQnOiBlbGUuaWRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNlbGYuaXNJbkJvdW5kaW5nQm94KGJib3gsIGNvbXBhcnRtZW50c1tpXSkpIHtcbiAgICAgICAgICBub2RlT2JqLnBhcmVudCA9IGNvbXBhcnRtZW50c1tpXS5pZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYWRkQ3l0b3NjYXBlSnNOb2RlOiBmdW5jdGlvbiAoZWxlLCBqc29uQXJyYXksIHBhcmVudCwgY29tcGFydG1lbnRzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBub2RlT2JqID0ge307XG5cbiAgICAvLyBhZGQgaWQgaW5mb3JtYXRpb25cbiAgICBub2RlT2JqLmlkID0gZWxlLmlkO1xuICAgIC8vIGFkZCBub2RlIGJvdW5kaW5nIGJveCBpbmZvcm1hdGlvblxuICAgIG5vZGVPYmouYmJveCA9IHNlbGYuYmJveFByb3AoZWxlKTtcbiAgICBcbiAgICBpZiAoZWxlLm1pbldpZHRoKSB7XG4gICAgICBub2RlT2JqLm1pbldpZHRoID0gZWxlLm1pbldpZHRoO1xuICAgICAgbm9kZU9iai5taW5XaWR0aEJpYXNMZWZ0ID0gZWxlLm1pbldpZHRoQmlhc0xlZnQ7XG4gICAgICBub2RlT2JqLm1pbldpZHRoQmlhc1JpZ2h0ID0gZWxlLm1pbldpZHRoQmlhc1JpZ2h0O1xuICAgIH1cbiAgICBcbiAgICBpZiAoZWxlLm1pbkhlaWdodCkge1xuICAgICAgbm9kZU9iai5taW5IZWlnaHQgPSBlbGUubWluSGVpZ2h0O1xuICAgICAgbm9kZU9iai5taW5IZWlnaHRCaWFzVG9wID0gZWxlLm1pbkhlaWdodEJpYXNUb3A7XG4gICAgICBub2RlT2JqLm1pbkhlaWdodEJpYXNCb3R0b20gPSBlbGUubWluSGVpZ2h0Qmlhc0JvdHRvbTtcbiAgICB9XG4gICAgXG4gICAgLy8gYWRkIGNsYXNzIGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5jbGFzcyA9IGVsZS5jbGFzc187XG4gICAgLy8gYWRkIGxhYmVsIGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5sYWJlbCA9IChlbGUubGFiZWwgJiYgZWxlLmxhYmVsLnRleHQpIHx8IHVuZGVmaW5lZDtcbiAgICAvLyBhZGQgc3RhdGUgYW5kIGluZm8gYm94IGluZm9ybWF0aW9uXG4gICAgbm9kZU9iai5zdGF0ZXNhbmRpbmZvcyA9IHNlbGYuc3RhdGVBbmRJbmZvUHJvcChlbGUsIG5vZGVPYmopO1xuICAgIC8vIGFkZGluZyBwYXJlbnQgaW5mb3JtYXRpb25cbiAgICBzZWxmLmFkZFBhcmVudEluZm9Ub05vZGUoZWxlLCBub2RlT2JqLCBwYXJlbnQsIGNvbXBhcnRtZW50cyk7XG4gICAgLy8gYWRkIGxhbmd1YWdlIGluZm8sIHRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIG1hcFR5cGVcbiAgICBub2RlT2JqLmxhbmd1YWdlID0gZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlO1xuXG4gICAgLy8gYWRkIGNsb25lIGluZm9ybWF0aW9uXG4gICAgaWYgKGVsZS5jbG9uZSkge1xuICAgICAgbm9kZU9iai5jbG9uZW1hcmtlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVPYmouY2xvbmVtYXJrZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gYWRkIHBvcnQgaW5mb3JtYXRpb25cbiAgICB2YXIgcG9ydHMgPSBbXTtcbiAgICB2YXIgcG9ydEVsZW1lbnRzID0gZWxlLnBvcnRzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3J0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwb3J0RWwgPSBwb3J0RWxlbWVudHNbaV07XG4gICAgICB2YXIgaWQgPSBwb3J0RWwuaWQ7XG4gICAgICB2YXIgcmVsYXRpdmVYUG9zID0gcGFyc2VGbG9hdChwb3J0RWwueCkgLSBub2RlT2JqLmJib3gueDtcbiAgICAgIHZhciByZWxhdGl2ZVlQb3MgPSBwYXJzZUZsb2F0KHBvcnRFbC55KSAtIG5vZGVPYmouYmJveC55O1xuXG4gICAgICByZWxhdGl2ZVhQb3MgPSByZWxhdGl2ZVhQb3MgLyBwYXJzZUZsb2F0KG5vZGVPYmouYmJveC53KSAqIDEwMDtcbiAgICAgIHJlbGF0aXZlWVBvcyA9IHJlbGF0aXZlWVBvcyAvIHBhcnNlRmxvYXQobm9kZU9iai5iYm94LmgpICogMTAwO1xuICAgICAgXG4gICAgICAvLyBXZSBhc3N1bWUgdGhhdCBwb3J0cyBhcmUgbm90IGluc2lkZSB0aGUgbm9kZSBzaGFwZS4gXG4gICAgICAvLyBUaGVyZWZvcmUsIGFicy4gdmFsdWUgb2YgdGhlaXIgcmVsYXRpdmUgeCBhbmQgeSBjb29yZGluYXRlcyAocmVsYXRpdmUgdG8gbm9kZSBjZW50ZXIpIHNob3VsZCBiZSBiaWdnZXIgdGhhbiA1MC5cbiAgICAgIGlmIChNYXRoLmFicyhyZWxhdGl2ZVhQb3MpIDwgNTApIHtcbiAgICAgICAgcmVsYXRpdmVYUG9zID0gMDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlWVBvcykgPCA1MCkge1xuICAgICAgICByZWxhdGl2ZVlQb3MgPSAwO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAocmVsYXRpdmVYUG9zID09PSAwICYmIHJlbGF0aXZlWVBvcyA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcG9ydHMucHVzaCh7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgeDogcmVsYXRpdmVYUG9zLFxuICAgICAgICB5OiByZWxhdGl2ZVlQb3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5vZGVPYmoucG9ydHMgPSBwb3J0cztcbiAgICBcbiAgICB2YXIgX2NsYXNzID0gbm9kZU9iai5jbGFzcztcbiAgICAvLyBJZiB0aGUgbm9kZSBjYW4gaGF2ZSBwb3J0cyBhbmQgaXQgaGFzIGV4YWN0bHkgMiBwb3J0cyB0aGVuIGl0IHNob3VsZCBiZSByZXByZXNlbnRlZCBieSBhIGJpZ2dlciBiYm94LlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSByZXByZXNlbnQgaXQgYXMgYSBwb2x5Z29uIGFuZCBzbyB0aGUgd2hvbGUgc2hhcGUgaW5jbHVkaW5nIHRoZSBwb3J0cyBhcmUgcmVuZGVyZWQgaW4gdGhlIG5vZGUgYmJveC5cbiAgICBpZiAoZWxlbWVudFV0aWxpdGllcy5jYW5IYXZlUG9ydHMoX2NsYXNzKSkge1xuICAgICAgaWYgKGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCAmJiBwb3J0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHBvcnRzIGFyZSBzeW1tZXRyaWMgdG8gdGhlIG5vZGUgY2VudGVyIHNvIHVzaW5nIGp1c3Qgb25lIG9mIHRoZSBwb3J0cyBpcyBlbm91Z2hcbiAgICAgICAgdmFyIHBvcnQgPSBwb3J0c1swXTtcbiAgICAgICAgdmFyIG9yaWVudGF0aW9uID0gcG9ydC54ID09PSAwID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmF0aW8gb2YgdGhlIGFyZWEgb2NjdXBpZWQgd2l0aCBwb3J0cyBvdmVyIHdpdGhvdXQgcG9ydHNcbiAgICAgICAgdmFyIHJhdGlvID0gb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgPyBNYXRoLmFicyhwb3J0LnkpIC8gNTAgOiBNYXRoLmFicyhwb3J0LngpIC8gNTA7XG4gICAgICAgIC8vIE11bHRpcGx5IHRoZSBiYm94IHdpdGggdGhlIGNhbGN1bGF0ZWQgcmF0aW9cbiAgICAgICAgbm9kZU9iai5iYm94LncgPSBwYXJzZUZsb2F0KG5vZGVPYmouYmJveC53KSAqIHJhdGlvO1xuICAgICAgICBub2RlT2JqLmJib3guaCA9IHBhcnNlRmxvYXQobm9kZU9iai5iYm94LmgpICogcmF0aW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZS5leHRlbnNpb24gJiYgZWxlLmV4dGVuc2lvbi5oYXMoJ2Fubm90YXRpb24nKSkgeyAvLyBhbm5vdGF0aW9uIGV4dGVuc2lvbiB3YXMgZm91bmRcbiAgICAgIHZhciByZGZFbGVtZW50ID0gZWxlLmV4dGVuc2lvbi5nZXQoJ2Fubm90YXRpb24nKS5yZGZFbGVtZW50O1xuICAgICAgbm9kZU9iaiA9IHNlbGYuaGFuZGxlQW5ub3RhdGlvbnMobm9kZU9iaiwgcmRmRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdmFyIGN5dG9zY2FwZUpzTm9kZSA9IHtkYXRhOiBub2RlT2JqfTtcbiAgICBqc29uQXJyYXkucHVzaChjeXRvc2NhcGVKc05vZGUpO1xuICB9LFxuICAvKipcbiAgICogZ2l2ZW4gYSBmdXR1cmUgY3kgb2JqZWN0LCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCdzIGxpYnNiZ25qcycgZXh0ZW5zaW9uLCBwb3B1bGF0ZXMgdGhlIGFubm90YXRpb25zIGZpZWxkXG4gICAqL1xuICBoYW5kbGVBbm5vdGF0aW9uczogZnVuY3Rpb24oY3lPYmplY3QsIHJkZkVsZW1lbnQpIHtcbiAgICAvLyBsb2NhbCB1dGlsaXR5IGZ1bmN0aW9uXG4gICAgZnVuY3Rpb24gZGJGcm9tVXJsKHVybCkge1xuICAgICAgdmFyIHJlZ2V4cCA9IC9eaHR0cDpcXC9cXC9pZGVudGlmaWVycy5vcmdcXC8oLis/KVxcLy4rJC87XG4gICAgICByZXR1cm4gdXJsLnJlcGxhY2UocmVnZXhwLCAnJDEnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaWxsRWxlbWVudERhdGFBbm5vdGF0aW9uKGN5T2JqZWN0LCBhbm5vdGF0aW9uSW5kZXgsIHN0YXR1cywgc2VsZWN0ZWREQiwgc2VsZWN0ZWRSZWxhdGlvbiwgYW5ub3RhdGlvblZhbHVlKSB7XG4gICAgICBpZighY3lPYmplY3QuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgY3lPYmplY3QuYW5ub3RhdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBhbm5vdElkID0gY3lPYmplY3QuaWQrXCItYW5ub3QtXCIrYW5ub3RhdGlvbkluZGV4O1xuXG4gICAgICBjeU9iamVjdC5hbm5vdGF0aW9uc1thbm5vdElkXSA9IHtcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtYXkgYmUgaGF6YXJkb3VzLiBCdXQgc2V0dGluZyBpdCBhcyB1bmNoZWNrZWQgbGVhdmUgdGhlIGFubm90YXRpb24gb3V0IGlmIHRoZSBmaWxlIGlzIHNhdmVkLlxuICAgICAgICAvLyBUaGlzIHdvdWxkIGxlYWQgdG8gdGhlIHVzZXIgbG9zaW5nIGFubm90YXRpb25zIHdpdGhvdXQga25vd2luZyBpdC5cbiAgICAgICAgc3RhdHVzOiBzdGF0dXMsIC8vIDwtLSB3ZSB0cnVzdCB0aGF0IHdoYXQncyBiZWVuIGxvYWRlZCBpcyB2YWxpZC5cbiAgICAgICAgc2VsZWN0ZWREQjogc2VsZWN0ZWREQixcbiAgICAgICAgc2VsZWN0ZWRSZWxhdGlvbjogc2VsZWN0ZWRSZWxhdGlvbixcbiAgICAgICAgYW5ub3RhdGlvblZhbHVlOiBhbm5vdGF0aW9uVmFsdWVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3lPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhlIGlkIG9mIHRoZSByZGY6YWJvdXQgZmllbGQgaXMgdGhlIG9uZSBvZiB0aGUgY3VycmVudCBub2RlLCBhbmQgdGhhdCB0aGVyZSdzIG9ubHkgMSBkZXNjcmlwdGlvblxuICAgIHZhciBpZCA9IHJkZkVsZW1lbnQuZ2V0QWxsSWRzKClbMF07XG4gICAgdmFyIHJlc291cmNlcyA9IHJkZkVsZW1lbnQuZ2V0UmVzb3VyY2VzT2ZJZChpZCk7XG4gICAgdmFyIGN1c3RvbVByb3BlcnRpZXMgPSByZGZFbGVtZW50LmdldEN1c3RvbVByb3BlcnRpZXNPZklkKGlkKTtcblxuICAgIHZhciBnbG9iYWxBbm5vdEluZGV4ID0gMDtcbiAgICAvLyBoYW5kbGUgY29udHJvbGxlZCBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgZnVsbFF1YWxpZmllciBpbiByZXNvdXJjZXMpIHtcbiAgICAgIHZhciByZWxhdGlvbiA9IGxpYnNiZ25qcy5hbm5vdC5VdGlsLnJlZHVjZVByZWZpeChmdWxsUXVhbGlmaWVyKTtcbiAgICAgIGZvcih2YXIgaT0wOyBpPHJlc291cmNlc1tmdWxsUXVhbGlmaWVyXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsdWUgPSByZXNvdXJjZXNbZnVsbFF1YWxpZmllcl1baV07XG4gICAgICAgIHZhciBzZWxlY3RlZERCID0gZGJGcm9tVXJsKHZhbHVlKTtcbiAgICAgICAgY3lPYmplY3QgPSBmaWxsRWxlbWVudERhdGFBbm5vdGF0aW9uKGN5T2JqZWN0LCBnbG9iYWxBbm5vdEluZGV4LCBcInZhbGlkYXRlZFwiLCBzZWxlY3RlZERCLCByZWxhdGlvbiwgdmFsdWUpO1xuICAgICAgICBnbG9iYWxBbm5vdEluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGhhbmRsZSBjdXN0b20gcHJvcGVydGllc1xuICAgIGZvciAodmFyIGtleSBpbiBjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBjdXN0b21Qcm9wZXJ0aWVzW2tleV07XG4gICAgICBjeU9iamVjdCA9IGZpbGxFbGVtZW50RGF0YUFubm90YXRpb24oY3lPYmplY3QsIGdsb2JhbEFubm90SW5kZXgsIFwidmFsaWRhdGVkXCIsIGtleSwgXCJzaW86U0lPXzAwMDIyM1wiLCB2YWx1ZSk7XG4gICAgICBnbG9iYWxBbm5vdEluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN5T2JqZWN0O1xuICB9LFxuICB0cmF2ZXJzZU5vZGVzOiBmdW5jdGlvbiAoZWxlLCBqc29uQXJyYXksIHBhcmVudCwgY29tcGFydG1lbnRzKSB7XG4gICAgdmFyIGVsSWQgPSBlbGUuaWQ7XG4gICAgaWYgKCFlbGVtZW50VXRpbGl0aWVzLmhhbmRsZWRFbGVtZW50c1tlbGUuY2xhc3NfXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluc2VydGVkTm9kZXNbZWxJZF0gPSB0cnVlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAvLyBhZGQgY29tcGxleCBub2RlcyBoZXJlXG5cbiAgICB2YXIgZWxlQ2xhc3MgPSBlbGUuY2xhc3NfO1xuXG4gICAgaWYgKGVsZUNsYXNzID09PSAnY29tcGxleCcgfHwgZWxlQ2xhc3MgPT09ICdjb21wbGV4IG11bHRpbWVyJyB8fCBlbGVDbGFzcyA9PT0gJ3N1Ym1hcCcpIHtcbiAgICAgIHNlbGYuYWRkQ3l0b3NjYXBlSnNOb2RlKGVsZSwganNvbkFycmF5LCBwYXJlbnQsIGNvbXBhcnRtZW50cyk7XG5cbiAgICAgIHZhciBjaGlsZEdseXBocyA9IGVsZS5nbHlwaE1lbWJlcnM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkR2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IGNoaWxkR2x5cGhzW2ldO1xuICAgICAgICB2YXIgZ2x5cGhDbGFzcyA9IGdseXBoLmNsYXNzXztcbiAgICAgICAgaWYgKGdseXBoQ2xhc3MgIT09ICdzdGF0ZSB2YXJpYWJsZScgJiYgZ2x5cGhDbGFzcyAhPT0gJ3VuaXQgb2YgaW5mb3JtYXRpb24nKSB7XG4gICAgICAgICAgaWYoIWdseXBoLmNvbXBhcnRtZW50UmVmIHx8IGdseXBoLmNvbXBhcnRtZW50UmVmID09IGVsSWQpIHtcbiAgICAgICAgICAgIHNlbGYudHJhdmVyc2VOb2RlcyhnbHlwaCwganNvbkFycmF5LCBlbElkLCBjb21wYXJ0bWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChnbHlwaC5jb21wYXJ0bWVudFJlZiAhPSBlbElkKSB7XG4gICAgICAgICAgICBzZWxmLnRyYXZlcnNlTm9kZXMoZ2x5cGgsIGpzb25BcnJheSwgZ2x5cGguY29tcGFydG1lbnRSZWYsIGNvbXBhcnRtZW50cyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmFkZEN5dG9zY2FwZUpzTm9kZShlbGUsIGpzb25BcnJheSwgcGFyZW50LCBjb21wYXJ0bWVudHMpO1xuICAgIH1cbiAgfSxcbiAgZ2V0UG9ydHM6IGZ1bmN0aW9uICh4bWxPYmplY3QpIHtcbiAgICByZXR1cm4gKCB4bWxPYmplY3QuX2NhY2hlZFBvcnRzID0geG1sT2JqZWN0Ll9jYWNoZWRQb3J0cyB8fCB4bWxPYmplY3QucXVlcnlTZWxlY3RvckFsbCgncG9ydCcpKTtcbiAgfSxcbiAgZ2V0R2x5cGhzOiBmdW5jdGlvbiAoeG1sT2JqZWN0KSB7XG4gICAgdmFyIGdseXBocyA9IHhtbE9iamVjdC5fY2FjaGVkR2x5cGhzO1xuXG4gICAgaWYgKCFnbHlwaHMpIHtcbiAgICAgIGdseXBocyA9IHhtbE9iamVjdC5fY2FjaGVkR2x5cGhzID0geG1sT2JqZWN0Ll9jYWNoZWRHbHlwaHMgfHwgeG1sT2JqZWN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2dseXBoJyk7XG5cbiAgICAgIHZhciBpZDJnbHlwaCA9IHhtbE9iamVjdC5faWQyZ2x5cGggPSB7fTtcblxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICB2YXIgZyA9IGdseXBoc1tpXTtcbiAgICAgICAgdmFyIGlkID0gZy5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG5cbiAgICAgICAgaWQyZ2x5cGhbIGlkIF0gPSBnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBnbHlwaHM7XG4gIH0sXG4gIGdldEdseXBoQnlJZDogZnVuY3Rpb24gKHhtbE9iamVjdCwgaWQpIHtcbiAgICB0aGlzLmdldEdseXBocyh4bWxPYmplY3QpOyAvLyBtYWtlIHN1cmUgY2FjaGUgaXMgYnVpbHRcblxuICAgIHJldHVybiB4bWxPYmplY3QuX2lkMmdseXBoW2lkXTtcbiAgfSxcbiAgZ2V0QXJjU291cmNlQW5kVGFyZ2V0OiBmdW5jdGlvbiAoYXJjLCB4bWxPYmplY3QpIHtcbiAgICAvLyBzb3VyY2UgYW5kIHRhcmdldCBjYW4gYmUgaW5zaWRlIG9mIGEgcG9ydFxuICAgIHZhciBzb3VyY2UgPSBhcmMuc291cmNlO1xuICAgIHZhciB0YXJnZXQgPSBhcmMudGFyZ2V0O1xuICAgIHZhciBzb3VyY2VOb2RlSWQ7XG4gICAgdmFyIHRhcmdldE5vZGVJZDtcblxuICAgIHZhciBzb3VyY2VFeGlzdHMgPSB0aGlzLmdldEdseXBoQnlJZCh4bWxPYmplY3QsIHNvdXJjZSk7XG4gICAgdmFyIHRhcmdldEV4aXN0cyA9IHRoaXMuZ2V0R2x5cGhCeUlkKHhtbE9iamVjdCwgdGFyZ2V0KTtcblxuICAgIGlmIChzb3VyY2VFeGlzdHMpIHtcbiAgICAgIHNvdXJjZU5vZGVJZCA9IHNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0RXhpc3RzKSB7XG4gICAgICB0YXJnZXROb2RlSWQgPSB0YXJnZXQ7XG4gICAgfVxuXG5cbiAgICB2YXIgaTtcbiAgICB2YXIgcG9ydEVscyA9IHRoaXMuZ2V0UG9ydHMoeG1sT2JqZWN0KTtcbiAgICB2YXIgcG9ydDtcbiAgICBpZiAoc291cmNlTm9kZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBwb3J0RWxzLmxlbmd0aDsgaSsrICkge1xuICAgICAgICBwb3J0ID0gcG9ydEVsc1tpXTtcbiAgICAgICAgaWYgKHBvcnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSBzb3VyY2UpIHtcbiAgICAgICAgICBzb3VyY2VOb2RlSWQgPSBwb3J0LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldE5vZGVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydEVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwb3J0ID0gcG9ydEVsc1tpXTtcbiAgICAgICAgaWYgKHBvcnQuZ2V0QXR0cmlidXRlKCdpZCcpID09PSB0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXROb2RlSWQgPSBwb3J0LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsnc291cmNlJzogc291cmNlTm9kZUlkLCAndGFyZ2V0JzogdGFyZ2V0Tm9kZUlkfTtcbiAgfSxcblxuICBnZXRBcmNCZW5kUG9pbnRQb3NpdGlvbnM6IGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgYmVuZFBvaW50UG9zaXRpb25zID0gW107XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUubmV4dHM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcG9zWCA9IGNoaWxkcmVuW2ldLng7XG4gICAgICB2YXIgcG9zWSA9IGNoaWxkcmVuW2ldLnk7XG5cbiAgICAgIGJlbmRQb2ludFBvc2l0aW9ucy5wdXNoKHtcbiAgICAgICAgeDogcG9zWCxcbiAgICAgICAgeTogcG9zWVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlbmRQb2ludFBvc2l0aW9ucztcbiAgfSxcbiAgYWRkQ3l0b3NjYXBlSnNFZGdlOiBmdW5jdGlvbiAoZWxlLCBqc29uQXJyYXksIHhtbE9iamVjdCkge1xuICAgIGlmICghZWxlbWVudFV0aWxpdGllcy5oYW5kbGVkRWxlbWVudHNbZWxlLmNsYXNzX10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNvdXJjZUFuZFRhcmdldCA9IHNlbGYuZ2V0QXJjU291cmNlQW5kVGFyZ2V0KGVsZSwgeG1sT2JqZWN0KTtcblxuICAgIGlmICghdGhpcy5pbnNlcnRlZE5vZGVzW3NvdXJjZUFuZFRhcmdldC5zb3VyY2VdIHx8ICF0aGlzLmluc2VydGVkTm9kZXNbc291cmNlQW5kVGFyZ2V0LnRhcmdldF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZWRnZU9iaiA9IHt9O1xuICAgIHZhciBiZW5kUG9pbnRQb3NpdGlvbnMgPSBzZWxmLmdldEFyY0JlbmRQb2ludFBvc2l0aW9ucyhlbGUpO1xuXG4gICAgZWRnZU9iai5pZCA9IGVsZS5pZCB8fCB1bmRlZmluZWQ7XG4gICAgZWRnZU9iai5jbGFzcyA9IGVsZS5jbGFzc187XG4gICAgZWRnZU9iai5iZW5kUG9pbnRQb3NpdGlvbnMgPSBiZW5kUG9pbnRQb3NpdGlvbnM7XG4gICAgLy8gYWRkIGxhbmd1YWdlIGluZm8sIHRoaXMgd2lsbCBhbHdheXMgYmUgdGhlIG1hcFR5cGVcbiAgICBlZGdlT2JqLmxhbmd1YWdlID0gZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlO1xuXG4gICAgZWRnZU9iai5jYXJkaW5hbGl0eSA9IDA7XG4gICAgaWYgKGVsZS5nbHlwaHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGUuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbGUuZ2x5cGhzW2ldLmNsYXNzXyA9PT0gJ2NhcmRpbmFsaXR5Jykge1xuICAgICAgICAgIHZhciBsYWJlbCA9IGVsZS5nbHlwaHNbaV0ubGFiZWw7XG4gICAgICAgICAgZWRnZU9iai5jYXJkaW5hbGl0eSA9IGxhYmVsLnRleHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWRnZU9iai5zb3VyY2UgPSBzb3VyY2VBbmRUYXJnZXQuc291cmNlO1xuICAgIGVkZ2VPYmoudGFyZ2V0ID0gc291cmNlQW5kVGFyZ2V0LnRhcmdldDtcblxuICAgIGVkZ2VPYmoucG9ydHNvdXJjZSA9IGVsZS5zb3VyY2U7XG4gICAgZWRnZU9iai5wb3J0dGFyZ2V0ID0gZWxlLnRhcmdldDtcblxuICAgIGlmIChlbGUuZXh0ZW5zaW9uICYmIGVsZS5leHRlbnNpb24uaGFzKCdhbm5vdGF0aW9uJykpIHsgLy8gYW5ub3RhdGlvbiBleHRlbnNpb24gd2FzIGZvdW5kXG4gICAgICB2YXIgcmRmRWxlbWVudCA9IGVsZS5leHRlbnNpb24uZ2V0KCdhbm5vdGF0aW9uJykucmRmRWxlbWVudDtcbiAgICAgIGVkZ2VPYmogPSBzZWxmLmhhbmRsZUFubm90YXRpb25zKGVkZ2VPYmosIHJkZkVsZW1lbnQpO1xuICAgIH1cblxuICAgIHZhciBjeXRvc2NhcGVKc0VkZ2UgPSB7ZGF0YTogZWRnZU9ian07XG4gICAganNvbkFycmF5LnB1c2goY3l0b3NjYXBlSnNFZGdlKTtcbiAgfSxcbiAgYXBwbHlTdHlsZTogZnVuY3Rpb24gKHJlbmRlckluZm9ybWF0aW9uLCBub2RlcywgZWRnZXMpIHtcbiAgICAvLyBnZXQgYWxsIGNvbG9yIGlkIHJlZmVyZW5jZXMgdG8gdGhlaXIgdmFsdWVcbiAgICB2YXIgY29sb3JMaXN0ID0gcmVuZGVySW5mb3JtYXRpb24ubGlzdE9mQ29sb3JEZWZpbml0aW9ucy5jb2xvckRlZmluaXRpb25zO1xuICAgIHZhciBjb2xvcklEVG9WYWx1ZSA9IHt9O1xuICAgIGZvciAodmFyIGk9MDsgaSA8IGNvbG9yTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29sb3JJRFRvVmFsdWVbY29sb3JMaXN0W2ldLmlkXSA9IGNvbG9yTGlzdFtpXS52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IHN0eWxlIGxpc3QgdG8gZWxlbWVudElkLWluZGV4ZWQgb2JqZWN0IHBvaW50aW5nIHRvIHN0eWxlXG4gICAgLy8gYWxzbyBjb252ZXJ0IGNvbG9yIHJlZmVyZW5jZXMgdG8gY29sb3IgdmFsdWVzXG4gICAgdmFyIHN0eWxlTGlzdCA9IHJlbmRlckluZm9ybWF0aW9uLmxpc3RPZlN0eWxlcy5zdHlsZXM7XG4gICAgdmFyIGVsZW1lbnRJRFRvU3R5bGUgPSB7fTtcbiAgICBmb3IgKHZhciBpPTA7IGkgPCBzdHlsZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdHlsZSA9IHN0eWxlTGlzdFtpXTtcbiAgICAgIHZhciByZW5kZXJHcm91cCA9IHN0eWxlLnJlbmRlckdyb3VwO1xuXG4gICAgICAvLyBjb252ZXJ0IGNvbG9yIHJlZmVyZW5jZXNcbiAgICAgIGlmIChyZW5kZXJHcm91cC5zdHJva2UgIT0gbnVsbCkge1xuICAgICAgICByZW5kZXJHcm91cC5zdHJva2UgPSBjb2xvcklEVG9WYWx1ZVtyZW5kZXJHcm91cC5zdHJva2VdO1xuICAgICAgfVxuICAgICAgaWYgKHJlbmRlckdyb3VwLmZpbGwgIT0gbnVsbCkge1xuICAgICAgICByZW5kZXJHcm91cC5maWxsID0gY29sb3JJRFRvVmFsdWVbcmVuZGVyR3JvdXAuZmlsbF07XG4gICAgICB9XG5cbiAgICAgIHZhciBpZExpc3QgPSBzdHlsZS5pZExpc3Quc3BsaXQoJyAnKTtcbiAgICAgIGZvciAodmFyIGo9MDsgaiA8IGlkTGlzdC5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgaWQgPSBpZExpc3Rbal07XG4gICAgICAgIGVsZW1lbnRJRFRvU3R5bGVbaWRdID0gcmVuZGVyR3JvdXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGV4VG9EZWNpbWFsIChoZXgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlSW50KCcweCcraGV4KSAvIDI1NSAqIDEwMCkgLyAxMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29udmVydEhleENvbG9yIChoZXgpIHtcbiAgICAgIGlmIChoZXgubGVuZ3RoID09IDcpIHsgLy8gbm8gb3BhY2l0eSBwcm92aWRlZFxuICAgICAgICByZXR1cm4ge29wYWNpdHk6IG51bGwsIGNvbG9yOiBoZXh9O1xuICAgICAgfVxuICAgICAgZWxzZSB7IC8vIGxlbmd0aCBvZiA5XG4gICAgICAgIHZhciBjb2xvciA9IGhleC5zbGljZSgwLDcpO1xuICAgICAgICB2YXIgb3BhY2l0eSA9IGhleFRvRGVjaW1hbChoZXguc2xpY2UoLTIpKTtcbiAgICAgICAgcmV0dXJuIHtvcGFjaXR5OiBvcGFjaXR5LCBjb2xvcjogY29sb3J9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHRoZSBzdHlsZSB0byBub2RlcyBhbmQgb3ZlcndyaXRlIHRoZSBkZWZhdWx0IHN0eWxlXG4gICAgZm9yICh2YXIgaT0wOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGNvbG9yIHByb3BlcnRpZXMsIHdlIG5lZWQgdG8gY2hlY2sgb3BhY2l0eVxuICAgICAgdmFyIGJnQ29sb3IgPSBlbGVtZW50SURUb1N0eWxlW25vZGUuZGF0YVsnaWQnXV0uZmlsbDtcbiAgICAgIGlmIChiZ0NvbG9yKSB7XG4gICAgICAgIHZhciByZXMgPSBjb252ZXJ0SGV4Q29sb3IoYmdDb2xvcik7XG4gICAgICAgIG5vZGUuZGF0YVsnYmFja2dyb3VuZC1jb2xvciddID0gcmVzLmNvbG9yO1xuICAgICAgICBub2RlLmRhdGFbJ2JhY2tncm91bmQtb3BhY2l0eSddID0gcmVzLm9wYWNpdHk7XG4gICAgICB9XG5cbiAgICAgIHZhciBib3JkZXJDb2xvciA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5zdHJva2U7XG4gICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgdmFyIHJlcyA9IGNvbnZlcnRIZXhDb2xvcihib3JkZXJDb2xvcik7XG4gICAgICAgIG5vZGUuZGF0YVsnYm9yZGVyLWNvbG9yJ10gPSByZXMuY29sb3I7XG4gICAgICB9XG5cbiAgICAgIHZhciBib3JkZXJXaWR0aCA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5zdHJva2VXaWR0aDtcbiAgICAgIGlmIChib3JkZXJXaWR0aCkge1xuICAgICAgICBub2RlLmRhdGFbJ2JvcmRlci13aWR0aCddID0gYm9yZGVyV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250U2l6ZSA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS5mb250U2l6ZTtcbiAgICAgIGlmIChmb250U2l6ZSkge1xuICAgICAgICBub2RlLmRhdGFbJ2ZvbnQtc2l6ZSddID0gZm9udFNpemU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250RmFtaWx5ID0gZWxlbWVudElEVG9TdHlsZVtub2RlLmRhdGFbJ2lkJ11dLmZvbnRGYW1pbHk7XG4gICAgICBpZiAoZm9udEZhbWlseSkge1xuICAgICAgICBub2RlLmRhdGFbJ2ZvbnQtZmFtaWx5J10gPSBmb250RmFtaWx5O1xuICAgICAgfVxuXG4gICAgICB2YXIgZm9udFN0eWxlID0gZWxlbWVudElEVG9TdHlsZVtub2RlLmRhdGFbJ2lkJ11dLmZvbnRTdHlsZTtcbiAgICAgIGlmIChmb250U3R5bGUpIHtcbiAgICAgICAgbm9kZS5kYXRhWydmb250LXN0eWxlJ10gPSBmb250U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb250V2VpZ2h0ID0gZWxlbWVudElEVG9TdHlsZVtub2RlLmRhdGFbJ2lkJ11dLmZvbnRXZWlnaHQ7XG4gICAgICBpZiAoZm9udFdlaWdodCkge1xuICAgICAgICBub2RlLmRhdGFbJ2ZvbnQtd2VpZ2h0J10gPSBmb250V2VpZ2h0O1xuICAgICAgfVxuXG4gICAgICB2YXIgdGV4dEFuY2hvciA9IGVsZW1lbnRJRFRvU3R5bGVbbm9kZS5kYXRhWydpZCddXS50ZXh0QW5jaG9yO1xuICAgICAgaWYgKHRleHRBbmNob3IpIHtcbiAgICAgICAgbm9kZS5kYXRhWyd0ZXh0LWhhbGlnbiddID0gdGV4dEFuY2hvcjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZ0ZXh0QW5jaG9yID0gZWxlbWVudElEVG9TdHlsZVtub2RlLmRhdGFbJ2lkJ11dLnZ0ZXh0QW5jaG9yO1xuICAgICAgaWYgKHZ0ZXh0QW5jaG9yKSB7XG4gICAgICAgIG5vZGUuZGF0YVsndGV4dC12YWxpZ24nXSA9IHZ0ZXh0QW5jaG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRvIHRoZSBzYW1lIGZvciBlZGdlc1xuICAgIGZvciAodmFyIGk9MDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuXG4gICAgICB2YXIgbGluZUNvbG9yID0gZWxlbWVudElEVG9TdHlsZVtlZGdlLmRhdGFbJ2lkJ11dLnN0cm9rZTtcbiAgICAgIGlmIChsaW5lQ29sb3IpIHtcbiAgICAgICAgdmFyIHJlcyA9IGNvbnZlcnRIZXhDb2xvcihsaW5lQ29sb3IpO1xuICAgICAgICBlZGdlLmRhdGFbJ2xpbmUtY29sb3InXSA9IHJlcy5jb2xvcjtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpZHRoID0gZWxlbWVudElEVG9TdHlsZVtlZGdlLmRhdGFbJ2lkJ11dLnN0cm9rZVdpZHRoO1xuICAgICAgaWYgKHdpZHRoKSB7XG4gICAgICAgIGVkZ2UuZGF0YVsnd2lkdGgnXSA9IHdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbWFwUHJvcGVydGllc1RvT2JqOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5tYXAuZXh0ZW5zaW9uICYmIHRoaXMubWFwLmV4dGVuc2lvbi5oYXMoJ21hcFByb3BlcnRpZXMnKSkgeyAvLyByZW5kZXIgZXh0ZW5zaW9uIHdhcyBmb3VuZFxuICAgICAgIHZhciB4bWwgPSB0aGlzLm1hcC5leHRlbnNpb24uZ2V0KCdtYXBQcm9wZXJ0aWVzJyk7XG4gICAgICAgdmFyIG9iajtcbiAgICAgICBwYXJzZVN0cmluZyh4bWwsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICAgIG9iaiA9IHJlc3VsdDtcbiAgICAgICB9KTtcbiAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfSxcbiAgY29udmVydDogZnVuY3Rpb24gKHhtbE9iamVjdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3l0b3NjYXBlSnNOb2RlcyA9IFtdO1xuICAgIHZhciBjeXRvc2NhcGVKc0VkZ2VzID0gW107XG4gICAgdmFyIGNvbXBhcnRtZW50Q2hpbGRyZW5NYXAgPSB7fTsgLy8gTWFwIGNvbXBhcnRtZW50cyBjaGlsZHJlbiB0ZW1wb3JhcmlseVxuXG4gICAgdmFyIHNiZ247XG4gICAgdHJ5IHtcbiAgICAgIHZhciB4bWxTdHJpbmcgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbE9iamVjdCk7XG4gICAgICBzYmduID0gbGlic2JnbmpzLlNiZ24uZnJvbVhNTCh4bWxTdHJpbmcpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcGFyc2Ugc2Jnbm1sLiBcIisgZXJyKTtcbiAgICB9XG5cbiAgICB2YXIgbWFwO1xuICAgIGlmKHNiZ24ubWFwcy5sZW5ndGggPCAxKSB7IC8vIGVtcHR5IHNiZ25cbiAgICAgIHJldHVybiB7bm9kZXM6IFtdLCBlZGdlczogW119O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1hcCA9IHNiZ24ubWFwc1swXTsgLy8gdGFrZSBmaXJzdCBtYXAgb2YgdGhlIGZpbGUgYXMgdGhlIG1haW4gbWFwXG4gICAgfVxuXG4gICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgaWYobWFwLmxhbmd1YWdlID09IFwicHJvY2VzcyBkZXNjcmlwdGlvblwiKSB7XG4gICAgICBlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGUgPSBcIlBEXCI7XG4gICAgfVxuICAgIGVsc2UgaWYobWFwLmxhbmd1YWdlID09IFwiYWN0aXZpdHkgZmxvd1wiKSB7XG4gICAgICBlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGUgPSBcIkFGXCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlID0gXCJVbmtub3duXCI7XG4gICAgfVxuXG4gICAgdmFyIGNvbXBhcnRtZW50cyA9IHNlbGYuZ2V0QWxsQ29tcGFydG1lbnRzKG1hcC5nbHlwaHMpO1xuXG4gICAgdmFyIGdseXBocyA9IG1hcC5nbHlwaHM7XG4gICAgdmFyIGFyY3MgPSBtYXAuYXJjcztcblxuICAgIHZhciBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIFxuICAgICAgLy8gbGlic2JnbiBsaWJyYXJ5IGxpc3RzIHRoZSBnbHlwaHMgb2YgY29tcGxleGVzIGluIGVsZS5nbHlwaE1lbWJlcnMgYnV0IGl0IGRvZXMgbm90IHN0b3JlIHRoZSBnbHlwaHMgb2YgY29tcGFydG1lbnRzXG4gICAgICAvLyBzdG9yZSBnbHlwaCBtZW1iZXJzIG9mIGNvbXBhcnRtZW50cyBoZXJlLlxuICAgICAgdmFyIGNvbXBhcnRtZW50UmVmID0gZ2x5cGguY29tcGFydG1lbnRSZWY7XG4gICAgICBcbiAgICAgIGlmIChnbHlwaC5jbGFzc18gPT09ICdjb21wYXJ0bWVudCcpIHtcbiAgICAgICAgaWYgKGNvbXBhcnRtZW50Q2hpbGRyZW5NYXBbZ2x5cGguaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb21wYXJ0bWVudENoaWxkcmVuTWFwW2dseXBoLmlkXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBnbHlwaC5nbHlwaE1lbWJlcnMgPSBjb21wYXJ0bWVudENoaWxkcmVuTWFwW2dseXBoLmlkXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNvbXBhcnRtZW50UmVmKSB7XG4gICAgICAgIGlmIChjb21wYXJ0bWVudENoaWxkcmVuTWFwW2NvbXBhcnRtZW50UmVmXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29tcGFydG1lbnRDaGlsZHJlbk1hcFtjb21wYXJ0bWVudFJlZl0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb21wYXJ0bWVudENoaWxkcmVuTWFwW2NvbXBhcnRtZW50UmVmXS5wdXNoKGdseXBoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBzZWxmLnRyYXZlcnNlTm9kZXMoZ2x5cGgsIGN5dG9zY2FwZUpzTm9kZXMsICcnLCBjb21wYXJ0bWVudHMpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBhcmNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXJjID0gYXJjc1tpXTtcbiAgICAgIHNlbGYuYWRkQ3l0b3NjYXBlSnNFZGdlKGFyYywgY3l0b3NjYXBlSnNFZGdlcywgeG1sT2JqZWN0KTtcbiAgICB9XG5cbiAgICBpZiAobWFwLmV4dGVuc2lvbiAmJiBtYXAuZXh0ZW5zaW9uLmhhcygncmVuZGVySW5mb3JtYXRpb24nKSkgeyAvLyByZW5kZXIgZXh0ZW5zaW9uIHdhcyBmb3VuZFxuICAgICAgc2VsZi5hcHBseVN0eWxlKG1hcC5leHRlbnNpb24uZ2V0KCdyZW5kZXJJbmZvcm1hdGlvbicpLCBjeXRvc2NhcGVKc05vZGVzLCBjeXRvc2NhcGVKc0VkZ2VzKTtcbiAgICB9XG5cbiAgICB2YXIgY3l0b3NjYXBlSnNHcmFwaCA9IHt9O1xuICAgIGN5dG9zY2FwZUpzR3JhcGgubm9kZXMgPSBjeXRvc2NhcGVKc05vZGVzO1xuICAgIGN5dG9zY2FwZUpzR3JhcGguZWRnZXMgPSBjeXRvc2NhcGVKc0VkZ2VzO1xuXG4gICAgdGhpcy5pbnNlcnRlZE5vZGVzID0ge307XG5cbiAgICByZXR1cm4gY3l0b3NjYXBlSnNHcmFwaDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzYmdubWxUb0pzb247XG4iLCIvKlxuICogVGV4dCB1dGlsaXRpZXMgZm9yIGNvbW1vbiB1c2FnZVxuICovXG5cbnZhciBvcHRpb25VdGlsaXRpZXMgPSByZXF1aXJlKCcuL29wdGlvbi11dGlsaXRpZXMnKTtcbnZhciBvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcblxudmFyIHRleHRVdGlsaXRpZXMgPSB7XG4gIC8vVE9ETzogdXNlIENTUydzIFwidGV4dC1vdmVyZmxvdzplbGxpcHNpc1wiIHN0eWxlIGluc3RlYWQgb2YgZnVuY3Rpb24gYmVsb3c/XG4gIHRydW5jYXRlVGV4dDogZnVuY3Rpb24gKHRleHRQcm9wLCBmb250KSB7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29udGV4dC5mb250ID0gZm9udDtcbiAgICBcbiAgICB2YXIgZml0TGFiZWxzVG9Ob2RlcyA9IG9wdGlvbnMuZml0TGFiZWxzVG9Ob2RlcztcbiAgICBmaXRMYWJlbHNUb05vZGVzID0gdHlwZW9mIGZpdExhYmVsc1RvTm9kZXMgPT09ICdmdW5jdGlvbicgPyBmaXRMYWJlbHNUb05vZGVzLmNhbGwoKSA6IGZpdExhYmVsc1RvTm9kZXM7XG4gICAgXG4gICAgdmFyIHRleHQgPSB0ZXh0UHJvcC5sYWJlbCB8fCBcIlwiO1xuICAgIC8vSWYgZml0IGxhYmVscyB0byBub2RlcyBpcyBmYWxzZSBkbyBub3QgdHJ1bmNhdGVcbiAgICBpZiAoZml0TGFiZWxzVG9Ob2RlcyA9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIHZhciB3aWR0aDtcbiAgICB2YXIgbGVuID0gdGV4dC5sZW5ndGg7XG4gICAgdmFyIGVsbGlwc2lzID0gXCIuLlwiO1xuICAgIHZhciB0ZXh0V2lkdGggPSAodGV4dFByb3Aud2lkdGggPiAzMCkgPyB0ZXh0UHJvcC53aWR0aCAtIDE2IDogdGV4dFByb3Aud2lkdGg7XG4gICAgd2hpbGUgKCh3aWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGgpID4gdGV4dFdpZHRoKSB7XG4gICAgICAtLWxlbjtcbiAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBsZW4pICsgZWxsaXBzaXM7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9LFxuXG4gIC8vIHNhbWUgcHVycG9zZSBhcyBwcmV2aW91cyBvbmUsIGJ1dCB3aXRoIGNsZWFyZXIgcmVzcG9uc2liaWxpdHlcbiAgdHJ1bmNhdGU6IGZ1bmN0aW9uKHRleHQsIGZvbnQsIHdpZHRoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29udGV4dC5mb250ID0gZm9udDtcbiAgICAvLyBjaGVjayB0cml2aWFsIGNhc2UgZmlyc3QsIHdoZW4gZW50aXJlIHRleHQgaXMgYWxyZWFkeSBzbWFsbCBlbm91Z2hcbiAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoIDwgd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBlbGxpcHNpcyA9IFwiLi5cIjtcbiAgICAgIC8vIGlmIGVsbGlwc2lzIGFsb25lIGlzIGFscmVhZHkgdG9vIGxhcmdlXG4gICAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KGVsbGlwc2lzKS53aWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluYWxMZW5ndGg7IC8vIHRoaXMgc2hvdWxkIGFsd2F5cyBoYXZlIGEgdmFsdWUgYWZ0ZXIgdGhlIGxvb3BcbiAgICAgIGZvcih2YXIgaT0wOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VidGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGkpICsgZWxsaXBzaXM7XG4gICAgICAgIGlmIChjb250ZXh0Lm1lYXN1cmVUZXh0KHN1YnRleHQpLndpZHRoID4gd2lkdGgpIHsgLy8gd2UncmUgdG9vIGZhciwgdGFrZSB0aGUgcHJldmlvdXMgaW5kZXhcbiAgICAgICAgICBmaW5hbExlbmd0aCA9IGkgPiAwID8gaS0xIDogMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGZpbmFsTGVuZ3RoKSArIGVsbGlwc2lzO1xuICAgIH1cbiAgfSxcblxuICAvLyBlbnN1cmUgdGhhdCByZXR1cm5lZCBzdHJpbmcgZm9sbG93cyB4c2Q6SUQgc3RhbmRhcmRcbiAgLy8gc2hvdWxkIGZvbGxvdyByJ15bYS16QS1aX11bXFx3Li1dKiQnXG4gIGdldFhNTFZhbGlkSWQ6IGZ1bmN0aW9uKG9yaWdpbmFsSWQpIHtcbiAgICB2YXIgbmV3SWQgPSBcIlwiO1xuICAgIHZhciB4bWxWYWxpZFJlZ2V4ID0gL15bYS16QS1aX11bXFx3Li1dKiQvO1xuICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChvcmlnaW5hbElkKSkgeyAvLyBkb2Vzbid0IGNvbXBseVxuICAgICAgbmV3SWQgPSBvcmlnaW5hbElkO1xuICAgICAgbmV3SWQgPSBuZXdJZC5yZXBsYWNlKC9bXlxcdy4tXS9nLCBcIlwiKTtcbiAgICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChuZXdJZCkpIHsgLy8gc3RpbGwgZG9lc24ndCBjb21wbHlcbiAgICAgICAgbmV3SWQgPSBcIl9cIiArIG5ld0lkO1xuICAgICAgICBpZiAoISB4bWxWYWxpZFJlZ2V4LnRlc3QobmV3SWQpKSB7IC8vIG5vcm1hbGx5IHdlIHNob3VsZCBuZXZlciBlbnRlciB0aGlzXG4gICAgICAgICAgLy8gaWYgZm9yIHNvbWUgb2JzY3VyZSByZWFzb24gd2Ugc3RpbGwgZG9uJ3QgY29tcGx5LCB0aHJvdyBlcnJvci5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtYWtlIGlkZW50aWZlciBjb21wbHkgdG8geHNkOklEIHJlcXVpcmVtZW50czogXCIrbmV3SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3SWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsSWQ7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdGV4dFV0aWxpdGllcztcbiIsIi8qXG4gKiBDb21tb25seSBuZWVkZWQgVUkgVXRpbGl0aWVzXG4gKi9cblxudmFyIG9wdGlvblV0aWxpdGllcyA9IHJlcXVpcmUoJy4vb3B0aW9uLXV0aWxpdGllcycpO1xudmFyIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xudmFyIGxpYnMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG52YXIgdWlVdGlsaXRpZXMgPSB7XG4gIHN0YXJ0U3Bpbm5lcjogZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgPSAnZGVmYXVsdC1jbGFzcyc7XG4gICAgfVxuICAgIFxuICAgIGlmICgkKCcuJyArIGNsYXNzTmFtZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgY29udGFpbmVyV2lkdGggPSAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yKS53aWR0aCgpO1xuICAgICAgdmFyIGNvbnRhaW5lckhlaWdodCA9ICQob3B0aW9ucy5uZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IpLmhlaWdodCgpO1xuICAgICAgJChvcHRpb25zLm5ldHdvcmtDb250YWluZXJTZWxlY3RvciArICc6cGFyZW50JykucHJlcGVuZCgnPGkgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDk5OTk5OTk7IGxlZnQ6ICcgKyBjb250YWluZXJXaWR0aCAvIDIgKyAncHg7IHRvcDogJyArIGNvbnRhaW5lckhlaWdodCAvIDIgKyAncHg7XCIgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXNwaW4gZmEtM3ggZmEtZncgJyArIGNsYXNzTmFtZSArICdcIj48L2k+Jyk7XG4gICAgfVxuICB9LFxuICBlbmRTcGlubmVyOiBmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZSA9ICdkZWZhdWx0LWNsYXNzJztcbiAgICB9XG4gICAgXG4gICAgaWYgKCQoJy4nICsgY2xhc3NOYW1lKS5sZW5ndGggPiAwKSB7XG4gICAgICAkKCcuJyArIGNsYXNzTmFtZSkucmVtb3ZlKCk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVpVXRpbGl0aWVzO1xuXG5cbiIsIi8qXG4gKiBUaGlzIGZpbGUgZXhwb3J0cyB0aGUgZnVuY3Rpb25zIHRvIGJlIHV0aWxpemVkIGluIHVuZG9yZWRvIGV4dGVuc2lvbiBhY3Rpb25zIFxuICovXG52YXIgZWxlbWVudFV0aWxpdGllcyA9IHJlcXVpcmUoJy4vZWxlbWVudC11dGlsaXRpZXMnKTtcblxudmFyIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zID0ge1xuICBkZWxldGVFbGVzU2ltcGxlOiBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5kZWxldGVFbGVzU2ltcGxlKHBhcmFtLmVsZXMpO1xuICB9LFxuICByZXN0b3JlRWxlczogZnVuY3Rpb24gKGVsZXMpIHtcbiAgICB2YXIgcGFyYW0gPSB7fTtcbiAgICBwYXJhbS5lbGVzID0gZWxlbWVudFV0aWxpdGllcy5yZXN0b3JlRWxlcyhlbGVzKTtcbiAgICByZXR1cm4gcGFyYW07XG4gIH0sXG4gIGRlbGV0ZU5vZGVzU21hcnQ6IGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIGlmIChwYXJhbS5maXJzdFRpbWUpIHtcbiAgICAgIHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmRlbGV0ZU5vZGVzU21hcnQocGFyYW0uZWxlcyk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmRlbGV0ZUVsZXNTaW1wbGUocGFyYW0uZWxlcyk7XG4gIH0sXG4gIHNldFBvcnRzT3JkZXJpbmc6IGZ1bmN0aW9uKHBhcmFtKSB7XG4gICAgdmFyIG5vZGVzID0gcGFyYW0ubm9kZXM7XG4gICAgdmFyIG9yZGVyaW5nID0gcGFyYW0ub3JkZXJpbmc7XG4gICAgdmFyIHBvcnREaXN0YW5jZSA9IHBhcmFtLnBvcnREaXN0YW5jZTtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2Rlcy5jb25uZWN0ZWRFZGdlcygpO1xuICAgIHZhciBub2RlUHJvcE1hcCA9IHt9OyAvLyBOb2RlIHByb3AgbWFwIGZvciBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbm9kZXMgaXQgaXMgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHJlc3VsdCBtYXAuIEl0IGluY2x1ZGVzIG5vZGUgY3VycmVudCBwb3J0IG9yZGVyaW5nIGFuZCBjdXJyZW50IHBvcnRzLlxuICAgIHZhciBlZGdlUHJvcE1hcCA9IHt9OyAvLyBFZGdlIHByb3AgbWFwIGZvciBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbm9kZXMgaXQgaXMgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHJlc3VsdCBtYXAuIEl0IGluY2x1ZGVzIGVkZ2UgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldC5cblxuICAgIC8vIEZpbGwgbm9kZS9lZGdlIHByb3AgbWFwcyBmb3IgdW5kby9yZWRvIGFjdGlvbnNcblxuICAgIC8vIE5vZGUgcHJvcCBtYXAgaW5jbHVkZXMgYSBjb3B5IG9mIG5vZGUgcG9ydHNcbiAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICB2YXIgcG9ydHMgPSBub2RlLmRhdGEoJ3BvcnRzJyk7XG4gICAgICB2YXIgY3VycmVudE9yZGVyaW5nID0gc2JnbnZpei5lbGVtZW50VXRpbGl0aWVzLmdldFBvcnRzT3JkZXJpbmcobm9kZSk7IC8vIEdldCB0aGUgY3VycmVudCBub2RlIHBvcnRzIG9yZGVyaW5nXG4gICAgICB2YXIgcG9ydHNDb3B5ID0gcG9ydHMubGVuZ3RoID09PSAyID8gWyB7IGlkOiBwb3J0c1swXS5pZCwgeDogcG9ydHNbMF0ueCwgeTogcG9ydHNbMF0ueSB9LCB7IGlkOiBwb3J0c1sxXS5pZCwgeDogcG9ydHNbMV0ueCwgeTogcG9ydHNbMV0ueSB9IF0gOiBbXTtcbiAgICAgIG5vZGVQcm9wTWFwW25vZGUuaWQoKV0gPSB7IG9yZGVyaW5nOiBjdXJyZW50T3JkZXJpbmcsIHBvcnRzOiBwb3J0c0NvcHkgfTtcbiAgICB9XG5cbiAgICAvLyBOb2RlIHByb3AgbWFwIGluY2x1ZGVzIGVkZ2UgcG9ydHNvdXJjZSBhbmQgcG9ydHRhcmdldFxuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGNvbm5lY3RlZEVkZ2VzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcbiAgICAgIGVkZ2VQcm9wTWFwW2VkZ2UuaWQoKV0gPSB7IHBvcnRzb3VyY2U6IGVkZ2UuZGF0YSgncG9ydHNvdXJjZScpLCBwb3J0dGFyZ2V0OiBlZGdlLmRhdGEoJ3BvcnR0YXJnZXQnKSB9O1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBub2Rlczogbm9kZXMsXG4gICAgICBub2RlUHJvcE1hcDogbm9kZVByb3BNYXAsXG4gICAgICBlZGdlUHJvcE1hcDogZWRnZVByb3BNYXBcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBjYWxsIHJlbGF0ZWQgbWV0aG9kIGZyb20gZWxlbWVudCB1dGlsaXRpZXMgZWxzZSBnbyBiYWNrIHRvIHRoZSBzdG9yZWQgcHJvcHMgb2Ygbm9kZXMvZWRnZXNcbiAgICBpZiAoIHBhcmFtLmZpcnN0VGltZSApIHtcbiAgICAgIGVsZW1lbnRVdGlsaXRpZXMuc2V0UG9ydHNPcmRlcmluZyhub2Rlcywgb3JkZXJpbmcsIHBvcnREaXN0YW5jZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuXG4gICAgICAvLyBHbyBiYWNrIHRvIHN0b3JlZCBub2RlIHBvcnRzIHN0YXRlXG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgdmFyIHBvcnRzVG9SZXR1cm4gPSBwYXJhbS5ub2RlUHJvcE1hcFtub2RlLmlkKCldLnBvcnRzO1xuICAgICAgICB2YXIgb3JkZXJpbmdzVG9SZXR1cm4gPSBwYXJhbS5ub2RlUHJvcE1hcFtub2RlLmlkKCldLm9yZGVyaW5nO1xuICAgICAgICBub2RlLmRhdGEoJ3BvcnRzJywgcG9ydHNUb1JldHVybik7XG4gICAgICAgIG5vZGUuZGF0YSgncG9ydHNvcmRlcmluZycsIG9yZGVyaW5nc1RvUmV0dXJuKTsgLy8gVXBkYXRlIHRoZSBjYWNoZWQgcG9ydHMgb3JkZXJpbmdcbiAgICAgIH1cblxuICAgICAgLy8gR28gYmFjayB0byBzdG9yZWQgZWRnZSBwb3J0c291cmNlL3BvcnR0YXJnZXRzIHN0YXRlXG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tpXTtcbiAgICAgICAgdmFyIHByb3BzID0gcGFyYW0uZWRnZVByb3BNYXBbZWRnZS5pZCgpXTtcbiAgICAgICAgZWRnZS5kYXRhKCdwb3J0c291cmNlJywgcHJvcHMucG9ydHNvdXJjZSk7XG4gICAgICAgIGVkZ2UuZGF0YSgncG9ydHRhcmdldCcsIHByb3BzLnBvcnR0YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnM7Il19